【魔码量化工程实战进阶 #13】均线家族与多周期:MA-EMA-多周期共振
【魔码量化工程实战进阶 #13】均线家族与多周期:MA / EMA / 多周期共振
入门系列第 11 篇讲了"移动均线 MA",一行
rolling.mean()。本篇把均线讲深:MA 为什么滞后、EMA 怎么用递推解决滞后、多周期(5/20/60/250)怎么组合成"共振"信号,以及工程实现里最容易犯的未来函数错误。
本文你将得到什么
- MA 滞后的数学本质,和 EMA 递推公式为什么"更跟手"
- 多周期均线(5/20/60/120/250)的工程含义与"多头排列"信号
- 金叉/死叉的无未来函数写法(用差值符号变化,不用
>当前值) - 本机复核(合成序列 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 次死叉——符合随机游走下均线频繁纠缠的特征。
五、原理深挖:四个真实坑
- 未来函数(最致命):信号判定若用了"当天收盘价穿越当天均线"且当天就交易,等于用未实现的收盘下单。正确:穿越次日(
shift(1)确认)才交易,或盘中用实时快照(#07)触发。 - 均线滞后本质:EMA 缓解但不消除滞后。任何均线在拐点都会"慢半拍"——它适合趋势市,震荡市会反复被打脸(金叉死叉来回亏手续费)。
- 参数过拟合:在历史上调出"MA7/MA23 最赚"是幸存者偏差。参数要有经济含义(5=周、20=月、60=季),别为拟合而拟合。
- 多周期对齐:用不同周期均线时,确保每个都用后复权价(#09)且按交易日对齐(#08),否则周期错位信号失真。
六、小结
均线是量化的"第一把尺":MA 平滑但滞后,EMA 用递推加权更跟手,多周期排列表达趋势强度。工程上最要守住的是无未来函数——用 shift(1) 确认穿越,绝不拿当天值反推当天交易。下一篇把"价格"扩展到"波动与回撤",这是风控的尺子。
均线信号建立在干净的后复权日 K 上;魔码量化 Pro 包(完整历史 + 全市场实时)让多周期信号能从"单只试玩"扩展到"全市场扫描"。详见文末。
免责声明:本文所有示例数据仅用于接口演示,不构成任何投资建议;市场有风险,投资需谨慎。
系列持续更新中。 想要亲手跑通上面的代码?前往 魔码证书申请页 免费领取你的专属证书,复制即用、按次计费、稳定可用。
