定投策略之实践篇

作者:Stephan

趋势交易者 | 关注 #ETH 及 #Layer2 生态 | 程序员 | 热爱摇滚乐

Twitter:@StephanCptMax

Mirror: Stephan

如需转载请注明出处,给出原文链接地址,谢谢!

文中所有观点仅代表我的个人偏见,所有内容均不作为投资建议。请为自己的投资负责。

上一篇 定投策略之概念篇 里我们聊了为什么要定投、定投不能解决哪些问题,以及定投的几种分类。这一篇详细讲讲具体的定投策略,重点会展开讲我研发的EDCA量化策略、回测效果,以及使用该策略时需要注意的问题。

DCA定投法 vs EDCA定投法

DCA定投法

平均成本定投法(Dollar Cost Averaging),就是在定投周期内,固定时间间隔、且固定单次买入额。这个定投法只有买入逻辑,没有卖出逻辑。

如下图,无论价格上涨还是下跌,在固定周期每次都买入$100价值的股票:

EDCA定投法

限时限额加码停利定投法(Enhanced Dollar Cost Averaging),就是在定投周期内,依然以固定时间间隔投入,如果价格下跌则买入,且买入额随着价格跌幅扩大而线性扩大;如果价格上涨则卖出,卖出额随着价格涨幅扩大而线性扩大:

相比DCA,EDCA的几个特点:

  1. 市场下跌时买更多,理想情况下可以更好的压低平均成本。但由于我们无法预测下跌周期的长短,所以可能会出现市场只跌到半山腰,仓位就已用尽的情况(同样情况也会出现在卖出时)。这个特性既是EDCA的优点,也是EDCA的风险。所以要配合一定的周期判断、以及仓位管理能力去执行(投资新手不建议用EDCA)。

  2. EDCA有卖出策略,使策略得以闭环。而DCA没有卖出逻辑,理论上不能称为一个完整的交易策略。当然,一般成熟的交易者会在DCA的基础上增加自己的卖出策略,而EDCA自带了卖出策略。

市场的涨跌会放大投资者的情绪,而陷入情绪中的主观交易者很难长期盈利。只有用量化策略将交易规则固定下来,无情的执行,才有长期盈利的可能。

Linear EDCA策略

基于EDCA的策略思想,我在TradingView上利用pine脚本开发了Linear EDCA策略,并且开源发布,任何人都可以使用(转载请注明出处):

策略特性

本策略在TradingView中加载后,可以量化买卖周期、间隔、仓位,给出交易信号。如下图:

基于均线偏离度的买入卖出

策略默认以1100日SMA均线作为参考指标,计算当前收盘价距离均线的偏离度,价格在均线以下,偏离度越大买入仓位越大,价格在均线以上,偏离度越大卖出仓位越大:

买入和卖出采用不同的线性函数控制

币圈和美股,有明显的牛长熊短的特征,所以在熊市中买入的速率应该快一些,而在牛市中卖出的速率应该慢一些。所以,策略以两条单独的线性函数来分别控制买入和卖出速率。

如下图,以1%的仓位作为基准仓位,由于买入的线性函数斜率更陡峭,所以买入的速率会快一些;由于卖出的线性函数斜率更平缓,所以卖出的速率会慢一些:

控制不要过早卖出

由于均线采用的是超长周期的1100日均线,所以如果按照上述方式,在牛市前期还是会积累一定卖出量,导致牛市后期仓位已卖光:

所以为此增加了一个“卖出偏离度”的参数,用来控制牛市前期不要过早卖出,甚至如果有仓位的话,牛市前期的回调阶段可以小幅买入:

最终函数

综上所述,最终的两条线性函数是这样的:

  1. 买入函数:y = buySlope * deviation + 1
    buySlope控制买入函数斜率,deviation作为均线偏离度代入,求得买入的倍率

  2. 卖出函数:y = sellSlope * deviation + sellOffset
    sellSlope控制卖出函数斜率,deviation作为均线偏离度代入,求得卖出的倍率

参数说明

  1. 默认仓位比率(defInvestRatio):以此比率作为基准仓位比率,将上述公式计算出的倍率*基准比率 得出本次定投的目标仓位

  2. 定买/定卖斜率(buySlope/sellSlope):两条线性函数的斜率,需要<0,值越小代表斜率越陡。一般设定买入斜率较小,卖出斜率较大

  3. 最大买入/卖出倍率(maxBuyRate/maxSellRate):用来控制最大买卖倍率,尤其是在大涨大跌时,可以避免单次交易仓位过重。
    单次最大买入仓位=defInvestRatio*maxBuyRate(建议不要超过0.2)
    单次最大卖出仓位=defInvestRatio*maxSellRate(建议不要超过0.15)

  4. 均线长度(maPeriod):均线用来控制买卖区间,对于不同周期的标的可能需要设置不同参数。比如币圈周期和贵金属的周期不同,需要设定不同的均线长度。但在同一个品类内的不同标的建议用一样的均线长度以避免过拟合。

  5. 回测时间周期相关参数:

    1. Filter Date Range of Backtest: 回测时是否要打开日期范围限制开关

    2. settle account on end: 如果打开了日期范围限制开关,在结束日之后是否平仓所持有的仓位平仓

    3. startDate/endDate: 如果打开了日期范围限制开关,指定回测开始/结束日期

    4. invest day of week: 每次在周几定投,1代表周一开盘,2代表周二开盘,以此类推

    5. interval days: 每次定投之间的最小间隔天数,由于是按周计算,所以此数字必须是7或7的倍数

回测效果

BTC回测1

周期:2017-12-16 ~ 2022-09-16(一轮牛熊+当前熊市)

资金曲线:如下图,相比买入并持有至今(蓝色线),Linear EDCA的资金曲线更加平滑,由于有卖出逻辑帮助锁定利润,所以回撤极小(最大回撤0.51%),并且中后期开始跑赢买入并持有的收益(可能在下一轮牛市买入持有收益会再度高过本策略收益,但收益率差有缩小的趋势)

2017-12-16
2017-12-16

BTC回测2

周期:2013-11-30 ~ 2022-09-16(两轮牛熊+当前熊市)

更长周期的回测来看,最大回撤依然很小(0.27%),后期大幅跑赢买入并持有的收益:

2013-11-30
2013-11-30

ETH回测

周期:2017-12-16 ~ 2022-09-16(一轮牛熊+当前熊市)

ETH的资金曲线同样比较平滑,且在中后期开始跑赢买入并持有的收益:

2017-12-16
2017-12-16

参数过拟合问题

量化参数过拟合,是指的参数调优过于依赖以往固定周期的数据,导致未来策略的实盘表现和过去的回测表现差别较大的问题。也就是我们所说的历史不能预测未来的问题。这个问题我认为源于两种原因:

原因1:未来市场的长周期走势相比历史走势发生了很大变化,导致策略失效(比如4年减半行情失效,或者经济进入长期下行周期)

原因2:历史回测参数过于依赖单一周期,没有考虑到策略在不同周期、不同标的的适应性问题,也就是量化领域的参数平原和参数孤岛问题。具体可以参考:如何优雅地做策略优化

目前本策略的默认参数已经是调优后的结果,尽量规避了原因2,不做过度优化,并且进行过样本内和样本外的比较。但对于原因1目前我还没有想到很好的办法规避,只能是从仓位管理上,尽量不要把资金过于集中的分配给单一策略,做一些跨品类的风险对冲

使用注意

默认参数的调整

本策略默认以BTC作为参数优化的对象,在应用其他标的时可能需要手动调整参数。以下给出参数调优的一般步骤:

第一步:回测周期的选择

回测周期应该尽量覆盖多轮牛熊,另外定投间隔的选择也会影响仓位的使用情况。一般来讲牛熊周期约长,定投间隔也要相应拉长。

第二步:均线的选择

在面对一个新的标的时,首先就应该从均线的调优入手。因为均线的作用是划分出买入和卖出的大致区间,所以均线需要能够覆盖到多轮长周期的熊市底部,底部空间不宜过大或过小,否则都有过拟合的可能。

第三步:仓位调优

通过调整默认仓位比率、买卖斜率、最大买卖倍率参数来控制买卖仓位。在调整过程中可以不断查看数据窗口中的当前仓位比率(positionPercent%),目的是在熊市后期仓位能尽量填满,在牛市后期仓位能尽量清空:

这里还是要注意过拟合的问题,不要纠结于单轮牛熊仓位是否利用到最优,而是要尽量能覆盖到多轮牛熊、多个同品类标的的表现情况。做全局调优而不是局部最优。

第四步:回测效果比较

回测效果不仅仅要看收益率表现,还要看回撤情况。最大可能回撤(Max Drawdown)和单笔最大亏损都是我比较关心的指标:

对于多套参数,可以通过比较 年化收益率/最大净值回撤 的比值来确定哪套参数的收益风险比更优。

实盘使用

在实盘使用时,需要注意以下几点:

第一:真实周期

根据计划的定投周期,修改StartDate/EndDate/IntevalDays等周期参数

第二:仓位跟随

在实盘使用此策略时,要注意每次策略给出信号时提示的仓位比例,依据此比例来规划下单计划

第三:平均成本

同时,可以计算实盘的平均成本,和策略计算的平均成本是否相符:

总结

以上,我们详细讲述了:

  1. DCA定投法与EDCA定投法的特性及区别

  2. Linear EDCA策略原理详解和参数说明

  3. 给出Linear EDCA的BTC、ETH回测效果

  4. 在应用本策略时需要注意的事项

最后,还是要再强调一下,投资没有圣杯,也没有万能的策略。请做好你自己的风险控制,不要过于依赖单一策略。本策略只作为学习交流使用,不构成投资建议。同时,也欢迎量化领域的小伙伴关注我的 Twitter 跟我交流。

参考文章/视频

不仅定投,还能定卖!实用Python量化定投策略【邢不行】

如何找到收益率最大的策略回測參數。Tradingview策略參數優化

如何优雅地做策略优化?

Subscribe to Stephan
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.