如何使用正则表达式解析OCC期权符号?

6
OCC期权符号由4部分组成:
  1. 标的股票或ETF的根符号,用空格填充到6个字符
  2. 到期日,为6位数字,格式为yymmdd
  3. 期权类型,即P或C,表示看跌或看涨
  4. 行使价格,按价格x1000计算,前面用0填充到8个数字
例如,SPX 141122P00019500 表示“对SPX进行看跌期权交易,到期日为2014年11月22日,行使价格为$19.50”。
是否可以使用正则表达式自动解析它?我正在使用JavaScript。

预期的结果是什么? - guest271314
将字符串解析为不同的部分 - Shamoon
3个回答

3

这是正则表达式(我强烈建议使用 http://regexr.com

([\w ]{6})((\d{2})(\d{2})(\d{2}))([PC])(\d{8})

第一组:ETF

第二组:年份

第三组:月份

第四组:日期

第五组:认购/认沽

第六组:行权价

您的JavaScript代码可能类似于以下内容(某种程度上是伪代码,未经测试):

var myString = "SPX   141122P00019500";
var myRegexp = /([\w ]{6})((\d{2})(\d{2})(\d{2}))([PC])(\d{8})/g;
var match = myRegexp.exec(myString);

console.log("a " + match[5] + " on " + match[1].trim() + ", expiring on " + match[3] + "/" + match[4] + "/20" + match[2] + " with a strike price of $" + match[6]);

RegExp 处理包含数字的股票代码吗? - guest271314

1

我认为如果OCC选项字符串具有固定的格式,你甚至不需要正则表达式。相反,你可以尝试使用substring()来提取各个组件。

var occ = 'SPX   141122P00019500';
var symbol = occ.substring(0, 3);
var year = parseInt(occ.substring(6, 8)) + 2000;
var month = occ.substring(8, 10);
var day = occ.substring(10, 12);
var date = month + '/' + day + '/' + year;
var type = occ.substring(12, 13) == 'P' ? 'put' : 'call';
var price = parseFloat(occ.substring(13, 21)) / 1000.0;

var output = 'a ' + type + ' on ' + symbol + ', expiring on ' + date +
             ', with a strike price of $' + price.toFixed(2); + '.';
console.log(output);

我认为使用子字符串构建输出字符串通常比使用正则表达式更有效。

这是不被鼓励的。occ符号可以在股票代码末尾或之前带有数字,用于弹性期权或调整后的期权。 - Jeff Gruenbaum

1
你可以使用RegExp /^[^\s]+(?=\s+|\d{6})|\d{6}(?=C|P)|(C|P)(?=0+)|(?!:\1)0+|\d+$/g来匹配字符串开头的非空格字符,或者紧接着六个数字的日期后跟着CP,或者CP后面跟着一个或多个0字符,或者以CP为前缀的一个或多个0字符,或者以一串数字结尾的字符串。

利用解构赋值将匹配的部分定义为数组的单独变量。

let quote = "SPX   141122P00019500";
 
let re = /^[^\s]+(?=\s+|\d{6})|\d{6}(?=C|P)|(C|P)(?=0+)|(?!:\1)0+|\d+$/g;

let [ticker, date, option, strike, price] = quote.match(re);

console.log({ticker, date, option, strike, price});


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接