3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
这是一个基于 CCI (Commodity Channel Index,顺势指标) 的量化交易策略。
CCI 指标主要用于衡量股价是否超出常态分布范围。本策略采用经典的 超买超卖反转逻辑:
def initialize(context):
"""
初始化函数,设置股票池和全局变量
"""
# 设置我们要操作的股票,这里以恒生电子为例
g.security = '600570.SS'
# 设置股票池
set_universe(g.security)
# CCI指标的计算周期,通常为14
g.n = 14
# 设置回测频率为日线
# 注意:实际运行时请在回测界面选择"日线"频率
def handle_data(context, data):
"""
盘中运行函数,每个单位时间(如每天)运行一次
"""
security = g.security
# 1. 过滤停牌股票
# 如果股票停牌(is_open为0),则跳过不处理
if data[security].is_open == 0:
return
# 2. 获取历史行情数据
# 获取过去 100 天的数据,确保有足够的数据计算 CCI
# 需要 high, low, close 三个字段
h = get_history(100, '1d', ['high', 'low', 'close'], security_list=security)
# 提取数据为 numpy 数组
high_data = h['high'].values
low_data = h['low'].values
close_data = h['close'].values
# 3. 计算 CCI 指标
# PTrade 内置了 get_CCI 函数,直接调用即可
# 注意:虽然文档有时简写,但 get_CCI 标准调用需要 high, low, close, n
cci_values = get_CCI(high_data, low_data, close_data, g.n)
# 确保计算结果有效
if cci_values is None or len(cci_values) < 2:
return
# 获取当前周期和上一周期的 CCI 值
curr_cci = cci_values[-1]
prev_cci = cci_values[-2]
# 4. 获取当前持仓和资金情况
position = get_position(security)
cash = context.portfolio.cash
current_price = data[security].close
# 5. 交易逻辑
# 买入逻辑:CCI 上穿 -100 (前值 < -100 且 当前值 > -100)
# 且当前没有持仓
if prev_cci < -100 and curr_cci > -100:
if position.amount == 0:
# 全仓买入
order_value(security, cash)
log.info("买入信号触发: CCI上穿-100 (前值: %.2f, 现值: %.2f)" % (prev_cci, curr_cci))
# 卖出逻辑:CCI 下穿 +100 (前值 > 100 且 当前值 < 100)
# 且当前持有股票
elif prev_cci > 100 and curr_cci < 100:
if position.amount > 0:
# 清仓卖出
order_target(security, 0)
log.info("卖出信号触发: CCI下穿+100 (前值: %.2f, 现值: %.2f)" % (prev_cci, curr_cci))
数据获取 (get_history):
high)、最低价 (low) 和收盘价 (close)。指标计算 (get_CCI):
get_CCI(high, low, close, n) 函数。这是最高效的方法,无需手动编写公式。g.n 设置为 14,这是 CCI 的标准参数。信号判断:
prev_cci < -100 and curr_cci > -100。这通常意味着市场处于超卖状态后的修复阶段,是一个潜在的买点。prev_cci > 100 and curr_cci < 100。这通常意味着市场处于超买状态后的回调阶段,是一个潜在的卖点。交易执行:
order_value 进行按金额买入(示例中为全仓)。order_target 进行卖出(目标仓位设为 0 即为清仓)。data[security].is_open 判断,避免在停牌日下单导致废单。Q: 如何修改 CCI 的计算周期?
A: 在 initialize 函数中,修改 g.n = 14 这一行,将 14 改为您想要的数字(例如 20 或 9)。
Q: 这个策略可以用于分钟级别回测吗?
A: 可以。代码逻辑是通用的。您只需要在 PTrade 回测界面的配置中,将运行频率从“日线”改为“分钟”即可。get_history 会自动获取分钟级别的 K 线数据。
Q: 为什么使用 get_history 获取 100 条数据而不是 14 条?
A: 虽然 CCI 周期是 14,但技术指标通常需要更多的数据来平滑计算结果(特别是涉及移动平均的计算)。获取更多数据(如 100 条)可以确保计算出的当前 CCI 值与看盘软件上的数值一致。