文华日历价差套利策略[文华财经公式]
①日历价差套利策略简介
日历价差是指买进到期日较远的期权,同时又卖出相同行权价格、相同数量但到期日较近的期权,赚取两个不同期权隐含波动率的差价或者其它期权定价参数的差价,以获得利润的期权套利交易策略。
②推导套利条件
1)、开仓策略:
X=V(近月隐含波动率)-V (历史波动率)+V (近月隐含波动率 )-V(远月隐含波动率) X>0,通过卖出一份近月看涨期权,同时买出一份远月看涨期权,建立日历价差组合。
2)、平仓策略:
考虑到该组合并没有对冲标的物价格变动的风险,在近月期权到期前几天,组合的Gamma风险值可能比较大,标的物价格的变化会大幅增加收益的波动率。因此,策略采取在当月合约到期前8天进行平仓。
③将上述策略编写为策略模型
Data CODA0:"c2209-C-3160"; //近月合约 CODB0:"c2211-C-3160"; //远月合约 CODA1:"c2209-C-3120"; //近月合约 CODB1:"c2211-C-3120"; //远月合约 CODA2:"c2209-C-3080"; //近月合约 CODB2:"c2211-C-3080"; //远月合约 CODA3:"c2209-C-3040"; //近月合约 CODB3:"c2211-C-3040"; //远月合约 CODA4:"c2209-C-3000"; //近月合约 CODB4:"c2211-C-3000"; //远月合约 COD:"c2209"; //标的期货 Vars StringArray CODA; //看涨期权 StringArray CODB; //看跌期权 String CODF; //标的期货 Numeric CDN; //期权合约数量 Numeric N; //下单手数 Numeric Length; //周期 Numeric X; //循环变量 Numeric D; //日期间隔 Numeric TKN; //数据区长度 Numeric TOD; //当前日期 Numeric HVLF; //F价格波动率 Numeric OPFLG; //模型处理标志 Var_TickData TKD; //数据区 NumericArray LNP; //自然对数 NumericArray EPDA; //行权日期 NumericArray RTS; //距行权日剩余天数 NumericArray STRA; //近月合约隐含波动率 NumericArray STRB; //远月合约隐含波动率 NumericArray PRC; //隐含波动率综合价差 NumericArray NEWPA; //A最新价 NumericArray NEWPB; //B最新价 NumericArray RLPA,FLPA; //A涨跌停价 NumericArray RLPB,FLPB; //B涨跌停价 NumericArray BIDPA,ASKPA; //A买卖一价 NumericArray BIDPB,ASKPB; //B买卖一价 NumericArray BRPA,SRPA; //A多空头可用持仓 NumericArray BRPB,SRPB; //B多空头可用持仓 NumericArray BKDFLG; //买开处理标志 NumericArray SKDFLG; //卖开处理标志 NumericArray BPDFLG; //买平处理标志 NumericArray SPDFLG; //卖平处理标志 Global_NumericArray BCFLG; //多头处理标志 Global_NumericArray SCFLG; //空头处理标志 Global_NumericArray BKIDA,SKIDA; //A开仓委托 Global_NumericArray BKIDB,SKIDB; //B开仓委托 Global_NumericArray BPIDA,SPIDA; //A平仓委托 Global_NumericArray BPIDB,SPIDB; //B平仓委托 Global_NumericArray BKFLGA,SKFLGA; //A开仓标志 Global_NumericArray BKFLGB,SKFLGB; //B开仓标志 Global_NumericArray BPFLGA,SPFLGA; //A平仓标志 Global_NumericArray BPFLGB,SPFLGB; //B平仓标志 Global_NumericArray BKMA,SKMA; //A开仓委托手数 Global_NumericArray BKMB,SKMB; //B开仓委托手数 Global_NumericArray BPMA,SPMA; //A平仓委托手数 Global_NumericArray BPMB,SPMB; //B平仓委托手数 Global_NumericArray BKPA,SKPA; //A开仓委托价格 Global_NumericArray BKPB,SKPB; //B开仓委托价格 Global_NumericArray BPPA,SPPA; //A平仓委托价格 Global_NumericArray BPPB,SPPB; //B平仓委托价格 Begin //------------------------处理开启------------------------// If(1) //处理开启 { CODA[0] = "c2209-C-3160"; //近月合约 CODB[0] = "c2211-C-3160"; //远月合约 CODA[1] = "c2209-C-3120"; //近月合约 CODB[1] = "c2211-C-3120"; //远月合约 CODA[2] = "c2209-C-3080"; //近月合约 CODB[2] = "c2211-C-3080"; //远月合约 CODA[3] = "c2209-C-3040"; //近月合约 CODB[3] = "c2211-C-3040"; //远月合约 CODA[4] = "c2209-C-3000"; //近月合约 CODB[4] = "c2211-C-3000"; //远月合约 CDN = GetStringArraySize(CODA); //期权合约数量 CODF = "c2209"; //标的期货 OPFLG = 1; //开启模型处理 If(CODF.A_IsExchangeOpen() != 1) //如果非开盘状态 { OPFLG = 2; //关闭模型处理 } For X = 0 To CDN - 1 //遍历期权合约 { If(CODA[X].A_IsExchangeOpen() != 1 || CODB[X].A_IsExchangeOpen() != 1) //如果非开盘状态 { OPFLG = 2; //关闭模型处理 } } } //------------------------变量赋值------------------------// If(OPFLG == 1) //变量赋值 { N = 10; //下单手数 Length = 5; //周期 D = 5; //日期间隔 TOD = CurrentDate(); //当前日期 For X = 0 To CDN - 1 //遍历期权合约 { NEWPA[X] = CODA[X].Price("New"); //A最新价 NEWPB[X] = CODB[X].Price("New"); //B最新价 BIDPA[X] = CODA[X].Price("Bid1"); //A买一价 ASKPA[X] = CODA[X].Price("Ask1"); //A卖一价 BIDPB[X] = CODB[X].Price("Bid1"); //B买一价 ASKPB[X] = CODB[X].Price("Ask1"); //B卖一价 RLPA[X] = CODA[X].Price("RiseLimit"); //A涨停价 FLPA[X] = CODA[X].Price("FallLimit"); //A跌停价 RLPB[X] = CODB[X].Price("RiseLimit"); //B涨停价 FLPB[X] = CODB[X].Price("FallLimit"); //B跌停价 BIDPA[X] = IIF(BIDPA[X] == 0 && NEWPA[X] == FLPA[X],FLPA[X],BIDPA[X]); //A买一价 ASKPA[X] = IIF(ASKPA[X] == 0 && NEWPA[X] == RLPA[X],RLPA[X],ASKPA[X]); //A卖一价 BIDPB[X] = IIF(BIDPB[X] == 0 && NEWPB[X] == FLPB[X],FLPB[X],BIDPB[X]); //B买一价 ASKPB[X] = IIF(ASKPB[X] == 0 && NEWPB[X] == RLPB[X],RLPB[X],ASKPB[X]); //B卖一价 STRA[X] = CODA[X].Price("Stdderiation"); //A隐含波动率 STRB[X] = CODB[X].Price("Stdderiation"); //B隐含波动率 EPDA[X] = CODA[X].Price("ExpirationDate"); //A行权日期 RTS[X] = DateDiff(TOD,EPDA[X] ); //距行权日剩余天数 BRPA[X] = CODA[X].F_BuyRemainPosition(); //A多头可用持仓 SRPA[X] = CODA[X].F_SellRemainPosition(); //A空头可用持仓 BRPB[X] = CODB[X].F_BuyRemainPosition(); //B多头可用持仓 SRPB[X] = CODB[X].F_SellRemainPosition(); //B空头可用持仓 BRPA[X] = Min(BRPA[X],CODA[X].A_BuyRemainPosition()); //A多头可用持仓 SRPA[X] = Min(SRPA[X],CODA[X].A_SellRemainPosition()); //A空头可用持仓 BRPB[X] = Min(BRPB[X],CODB[X].A_BuyRemainPosition()); //B多头可用持仓 SRPB[X] = Min(SRPB[X],CODB[X].A_SellRemainPosition()); //B空头可用持仓 } } //------------------------数据取值------------------------// If(OPFLG == 1) //数据取值 { TKD = Def_TickData(CODF,1,6); //数据区 If(TKD.State == 1) //如果数据区有效 { TKN = TKD.Num; //数据区长度 For X = 1 To TKN - 1 //遍历数据区 { LNP[X - 1] = Ln(TKD[X].TickPrice / TKD[X - 1].TickPrice); //自然对数 } HVLF = StandardDevArray(LNP,2) * Sqrt(252) ; //F价格波动率 For X = 0 To CDN - 1 //遍历期权合约 { PRC[X] = STRA[X] - HVLF + STRA[X] - STRB[X]; //隐含波动率综合价差 } } Else //如果数据区无效 { OPFLG = 2; //关闭模型处理 } } //------------------------成交判断------------------------// If(OPFLG == 1) //成交判断 { For X = 0 To CDN - 1 //遍历期权合约 { If(SKFLGA[X] == 1) //如果有A卖开委托 { If(F_OrderStatus(SKIDA[X]) == Enum_Filled) //如果A卖开委托成交 { Commentary("【空头开仓:A卖开委托" + Text(X + 1) + "成交!】"); SKFLGA[X] = 0; //A卖开标志归0 } Else If(F_OrderStatus(SKIDA[X]) == Enum_Deleted) //如果A卖开委托废单 { Commentary("【空头开仓:A卖开委托" + Text(X + 1) + "废单!】"); SKFLGA[X] = 0; //A卖开标志归0 } } If(BKFLGB[X] == 1) //如果有B买开委托 { If(F_OrderStatus(BKIDB[X]) == Enum_Filled) //如果B买开委托成交 { Commentary("【空头开仓:B买开委托" + Text(X + 1) + "成交!】"); BKFLGB[X] = 0; //B买开标志归0 } Else If(F_OrderStatus(BKIDB[X]) == Enum_Deleted) //如果B买开委托废单 { Commentary("【空头开仓:B买开委托" + Text(X + 1) + "废单!】"); BKFLGB[X] = 0; //B买开标志归0 } } If(BPFLGA[X] == 1) //如果有A买平委托 { If(F_OrderStatus(BPIDA[X]) == Enum_Filled) //如果A买平委托成交 { Commentary("【空头平仓:A买平委托" + Text(X + 1) + "成交!】"); BPFLGA[X] = 0; //A买平标志归0 } Else If(F_OrderStatus(BPIDA[X]) == Enum_Deleted) //如果A买平委托废单 { Commentary("【空头平仓:A买平委托" + Text(X + 1) + "废单!】"); BPFLGA[X] = 0; //A买平标志归0 } } If(SPFLGB[X] == 1) //如果有B卖平委托 { If(F_OrderStatus(SPIDB[X]) == Enum_Filled) //如果B卖平委托成交 { Commentary("【空头平仓:B卖平委托" + Text(X + 1) + "成交!】"); SPFLGB[X] = 0; //B卖平标志归0 } Else If(F_OrderStatus(SPIDB[X]) == Enum_Deleted) //如果B卖平委托废单 { Commentary("【空头平仓:B卖平委托" + Text(X + 1) + "废单!】"); SPFLGB[X] = 0; //B卖平标志归0 } } } } //------------------------空头处理------------------------// If(OPFLG == 1) //空头处理 { For X = 0 To CDN - 1 //遍历期权合约 { If(SKFLGA[X] == 0 && BKFLGB[X] == 0 && BPFLGA[X] == 0 && SPFLGB[X] == 0) //如果没有开平仓委托 { If(SCFLG[X] == 0) //如果未执行空头开仓 { If(PRC[X] > 0 && RTS[X] > D) //如果满足空头开仓条件 { SKDFLG[X] = 1; //开启卖开处理 SCFLG[X] = 1; //已执行空头开仓 } } Else If(SCFLG[X] == 1) //如果已执行空头开仓 { If(RTS[X] <= D) //如果满足空头平仓条件 { BPDFLG[X] = 1; //开启买平处理 SCFLG[X] = 0; //空头处理标志归0 } } } } } //------------------------委托处理------------------------// If(OPFLG == 1) //委托处理 { For X = 0 To CDN - 1 //遍历期权合约 { If(SKDFLG[X] == 1) //如果已开启卖开处理 { If(SKFLGA[X] == 0 && BKFLGB[X] == 0) //如果没有开仓委托 { SKMA[X] = N; //A卖开委托手数 SKPA[X] = BIDPA[X]; //A卖开委托价格 Commentary("【空头开仓:A卖开委托" + Text(X + 1) + "发出!】"); SKIDA[X] = CODA[X].A_SendOrder(Enum_Sell,Enum_Entry,SKMA[X],SKPA[X]); //发出A卖开委托 SKFLGA[X] = 1; //已发出A卖开委托 BKMB[X] = N; //B买开委托手数 BKPB[X] = ASKPB[X]; //B买开委托价格 Commentary("【空头开仓:B买开委托" + Text(X + 1) + "发出!】"); BKIDB[X] = CODB[X].A_SendOrder(Enum_Buy,Enum_Entry,BKMB[X],BKPB[X]); //发出B买开委托 BKFLGB[X] = 1; //已发出B买开委托 } } If(BPDFLG[X] == 1) //如果已开启买平处理 { If(BPFLGA[X] == 0 && SPFLGB[X] == 0) //如果没有平仓委托 { If(SRPA[X] >= N) //如果A空头可用持仓达到N手 { BPMA[X] = N; //A买平委托手数 BPPA[X] = ASKPA[X]; //A买平委托价格 Commentary("【空头平仓:A买平委托" + Text(X + 1) + "发出!】"); BPIDA[X] = CODA[X].A_SendOrder(Enum_Buy,Enum_Exit,BPMA[X],BPPA[X]); //发出A买平委托 BPFLGA[X] = 1; //已发出A买平委托 } If(BRPB[X] >= N) //如果B多头可用持仓达到N手 { SPMB[X] = N; //B卖平委托手数 SPPB[X] = BIDPB[X]; //B卖平委托价格 Commentary("【空头平仓:B卖平委托" + Text(X + 1) + "发出!】"); SPIDB[X] = CODB[X].A_SendOrder(Enum_Sell,Enum_Exit,SPMB[X],SPPB[X]); //发出B卖平委托 SPFLGB[X] = 1; //已发出B卖平委托 } } } } } End
有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友
可联系技术人员 QQ: 1145508240 进行 有偿 编写!(不贵!点击查看价格!)
相关文章
-
没有相关内容