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

ptrade 平台如何使用 KDJ 指标实现金叉买入与死叉卖出策略?(附 Python 源码)

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

问题描述

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

Title: ptrade KDJ 随机指标金叉死叉量化策略教程

Question: 如何在 ptrade 中使用 get_KDJ 接口实现金叉买入死叉卖出策略?

解决方案

一、KDJ 指标与金叉死叉策略原理

KDJ(随机指标)是量化交易中常用的动量指标,由 K 线、D 线和 J 线三条曲线组成。

  • 金叉(买入信号):当 K 线从下向上穿过 D 线,即前一周期 K < D 且当前周期 K > D,表明短期多头力量增强,产生买入信号。
  • 死叉(卖出信号):当 K 线从上向下穿过 D 线,即前一周期 K > D 且当前周期 K < D,表明短期空头力量增强,产生卖出信号。

二、ptrade 中 get_KDJ API 介绍

ptrade 提供了内置的内置计算函数 get_KDJ,用于快速获取随机指标的计算结果:

get_KDJ(high, low, close, n=9, m1=3, m2=3)

参数说明:

  • high:最高价的时间序列数据,numpy.ndarray 类型。
  • low:最低价的时间序列数据,numpy.ndarray 类型。
  • close:收盘价的时间序列数据,numpy.ndarray 类型。
  • n:计算 RSV 的周期,整数,默认为 9。
  • m1:K 值的平滑周期,整数,默认为 3。
  • m2:D 值的平滑周期,整数,默认为 3。

返回值:

  • k_data:K 值时间序列(numpy.ndarray)。
  • d_data:D 值时间序列(numpy.ndarray)。
  • j_data:J 值时间序列(numpy.ndarray)。

三、策略源码实现

以下是基于 ptrade 平台的完整 KDJ 金叉买入、死叉卖出策略代码:

def initialize(context):
    # 设置标的股票(以恒生电子为例)
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    security = g.security
    
    # 1. 获取过去 100 天的历史最高价、最低价和收盘价
    df = get_history(100, frequency='1d', field=['high', 'low', 'close'], security_list=security)
    if df is None or len(df) < 20:
        return
    
    high_data = df['high'].values
    low_data = df['low'].values
    close_data = df['close'].values
    
    # 2. 调用 ptrade 内置 get_KDJ 接口计算 KDJ 指标
    k_data, d_data, j_data = get_KDJ(high_data, low_data, close_data, n=9, m1=3, m2=3)
    
    # 获取前一周期与当前周期的 K 值和 D 值
    k_prev, k_curr = k_data[-2], k_data[-1]
    d_prev, d_curr = d_data[-2], d_data[-1]
    
    # 获取当前持仓与可用资金
    pos = get_position(security)
    cash = context.portfolio.cash
    
    # 3. 金叉判断:前一周期 K <= D 且 当前周期 K > D
    if k_prev <= d_prev and k_curr > d_curr:
        if pos.amount == 0 and cash > 0:
            # 全仓买入
            order_value(security, cash)
            log.info(f"【KDJ金叉买入】标的: {security}, 前期K: {k_prev:.2f}, D: {d_prev:.2f} | 当前K: {k_curr:.2f}, D: {d_curr:.2f}")
            
    # 4. 死叉判断:前一周期 K >= D 且 当前周期 K < D
    elif k_prev >= d_prev and k_curr < d_curr:
        if pos.amount > 0:
            # 清仓卖出
            order_target(security, 0)
            log.info(f"【KDJ死叉卖出】标的: {security}, 前期K: {k_prev:.2f}, D: {d_prev:.2f} | 当前K: {k_curr:.2f}, D: {d_curr:.2f}")

四、注意事项

  1. 数据长度要求get_history 获取的数据长度应大于 KDJ 的计算周期(建议至少 30 根 K 线以上),以确保指标计算的准确性。
  2. 钝化现象防护:KDJ 在强单边趋势行情中容易出现高位或低位钝化,建议配合 MACD、均线(MA)或超买超卖区间(如 K < 20 为超卖,K > 80 为超买)辅助过滤假信号。