Java教程

算法策略 | 商品统计套利之趋势套利策略

本文主要是介绍算法策略 | 商品统计套利之趋势套利策略,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

量化策略开发,高质量社群,交易思路分享等相关内容

赠言“识局,破局”

大家好,我是乌克兰剑圣。

本月的最后一个策略来了,群里的小伙伴之前提到过能不能写一个套利策略。好,本期我们就来开发一个套利策略。套利策略的依据理论有很多,距离法,协整法,随机价差法,时间序列法等等之类的,其中最重要的就是均衡关系。然而,我并不准备罗列一大堆数学公式,因为我也不会。而是秉持松鼠宽客一贯的作风: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] <= HH )          NTD1 = NTD1 + (HH - JC[value1]);         If (JC[value1] >= LL  )        NTD1 = NTD1 + (JC[value1] - LL);       }      For value1 = 1 To R1*2        //      {        If(value1==1)NTD2=0;        If (JC[value1] <= HH2 )            NTD2 = NTD2 + (HH2 - JC[value1]);         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]<XY)//当波动率小于下限时,波动率逐步走向收缩。      {           if(ATRN[1]<ATRN[2])//波动率持续收缩,说明行情在震荡或者无明显趋势。移动止盈参数也随之减少以免因为参数迟钝在震荡行情亏损过大;                  //若波动率小于XY,但是波动率开始走强说明行情可能进入趋势或者波段,这个时候TRS参数将不再继续减少,即保护仓位;        {          TRS=TRS-X;          TRS=Max(TRS,100);        }      }      BarN=CurrentBar;    }

先在16年-19年样本内反复调整,再到样本外检查普适性避免使用过优参数。我发现加入了参数自适应后,策略绩效整体有了提升,净值从1.2至1.4。但是并没有处理好16-19年这段,问题可能不是出场条件,怎么办?

第三版

改变进场条件,使用周期内的波峰波谷,同时换成ER噪音过滤:

    filter=EffRatio>P ; //ER过滤降噪    //PlotNumeric("EffRatio",EffRatio*100);    Commentary("EffRatio"+Text(EffRatio));    Commentary("ATR"+Text(ATR));    SH=SwingHigh(1,JC,X,N);//计算波峰    SL=SwingLow(1,JC,X,N);//计算波谷    if(SH>0)PlotNumeric("SH",SH);    if(SL>0)PlotNumeric("SL",SL);

改变开仓条件和加入ER滤波器以后,绩效有了显著的增长。我们关注的回撤期从16年7月至2019年缩短至16年12月至18年9月。虽然没有在这段时间盈利,但是其他时间段的盈利提升了不少。在开仓条件里还加入文章开头提到的上限下限的限制,低于下限不开空,高于上限不开多。至于这一点,是基于以前在公司做基本面的统计,也和品种间的替代有关。这也是套利遵循均衡关系的原因,实际中价差向下的空间有限,向上的空间可能会超出预期,所以并不是一个对称的关系,我们在极端位置的时候就不要再去顺势交易了,真正有价值的行情在区间里。

策略源码包:

本策略仅作学习交流使用,实盘交易盈亏投资者个人负责。

这篇关于算法策略 | 商品统计套利之趋势套利策略的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!