🚀 AI 一键生成 ptrade 策略代码
立即体验

ptrade 平台如何编写 MACD 底背离自动买入策略?(附 Python 完整源码)

ptrade | 发布时间: 2026/8/3
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: ptrade 技术指标实战:MACD 背离自动识别策略编写

Question: 请帮我用 ptrade 编写一个 MACD 柱状图底背离自动买入策略

解决方案

ptrade 技术指标实战:MACD 背离自动识别策略编写

MACD 柱状图底背离是技术分析中经典的看涨反转信号。当股票价格创出新低,但 MACD 柱状图(绿柱)的低点却比前一次低点抬高时,即形成底背离。本文将介绍如何在 ptrade 量化交易平台中利用内置函数自动识别 MACD 柱状图底背离并执行买入操作。


策略逻辑说明

  1. 数据获取:每日盘中通过 get_history 获取标的前 N 个交易日的收盘价序列。
  2. 指标计算:调用 ptrade 内置技术指标函数 get_MACD(close_data, 12, 26, 9) 计算 DIF、DEA 及 MACD 柱状图(macd)序列。
  3. 背离判断
    • 寻找最近两次 MACD 绿柱谷底(局部最小值)。
    • 比较两次谷底对应的股票收盘价与 MACD 柱状图数值:
      • 价格:当前谷底收盘价 < 上次谷底收盘价(价格创新低)。
      • MACD 柱:当前谷底 MACD 柱 < 上次谷底 MACD 柱(柱状图负值变大/绿柱变短,即能量衰减)。
  4. 下单执行:触发底背离信号且当前无持仓时,使用 order_value 全仓买入。

ptrade 代码实现

def initialize(context):
    # 设置监控标的(以恒生电子 600570.SS 为例)
    g.security = '600570.SS'
    set_universe(g.security)
    # 策略全局变量
    g.history_count = 100

def handle_data(context, data):
    security = g.security
    
    # 1. 获取过去 100 天的收盘价历史数据
    df = get_history(g.history_count, '1d', 'close', security_list=security, fq='pre')    if df is None or df.empty:
        return
    
    # 单只股票返回的是 DataFrame,提取 close 数组
    close_data = df['close'].values
    
    # 2. 调用 ptrade 内置 MACD 计算函数
    # 返回:dif_data, dea_data, macd_data
    macd_dif, macd_dea, macd_bar = get_MACD(close_data, short=12, long=26, m=9)
    
    # 3. 寻找 MACD 绿柱谷底(局部最小值点)
    # macd_bar 为负数时代表绿柱
    trough_indices = []
    for i in range(2, len(macd_bar) - 1):
        # 满足局部最小值且为负值(绿柱谷底)
        if macd_bar[i] < 0 and macd_bar[i] < macd_bar[i-1] and macd_bar[i] < macd_bar[i+1]:
            trough_indices.append(i)
            
    # 如果谷底少于 2 个,无法构成背离比较
    if len(trough_indices) < 2:
        return
        
    # 获取最近的两个谷底索引
    last_trough = trough_indices[-1]
    prev_trough = trough_indices[-2]
    
    # 确保最近的谷底刚形成不久(如发生在最近 3 个交易日内),保证时效性
    if (len(macd_bar) - 1 - last_trough) > 3:
        return
        
    # 4. 判断底背离条件
    # 条件 1: 最近谷底的价格低于上一次谷底的价格(价格创新低)
    price_condition = close_data[last_trough] < close_data[prev_trough]
    # 条件 2: 最近谷底的 MACD 绿柱负值大于上一次谷底(绿柱变短,能量抬升)
    macd_condition = macd_bar[last_trough] > macd_bar[prev_trough]
    
    # 5. 执行买入逻辑
    cash = context.portfolio.cash
    current_position = get_position(security).amount
    
    if price_condition and macd_condition and current_position == 0:
        log.info("触发 MACD 柱状图底背离!前谷底价格: %s, 现谷底价格: %s" % (close_data[prev_trough], close_data[last_trough]))
        # 全仓买入股票
        order_value(security, cash)

核心函数解析

  1. get_MACD(close, short=12, long=26, m=9)

    • 功能:ptrade 内置的 MACD 指标计算函数,传入收盘价数组,直接返回 (dif, dea, macd) 三个一维 numpy.ndarray 数组。
    • 注意:函数返回的 macd 值为柱状图数值,正值为红柱,负值为绿柱。
  2. get_history(count, frequency, field, security_list, fq)

    • 功能:获取历史 K 线数据。此处获取 100 天的前复权(fq='pre')收盘价,确保技术指标计算连贯准确。
  3. order_value(security, value)

    • 功能:按指定金额下单买入标的,自动按照 100 股向下取整计算买入数量。

实战优化建议

  • 过滤停牌与涨跌停:在实盘环境中,建议结合 check_limitget_stock_status 过滤停牌或涨跌停标的。
  • 引入平仓/止损逻辑:策略中可结合 MACD 死叉或固定止损止盈比(如 5% 止损,10% 止盈)使用 order_target(security, 0) 及时平仓,降低风险。