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

//------------------------------------------------------------------------

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());

   }

开仓价格与委托价格差异将近10跳
回测数据长期和短期重叠部分差异非常大
K线图行情界面添加商品的bug
哪里刷新行情数据?
获取复权行情数据
行情数据问题
TBQ行情数据如何导出?
反馈行情软件界面保存的建议
策略报告与实盘当日盈亏差异问题
python 调用行情数据出错

利率填的多少

5,参照了示例的数值

类型为期货(MyAssetType = 3),分红收率、外币无风险利率都填的0

系统设置可以看下是不是一样,


将无风险利率设置为与OptionsComplex函数一致,刷新出来的数据差异没有改善。