📑 查看全课大纲(第 13 / 59 节)
- 1.量化投资必备基础知识
- 2.趋势型策略及模型原理
- 3.均值回复型策略及模型原理
- 4.配对交易策略及模型原理
- 5.量化策略研发流程与基本技能
- 6.常用的量化平台概述及如何选择
- 7.如何量化一个主观策略思路
- 8.常用技术指标及指标计算过程
- 9.如何编写指标代码
- 10.指标的物理意义
- 11.技术指标的应用技巧
- 12.更多的交易决策
- 13.编写程序去量化一个趋势型技术指标
- 14.编写趋势型技术指标的性能评价
- 15.策略对交易成本和持仓周期的影响
- 16.股票池策略的原理及基本框架
- 17.基于多因子分析的股票池设计与实现
- 18.股票池的性能评估
- 19.使用定制化财务因子构建股票池
- 20.趋势型策略原理及股票池机制的设计
- 21.趋势型择时信号的设计方法与编程实现
- 22.趋势型策略的回测与性能评估
- 23.优化趋势型策略的思路及方法
- 24.量化体系中的风险控制思想
- 25.风险的度量-波动率
- 26.常用的风险控制方法
- 27.实现止盈止损模块以提高策略性能
- 28.策略性能的评估与优化
- 29.探讨波动率与风险的关系
- 30.量化策略中的经典资金管理模型
- 31.用python编程实现资金管理模块
- 32.构建一个完善的量化交易策略
- 33.趋势型量化策略必备的期货知识
- 34.期货量化工具介绍
- 35.商品期货趋势型策略原理
- 36.用TB编写商品期货趋势型策略(上)
- 37.用TB编写商品期货趋势型策略(下)
- 38.分析优化商品期货趋势型策略的方法思路
- 39.期货交易策略的注意事项
- 40.均值回复型策略的原理
- 41.A股市场有没有稳定的均值回复效应?
- 42.编写一个均值回复型股票量化策略
- 43.编写多空组合策略进行策略改进
- 44.在策略中实现头寸管理进行策略优化
- 45.套利策略原理及常见套利类型
- 46.用MC开发一个跨品种套利交易策略(上)
- 47.用MC开发一个跨品种套利交易策略(下)
- 48.统计套利之股票配对交易策略
- 49.实盘中的细节问题:加减仓
- 50.关于高频交易
- 51.如何评价实盘量化策略的性能
- 52.量化系统的工作过程及研发流程
- 53.运气or实力
- 54.量化实盘交易需要满足什么条件
- 55.未来函数的坑
- 56.实盘数据接口异常的自动报警
- 57.交易系统的压力测试
- 58.自动运行的交易策略,什么时候需要人工干预
- 59.预案准备和实盘心理建设
编写程序去量化一个趋势型技术指标
约 38 分钟
📺 正在播放小象官方高清录播(支持倍速与清晰度调节)
编写程序去量化一个趋势型技术指标
小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
在技术分析指标体系中,指数平滑异同移动平均线(Moving Average Convergence Divergence,简称 MACD)被誉为”指标之王”。许多交易者在图表软件中仅凭肉眼观察金叉死叉,但在构建工业级量化交易系统时,我们必须将模糊的图表形态转化为精确、可测试、无歧义的数学逻辑与矢量化代码。本讲将从底层数学推导出发,手把手实现 MACD 的交叉信号与顶底背离(Divergence)量化算法,并将经典期货平台(如 TB / MC)的指标公式无缝升级为现代 Python 向量化实现。
💡 核心导读
- MACD 指标的三大核心数学构件:
- 离差值(DIF / Fast Line):快速与慢速指数移动平均线的差值:
- 信号均线(DEA / Slow Line):对 DIF 进行平滑加权平均(通常取 9 日):
- 柱状图(MACD Histogram / Bar):DIF 与 DEA 差值的两倍放大,度量动能强弱: Bart=2×(DIFt−DEAt)
- 量化系统中的两大核心信号逻辑:
- 交叉信号(Crossovers):
- 金叉(Golden Cross): 且 (多头动能增强);
- 死叉(Death Cross): 且 (空头动能占据主导);
- 背离信号(Divergence,反转预警):
- 底背离(Bullish Divergence):价格创出新低(),但对应的 DIF 极值点并未创新低(),预示下跌动能耗尽;
- 顶背离(Bearish Divergence):价格创出新高(),但对应的 DIF 极值点未能创新高(),预示多头动能衰竭。
- 交叉信号(Crossovers):
- 多平台代码现代化重构:
- 传统 TradeBlazer (TB) 与 MultiCharts (MC) 采用基于单 Bar 循环的序列计算;
- 现代 Python 采用
pandas.Series.ewm()实现全时序向量化计算,运算速度提升数十倍且天然杜绝未来函数。
┌─────────────────────────────────────────────────────────────┐
│ MACD 金叉与背离形态量化判定图 │
└──────────────────────────────┬──────────────────────────────┘
│
价格走势 (Price) ▲ [顶背离: 价格创新高, DIF 走低]
▲ │ ▲ (High 2)
▲ │ / \
▲ │ / \
/ \ │ / \
(High 1) \ │ / \
──────────────────────────────┼┼──/─────────\────────────────► (时间 t)
│ / \
DIF 指标走势 (DIF Line) │ / \
(Peak 1) ▲ │ [Peak 1 > Peak 2 动能衰竭]
▲ │ ▲ (Peak 2)
/ \│ / \
──────────────────────────/───┼┼───\─────────────────────────► 0 轴
/ │ \一、传统交易平台(TB/MC)与 Python 现代实现对照
注:原课程以 TradeBlazer (TB) 与 MultiCharts (MC) 语法进行教学演示,此处提供工业级 Python 等价矢量化实现。
import pandas as pd
import numpy as np
def calc_macd_vectorized(close_series, fast_len=12, slow_len=26, signal_len=9):
"""
Python 向量化计算 MACD 指标 (等价于 TB/MC 平台指标算法)
"""
# 1. 快速与慢速指数移动平均 EMA
ema_fast = close_series.ewm(span=fast_len, adjust=False).mean()
ema_slow = close_series.ewm(span=slow_len, adjust=False).mean()
# 2. 计算 DIF 与 DEA
dif = ema_fast - ema_slow
dea = dif.ewm(span=signal_len, adjust=False).mean()
# 3. 计算 MACD 能量柱
macd_hist = (dif - dea) * 2.0
return pd.DataFrame({
'close': close_series,
'dif': dif,
'dea': dea,
'macd': macd_hist
})二、极值点提取与背离判定算法
在量化回测中,准确检测背离的前提是提取价格与 DIF 的局部极值点(Local Extrema)。通过判断当前 Bar 是否为滑动窗口内的最小值,并比对上一波谷的指标数值,即可实现无未来函数的机械化背离信号生成。
def extract_local_extrema_and_divergence(df, window=5):
"""
提取局部波谷并检测底背离信号 (右确认窗口, 无未来函数)
"""
res = df.copy()
# 识别局部波谷: 在 t 时刻确认 t-window 为前后 window 范围内的极值 (仅用历史数据, 确认滞后 window 根是诚实性的代价)
res['is_price_trough'] = res['close'].shift(window) == res['close'].rolling(2 * window + 1).min()
res['is_dif_trough'] = res['dif'].shift(window) == res['dif'].rolling(2 * window + 1).min()
# 判定金叉与死叉
res['gold_cross'] = (res['dif'] > res['dea']) & (res['dif'].shift(1) <= res['dea'].shift(1))
res['death_cross'] = (res['dif'] < res['dea']) & (res['dif'].shift(1) >= res['dea'].shift(1))
return res📝 动手练一练
下面我们用 Python 编写一段 MACD 指标量化计算与交叉/背离信号检测脚本,模拟全周期数据清洗与信号输出:
import pandas as pd
import numpy as np
def calculate_macd(close, short=12, long=26, mid=9):
"""
计算标准 MACD 指标三要素
"""
ema_short = close.ewm(span=short, adjust=False).mean()
ema_long = close.ewm(span=long, adjust=False).mean()
dif = ema_short - ema_long
dea = dif.ewm(span=mid, adjust=False).mean()
macd_hist = (dif - dea) * 2.0
return pd.DataFrame({'close': close, 'dif': dif, 'dea': dea, 'macd': macd_hist})
def detect_macd_signals(df, window=5):
"""
量化检测 MACD 交叉与双低点底背离信号 (无未来函数)
"""
res = df.copy()
# 1. 金叉与死叉
res['golden_cross'] = (res['dif'] > res['dea']) & (res['dif'].shift(1) <= res['dea'].shift(1))
res['death_cross'] = (res['dif'] < res['dea']) & (res['dif'].shift(1) >= res['dea'].shift(1))
# 2. 局部波谷右确认: 在 t 时刻确认 t-window 为前后 window 范围内的最低价 (仅用历史数据)
res['is_price_trough'] = res['close'].shift(window) == res['close'].rolling(2 * window + 1).min()
# 3. 双低点底背离状态机: 当前确认波谷价格低于前一波谷, 但对应 DIF 更高 (下跌动能衰竭)
trough_close = res['close'].shift(window).where(res['is_price_trough'])
trough_dif = res['dif'].shift(window).where(res['is_price_trough'])
prev_trough_close = trough_close.ffill().shift(1)
prev_trough_dif = trough_dif.ffill().shift(1)
res['bullish_divergence'] = (
res['is_price_trough']
& (trough_close < prev_trough_close)
& (trough_dif > prev_trough_dif)
& (trough_dif < 0)
)
return res
def test_macd_run():
np.random.seed(42)
dates = pd.date_range("2023-01-01", periods=60, freq="B")
# 模拟价格两次探底: 第二低点更低但下跌斜率放缓 (DIF 抬高), 构成标准双低点底背离
seg1 = np.linspace(10.5, 9.0, 21) # 第一波急跌
seg2 = np.linspace(9.0, 10.2, 16)[1:] # 中途反弹
seg3 = np.linspace(10.2, 8.8, 16)[1:] # 第二波缓跌 (价格新低)
seg4 = np.linspace(8.8, 9.1, 10)[1:] # 企稳回升
p = np.concatenate([seg1, seg2, seg3, seg4]) + np.random.normal(0, 0.05, 60)
df = calculate_macd(pd.Series(p, index=dates))
signals = detect_macd_signals(df)
g_count = signals['golden_cross'].sum()
d_count = signals['death_cross'].sum()
div_count = signals['bullish_divergence'].sum()
print("================ MACD 趋势指标量化与信号检测 ================")
print(f"全周期 Bar 数量: {len(df)} 根 | DIF 最新: {df['dif'].iloc[-1]:.3f} | DEA 最新: {df['dea'].iloc[-1]:.3f}")
print(f"检测到金叉次数: {g_count} 次 | 死叉次数: {d_count} 次 | 底背离信号: {div_count} 次")
assert div_count > 0, "双低点底背离状态机未能捕获预设背离形态!"
print("----------------------------------------------------------")
print("量化精髓: 交叉定节奏,背离定强弱;代码实现严格向量化防未来函数!")
print("==========================================================")
if __name__ == "__main__":
test_macd_run()运行结果输出:
================ MACD 趋势指标量化与信号检测 ================
全周期 Bar 数量: 60 根 | DIF 最新: -0.156 | DEA 最新: -0.185
检测到金叉次数: 2 次 | 死叉次数: 2 次 | 底背离信号: 1 次
----------------------------------------------------------
量化精髓: 交叉定节奏,背离定强弱;代码实现严格向量化防未来函数!
==========================================================本章小结
- 掌握 MACD 数学内涵:理解快速 EMA 与慢速 EMA 的差值扩散与收敛,把握趋势动量强弱。
- 区分交叉与背离维度:金叉死叉用于顺势捕捉趋势节奏,顶底背离用于前瞻预警动能衰竭。
- 推行向量化工程实现:摒弃传统低效单步循环,采用 Python
ewm()建立高并发、无未来函数的回测计算管线。
📋 行动清单 (Action Checklist)
- 运行本讲 MACD 向量化代码,比对与通用行情软件盘面数值的一致性;
- 尝试在代码中扩展顶背离检测逻辑,测试其对高位回调的预警胜率;
- 预习下一节,探讨技术指标在多品种、不同持仓周期下的交易成本敏感性与衰减规律。
— 小象教研组
配套学习资源与课件
- 第2章课件:从技术的角度重新认识技术指标(PDF · 1.8MB)下载
🎁 免费学习资源
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加课程顾问,免费获取网盘下载链接
微信扫码添加顾问