← 返回博客列表

【魔码量化工程实战进阶 #13】均线家族与多周期:MA-EMA-多周期共振

2026年08月31日 18:04 · 魔码数服 · 魔码量化工程实战进阶

【魔码量化工程实战进阶 #13】均线家族与多周期:MA / EMA / 多周期共振

入门系列第 11 篇讲了"移动均线 MA",一行 rolling.mean()。本篇把均线讲深:MA 为什么滞后、EMA 怎么用递推解决滞后、多周期(5/20/60/250)怎么组合成"共振"信号,以及工程实现里最容易犯的未来函数错误。

本文你将得到什么

  1. MA 滞后的数学本质,和 EMA 递推公式为什么"更跟手"
  2. 多周期均线(5/20/60/120/250)的工程含义与"多头排列"信号
  3. 金叉/死叉的无未来函数写法(用差值符号变化,不用 > 当前值)
  4. 本机复核(合成序列 seed=42):末日价 90.72,MA5=90.03,EMA12=89.90,金叉 1 / 死叉 1

一、痛点:均线会"迟到"

MA 是"过去 N 天平均",天然滞后。N 越大越平滑也越迟钝——等 250 日均线拐头,趋势都走完一半了。新手还常写出未来函数

signal = (ma5 > ma20).astype(int)   # 看起来对,但回测里 ma20 用了"未来"吗?

其实单纯 ma5 > ma20 不算未来函数(都是已收盘值)。真正的未来函数藏在"用当天收盘价判断当天买卖、却拿不到当天信号"的错位里——见第五节。


二、工程方案:MA 与 EMA

MA(简单移动平均)MA(N) = mean(close[-N:]),每个点权重相等,滞后明显。

EMA(指数移动平均):给近期更高权重,递推计算,几乎不存历史:

EMA(t) = α·close(t) + (1−α)·EMA(t−1),  α = 2/(span+1)

EMA 的"半衰期"约 span/2.885 天——EMA12 约 4 天半就把旧值忘掉一半,比 MA12 跟手得多。

import pandas as pd
s = pd.Series(close)                       # close: 收盘价序列
ma5  = s.rolling(5).mean()
ema12 = s.ewm(span=12, adjust=False).mean() # adjust=False 用递推式,工程常用

多周期:用不同 span 的均线表达不同时间尺度: - MA5 / MA10:短线 - MA20(月线):波段 - MA60(季线):中期趋势 - MA120 / MA250(年线):长期牛熊

"多头排列"= MA5 > MA20 > MA60 > MA250,是趋势最强的结构。


三、金叉 / 死叉(无未来函数写法)

金叉 = 短线上穿长线。用两者差值的符号变化判定,绝不用"当前是否大于":

diff = ma5 - ema12
# 前一天 diff<0 且今天 diff>=0 → 金叉(上穿)
cross_up = (diff.shift(1) < 0) & (diff >= 0)
# 前一天 diff>0 且今天 diff<=0 → 死叉(下穿)
cross_dn = (diff.shift(1) > 0) & (diff <= 0)

shift(1) 是关键:信号在穿越发生后的第二天才确认,避免用"当天值"反推"当天买卖"造成的隐性未来函数。


四、本机复核(合成序列 seed=42,纯标准库/pandas 计算)

我用一段 60 天合成价格序列(随机游走,仅演示指标行为,非真实行情)计算:

末日价   = 90.72
MA5      = 90.03
EMA12    = 89.90
金叉次数 = 1
死叉次数 = 1

末日 MA5(90.03) > EMA12(89.90),短期均线在长期之上,呈短多结构;整段出现 1 次金叉、1 次死叉——符合随机游走下均线频繁纠缠的特征。


五、原理深挖:四个真实坑

  1. 未来函数(最致命):信号判定若用了"当天收盘价穿越当天均线"且当天就交易,等于用未实现的收盘下单。正确:穿越次日(shift(1) 确认)才交易,或盘中用实时快照(#07)触发。
  2. 均线滞后本质:EMA 缓解但不消除滞后。任何均线在拐点都会"慢半拍"——它适合趋势市,震荡市会反复被打脸(金叉死叉来回亏手续费)。
  3. 参数过拟合:在历史上调出"MA7/MA23 最赚"是幸存者偏差。参数要有经济含义(5=周、20=月、60=季),别为拟合而拟合。
  4. 多周期对齐:用不同周期均线时,确保每个都用后复权价(#09)且按交易日对齐(#08),否则周期错位信号失真。

六、小结

均线是量化的"第一把尺":MA 平滑但滞后,EMA 用递推加权更跟手,多周期排列表达趋势强度。工程上最要守住的是无未来函数——用 shift(1) 确认穿越,绝不拿当天值反推当天交易。下一篇把"价格"扩展到"波动与回撤",这是风控的尺子。

均线信号建立在干净的后复权日 K 上;魔码量化 Pro 包(完整历史 + 全市场实时)让多周期信号能从"单只试玩"扩展到"全市场扫描"。详见文末。


免责声明:本文所有示例数据仅用于接口演示,不构成任何投资建议;市场有风险,投资需谨慎。

系列持续更新中。 想要亲手跑通上面的代码?前往 魔码证书申请页 免费领取你的专属证书,复制即用、按次计费、稳定可用。

想亲自试一下?免费获取证书
客服微信
客服微信二维码