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

ptrade 量化平台:如何使用历史 K 线数据自定义计算 MACD 与 KDJ 指标?

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

问题描述

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

Title: ptrade 技术指标开发:自定义计算 MACD 与 KDJ 指标

Question: 如何在 ptrade 中使用历史 K 线数据手动计算 MACD 或 KDJ 指标?

解决方案

在 ptrade 量化交易平台中,计算 MACD(异同移动平均线)和 KDJ(随机指标)等技术指标通常分为两个步骤:通过 API 获取历史行情数据,然后调用 ptrade 内置的技术指标计算函数自行编写 NumPy/Pandas 算法进行手动计算


一、获取历史 K 线数据

在 ptrade 中,推荐使用 get_history 函数获取用于指标计算的历史行情数据(如收盘价、最高价、最低价)。

接口示例:

# 获取目标股票过去 100 天的 日线 close、high、low 数据
history_df = get_history(100, frequency='1d', field=['close', 'high', 'low'], security_list=['600570.SS'])

注意:进行技术指标计算时,需将 DataFrame/Series 转换为 NumPy 数组(.values),以匹配计算函数的入参要求。


二、使用 ptrade 内置函数计算指标

ptrade 框架提供了现成的技术指标计算 API,可直接传入数据数组进行高效计算。

1. 计算 MACD 指标

  • 接口get_MACD(close, short=12, long=26, m=9)
  • 入参close 为收盘价的 numpy.ndarray
  • 返回dif_data, dea_data, macd_data 序列

2. 计算 KDJ 指标

  • 接口get_KDJ(high, low, close, n=9, m1=3, m2=3)
  • 入参:最高价、最低价、收盘价的时间序列(numpy.ndarray)
  • 返回k_data, d_data, j_data 序列

三、完整策略示例源码

以下示例展示了如何在 handle_data 盘中事件中获取数据并计算 MACD 和 KDJ 的最新值:

def initialize(context):
    g.security = '600570.SS' # 恒生电子
    set_universe(g.security)

def handle_data(context, data):
    # 1. 获取过去 100 根 K 线的行情数据
    h = get_history(100, '1d', ['close', 'high', 'low'], security_list=g.security)
    
    # 2. 提取 numpy 数组
    close_data = h['close'].values
    high_data = h['high'].values
    low_data = h['low'].values
    
    # 3. 计算 MACD 指标
    macdDIF, macdDEA, macdHIST = get_MACD(close_data, short=12, long=26, m=9)
    current_dif = macdDIF[-1]
    current_dea = macdDEA[-1]
    current_macd = macdHIST[-1]
    
    # 4. 计算 KDJ 指标
    k_data, d_data, j_data = get_KDJ(high_data, low_data, close_data, n=9, m1=3, m2=3)
    current_k = k_data[-1]
    current_d = d_data[-1]
    current_j = j_data[-1]
    
    # 5. 打印最新指标结果
    log.info("股票: %s | MACD(DIF: %.3f, DEA: %.3f, MACD: %.3f) | KDJ(K: %.2f, D: %.2f, J: %.2f)" % 
             (g.security, current_dif, current_dea, current_macd, current_k, current_d, current_j))
    
    # 6. 编写基于指标的交易逻辑(示例:KDJ金叉买入)
    if k_data[-2] < d_data[-2] and current_k > current_d:
        cash = context.portfolio.cash
        if cash > 0:
            order_value(g.security, cash)
            log.info("KDJ金叉,买入标的 %s" % g.security)

四、常见开发注意事项

  1. 数据长度问题:MACD(EMA平滑)等指标具有累积效应,获取的历史数据条数(count)建议尽量长(如 100 根或以上),避免因为样本量过短导致计算出的 DIF/DEA 与同花顺、通达信等软件存在微小偏差。
  2. 数据数据类型:传递给 get_MACDget_KDJ 的入参必须是 numpy.ndarray 类型,若直接传入 Pandas DataFrame/Series 会导致报错。
  3. 多线程并发冲突:在 run_dailyrun_interval 定时任务中,请勿与 handle_data 同时调用 get_history,以防产生高并发竞争导致取数为空。