# 定投策略之实践篇

By [Stephan](https://paragraph.com/@stephan-2) · 2022-11-13

---

> 作者：Stephan
> 
> 趋势交易者 | 关注 #ETH 及 #Layer2 生态 | 程序员 | 热爱摇滚乐
> 
> Twitter：[@StephanCptMax](https://twitter.com/StephanCptMax)
> 
> Mirror： [Stephan](https://mirror.xyz/0x7c3779A2F49c9e99Ed6875438D0FA70a753a8757)
> 
> _如需转载请注明出处，给出原文链接地址，谢谢！_
> 
> _文中所有观点仅代表我的个人偏见，_**_所有内容均不作为投资建议。请为自己的投资负责。_**

上一篇 [定投策略之概念篇](https://mirror.xyz/0x7c3779A2F49c9e99Ed6875438D0FA70a753a8757/MPj0pVoBghC8yz---hCg_UK3tGEe1GYCwehEeWWXudY) 里我们聊了为什么要定投、定投不能解决哪些问题，以及定投的几种分类。这一篇详细讲讲具体的定投策略，重点会展开讲我研发的EDCA量化策略、回测效果，以及使用该策略时需要注意的问题。

DCA定投法 vs EDCA定投法
-----------------

### DCA定投法

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

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

![](https://storage.googleapis.com/papyrus_images/897b6e3c2b2f10585e7f618e3c0ef41ed8803b27bbdf29d67804c4391c74f8f5.png)

### EDCA定投法

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

![](https://storage.googleapis.com/papyrus_images/594c00687033c924c999bc69b3df19dbb0695b8469ddcf4e03eb2f6cff365d13.png)

相比DCA，EDCA的几个特点：

1.  市场下跌时买更多，理想情况下可以更好的压低平均成本。但由于我们无法预测下跌周期的长短，所以可能会出现市场只跌到半山腰，仓位就已用尽的情况（同样情况也会出现在卖出时）。这个特性既是EDCA的优点，也是EDCA的风险。所以要配合一定的周期判断、以及仓位管理能力去执行（**投资新手不建议用EDCA**）。
    
2.  EDCA有卖出策略，使策略得以闭环。而DCA没有卖出逻辑，理论上不能称为一个完整的交易策略。当然，一般成熟的交易者会在DCA的基础上增加自己的卖出策略，而EDCA自带了卖出策略。
    

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

Linear EDCA策略
-------------

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

[https://cn.tradingview.com/script/xMtuW4V2/](https://cn.tradingview.com/script/xMtuW4V2/)

### 策略特性

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

![](https://storage.googleapis.com/papyrus_images/ba3884cc877738ad378a0bfc21d5ca0a5e33ced1af8d0238ed96a18c26e78343.png)

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

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

![](https://storage.googleapis.com/papyrus_images/059a8af13b943ec0a6a560c5d063856abd40db2a97842c0fc851f6ac158e2678.png)

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

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

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

![](https://storage.googleapis.com/papyrus_images/8d637f436ab01a31d1971aa697312ea3ab7a0ee9f8ccac07575ca2907d4461e1.png)

**控制不要过早卖出**

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

![](https://storage.googleapis.com/papyrus_images/70a6b780c4b07443b93f93260d809bfe950bfea6aac9e4624eb1f1be7cf12dfa.png)

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

![](https://storage.googleapis.com/papyrus_images/300eb41a1749041dffc833401b146b2f36c0677657266feca7ea5c5225d3840b.png)

**最终函数**

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

![](https://storage.googleapis.com/papyrus_images/75dba64e1ea80187b7d8d6d0008695f1d968cf3f1920acf8c9d79ac1d5fe23d8.png)

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 ](https://storage.googleapis.com/papyrus_images/9314308dce6359702560eeebde6bd75d1fd18b881e6220ac6850906a35ba215f.png)

2017-12-16

### BTC回测2

周期：2013-11-30 ~ 2022-09-16（两轮牛熊+当前熊市）

更长周期的回测来看，最大回撤依然很小（0.27%），后期大幅跑赢买入并持有的收益：

![2013-11-30 ](https://storage.googleapis.com/papyrus_images/e554917c99bc7a82f15ef1e0ad47d4347c36eca03238d48779f410e658a2081d.png)

2013-11-30

### ETH回测

周期：2017-12-16 ~ 2022-09-16（一轮牛熊+当前熊市）

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

![2017-12-16 ](https://storage.googleapis.com/papyrus_images/ac88abb9cb70fc1682f1b832ad827766a09c01fb207f97c7321e0b603e858f22.png)

2017-12-16

### 参数过拟合问题

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

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

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

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

使用注意
----

### 默认参数的调整

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

第一步：回测周期的选择

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

第二步：均线的选择

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

第三步：仓位调优

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

![](https://storage.googleapis.com/papyrus_images/f245e069d42b1b2eb602b4f780bde786ab382f004021d7a61dd69d210bc68b69.png)

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

第四步：回测效果比较

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

![](https://storage.googleapis.com/papyrus_images/0f88eec43afcb8917f414dc65e2f91032eb6f0ab601c53b6772ea12681759805.png)

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

### 实盘使用

在实盘使用时，需要注意以下几点：

第一：真实周期

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

第二：仓位跟随

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

第三：平均成本

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

![](https://storage.googleapis.com/papyrus_images/b5eee633eda7329cfee8c7716088c57b9e31b739a0eb1561fec4474bbd5ad971.png)

总结
--

以上，我们详细讲述了：

1.  DCA定投法与EDCA定投法的特性及区别
    
2.  Linear EDCA策略原理详解和参数说明
    
3.  给出Linear EDCA的BTC、ETH回测效果
    
4.  在应用本策略时需要注意的事项
    

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

参考文章/视频
-------

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

[![]({{DOMAIN}}/editor/youtube/play.png)](https://www.youtube.com/watch?v=9QERjmLYLFw)

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

[![]({{DOMAIN}}/editor/youtube/play.png)](https://www.youtube.com/watch?v=bvupBbaG_yw)

### 如何优雅地做策略优化？

[https://cyclegen.cloud/archives/196](https://cyclegen.cloud/archives/196)

---

*Originally published on [Stephan](https://paragraph.com/@stephan-2/G9qCzaHKaZuaDomrOgDT)*
