OptionsComplex返回值与行情界面数据差异较大

调用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//------------------------------------------------------------------------ParamsVars //此处添加变量 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函数一致,刷新出来的数据差异没有改善。