量化策略均值回归策略——布林带突破策略
Xiao
Xiao
策略核心逻辑
基于“价格围绕价值中枢波动”的均值回归理论:当价格偏离均 ...
量化策略均值回归策略——布林带突破策略
Xiao
Xiao
策略核心逻辑
基于“价格围绕价值中枢波动”的均值回归理论:当价格偏离均值过远时会向均值回归,而布林带(Bollinger Bands)通过“中轨(均值)+上下轨(标准差通道)”量化这种偏离程度,捕捉短期超买/超卖后的反转机会。
•中轨:N日移动平均线(代表价格“价值中枢”);
•上轨:中轨 + k倍N日收盘价标准差(代表“超买压力位”,价格触及上轨后易回落);
•下轨:中轨 - k倍N日收盘价标准差(代表“超卖支撑位”,价格触及下轨后易反弹);
•交易信号:价格突破上轨→做空(预期回落);价格跌破下轨→做多(预期反弹);价格回归中轨附近→平仓。
参数设定
•标的:高波动性品种(如加密货币BTC/USDT、商品期货螺纹钢、高换手率股票),或震荡特征明显的ETF(如中证500ETF,代码510500);
•时间周期:日线/小时线(日内交易可选15分钟/30分钟线);
•布林带参数:N=20日(常用周期,平衡灵敏度与稳定性),k=2(2倍标准差覆盖约95%的价格波动,经典设置);
•初始资金:10万元(可自定义);
•手续费:0.03%(买入)+0.13%(卖出,含印花税),滑点0.1%(模拟实际成交偏差)。
策略步骤
1. 数据准备
获取标的的K线数据(需包含日期、收盘价,若做日内交易需更细粒度数据如15分钟线)。
2. 计算布林带指标
•中轨(MB):20日收盘价的简单移动平均线(SMA20);
•标准差(STD):20日收盘价的标准差(衡量价格波动幅度);
•上轨(UB):MB + 2×STD;
•下轨(LB):MB - 2×STD。
3. 生成交易信号
•做多信号:收盘价跌破下轨(C < LB),且前一日收盘价≥前一日LB(避免连续触发);
•做空信号:收盘价突破上轨(C > UB),且前一日收盘价≤前一日UB;
•平仓信号:价格回归中轨附近(如收盘价≥MB时平空单,收盘价≤MB时平多单;或固定持有N根K线后强制平仓,避免长期持仓风险)。
4. 仓位与风控
•仓位:单次开仓50%资金(避免全仓波动过大),支持多空双向持仓(需标的允许做空,如期货、融资融券标的);
•止损:开仓后若价格反向突破轨外(如做多后价格继续跌破LB下方2%),立即止损;
•止盈:价格回归中轨时止盈,或盈利达2%时主动止盈。
5. 回测与评估
重点评估震荡市表现(避免趋势市中逆势亏损),核心指标:胜率(均值回归依赖高胜率)、盈亏比(单笔盈利/亏损)、最大回撤(控制极端风险)。
Python代码示例(基于backtrader框架)
python
下载
复制
运行
import backtrader as bt
import pandas as pd
# 1. 定义布林带策略类
class BollingerMeanReversionStrategy(bt.Strategy):
params = (
('period', 20), # 布林带周期(N)
('devfactor', 2), # 标准差倍数(k)
('printlog', True) # 打印日志
)
def __init__(self):
# 计算布林带指标(backtrader内置BollingerBands)
self.boll = bt.indicators.BollingerBands(
self.data.close,
period=self.params.period,
devfactor=self.params.devfactor
)
# 记录上一日收盘价(用于判断突破有效性)
self.prev_close = None
def next(self):
current_close = self.data.close[0]
prev_close = self.data.close[-1] if len(self.data) > 1 else current_close
upper_band = self.boll.top[0] # 当前上轨
lower_band = self.boll.bot[0] # 当前下轨
mid_band = self.boll.mid[0] # 当前中轨
# 首次运行不操作
if self.prev_close is None:
self.prev_close = prev_close
return
# 无持仓时:检查开仓信号
if not self.position:
# 做多:跌破下轨(当前C < LB,且前一日C ≥ 前一日LB)
if current_close < lower_band and prev_close >= self.boll.bot[-1]:
self.buy(size=0.5) # 50%资金开多
self.log(f'做多信号 | 价格: {current_close:.2f}, 下轨: {lower_band:.2f}')
# 做空:突破上轨(当前C > UB,且前一日C ≤ 前一日UB)
elif current_close > upper_band and prev_close <= self.boll.top[-1]:
self.sell(size=0.5) # 50%资金开空
self.log(f'做空信号 | 价格: {current_close:.2f}, 上轨: {upper_band:.2f}')
# 有持仓时:检查平仓信号
else:
# 多单平仓:价格回归中轨上方(当前C ≥ MB)或止损(跌破LB下方2%)
if self.position.size > 0:
if current_close >= mid_band or current_close < (lower_band * 0.98):
self.close()
self.log(f'平多信号 | 价格: {current_close:.2f}, 中轨: {mid_band:.2f}')
# 空单平仓:价格回归中轨下方(当前C ≤ MB)或止损(突破UB上方2%)
elif self.position.size < 0:
if current_close <= mid_band or current_close > (upper_band * 1.02):
self.close()
self.log(f'平空信号 | 价格: {current_close:.2f}, 中轨: {mid_band:.2f}')
# 更新上一日收盘价
self.prev_close = prev_close
def log(self, txt, dt=None):
if self.params.printlog:
dt = dt or self.datas[0].datetime.date(0)
print(f'{dt.isoformat()} | {txt}')
# 2. 加载数据(示例:BTC/USDT日线数据,需替换为实际数据)
# 假设CSV格式:date,open,high,low,close,volume(可从Binance API下载)
data = pd.read_csv('btc_usdt_daily.csv', index_col='date', parse_dates=True)
datafeed = bt.feeds.PandasData(dataname=data)
# 3. 初始化回测引擎
cerebro = bt.Cerebro()
cerebro.addstrategy(BollingerMeanReversionStrategy)
cerebro.adddata(datafeed)
cerebro.broker.setcash(100000.0) # 初始资金10万
cerebro.broker.setcommission(commission=0.0013) # 佣金+印花税
cerebro.broker.set_slippage_perc(perc=0.001) # 滑点0.1%
# 4. 运行回测
print(f'初始资金: {cerebro.broker.getvalue():.2f}')
cerebro.run()
print(f'最终资金: {cerebro.broker.getvalue():.2f}')
# 5. 可视化(含布林带)
cerebro.plot(style='candlestick', volume=False)
策略优缺点
•优点:在震荡市中表现优异(高胜率,捕捉短期反转),逻辑清晰(基于统计规律),可通过参数调整适配不同波动品种。
•缺点:趋势市中会“逆势扛单”(如单边上涨时持续做空,导致大幅亏损);对参数敏感(N和k需根据品种波动性优化);需频繁调仓(交易成本累积)。
优化方向
1.趋势过滤:结合ADX(平均趋向指数)判断趋势强度,仅在ADX<25(震荡市)时启用策略,ADX>25(趋势市)时空仓或切换趋势策略;
2.动态参数:根据市场波动率调整k值(高波动时增大k至2.5,低波动时减小k至1.5);
3.多周期共振:日线+小时线布林带同时发出信号才开仓,提高胜率;
4.资金管理:采用固定 fractional 仓位(如每次用账户资金的5%开仓),避免单次亏损过大。
发布于 2025-12-08 14:34・四川 |
|
|
|
|
|
|
|