请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  量化平台 帖子:3364716 新帖:3

期货 AdaptiveMA自适应均线

醒掌天下权发表于:5 月 10 日 04:50回复(1)

网上关于AMA均线,也就是考夫曼Perry.J.Kaufman的自适应均线系统描已经不少了,其核心就是根据波动率来自适应周期,但是很清晰地说明白各个模块的原理,以及很简单地使用python平台写出来,好像存在诸多限制,基于TB或者文华财经和MC的模型源码很多,我觉得国内三大矿,在聚宽平台上写最合适。

今天仅写一个简单的交易框架,并且是在日频上,不涉及到bar内穿价成交,也不涉及到过于复杂的其他优化逻辑,希望给聚宽的各位新手和大神们一些新思路,这类模型你们一定接触过很多,但是要解决移仓换月等诸多问题,依然需要代码精细处理。

AMA自适应均线原理和优势

由 SMA、WMA、EMA 均线的计算公式可知,其不同交易日的权重是相对固定的,因此虽然三种均线都可以在一定程度上把握趋势,但是却很难根据市场变化去进行调整,进而更好的适应和把握趋势。

自适应移动平均AdaptiveMovingAverage,它通过思路非常清晰的构造,计算方向性和波动性,完成了类似调节均线参数的效果。

方向性direction = ratio_price - price[10] ;
波动性volatility = Summation( Abs(price - price1), 10);
ER效率系数Efficiency_Ratio = Abs(direction / volatility) ;

ER的构造是AMA均线的核心。这个均线的设计者佩里?考夫曼,针对美国股票市场,设定了两个周期参数2日和30日,他希望均线值在这两个值之间变化。

21.png

22.png

AMA能自适应的秘密在于ER效率系数,Efficiency_Ratio是方向性和波动率的比值。ER较高时意味着趋势较为显著,它不仅考虑方向,还考虑波动,当波动率过大时,ER系数相应降低,对于趋势的强度描述性也随之下降。

具体到AMA和过滤器的关系,我看过濮元恺老师的公众号和书中《量化投资技术分析实战》也对AMA系统有描述,我还去要过一个源码,这张图片应该能解答这个模块的设计疑问。

2222.png

按照课程中的讲解,完整AMA系统的交易规则很简单,当两日AMA值之差大于过滤器,做多,小于过滤器,做空。

标准差过滤器像是一个控制系统,驾驭着AMA自适应均线,你可以理解为AMA均线是汽车的引擎,而标准差过滤器是汽车的变速箱

23.png

那么这两部分,的确是可以通过调参,来优化整套系统,使它更为贴合市场走势。在这里我们分别选择了标准差部分的的过滤器系数fliterSet和AMA部分的ER周期参数,因为商品期货各品种趋势度不同,所以fliterSet肯定应该差别对待。而ER周期参数也因为各品种的K线数目不同,和计算一个阶段的波动率周期不同,可以区别对待。

对于商品期货的测试效果 你应该很满意

还是保持了和我演示的双均线模型一样的基础设置:

# 设定账户为金融账户
set_subportfolios([SubPortfolioConfig(cash=context.portfolio.starting_cash, type='futures')])
# 期货类每笔交易时的手续费是:买入时万分之0.23,卖出时万分之0.23,平今仓为万分之23
set_order_cost(OrderCost(open_commission=0.00005, close_commission=0.00005,close_today_commission=0.00005), type='index_futures')
# 设定保证金比例
set_option('futures_margin_rate', 0.15)
# 设置滑点(单边万5,双边千1)
set_slippage(PriceRelatedSlippage(0.001),type='future')

在AMA值的计算方面,我偷了懒,没有再用基础的模型,一点一点计算ER效率系数,计算AMA值,而是使用了TA-LIB:

KAMA - Kaufman Adaptive Moving Averagereal = KAMA(close, timeperiod=30)

24.png

通过介绍可以看到,我把价格通过attribute_history提出来之后,直接使用了g.AMA[IndexFuture] = talib.KAMA(close,g.Window)。

但是按照之前在其他软件建模的经验,AMA值应该可以调节的参数还有:最大周期和最小周期,但是我没找到这两个参数的调节方案,所以估计用了默认值2和30。考虑到我们测试的依然是商品期货日线周期,所以这两个值是合理的。

在止损方面,我们使用了基于ATR的追踪止损,虽然是上周期close驱动,在新周期open发单,但是依然是有效的,毕竟很多时候,追踪止损的出场速度比AMA本体要快很多很多。

25.png

这个模型虽然有参数 ,但是参数风险非常低,完全可控,我们做了参数优化,按照这个帖子的方法:https://www.joinquant.com/post/4351?tag=algorithm

顺便说一句,聚宽的参数优化并不方便啊,不能直接在模型里做,要进入到研究平台去调用回测,学了很多次才学会,但是学会发现效果还行,如果速度能像本地PC上运行的软件那样就更好了,python还是慢。

参数优化细节部分,我是这样写的:

回报周期测试

pa.get_backtest_data(file_name = 'results_days.pkl',
running_max = 10,
start_date = '2012-01-01',
end_date = '2018-12-05',
frequency = 'day',
initial_cash = '10000000',
param_names = ['FilterTimes','Window'],
param_values = [[0.1,0.2,0.3],[10,15,20]]
)

可惜给我们这种免费的loser用户,聚宽只给10个CPU线程,真心不够用,我只能放大间隔来做测试了,'FilterTimes'是过滤器强度,应该在0.1足够,考夫曼原版也是这样写的。'Window'是模型里的几个窗口期,发现商品期货,在10日的窗口基本够用。

多组测试的资金曲线如图:

26.png

最佳组的资金曲线如图:

27.png

虽然听说和专业机构做的还有很大差距,但是我感觉也不错,年化收益25%以上,最大回撤可控,为什么这样的模型不能实盘呢,再优化一些止损细节,资金管理模块,完全可以实盘去交易。

建议各位测试更多品种,可能会有更好的结果,我选了10个从基本面上看,动量会持续比较强的,但是也不能保证它们以后都强,所以说择品种这个事非常难做,倾向于在建模时候,使用非常大数量的品种,比如超过30个来做模型,得到的统计特征可以稳定一些。

总之AMA是个好东西,择时有效,在商品这种动量很强的品种上,对了,你还可以试试股指,国债期货,也是同样有效的。

全部回复

0/140

量化课程

    移动端课程