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

PTrade 量化平台:基于 get_KDJ 的随机指标策略实现指南(附 Python 源码)

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

问题描述

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

Title: PTrade 技术指标开发:自定义 KDJ 指标策略实现指南

Question: 请帮我在 PTrade 中编写一个基于 get_KDJ 函数的随机指标金叉买入死叉卖出策略

解决方案

PTrade 基于 get_KDJ 的随机指标策略实现指南

在量化交易中,KDJ(随机指标)是广泛应用于股票与期货市场的动量指标。本文将详细介绍如何在 PTrade 量化平台上利用内置函数 get_KDJ 快速计算 KDJ 值,并实现一个典型的KDJ金叉买入、死叉卖出自动化交易策略。


1. 策略逻辑与核心 API 介绍

策略逻辑

  1. KDJ 金叉(买入信号):当 K 线从下向上穿过 D 线,且前一周期 $K < D$、当前周期 $K > D$ 时,全仓买入标的。
  2. KDJ 死叉(卖出信号):当 K 线从上向下穿过 D 线,且前一周期 $K > D$、当前周期 $K < D$ 时,平仓卖出持有的标的。

核心 API:get_KDJ

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, d_data, j_data),均为 numpy.ndarray 类型的时间序列。

2. PTrade 策略完整源码

以下是基于日线级别的完整策略代码,适用于 PTrade 回测与实盘运行:

# 导入必要的库
import numpy as np

def initialize(context):
    # 设置标的代码(以恒生电子 600570.SS 为例)
    g.security = '600570.SS'
    # 设置股票池
    set_universe(g.security)
    # 设置参考基准
    set_benchmark('000300.SS')
    # 打印日志
    log.info("策略初始化完成,标的: %s" % g.security)

def handle_data(context, data):
    security = g.security
    
    # 1. 获取过去 100 个交易日的历史 K 线数据(需要包含 high, low, close)
    df = get_history(100, frequency='1d', field=['high', 'low', 'close'], security_list=security)
    
    if df is None or len(df) < 20:
        return
    
    # 提炼出 numpy.ndarray 格式的数据
    # 针对 Python 3.11 及多标的情形,使用 query 提取单标的数据列
    sec_df = df.query('code in [@security]') if 'code' in df.columns else df
    high_data = sec_df['high'].values
    low_data = sec_df['low'].values
    close_data = sec_df['close'].values
    
    # 2. 调用 PTrade API 计算 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]
    
    # 3. 获取当前持仓与资金状态
    pos = get_position(security)
    cash = context.portfolio.cash
    current_price = data[security]['close']
    
    # 4. 判断金叉与死叉逻辑
    is_gold_cross = (k_prev < d_prev) and (k_curr > d_curr)
    is_dead_cross = (k_prev > d_prev) and (k_curr < d_curr)
    
    # 5. 执行交易操作
    if is_gold_cross and pos.amount == 0:
        # 全仓买入
        log.info("触发 KDJ 金叉,买入 %s,当前价格: %.2f" % (security, current_price))
        order_value(security, cash)
        
    elif is_dead_cross and pos.amount > 0:
        # 全仓卖出
        log.info("触发 KDJ 死叉,卖出 %s,当前价格: %.2f" % (security, current_price))
        order_target(security, 0)

3. 注意事项与优化建议

  1. 数据准备充分性:KDJ 指标需要一定的历史数据来进行平滑计算,调用 get_history 时建议获取至少 50-100 根 K 线,避免数组过短导致指标不准确。
  2. 超买超卖过滤:单一金叉/死叉容易在震荡市产生频繁假信号,可结合超买超卖区间进行过滤。例如:仅在 $K, D < 20$(低位/超卖区)发生的金叉买入,仅在 $K, D > 80$(高位/超买区)发生的死叉卖出。
  3. 滑点与佣金设置:回测时建议使用 set_commissionset_slippage 设置合理的交易成本,使回测效果更接近实盘场景。