【Python量化实战宝典 #18】MACD 金叉死叉手册:DIF、DEA、柱体全拆解(Python 可跑)
手册定位:模块三第 2 篇。MACD 是均线的升级------DIF/DEA 双线 + 柱体,金叉死叉更细腻,还能看动能背离。本篇讲怎么算、怎么出信号。
数据来源复用 #02 历史K线(也可用
/hs/history/macd端点直出,本文演示自算以讲透)。
1. 你将得到什么
- MACD(DIF/DEA/柱体) 从 close 自己算的完整代码(EMA12/EMA26/信号9);
- 金叉/死叉 与柱体由负转正两类买点的生成;
- 背离判定的思路;
- MACD 的 4 个坑(参数适配、柱体噪声、零轴上下、与均线共振)。
2. 取数约定(复用)
| 信号 | 来源 | 见 |
|---|---|---|
| 日线 close | /hs/history/{代码}.{市场}/d/n |
#02 |
| MACD 直出 | /hs/history/macd/{代码}.{市场}/d/n |
#02 |
真实取数优先用
/hs/history/macd端点(已算好 DIF/DEA/柱);本文自算用于讲清原理。
3. 数据来源(复用,不重复罗列)
详见 #02 历史K线接口手册(日线 + 技术指标 MACD 端点)。
4. 核心模板函数(自包含可跑)
python
import pandas as pd
import numpy as np
_MOCK = True
def calc_macd(close, fast=12, slow=26, signal=9):
s = pd.Series(close)
ema_f = s.ewm(span=fast, adjust=False).mean()
ema_s = s.ewm(span=slow, adjust=False).mean()
dif = ema_f - ema_s
dea = dif.ewm(span=signal, adjust=False).mean()
hist = (dif - dea) * 2
return dif, dea, hist
def macd_signal(dif, dea):
"""金叉=持仓1,死叉=空仓0。"""
pos = ((dif > dea) & (dif.shift(1) <= dea.shift(1))).astype(int)
state = (dif > dea).astype(int)
return state, pos # state: 持续持仓;pos: 仅在金叉当根=1
def run_check():
close = [10, 10.3, 10.8, 11.2, 11.0, 10.6, 10.2, 10.5, 11.0, 11.6, 12.1, 12.0]
dif, dea, hist = calc_macd(close)
state, pos = macd_signal(dif, dea)
assert len(dif) == len(close) and not dif.isna().all()
assert state.iloc[-1] in (0, 1)
print("校验通过 | 末态持仓=%d 末根金叉=%d" % (state.iloc[-1], pos.iloc[-1]))
return dif, dea, hist, state
if __name__ == "__main__":
run_check()
5. 跑通示例
python
dif, dea, hist, state = run_check()
print("最近:", "多头" if state.iloc[-1] else "空头", " DIF=%.3f DEA=%.3f" % (dif.iloc[-1], dea.iloc[-1]))
6. 坑与注意事项
- 参数适配:A 股日线常用 12/26/9,但换周期(60 分)要重设,别直接套。
- 柱体噪声:柱体在零轴附近频繁伸缩,单独用易误判,要结合 DIF 方向。
- 零轴上下:零轴上金叉是强势确认,零轴下金叉是弱反弹,信号强度不同。
- 与均线共振:MACD 金叉 + 均线多头排列共振,胜率高于单独用 MACD。
7. 小结与下一篇预告
MACD 择时比均线更细腻。下一篇讲KDJ/BOLL 通道------超买超卖(KDJ)与布林带(BOLL)两种通道类指标。
下一篇预告:《【Python量化实战宝典 #19】KDJ、BOLL 通道手册:超买超卖与布林带(Python 可跑)》
8. 免责声明
本文为择时方法示例,演示数据为虚构,不构成投资建议。