《TBQuant如何获得期权“行权价间距”》
在动态加载期权合约时,要知道订阅哪些“档位”的合约。我们只有知道当前价格和行权价间距,才能合理、正确的订阅期权合约。比如rb2510当前价格2980,上下几档分析是3100,3050,3000,2950,2900,螺纹行权价间距是50。
获得“行权价间距”有两种方法。第一种,是代码人工设定,代码示例如图一。实现比较简单。缺点是比较死板。有些品种行权价很特殊,比如橡胶是250,黄金是8;有些品种会随着价格变化,行权价间距会变化,比如黄金以前是2。
需要一种更灵活的方法,获得“行权价间距”,思路如图二。1、通过GetSymbols函数获得所有rb2010的期货合约;2、提取这些合约的行权价,计算“行权价间距”。这个方法是动态的,适应能力强,不担心间距的变化。
是的,目前为止都是自己计算
本来想写一系列期权函数
不想写了
太累
👍
//ReadStrikeInterval,通过读取合约,价格计算出期权行权价间隔。取消月份过滤
Numeric ReadStrikeInterval(string inSymbolType,string inExchangeCode)
{
//函数变量声明
// inSymbolType,期货商品代码
// inCurrentPrice,期货商品当前的价格
// StrikeInterval
Numeric StrikeInterval;
//一、根据期货代码,输出所有期权合约。
Array<String> symbols;
string myCode = inSymbolType + "." + inExchangeCode;
if(inExchangeCode=="CFFEX") //股指期权要做特殊处理
{
print("金融版块,期权名字转换,IH IF IC IM,HO IO CO MO");
if (inSymbolType=="IH")
myCode = "000016.SSE";
else if(inSymbolType=="IF")
myCode = "000300.SSE";
else if (inSymbolType=="IC")
myCode = "000852.SSE";
else if (inSymbolType=="IM")
myCode = "999999.SSE";
}
//期权"rb.SHFE"
Integer ret = GetSymbols(myCode,Enum_CategoryOptions,symbols);
print(myCode + " ret=" + Text(ret) + ",symbols size = "+Text(GetArraySize(symbols)));
print("所有合约" + TextArray(symbols) );
//二、根据读取的合约,计算行权间隔
Array<Numeric> arrStrike;
Array<Numeric> arrStrike2;
Numeric oneStrike;
Numeric i;
//二.1、根据读取的合约,计算行权价
for i = 0 to GetArraySize(symbols)-1
{
//rb2510C3550.SHFE,取出3550
Array<String> arr;
StringSplit(symbols[i], ".", arr); //rb2510C3550.SHFE,取出rb2510P3550
String Mysymbol1 = arr[0];//rb2510C3550
Array<String> arr2;
StringSplit(Mysymbol1, "C", arr2); //rb2510C3550,取出3550
String Mysymbol2 = arr2[1];//3550
oneStrike = Value(Mysymbol2);
if( oneStrike <>InvalidInteger )
{
ArrayPushBack(arrStrike,oneStrike);
}
}
//二.2 根据行权价数组,计算行权间隔。
ArraySort(arrStrike, False);//数组降序排序
Print("降序排序结果:" + TextArray(arrStrike));
Array<Numeric> arrStrikeInterval;
for i = 0 to GetArraySize(arrStrike)-2
{
Numeric oneStrikeInterval = arrStrike[i] - arrStrike[i+1];
ArrayPushBack(arrStrikeInterval,oneStrikeInterval);
}
Print("arrStrikeInterval:" + TextArray(arrStrikeInterval));
//清理数组里0值
Array<Numeric> arrStrikeInterval2;
for i = 0 to GetArraySize(arrStrikeInterval)-1
{
if(arrStrikeInterval[i]>0)
ArrayPushBack(arrStrikeInterval2,arrStrikeInterval[i]);
}
Print("清零后arrStrikeInterval2:" + TextArray(arrStrikeInterval2));
//计算出现次数最多的值
Array<Numeric> dest;
ArrayPushBack(arrStrikeInterval2,999999);//ModeArray有bug,需要塞一个假的数据进去。
ModeArray(arrStrikeInterval2, dest);//求数组的众数
//Print("dest:" + TextArray(dest));
strikeInterval = dest[0];
Print("最终的行权价间距:" + Text(strikeInterval) );
return strikeInterval;
}
OnReady()
{
Numeric interval = ReadStrikeInterval(SymbolType(),ExchangeCode());
Print(SymbolType() + " 标的价格=" + text(Close) +" 行权价间距=" + text( interval) );