cicikml 发布于2018-12-07
回复 54
浏览 28055
307
网上关于AMA均线,也就是考夫曼Perry.J.Kaufman的自适应均线系统描已经不少了,其核心就是根据波动率来自适应周期,但是很清晰地说明白各个模块的原理,以及很简单地使用python平台写出来,好像存在诸多限制,基于TB或者文华财经和MC的模型源码很多,我觉得国内三大矿,在聚宽平台上写最合适。
今天仅写一个简单的交易框架,并且是在日频上,不涉及到bar内穿价成交,也不涉及到过于复杂的其他优化逻辑,希望给聚宽的各位新手和大神们一些新思路,这类模型你们一定接触过很多,但是要解决移仓换月等诸多问题,依然需要代码精细处理。
**AMA自适应均线原理和优势**
由 SMA、WMA、EMA 均线的计算公式可知,其不同交易日的权重是相对固定的,因此虽然三种均线都可以在一定程度上把握趋势,但是却很难根据市场变化去进行调整,进而更好的适应和把握趋势。
自适应移动平均AdaptiveMovingAverage,它通过思路非常清晰的构造,计算方向性和波动性,完成了类似调节均线参数的效果。
方向性direction = ratio_price - price[10] ;
波动性volatility = Summation( Abs(price - price[1]), 10);
ER效率系数Efficiency_Ratio = Abs(direction / volatility) ;
ER的构造是AMA均线的核心。这个均线的设计者佩里•考夫曼,针对美国股票市场,设定了两个周期参数2日和30日,他希望均线值在这两个值之间变化。
![21.png][1]
![22.png][2]
AMA能自适应的秘密在于ER效率系数,Efficiency_Ratio是方向性和波动率的比值。ER较高时意味着趋势较为显著,它不仅考虑方向,还考虑波动,当波动率过大时,ER系数相应降低,对于趋势的强度描述性也随之下降。
具体到AMA和过滤器的关系,我看过濮元恺老师的公众号和书中《量化投资技术分析实战》也对AMA系统有描述,我还去要过一个源码,这张图片应该能解答这个模块的设计疑问。
![2222.png][3]
按照课程中的讲解,完整AMA系统的交易规则很简单,当两日AMA值之差大于过滤器,做多,小于过滤器,做空。
标准差过滤器像是一个**控制系统,驾驭着AMA自适应均线,你可以理解为AMA均线是汽车的引擎,而标准差过滤器是汽车的变速箱**。
![23.png][4]
那么这两部分,的确是可以通过调参,来优化整套系统,使它更为贴合市场走势。在这里我们分别选择了标准差部分的的过滤器系数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][5]
通过介绍可以看到,我把价格通过attribute_history提出来之后,直接使用了g.AMA[IndexFuture] = talib.KAMA(close,g.Window)。
但是按照之前在其他软件建模的经验,AMA值应该可以调节的参数还有:最大周期和最小周期,但是我没找到这两个参数的调节方案,所以估计用了默认值2和30。考虑到我们测试的依然是商品期货日线周期,所以这两个值是合理的。
在止损方面,我们使用了基于ATR的追踪止损,虽然是上周期close驱动,在新周期open发单,但是依然是有效的,毕竟很多时候,追踪止损的出场速度比AMA本体要快很多很多。
![25.png][6]
这个模型虽然有参数 ,但是参数风险非常低,完全可控,我们做了参数优化,按照这个帖子的方法: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][7]
最佳组的资金曲线如图:
![27.png][8]
虽然听说和专业机构做的还有很大差距,但是我感觉也不错,年化收益25%以上,最大回撤可控,为什么这样的模型不能实盘呢,再优化一些止损细节,资金管理模块,完全可以实盘去交易。
建议各位测试更多品种,可能会有更好的结果,我选了10个从基本面上看,动量会持续比较强的,但是也不能保证它们以后都强,所以说择品种这个事非常难做,倾向于在建模时候,使用非常大数量的品种,比如超过30个来做模型,得到的统计特征可以稳定一些。
总之AMA是个好东西,择时有效,在商品这种动量很强的品种上,对了,你还可以试试股指,国债期货,也是同样有效的。
[1]: https://image.joinquant.com/fc73485a387725f82ee64f9746069d87
[2]: https://image.joinquant.com/e0073ad3a784a1a4b3e70092689c67e2
[3]: https://image.joinquant.com/b8c575ddd574abc02af2f93539219974
[4]: https://image.joinquant.com/6faa98c6b484dfb628b94a7221c2be21
[5]: https://image.joinquant.com/751cc82c6292301a9dccc3afe73045fa
[6]: https://image.joinquant.com/a11bbbbe91c32217cc74aeac16ea04d7
[7]: https://image.joinquant.com/7831fe6332c34685df1ef0aa8c5b0f4f
[8]: https://image.joinquant.com/30ed9b903c28e60e034c07a6cc532647
评论
搞不明白,聚宽的期货,为什么一定要我输入一个基准?
做期货没基准啊!我只能输入银华日利……
2018-12-07
@cicikml 收到您的建议,我们已经反馈给产品经理了
2018-12-07
这是我的支付宝二维码,你们别只是copy模型,做伸手党啊。
赏点钱吧,大佬们。也算是支持我这个学生党继续做研究,我们主要兴趣和模型积累,都在衍生品方面。
![webwxgetmsgimg.jpg][1]
[1]: https://image.joinquant.com/dbc1ba9a7d02258f38e0289dc552c2b0
2018-12-07
社区支持打赏哦~可以点击文章末尾“感谢作者”试试!
2018-12-07
都有这么高收益了,还发支付宝二维码干嘛。。。。股市里面都是钱。。
2018-12-08
@eyehorizon 我们做期货的本金很少,如果很少的钱做一个品种,无法ATR风险头寸,也无法获得稳健的收益率……
再说啦,打赏的钱是无风险收益率。感谢昨天晚上给我打赏19元的小伙伴,希望这个模型对你有帮助,但是只有这一笔。
btw:这个模型如果使用了bar内止损,效果会更好。目前是盘后止损。
2018-12-09
@cicikml
做一个盘中开仓、平仓的策略吧!
2018-12-09
@cicikml 朋友,你好,是否可以加我个微信,有个想法想请你帮忙实现,当然是有偿的哈,396547532,谢谢!
2018-12-09
@tjfree 谢谢大神,本周考完试,下周再写几个模型。争取写容易看懂。
2018-12-10
@wwwlll 好!我最近问了一个聚宽内部的IT,说正在改进,让系统支持方便地bar内交易。如果OK了,我就出策略。
2018-12-11
原版的过滤器是前后两周期AMA差值的方差。你直接使用g.Window周期内AMA的方差,效果上有什么差别?当然,你的过滤器系数不一样,还发现了什么区别吗?
然后,发现原版AMA还是有一个问题,即正常买入以后有一定概率第二天就卖(非止损),卖出以后有一定概率第二天就买。这个问题看看有没有很好的解决办法。
2018-12-11
@最爱苹果 我试过以较短的窗口期去计算AMA差值的方差,发现2周期肯定是不行的,统计标准差方差至少要10~20个交易日的样本数据。
依然是这部分,使用AMA差值的标准差,还是AMA值的标准差,我的测试结果是,两者都可以。
为了和网上大多数资料同步,让过滤器系数在0.1左右,我采用的是直接计算AMA值的标准差。
2018-12-11
@最爱苹果 我暂时没有遇到过,买入或卖出后,第二天就反向的情况,如果这样,说明过滤器部分过于敏感了,或者AMA线的周期太短,过于敏感了。
2018-12-11
@cicikml 那个第二天就反向的问题,我把你的策略回测以后把交易记录导出来,仔细看,还是有这样的情况,只是比原版单品种的情况要少。我试过用WR等其他指标来过滤,不过交易信号少了,收益也下降了。
2018-12-11
@cicikml 哦,我又仔细看了濮大的书,果然他书里写的是差值的标准差,但是附的TB代码计算的是AMA的标准差。跟你说的一样。
2018-12-11
@zhushuhong 我说的【真实合约】就是历史上,每个月的主力合约,和次主力合约,和所有可交易的合约。指数合约,是按照计算规则加权得到的,主力连续合约,是直接把每个阶段的主力连起来。
2018-12-13
@cicikml 谢谢大佬解释!!!!!
2018-12-13