3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,KDJ(随机指标)是广泛应用于股票与期货市场的动量指标。本文将详细介绍如何在 PTrade 量化平台上利用内置函数 get_KDJ 快速计算 KDJ 值,并实现一个典型的KDJ金叉买入、死叉卖出自动化交易策略。
get_KDJPTrade 提供了高效率的技术指标计算函数 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 类型的时间序列。以下是基于日线级别的完整策略代码,适用于 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)
get_history 时建议获取至少 50-100 根 K 线,避免数组过短导致指标不准确。set_commission 和 set_slippage 设置合理的交易成本,使回测效果更接近实盘场景。