量化策略开发,高质量社群,交易思路分享等相关内容
赠言“识局,破局”
大家好,我是乌克兰剑圣。
本月的最后一个策略来了,群里的小伙伴之前提到过能不能写一个套利策略。好,本期我们就来开发一个套利策略。套利策略的依据理论有很多,距离法,协整法,随机价差法,时间序列法等等之类的,其中最重要的就是均衡关系。然而,我并不准备罗列一大堆数学公式,因为我也不会。而是秉持松鼠宽客一贯的作风:0到1,策略落地。
OK,说正事儿。套利标的我选择油脂的YP,因为早年在公司主攻农产品板块,三油俩粕还是比较熟悉的。农产品的波段机会是非常多的,尤其是油粕每年总有那么3-4次波段。如果说你的CTA策略在这个版块表现不好,那是正常的,少有表现好的CTA策略放到上面能和黑色化工媲美,这和品种特性有很大关系。我们来看看YP的套利价差图(15分钟图):
这是15年至今的价差变化,虽然凌乱但还是遵循了均衡关系;
价差的均值回归特性是比较明显的,百分位数计算的上限1200左右,下限500左右。我们有利可图的地方在区间之内,如何抓住这部分利润是策略盈利的关键。至于鱼头鱼尾,咱们就别抢了吧。
先上策略:抱歉,我也没想到在其他品种表现很好的策略上来是这副德性,用太原话讲叫做求胡麻擦。没关系,不怕策略差,就怕不会改。
我们再回到价差这幅图:
我们目的是要吃鱼身,但是发现这条鱼的“刺儿”太多了,而且大小不均,不太好剔除。杂乱无章的价格噪音阻碍了我们赚取主要趋势的利润,这也是策略表现很差的原因,所以重点来了:过滤。
过滤保持原策略开平仓条件和参数不变,加入波动率计算公式:
//波动幅度计算
For value1 = 1 To R1 //
{
If(value1==1)NTD1=0;
If (JC[value1] = LL )
NTD1 = NTD1 + (JC[value1] - LL);
}
For value1 = 1 To R1*2 //
{
If(value1==1)NTD2=0;
If (JC[value1] = LL2 )
NTD2 = NTD2 + (JC[value1] - LL2);
}
//波动率计算
N1=(NTD1/JC)/Summation((NTD1/JC),R1);
N2=(NTD2/JC)/Summation((NTD2/JC),R1);
策略代码里已经做过防偷价处理,中间的是价差图加上了开平仓的条件线显示。我们从测试报告上看,效果有了很大的提升。但是还没有达到我的预期,我们从绩效图看到16年至19年都没有创新高,处于回撤期中。这样是不行的,现在来看看这段时间的行情是什么样的:
这段时间行情虽然有过几个流畅的波段,但主要还是以短波往复为主。
如何改?我首先想到的是平仓出场的条件是否能灵活一些。
第二版加入平仓参数自适应:
if(CurrentBar>barN)
{
if(ATRN[1]>SY) //当波动率大于上限时,波动率逐步走向过热
{
if (ATRN[1]>ATRN[2])//波动率持续放大,说明趋势在加速,行情波动加大。移动止盈参数也随之增大以免被甩出去;
//若波动率大于SY,但是波动率开始走弱说明行情可能进入回抽或者震荡,这个时候TRS参数将不再继续增加,即保护利润;
{
TRS=TRS+X;
TRS=Min(TRS,200);
}
}
if(ATRN[1]0)PlotNumeric("SH",SH);
if(SL>0)PlotNumeric("SL",SL);
改变开仓条件和加入ER滤波器以后,绩效有了显著的增长。我们关注的回撤期从16年7月至2019年缩短至16年12月至18年9月。虽然没有在这段时间盈利,但是其他时间段的盈利提升了不少。在开仓条件里还加入文章开头提到的上限下限的限制,低于下限不开空,高于上限不开多。至于这一点,是基于以前在公司做基本面的统计,也和品种间的替代有关。这也是套利遵循均衡关系的原因,实际中价差向下的空间有限,向上的空间可能会超出预期,所以并不是一个对称的关系,我们在极端位置的时候就不要再去顺势交易了,真正有价值的行情在区间里。
策略源码包:本策略仅作学习交流使用,实盘交易盈亏投资者个人负责。