第一个策略:双均线趋势跟踪
本课目标:亲手实现一个最简单的双均线策略,走通”信号→持仓→收益”的完整回测流程,并理解它的局限。
很多人学量化的第一步是找”厉害的策略”,但更有价值的第一步,是把一个朴素到近乎简陋的策略完整做一遍。双均线趋势跟踪就是这样一个教学策略:规则简单、逻辑透明,几十行代码就能实现,却足以暴露回测流程里的所有关键环节——信息时点、交易成本、参数选择,一个都躲不掉。本文不构成投资建议,只用于演示研究方法。
策略假设:趋势会延续
任何策略背后都应该有一个可以被检验的假设。双均线策略的假设是:价格趋势一旦形成,会在一段时间内延续。如果最近的价格系统性地高于更早的价格,说明可能处于上升趋势中,顺着趋势持有比逆着趋势操作更有利。
注意,这只是一个假设,不是真理。趋势在某些市场、某些阶段明显,在另一些阶段则完全失效(比如长期横盘震荡时)。写下假设的好处是:回测结果不好时,你知道自己在检验什么、否定的是什么,而不是笼统地感叹”策略不行”。
为什么趋势可能延续?常见的解释有两类:一是信息扩散需要时间,重大变化不会在一天内被所有人消化,价格会分几步走到位;二是投资者的追涨行为会自我强化。反过来,趋势策略的天敌也很明确——横盘震荡时价格反复穿越均线,策略会不断地”高买低卖”,这种来回挨打俗称被震荡”磨损”。理解了这一点,你对后面的回测结果就不会感到意外。
交易规则:金叉买入,死叉卖出
我们用两条简单移动平均线(MA)来刻画”最近”和”更早”的价格水平:
| 名称 | 常见参数 | 含义 |
|---|---|---|
| 短均线 | 20 日 | 最近约一个月的平均价格 |
| 长均线 | 60 日 | 最近约一个季度的平均价格 |
规则只有两条:
- 短均线上穿长均线(俗称金叉):次日开盘买入并持有;
- 短均线下穿长均线(俗称死叉):次日开盘卖出,空仓等待。
标的建议先用一只宽基 ETF 来做实验,避免个股停牌、退市等复杂情况干扰你对流程本身的理解。也不建议一开始就加入止损、加仓等花样——先把最朴素的版本跑通,每一次改动才有清晰的对照基准。
回测流程:信号 → 持仓 → 收益
这是本课最重要的部分。回测的骨架永远是三步:
- 信号(signal):根据规则,在每一天算出”想要的状态”(持有=1,空仓=0);
- 持仓(position):信号要延迟生效。今天收盘才能算出的信号,最快明天才能变成持仓,所以要把信号整体后移一天;
- 收益(returns):策略每日收益 = 当日持仓 × 标的当日涨跌幅,再累乘得到净值曲线。
用 pandas 表达大致如下(示意代码,省略了数据读取和成本处理):
import pandas as pd
# close 是一个以日期为索引的收盘价 Seriesma_short = close.rolling(20).mean()ma_long = close.rolling(60).mean()
signal = (ma_short > ma_long).astype(int) # 1=想持有, 0=想空仓position = signal.shift(1).fillna(0) # 信号次日才生效,避免用到当日信息
daily_ret = close.pct_change().fillna(0)strategy_ret = position * daily_retequity = (1 + strategy_ret).cumprod() # 策略净值曲线其中 shift(1) 是新手最容易漏掉的一行。漏掉它,等于让你”今天收盘时穿越回今天开盘”下单,回测结果会漂亮得毫无意义。这类错误我们下一课会专门讲。
拿到净值曲线后,至少看三个指标:年化收益衡量赚钱速度,最大回撤衡量最惨时刻从高点跌下来多少,交易次数帮你估算成本的影响。别忘了同时画一条”买入并一直持有”的基准曲线——如果策略费了半天劲还不如躺着不动,那它就没有存在价值。另外要在收益里扣掉交易成本:每次买卖按一个固定费率从当日收益中减去,双均线策略交易不频繁,但成本处理的习惯要从第一个策略就养成。
参数敏感性:20/60 是不是”最优”
把参数从 (20, 60) 换成 (10, 50)、(30, 90),结果往往差别很大。这时新手容易走向两个极端:要么随手选一组,要么写循环把几百组参数全跑一遍、挑最好的那组。后者尤其危险——你挑出的很可能只是”最适合这段历史”的参数,换一段时间就失效。
务实的做法是:
- 只测少数几组有先验含义的参数(周/月/季度级别);
- 观察结果对参数是否平滑:好的策略在相邻参数下表现相近,而不是只有某一组特别好;
- 把”最优参数”看作警报而不是奖品——如果 (20, 60) 很好而 (19, 58) 很差,大概率你找到的是这段历史的巧合,而不是规律。
一个直观的检查方法是画”参数热力图”:横轴短均线周期、纵轴长均线周期、颜色代表回测收益。如果高收益区域连成一片平缓的高原,说明策略对参数不敏感,可信度更高;如果只有零星几个孤立的亮点,基本可以断定是运气。
这个策略教会我们什么
双均线策略在 A 股宽基指数上的历史表现,通常是”牛市能跟上、熊市能躲开一部分、震荡市反复挨打”。它未必能让你赚钱,但它教会你的东西是通用的:
- 策略 = 假设 + 规则 + 执行细节,三者缺一不可;
- 回测的本质是模拟”当时的你”只用”当时可得的信息”做决策;
- 参数不是越优越好,稳健比极致重要;
- 任何策略都有失效场景,知道它什么时候会难受,和知道它什么时候赚钱同样重要。
后面课程里的更复杂策略,骨架都和这三行 pandas 一样。把这个最小闭环做扎实,比囤十个看不懂的”高级策略”更有用。
本课小结
- 双均线策略的假设是趋势延续,规则是金叉持有、死叉空仓。
- 回测三步:信号、持仓(记得 shift)、收益,缺一不可。
shift(1)保证信号次日生效,是避免未来函数的第一道防线。- 参数扫描挑出的”最优参数”往往是过拟合,关注参数的平滑性更有意义。
- 教学策略的价值在于走通流程,而不是直接拿去实盘。
动手练习:选一只宽基 ETF 的日线数据,实现上面的双均线回测,分别跑 (10, 50)、(20, 60)、(30, 90) 三组参数,画出三条净值曲线,并回答:三组结果差异大吗?这说明了什么?