3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,单一技术指标极易产生伪信号(如震荡指标在趋势行情中钝化,或趋势指标在震荡行情中频繁止损)。为了提高择时的准确率,使用多指标共振(Multi-Indicator Resonance)是一种经典且有效的策略设计思路。
本文将基于 PTrade 平台内置的技术指标计算函数(get_KDJ、get_RSI、get_CCI),构建一个包含超买超卖与趋势反转验证的多指标共振策略。
在 PTrade 平台中,可以通过 get_history 获取历史行情高开低收数据,然后直接调用内置的 get_KDJ、get_RSI、get_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)
get_history 返回的 DataFrame 需提取 .values 为 numpy.ndarray 格式,符合 PTrade 计算 API 的入参标准。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 序列。get_position(security).amount 检查持仓状态,避免每分钟/每日反复触发重复下单。before_trading_start 中使用 filter_stock_by_status 剔除 ST、停牌及退市股票,确保策略运行稳健。