问题描述
请帮我编写一个布林带策略,当价格触及下轨时买入,触及上轨时卖出。
解决方案
这是一个基于聚宽(JoinQuant)API编写的经典布林带(Bollinger Bands)均值回归策略。
策略逻辑
- 指标计算:
- 中轨:过去 N 天(通常为20天)的收盘价移动平均线。
- 上轨:中轨 + K倍(通常为2倍)标准差。
- 下轨:中轨 - K倍(通常为2倍)标准差。
- 交易信号:
- 买入:当当前价格跌破或触及下轨时,认为价格超跌,全仓买入。
- 卖出:当当前价格突破或触及上轨时,认为价格超买,清仓卖出。
策略代码
# -*- coding: utf-8 -*-
import jqdata
import numpy as np
def initialize(context):
"""
初始化函数,设定基准、股票池、参数等
"""
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 过滤掉order系列API产生的比error级别低的log
log.set_level('order', 'error')
# --- 策略参数设置 ---
# 要操作的标的(这里以平安银行为例)
g.security = '000001.XSHE'
# 布林带计算周期 (通常为20日)
g.n = 20
# 布林带宽度参数 (通常为2倍标准差)
g.k = 2
# 设定每天开盘时运行
run_daily(market_open, time='open')
def market_open(context):
"""
每日开盘运行的策略逻辑
"""
security = g.security
# 1. 获取历史数据
# 获取过去 g.n 天的收盘价数据(不包含今天,用于计算指标)
# 注意:attribute_history 获取的是前复权数据
hist_data = attribute_history(security, g.n, '1d', ['close'])
# 如果数据不足(例如新股上市),则跳过
if len(hist_data) < g.n:
return
close_prices = hist_data['close']
# 2. 计算布林带指标
# 计算中轨(均线)
mid_line = close_prices.mean()
# 计算标准差
std = close_prices.std()
# 计算上轨
upper_line = mid_line + g.k * std
# 计算下轨
lower_line = mid_line - g.k * std
# 3. 获取当前数据
# 获取当天的开盘价作为当前价格进行判断(也可以改用收盘价或分钟级价格)
current_data = get_current_data()[security]
current_price = current_data.day_open
# 获取当前账户资金和持仓
cash = context.portfolio.available_cash
position = context.portfolio.positions[security].total_amount
# 4. 交易逻辑
# 情况A: 价格跌破下轨,且当前无持仓 -> 买入
if current_price <= lower_line and position == 0:
# 全仓买入
order_value(security, cash)
log.info(f"价格({current_price})触及下轨({lower_line:.2f}),执行买入")
# 情况B: 价格突破上轨,且有持仓 -> 卖出
elif current_price >= upper_line and position > 0:
# 清仓卖出
order_target(security, 0)
log.info(f"价格({current_price})触及上轨({upper_line:.2f}),执行卖出")
# 5. 绘制图表(仅在回测结果页显示)
# 记录价格和布林带轨道,方便回测后查看可视化效果
record(Price=current_price, Upper=upper_line, Lower=lower_line, Mid=mid_line)
代码说明
initialize: 初始化设置。这里设置了标的为平安银行(000001.XSHE),你可以根据需要修改g.security为其他股票代码或指数ETF代码。attribute_history: 获取过去20天的收盘价,这是计算布林带的基础。- 指标计算: 利用
pandas的mean()和std()方法快速计算均值和标准差。 order_value/order_target: 聚宽的下单函数。order_value用于按金额买入,order_target用于调整持仓到指定数量(设为0即为清仓)。record: 这个函数会在回测结果的图表中画出布林带的三条线和股价,非常有助于验证策略是否按预期执行。
注意事项
- 回测频率:此代码使用的是
run_daily,即按日回测。如果你需要更精细的盘中触及即买入(例如分钟级),需要将逻辑移至handle_data并选择分钟级回测。 - 风险提示:布林带策略属于震荡市策略。在单边剧烈上涨或下跌的趋势行情中,该策略可能会过早卖出(踏空)或在下跌途中过早买入(接飞刀)。实际使用时通常需要结合趋势指标(如MACD)进行过滤。