趋势跟踪策略是常用的CTA策略,具有盈亏比较高(一般要大于2),而胜率较低(往往在40%以下)的特点。要实战应用,策略必须要超出常规的盈亏比和胜率。这就需要对策略进行优化。
策略优化是一个非常重要的过程,若简单地根据历史数据进行回测选择较优参数,往往会堕入参数拟合的窠臼,达不到用于实战的预期。
本文介绍了一个基于跨周期定多空方向的优化方法,在此分享给量化交易同仁。
原始的策略是一个EMA 通道突破的策略,策略思路和源码详见上篇CTA 策略分享之一的文章:
为了提高策略绩效,我们利用日线来决定做多或者做空方向。具体思路:价格大于日线收盘价的EMA20 均线之上,作为做多进场的一个过滤条件,做空则相反。
代码如下:
Inputs: AvgLen(30), ADXLen(12), EntryBar(2);
Vars: UpperMA(0), LowerMA(0), ADXValue(0), ChanSpread(0), BuySetup(False), SellSetup(False), BuyTarget(0), SellTarget(0), MROBS(0), MROSS(0);
var: va_data2(0,data2);
va_data2 = XAverage(c,20) data2;
{Variable Declarations}
UpperMA = XAverage(High, AvgLen)[1];
LowerMA = XAverage(Low, AvgLen)[1];
ADXValue = ADX(ADXLen);
ChanSpread = (UpperMA - LowerMA) / 2;
{Setup}
BuySetup = Close > UpperMA AND ADXValue > ADXValue[1];
SellSetup = Close < LowerMA AND ADXValue > ADXValue[1];
IF BuySetup Then
BuyTarget = Close + ChanSpread;
IF SellSetup Then
SellTarget = Close - ChanSpread;
MROBS = MRO(BuySetup, EntryBar, 1);
MROSS = MRO(SellSetup, EntryBar, 1);
{Entries}
IF MROBS <> -1 AND MRO(MarketPosition=1, MROBS, 1) = -1 and c > va_data2 Then
Buy Next Bar at BuyTarget Stop;
IF MROSS <> -1 AND MRO(MarketPosition=-1, MROSS, 1) = -1 and c < va_data2 Then
SellSHORT Next Bar at SellTarget Stop;
{Exits}
SELL Next Bar at LowerMA Stop;
BUYTOCOVER Next Bar at UpperMA Stop;
同样在螺纹钢指数三年的15分钟Bar 测试,绩效如下:
可以看出,盈亏比和胜率均有改善。说明这一优化思路有一定的作用。
当然,要实现一个能实战的策略,还需要继续的采用更多的优化方法,把胜率和盈亏比提到一个新的高度才可以。笔者将持续研究,并随后与大家分享,同时欢迎朋友们批评指正。