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

PTrade 平台如何编写 KDJ 与 RSI 双指标共振量化策略?(附 Python 源码)

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

问题描述



Title: PTrade 策略开发:结合 KDJ 与 RSI 构筑超买超卖共振系统

Question: 如何使用 ptrade 编写一个 KDJ 与 RSI 双指标共振的量化策略?

解决方案

PTrade 结合 KDJ 与 RSI 构筑超买超卖共振系统

在量化交易中,单一指标往往容易产生“钝化”或发出虚假信号。**KDJ(随机指标)对价格波动非常敏感,适合捕捉短期拐点;而RSI(相对强弱指标)**则能很好地衡量价格动能的强弱。将两者结合,当 KDJ 与 RSI 在超买或超卖区间产生共振时进行交易,能显著提高信号的准确率。

本指南将教你如何在 PTrade 平台中调用内置的技术指标计算函数 get_KDJget_RSI,编写一个完整的共振交易策略。


一、 策略逻辑设计

  1. 股票池设置:选择单只或多只流动性较好的股票(如恒生电子 600570.SS)。
  2. 数据获取:每日盘中获取过去 100 天的历史日线 K 线数据(包括 closehighlow)。
  3. 指标计算
    • 计算 KDJ(9, 3, 3) 的 K、D、J 值。
    • 计算 RSI(6) 的强弱值。
  4. 共振买入条件(超卖反弹)
    • RSI(6) < 20(处于严重超卖区)。
    • KDJ 出现金叉(K 值向上突破 D 值,且 J 值从低位回升)。
    • 满足上述条件时,全仓买入。
  5. 共振卖出条件(超买回落)
    • RSI(6) > 80(处于严重超买区)。
    • KDJ 出现死叉(K 值向下跌破 D 值)或当前价格低于 5 日均线。
    • 满足条件且持有仓位时,清仓卖出。

二、 PTrade 策略完整源码

# -*- coding: utf-8 -*-

def initialize(context):
    # 设置操作的股票:恒生电子
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 记录是否已买入标识
    g.has_position = False

def handle_data(context, data):
    security = g.security
    sid = g.security
    
    # 1. 获取过去100天的历史行情数据
    h = get_history(100, '1d', ['close', 'high', 'low'], security_list=security)
    if h is None or len(h) < 20:
        return
        
    # 提取 numpy 数组用于指标计算
    close_data = h['close'].values
    high_data = h['high'].values
    low_data = h['low'].values
    
    # 2. 计算 KDJ (9, 3, 3) 指标
    k_array, d_array, j_array = get_KDJ(high_data, low_data, close_data, n=9, m1=3, m2=3)
    k_val = k_array[-1]
    d_val = d_array[-1]
    j_val = j_array[-1]
    
    # 获取前一日的 KDJ 值用于判断金叉/死叉
    pre_k_val = k_array[-2]
    pre_d_val = d_array[-2]
    
    # 3. 计算 RSI (6) 指标
    rsi_array = get_RSI(close_data, n=6)
    rsi_val = rsi_array[-1]
    
    # 4. 获取当前账户现金与持仓状态
    cash = context.portfolio.cash
    current_position = get_position(security).amount
    
    # 5. 交易信号判断
    # 金叉判定:昨日 K <= D,今日 K > D
    is_gold_fork = (pre_k_val <= pre_d_val) and (k_val > d_val)
    # 死叉判定:昨日 K >= D,今日 K < D
    is_death_fork = (pre_k_val >= pre_d_val) and (k_val < d_val)
    
    # 买入共振:RSI 处于超卖区(<25) 且 KDJ 出现金叉
    if rsi_val < 25 and is_gold_fork and current_position == 0:
        # 全仓买入
        order_value(security, cash)
        log.info("【共振买入】RSI: %.2f, KDJ金叉(K:%.2f, D:%.2f)。买入: %s" % (rsi_val, k_val, d_val, security))
        
    # 卖出共振:RSI 处于超买区(>75) 且 KDJ 出现死叉
    elif (rsi_val > 75 or is_death_fork) and current_position > 0:
        # 清仓卖出
        order_target(security, 0)
        log.info("【共振卖出】RSI: %.2f, KDJ死叉(K:%.2f, D:%.2f)。卖出: %s" % (rsi_val, k_val, d_val, security))

三、 核心 API 函数解析

  • get_KDJ(high, low, close, n=9, m1=3, m2=3)
    PTrade 内置的技术指标函数。传入最高价、最低价和收盘价的 numpy.ndarray 序列,返回 K、D、J 三个时间序列数组。通过 [-1] 获取当前最新值,[-2] 获取上一个交易日的值。

  • get_RSI(close, n=6)
    内置的相对强弱指标计算函数。传入收盘价序列与周期(通常短期采用 6 日),返回 RSI 值的序列。

  • order_value(security, value)
    指定目标价值买入。在共振买入点,使用 context.portfolio.cash(当前可用资金)一键全仓买入目标标的。