作者:Stephan
趋势交易者 | 关注 #ETH 及 #Layer2 生态 | 程序员 | 热爱摇滚乐
Twitter:@StephanCptMax
Mirror: Stephan
如需转载请注明出处,给出原文链接地址,谢谢!
文中所有观点仅代表我的个人偏见,所有内容均不作为投资建议。请为自己的投资负责。
上一篇 定投策略之概念篇 里我们聊了为什么要定投、定投不能解决哪些问题,以及定投的几种分类。这一篇详细讲讲具体的定投策略,重点会展开讲我研发的EDCA量化策略、回测效果,以及使用该策略时需要注意的问题。
平均成本定投法(Dollar Cost Averaging),就是在定投周期内,固定时间间隔、且固定单次买入额。这个定投法只有买入逻辑,没有卖出逻辑。
如下图,无论价格上涨还是下跌,在固定周期每次都买入$100价值的股票:
限时限额加码停利定投法(Enhanced Dollar Cost Averaging),就是在定投周期内,依然以固定时间间隔投入,如果价格下跌则买入,且买入额随着价格跌幅扩大而线性扩大;如果价格上涨则卖出,卖出额随着价格涨幅扩大而线性扩大:
相比DCA,EDCA的几个特点:
市场下跌时买更多,理想情况下可以更好的压低平均成本。但由于我们无法预测下跌周期的长短,所以可能会出现市场只跌到半山腰,仓位就已用尽的情况(同样情况也会出现在卖出时)。这个特性既是EDCA的优点,也是EDCA的风险。所以要配合一定的周期判断、以及仓位管理能力去执行(投资新手不建议用EDCA)。
EDCA有卖出策略,使策略得以闭环。而DCA没有卖出逻辑,理论上不能称为一个完整的交易策略。当然,一般成熟的交易者会在DCA的基础上增加自己的卖出策略,而EDCA自带了卖出策略。
市场的涨跌会放大投资者的情绪,而陷入情绪中的主观交易者很难长期盈利。只有用量化策略将交易规则固定下来,无情的执行,才有长期盈利的可能。
基于EDCA的策略思想,我在TradingView上利用pine脚本开发了Linear EDCA策略,并且开源发布,任何人都可以使用(转载请注明出处):
本策略在TradingView中加载后,可以量化买卖周期、间隔、仓位,给出交易信号。如下图:
基于均线偏离度的买入卖出
策略默认以1100日SMA均线作为参考指标,计算当前收盘价距离均线的偏离度,价格在均线以下,偏离度越大买入仓位越大,价格在均线以上,偏离度越大卖出仓位越大:
买入和卖出采用不同的线性函数控制
币圈和美股,有明显的牛长熊短的特征,所以在熊市中买入的速率应该快一些,而在牛市中卖出的速率应该慢一些。所以,策略以两条单独的线性函数来分别控制买入和卖出速率。
如下图,以1%的仓位作为基准仓位,由于买入的线性函数斜率更陡峭,所以买入的速率会快一些;由于卖出的线性函数斜率更平缓,所以卖出的速率会慢一些:
控制不要过早卖出
由于均线采用的是超长周期的1100日均线,所以如果按照上述方式,在牛市前期还是会积累一定卖出量,导致牛市后期仓位已卖光:
所以为此增加了一个“卖出偏离度”的参数,用来控制牛市前期不要过早卖出,甚至如果有仓位的话,牛市前期的回调阶段可以小幅买入:
最终函数
综上所述,最终的两条线性函数是这样的:
买入函数:y = buySlope * deviation + 1
buySlope控制买入函数斜率,deviation作为均线偏离度代入,求得买入的倍率
卖出函数:y = sellSlope * deviation + sellOffset
sellSlope控制卖出函数斜率,deviation作为均线偏离度代入,求得卖出的倍率
默认仓位比率(defInvestRatio):以此比率作为基准仓位比率,将上述公式计算出的倍率*基准比率 得出本次定投的目标仓位
定买/定卖斜率(buySlope/sellSlope):两条线性函数的斜率,需要<0,值越小代表斜率越陡。一般设定买入斜率较小,卖出斜率较大
最大买入/卖出倍率(maxBuyRate/maxSellRate):用来控制最大买卖倍率,尤其是在大涨大跌时,可以避免单次交易仓位过重。
单次最大买入仓位=defInvestRatio*maxBuyRate(建议不要超过0.2)
单次最大卖出仓位=defInvestRatio*maxSellRate(建议不要超过0.15)
均线长度(maPeriod):均线用来控制买卖区间,对于不同周期的标的可能需要设置不同参数。比如币圈周期和贵金属的周期不同,需要设定不同的均线长度。但在同一个品类内的不同标的建议用一样的均线长度以避免过拟合。
回测时间周期相关参数:
Filter Date Range of Backtest: 回测时是否要打开日期范围限制开关
settle account on end: 如果打开了日期范围限制开关,在结束日之后是否平仓所持有的仓位平仓
startDate/endDate: 如果打开了日期范围限制开关,指定回测开始/结束日期
invest day of week: 每次在周几定投,1代表周一开盘,2代表周二开盘,以此类推
interval days: 每次定投之间的最小间隔天数,由于是按周计算,所以此数字必须是7或7的倍数
周期:2017-12-16 ~ 2022-09-16(一轮牛熊+当前熊市)
资金曲线:如下图,相比买入并持有至今(蓝色线),Linear EDCA的资金曲线更加平滑,由于有卖出逻辑帮助锁定利润,所以回撤极小(最大回撤0.51%),并且中后期开始跑赢买入并持有的收益(可能在下一轮牛市买入持有收益会再度高过本策略收益,但收益率差有缩小的趋势)
周期:2013-11-30 ~ 2022-09-16(两轮牛熊+当前熊市)
更长周期的回测来看,最大回撤依然很小(0.27%),后期大幅跑赢买入并持有的收益:
周期:2017-12-16 ~ 2022-09-16(一轮牛熊+当前熊市)
ETH的资金曲线同样比较平滑,且在中后期开始跑赢买入并持有的收益:
量化参数过拟合,是指的参数调优过于依赖以往固定周期的数据,导致未来策略的实盘表现和过去的回测表现差别较大的问题。也就是我们所说的历史不能预测未来的问题。这个问题我认为源于两种原因:
原因1:未来市场的长周期走势相比历史走势发生了很大变化,导致策略失效(比如4年减半行情失效,或者经济进入长期下行周期)
原因2:历史回测参数过于依赖单一周期,没有考虑到策略在不同周期、不同标的的适应性问题,也就是量化领域的参数平原和参数孤岛问题。具体可以参考:如何优雅地做策略优化
目前本策略的默认参数已经是调优后的结果,尽量规避了原因2,不做过度优化,并且进行过样本内和样本外的比较。但对于原因1目前我还没有想到很好的办法规避,只能是从仓位管理上,尽量不要把资金过于集中的分配给单一策略,做一些跨品类的风险对冲
本策略默认以BTC作为参数优化的对象,在应用其他标的时可能需要手动调整参数。以下给出参数调优的一般步骤:
第一步:回测周期的选择
回测周期应该尽量覆盖多轮牛熊,另外定投间隔的选择也会影响仓位的使用情况。一般来讲牛熊周期约长,定投间隔也要相应拉长。
第二步:均线的选择
在面对一个新的标的时,首先就应该从均线的调优入手。因为均线的作用是划分出买入和卖出的大致区间,所以均线需要能够覆盖到多轮长周期的熊市底部,底部空间不宜过大或过小,否则都有过拟合的可能。
第三步:仓位调优
通过调整默认仓位比率、买卖斜率、最大买卖倍率参数来控制买卖仓位。在调整过程中可以不断查看数据窗口中的当前仓位比率(positionPercent%),目的是在熊市后期仓位能尽量填满,在牛市后期仓位能尽量清空:
这里还是要注意过拟合的问题,不要纠结于单轮牛熊仓位是否利用到最优,而是要尽量能覆盖到多轮牛熊、多个同品类标的的表现情况。做全局调优而不是局部最优。
第四步:回测效果比较
回测效果不仅仅要看收益率表现,还要看回撤情况。最大可能回撤(Max Drawdown)和单笔最大亏损都是我比较关心的指标:
对于多套参数,可以通过比较 年化收益率/最大净值回撤 的比值来确定哪套参数的收益风险比更优。
在实盘使用时,需要注意以下几点:
第一:真实周期
根据计划的定投周期,修改StartDate/EndDate/IntevalDays等周期参数
第二:仓位跟随
在实盘使用此策略时,要注意每次策略给出信号时提示的仓位比例,依据此比例来规划下单计划
第三:平均成本
同时,可以计算实盘的平均成本,和策略计算的平均成本是否相符:
以上,我们详细讲述了:
DCA定投法与EDCA定投法的特性及区别
Linear EDCA策略原理详解和参数说明
给出Linear EDCA的BTC、ETH回测效果
在应用本策略时需要注意的事项
最后,还是要再强调一下,投资没有圣杯,也没有万能的策略。请做好你自己的风险控制,不要过于依赖单一策略。本策略只作为学习交流使用,不构成投资建议。同时,也欢迎量化领域的小伙伴关注我的 Twitter 跟我交流。