您现在的位置:程序化交易>> 期货公式>> 文华财经>> 文华财经公式>>正文内容

文华日历价差套利策略[文华财经公式]

①日历价差套利策略简介

日历价差是指买进到期日较远的期权,同时又卖出相同行权价格、相同数量但到期日较近的期权,赚取两个不同期权隐含波动率的差价或者其它期权定价参数的差价,以获得利润的期权套利交易策略。

 

②推导套利条件

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  点击这里给我发消息进行 有偿 编写!不贵!点击查看价格!

 


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容