
调用
OptionsComplex(3, DateDiff(SystemDateTime, props.ExpiredDateTime), props.strikePrice, data[id].Close, 5, 0, 0, volty, Enum_CallOption, Enum_EuropeanOption, oOptPrice, oDelta, oGamma, oVega, oTheta, oRho)计算出来的希腊值和行情界面显示的希腊值有很大的差异,这个原因是什么?可以复测的代码逻辑如下,麻烦老师给把把脉:
//------------------------------------------------------------------------
// 简称: opt_test
// 名称:
// 类别: 策略应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
Params
Vars
//此处添加变量
Numeric i;
Global Array<string> Callcontracts;
CodeProperty props;
Map<String, Array<Numeric>> map_call; // 定义看涨(Call)和看跌(Put)的数据容器
Map<String, Array<Numeric>> map_put;
DataFrame df1;
DataFrame df2;
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
OnInit()
{
GetOptSymbolsByCode(symbol, Callcontracts);
}
OnBar(ArrayRef<Integer> indexs)
{
// 字符串列数组
Array<String> symbol_call;
Array<String> symbolName_call;
Array<String> symbolType_call;
Array<String> symbol_put;
Array<String> symbolName_put;
Array<String> symbolType_put;
// 索引计数器
Numeric idx_call = 0;
Numeric idx_put = 0;
Numeric oOptPrice(0);
Numeric oDelta(0);
Numeric oGamma(0);
Numeric oVega(0);
Numeric oTheta(0);
Numeric oRho(0);
Numeric volty = Volatility(data[id].Close);
for i = 0 to GetArraySize(Callcontracts) - 1
{
GetProperty(Callcontracts[i], props);
String sym = props.Symbol; // 如 "ag2602C23100.SHFE"
// 检查是否包含 'C'(看涨)
if (FindFirstOf(sym, "C") != InvalidInteger)
{
OptionsComplex(3, DateDiff(SystemDateTime, props.ExpiredDateTime), props.strikePrice, data[id].Close, 5, 0, 0, volty, Enum_CallOption, Enum_EuropeanOption, oOptPrice, oDelta, oGamma, oVega, oTheta, oRho);
map_call["ExpiredDateTime"][idx_call] = props.ExpiredDateTime;
map_call["OpenDateTime"][idx_call] = props.OpenDateTime;
map_call["DueDays"][idx_call] = DateDiff(SystemDateTime, props.ExpiredDateTime);
map_call["strikePrice"][idx_call] = props.strikePrice;
map_call["Delta"][idx_call] = oDelta;
symbol_call[idx_call] = sym;
symbolName_call[idx_call] = props.SymbolName;
symbolType_call[idx_call] = props.symbolType;
idx_call = idx_call + 1;
}
// 检查是否包含 'P'(看跌)
else if (FindFirstOf(sym, "P") != InvalidInteger)
{
OptionsComplex(3, DateDiff(SystemDateTime, props.ExpiredDateTime), props.strikePrice, data[id].Close, 5, 0, 0, volty, Enum_PutOption, Enum_EuropeanOption, oOptPrice, oDelta, oGamma, oVega, oTheta, oRho);
map_put["ExpiredDateTime"][idx_put] = props.ExpiredDateTime;
map_put["OpenDateTime"][idx_put] = props.OpenDateTime;
map_put["DueDays"][idx_put] = DateDiff(SystemDateTime, props.ExpiredDateTime);
map_put["strikePrice"][idx_put] = props.strikePrice;
map_put["Delta"][idx_put] = oDelta;
symbol_put[idx_put] = sym;
symbolName_put[idx_put] = props.SymbolName;
symbolType_put[idx_put] = props.symbolType;
idx_put = idx_put + 1;
}
// 可选:else 忽略不合规合约(如无 C/P 的异常数据)
}
// ========== 构建 df1(Call)==========
df1.init(map_call);
df1.setPos("Symbol", [:], symbol_call);
df1.setPos("SymbolName", [:], symbolName_call);
df1.setPos("symbolType", [:], symbolType_call);
// ========== 构建 df2(Put)==========
df2.init(map_put);
df2.setPos("Symbol", [:], symbol_put);
df2.setPos("SymbolName", [:], symbolName_put);
df2.setPos("symbolType", [:], symbolType_put);
// ========== 按 strikePrice 升序排序 ==========
df1.sort_values("strikePrice", true); // true = 升序
df2.sort_values("strikePrice", true);
// 输出
print("=== Call Options (df1) ===");
print(df1.toString());
print("=== Put Options (df2) ===");
print(df2.toString());
}
利率填的多少
5,参照了示例的数值
类型为期货(MyAssetType = 3),分红收率、外币无风险利率都填的0
系统设置可以看下是不是一样,
将无风险利率设置为与OptionsComplex函数一致,刷新出来的数据差异没有改善。
