← 返回《进阶量化交易实战:迭代式的量化策略研发》
📑 查看全课大纲(第 13 / 59 节)
  1. 1.量化投资必备基础知识
  2. 2.趋势型策略及模型原理
  3. 3.均值回复型策略及模型原理
  4. 4.配对交易策略及模型原理
  5. 5.量化策略研发流程与基本技能
  6. 6.常用的量化平台概述及如何选择
  7. 7.如何量化一个主观策略思路
  8. 8.常用技术指标及指标计算过程
  9. 9.如何编写指标代码
  10. 10.指标的物理意义
  11. 11.技术指标的应用技巧
  12. 12.更多的交易决策
  13. 13.编写程序去量化一个趋势型技术指标
  14. 14.编写趋势型技术指标的性能评价
  15. 15.策略对交易成本和持仓周期的影响
  16. 16.股票池策略的原理及基本框架
  17. 17.基于多因子分析的股票池设计与实现
  18. 18.股票池的性能评估
  19. 19.使用定制化财务因子构建股票池
  20. 20.趋势型策略原理及股票池机制的设计
  21. 21.趋势型择时信号的设计方法与编程实现
  22. 22.趋势型策略的回测与性能评估
  23. 23.优化趋势型策略的思路及方法
  24. 24.量化体系中的风险控制思想
  25. 25.风险的度量-波动率
  26. 26.常用的风险控制方法
  27. 27.实现止盈止损模块以提高策略性能
  28. 28.策略性能的评估与优化
  29. 29.探讨波动率与风险的关系
  30. 30.量化策略中的经典资金管理模型
  31. 31.用python编程实现资金管理模块
  32. 32.构建一个完善的量化交易策略
  33. 33.趋势型量化策略必备的期货知识
  34. 34.期货量化工具介绍
  35. 35.商品期货趋势型策略原理
  36. 36.用TB编写商品期货趋势型策略(上)
  37. 37.用TB编写商品期货趋势型策略(下)
  38. 38.分析优化商品期货趋势型策略的方法思路
  39. 39.期货交易策略的注意事项
  40. 40.均值回复型策略的原理
  41. 41.A股市场有没有稳定的均值回复效应?
  42. 42.编写一个均值回复型股票量化策略
  43. 43.编写多空组合策略进行策略改进
  44. 44.在策略中实现头寸管理进行策略优化
  45. 45.套利策略原理及常见套利类型
  46. 46.用MC开发一个跨品种套利交易策略(上)
  47. 47.用MC开发一个跨品种套利交易策略(下)
  48. 48.统计套利之股票配对交易策略
  49. 49.实盘中的细节问题:加减仓
  50. 50.关于高频交易
  51. 51.如何评价实盘量化策略的性能
  52. 52.量化系统的工作过程及研发流程
  53. 53.运气or实力
  54. 54.量化实盘交易需要满足什么条件
  55. 55.未来函数的坑
  56. 56.实盘数据接口异常的自动报警
  57. 57.交易系统的压力测试
  58. 58.自动运行的交易策略,什么时候需要人工干预
  59. 59.预案准备和实盘心理建设

编写程序去量化一个趋势型技术指标

约 38 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

编写程序去量化一个趋势型技术指标

小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。

在技术分析指标体系中,指数平滑异同移动平均线(Moving Average Convergence Divergence,简称 MACD)被誉为”指标之王”。许多交易者在图表软件中仅凭肉眼观察金叉死叉,但在构建工业级量化交易系统时,我们必须将模糊的图表形态转化为精确、可测试、无歧义的数学逻辑与矢量化代码。本讲将从底层数学推导出发,手把手实现 MACD 的交叉信号与顶底背离(Divergence)量化算法,并将经典期货平台(如 TB / MC)的指标公式无缝升级为现代 Python 向量化实现。


💡 核心导读

  • MACD 指标的三大核心数学构件
    • 离差值(DIF / Fast Line):快速与慢速指数移动平均线的差值: DIFt=EMA12(Closet)EMA26(Closet)DIF_t = EMA_{12}(Close_t) - EMA_{26}(Close_t)
    • 信号均线(DEA / Slow Line):对 DIF 进行平滑加权平均(通常取 9 日): DEAt=EMA9(DIFt)DEA_t = EMA_9(DIF_t)
    • 柱状图(MACD Histogram / Bar):DIF 与 DEA 差值的两倍放大,度量动能强弱: MACDBart=2×(DIFtDEAt)MACD_Bar_t = 2 \times (DIF_t - DEA_t)Bart=2×(DIFtDEAt)
  • 量化系统中的两大核心信号逻辑
    1. 交叉信号(Crossovers)
      • 金叉(Golden Cross)DIFt1DEAt1DIF_{t-1} \le DEA_{t-1}DIFt>DEAtDIF_t > DEA_t(多头动能增强);
      • 死叉(Death Cross)DIFt1DEAt1DIF_{t-1} \ge DEA_{t-1}DIFt<DEAtDIF_t < DEA_t(空头动能占据主导);
    2. 背离信号(Divergence,反转预警)
      • 底背离(Bullish Divergence):价格创出新低(Pricet<PricetNPrice_t < Price_{t-N}),但对应的 DIF 极值点并未创新低(DIFt>DIFtNDIF_t > DIF_{t-N}),预示下跌动能耗尽;
      • 顶背离(Bearish Divergence):价格创出新高(Pricet>PricetNPrice_t > Price_{t-N}),但对应的 DIF 极值点未能创新高(DIFt<DIFtNDIF_t < DIF_{t-N}),预示多头动能衰竭。
  • 多平台代码现代化重构
    • 传统 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 次
----------------------------------------------------------
量化精髓: 交叉定节奏,背离定强弱;代码实现严格向量化防未来函数!
==========================================================

本章小结

  1. 掌握 MACD 数学内涵:理解快速 EMA 与慢速 EMA 的差值扩散与收敛,把握趋势动量强弱。
  2. 区分交叉与背离维度:金叉死叉用于顺势捕捉趋势节奏,顶底背离用于前瞻预警动能衰竭。
  3. 推行向量化工程实现:摒弃传统低效单步循环,采用 Python ewm() 建立高并发、无未来函数的回测计算管线。

📋 行动清单 (Action Checklist)

  • 运行本讲 MACD 向量化代码,比对与通用行情软件盘面数值的一致性;
  • 尝试在代码中扩展顶背离检测逻辑,测试其对高位回调的预警胜率;
  • 预习下一节,探讨技术指标在多品种、不同持仓周期下的交易成本敏感性与衰减规律。

— 小象教研组

配套学习资源与课件
  • 第2章课件:从技术的角度重新认识技术指标(PDF · 1.8MB)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加课程顾问,免费获取网盘下载链接
微信二维码:扫码添加课程顾问微信扫码添加顾问