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

PTrade 平台如何构建多指标共振策略?融合 KDJ、RSI 与 CCI(附 Python 完整源码)

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

问题描述

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

Title: PTrade 多指标组合策略:融合 KDJ、RSI 与 CCI 指算共振信号

Question: 如何在 PTrade 中结合 get_KDJ、get_RSI 和 get_CCI 构建一个多指标共振策略?

解决方案

PTrade 多指标组合策略:融合 KDJ、RSI 与 CCI 共振信号

在量化交易中,单一技术指标极易产生伪信号(如震荡指标在趋势行情中钝化,或趋势指标在震荡行情中频繁止损)。为了提高择时的准确率,使用多指标共振(Multi-Indicator Resonance)是一种经典且有效的策略设计思路。

本文将基于 PTrade 平台内置的技术指标计算函数(get_KDJget_RSIget_CCI),构建一个包含超买超卖与趋势反转验证的多指标共振策略。


一、三大技术指标分析与共振逻辑

  1. KDJ(随机指标):敏感度高,擅长捕捉短期拐点。当 K 线由下向上穿过 D 线形成“金叉”时为买入信号;反之为卖出信号。
  2. RSI(相对强弱指标):测量价格涨跌动能。当 RSI 从超卖区(如 < 30)回升突破 30 时表明动能转强;从超买区(如 > 70)跌破 70 时表明动能衰竭。
  3. CCI(顺势指标):专门识别常态与极端行情。当 CCI 上穿 -100 轴时,代表价格脱离超卖区域进入常态区,确认止跌企稳。

共振买卖信号定义

  • 买入共振信号(多头触发)
    1. KDJ 形成金叉($K > D$ 且上一周期 $K ext{前}
      eq D ext{前}$)。
    2. RSI 摆脱超卖区($RSI > 30$)。
    3. CCI 脱离极端超卖区($CCI > -100$)。
  • 卖出共振信号(空头平仓)
    1. KDJ 形成死叉($K < D$)。
    2. 或 RSI 处于高位超买区域($RSI > 70$)。

二、PTrade 策略源码实现

在 PTrade 平台中,可以通过 get_history 获取历史行情高开低收数据,然后直接调用内置的 get_KDJget_RSIget_CCI 函数进行计算。

def initialize(context):
    # 设置标的股票(以恒生电子为例)
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 策略参数设置
    g.kdj_n, g.kdj_m1, g.kdj_m2 = 9, 3, 3
    g.rsi_n = 6
    g.cci_n = 14

def handle_data(context, data):
    security = g.security
    
    # 1. 获取过去 100 天的历史价格数据
    h = get_history(100, '1d', ['close', 'high', 'low'], security_list=security)
    if h.empty:
        return
        
    high_data = h['high'].values
    low_data = h['low'].values
    close_data = h['close'].values
    
    # 2. 调用 PTrade 官方指标 API 计算技术指标
    k_arr, d_arr, j_arr = get_KDJ(high_data, low_data, close_data, g.kdj_n, g.kdj_m1, g.kdj_m2)
    rsi_arr = get_RSI(close_data, g.rsi_n)
    cci_arr = get_CCI(high_data, low_data, close_data, g.cci_n)
    
    # 取得最新与上一个周期的指标值
    k_curr, k_prev = k_arr[-1], k_arr[-2]
    d_curr, d_prev = d_arr[-1], d_arr[-2]
    rsi_curr = rsi_arr[-1]
    cci_curr = cci_arr[-1]
    
    # 获取当前持仓与资金
    pos = get_position(security).amount
    cash = context.portfolio.cash
    current_price = data[security]['close']
    
    # 3. 判断共振买入条件
    # 条件1: KDJ 金叉
    kdj_gold_cross = (k_prev <= d_prev) and (k_curr > d_curr)
    # 条件2: RSI 离开超卖区
    rsi_valid = rsi_curr > 30
    # 条件3: CCI 脱离极端低位
    cci_valid = cci_curr > -100
    
    # 三指标共振全满足且当前无持仓时全仓买入
    if kdj_gold_cross and rsi_valid and cci_valid and pos == 0:
        log.info("【买入共振】KDJ金叉,RSI(%s)>30,CCI(%s)>-100" % (rsi_curr, cci_curr))
        order_value(security, cash)
        
    # 4. 判断卖出/止损条件
    # 条件1: KDJ 死叉;条件2: RSI 超买警示
    kdj_death_cross = (k_prev >= d_prev) and (k_curr < d_curr)
    rsi_overbought = rsi_curr > 70
    
    if (kdj_death_cross or rsi_overbought) and pos > 0:
        log.info("【卖出信号】KDJ死叉或RSI超买,触发平仓")
        order_target(security, 0)

三、代码核心解读

  1. 数据获取与格式转换
    get_history 返回的 DataFrame 需提取 .valuesnumpy.ndarray 格式,符合 PTrade 计算 API 的入参标准。
  2. 内置计算函数优势
    • get_KDJ(high, low, close, n, m1, m2):返回 K、D、J 的 ndarray 序列。
    • get_RSI(close, n):返回 RSI 值的 ndarray 序列。
    • get_CCI(high, low, close, n):返回 CCI 值的 ndarray 序列。
  3. 防重复报单机制
    结合 get_position(security).amount 检查持仓状态,避免每分钟/每日反复触发重复下单。

四、实盘及回测优化建议

  • 引入滑动止损:多指标组合常用于择时,配合最高价回调止损(Trailing Stop)能更好地锁定利润。
  • 股票池过滤:在 before_trading_start 中使用 filter_stock_by_status 剔除 ST、停牌及退市股票,确保策略运行稳健。