文华日历价差套利策略[文华财经公式]
①日历价差套利策略简介
日历价差是指买进到期日较远的期权,同时又卖出相同行权价格、相同数量但到期日较近的期权,赚取两个不同期权隐含波动率的差价或者其它期权定价参数的差价,以获得利润的期权套利交易策略。
②推导套利条件
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 进行 有偿 编写!(不贵!点击查看价格!)
相关文章
-
没有相关内容

会员登录/注册