3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,单一指标往往容易产生“钝化”或发出虚假信号。**KDJ(随机指标)对价格波动非常敏感,适合捕捉短期拐点;而RSI(相对强弱指标)**则能很好地衡量价格动能的强弱。将两者结合,当 KDJ 与 RSI 在超买或超卖区间产生共振时进行交易,能显著提高信号的准确率。
本指南将教你如何在 PTrade 平台中调用内置的技术指标计算函数 get_KDJ 和 get_RSI,编写一个完整的共振交易策略。
600570.SS)。close、high、low)。# -*- 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))
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(当前可用资金)一键全仓买入目标标的。