欢迎加入专注于财经数据与量化投研的【数据科学实战】知识星球!在这里,您将获取持续更新的《财经数据宝典》和《量化投研宝典》,这两部宝典相辅相成,为您在量化投研道路上提供明确指引。 我们提供了精选的国内外量化投研的 180+ 篇高质量文章,并每日更新最新研究成果,涵盖策略开发、因子分析、风险管理等核心领域。 无论您是量化投资新手还是经验丰富的研究者,星球社区都能帮您少走弯路,事半功倍,共同探索数据驱动的投资世界!
引言
在加密货币市场中,价格的剧烈波动往往发生在平静期之后。如何捕捉这些爆发性行情?今天我们将深入探讨一个经典的量化交易策略——BBKC Squeeze(布林带-肯特纳通道挤压策略)。这个策略通过识别波动率压缩期,预测即将到来的价格突破,帮助交易者把握高概率的交易机会。
本文将使用 Python 实现完整的 BBKC Squeeze 策略,并在 ETH/USDC 交易对上进行回测,展示如何通过添加趋势过滤器和 ADX 指标来提升策略表现。
什么是 BBKC Squeeze 策略?
BBKC Squeeze 策略的核心思想是:市场波动率并非恒定的,而是呈现周期性变化。当市场进入低波动率阶段(挤压期),往往预示着即将到来的大幅价格变动。
该策略结合了两个经典的技术指标:
- 布林带(Bollinger Bands):通过标准差衡量统计波动率
- 肯特纳通道(Keltner Channels):通过 ATR(平均真实波幅)衡量价格区间波动
当布林带收缩到肯特纳通道内部时,市场进入"挤压"状态,策略开始寻找突破机会。
数据获取与预处理
首先,我们使用 ccxt 库从币安获取 ETH/USDC 的小时级别数据:
import ccxt, pandas as pd, numpy as np, matplotlib.pyplot as plt
# 初始化交易所连接
exchange = ccxt.binance()
symbol = 'ETH/USDC'
timeframe = '1h'
limit = 1000
# 获取 OHLCV 数据
ohlcv = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit)
df = pd.DataFrame(ohlcv, columns=['timestamp','open','high','low','close','volume'])
# 转换时间戳并设置为索引
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
df.set_index('timestamp', inplace=True)
核心指标计算
1. 布林带计算
布林带由移动平均线和上下轨道组成:
# 布林带参数:24 周期,1 倍标准差
bb_period, bb_std = 24, 1
# 计算移动平均和标准差
df['ma'] = df['close'].rolling(bb_period).mean()
df['std'] = df['close'].rolling(bb_period).std()
# 计算布林带上下轨
df['bb_upper'] = df['ma'] + bb_std * df['std']
df['bb_lower'] = df['ma'] - bb_std * df['std']
2. 肯特纳通道计算
肯特纳通道使用 EMA 和 ATR 构建:
# 肯特纳通道参数
kc_period, atr_mult = 24, 1
# 计算指数移动平均
df['ema'] = df['close'].ewm(span=kc_period).mean()
# 计算真实波幅(TR)
df['tr'] = df[['high','low','close']].apply(
lambda x: max(x['high']-x['low'],
abs(x['high']-x['close']),
abs(x['low']-x['close'])), axis=1
)
# 计算 ATR 和肯特纳通道
df['atr'] = df['tr'].rolling(kc_period).mean()
df['kc_upper'] = df['ema'] + atr_mult * df['atr']
df['kc_lower'] = df['ema'] - atr_mult * df['atr']
3. 识别挤压状态
当布林带完全位于肯特纳通道内部时,市场处于挤压状态:
# 识别挤压信号
df['squeeze_on'] = (df['bb_upper'] < df['kc_upper']) & (df['bb_lower'] > df['kc_lower'])
策略优化:添加趋势和强度过滤器
为了减少假突破,我们添加两个过滤器:
1. 趋势过滤器(72 周期 SMA)
# 使用 72 周期简单移动平均判断趋势方向
df['trend_ma'] = df['close'].rolling(72).mean()
2. ADX 强度过滤器
ADX 指标用于衡量趋势强度,只在 ADX > 30 时进行交易:
# ADX 计算(6 周期)
adx_period = 6
# 计算方向性移动
df['up_move'] = df['high'].diff()
df[
'down_move'] = -df['low'].diff()
# 计算 +DM 和 -DM
df['+dm'] = np.where((df['up_move'] > df['down_move']) & (df['up_move'] > 0),
df['up_move'], 0)
df['-dm'] = np.where((df['down_move'] > df['up_move']) & (df['down_move'] > 0),
df['down_move'], 0)
# 计算真实波幅
df['tr1'] = df['high'] - df['low']
df['tr2'] = abs(df['high'] - df['close'].shift())
df['tr3'] = abs(df['low'] - df['close'].shift())
df['TR'] = df[['tr1','tr2','tr3']].max(axis=1)
df['ATR'] = df['TR'].rolling(adx_period).mean()
# 计算方向性指标
df['+di'] = 100 * (df['+dm'].rolling(adx_period).mean() / df['ATR'])
df['-di'] = 100 * (df['-dm'].rolling(adx_period).mean() / df['ATR'])
# 计算 ADX
df['DX'] = (abs(df['+di'] - df['-di']) / (df['+di'] + df['-di'])) * 100
df['ADX'] = df['DX'].rolling(adx_period).mean()
交易逻辑实现
策略的交易规则如下:
- 入场条件:挤压状态下,价格突破肯特纳通道,且符合趋势方向,ADX > 30
# 设置止盈止损参数
TP, SL = 0.03, 0.02
capital, initial_capital = 10000, 10000
equity_curve, equity_dates = [], []
# 交易状态变量
in_trade, entry_price, direction = False, None, None
# 回测主循环
for i in range(1, len(df)):
price, date = df['close'].iloc[i], df.index[i]
ifnot in_trade:
# 检查是否处于挤压状态
if df['squeeze_on'].iloc[i-1]:
adx_val = df['ADX'].iloc[i]
# 多头信号:价格突破上轨,高于趋势线,ADX > 30
if (price > df['kc_upper'].iloc[i] and
price > df['trend_ma'].iloc[i] and
adx_val > 30):
entry_price, direction, in_trade = price, "long", True
# 空头信号:价格突破下轨,低于趋势线,ADX > 30
elif (price < df['kc_lower'].iloc[i] and
price < df['trend_ma'].iloc[i] and
adx_val > 30):
entry_price, direction, in_trade = price, "short", True
else:
# 多头持仓管理
if direction == "long":
if price >= entry_price * (1+TP): # 止盈
capital *= (1+TP)
in_trade = False
elif price <= entry_price * (1-SL): # 止损
capital *= (1-SL)
in_trade = False
# 空头持仓管理
elif direction == "short":
if price <= entry_price * (1-TP): # 止盈
capital *= (1+TP)
in_trade = False
elif price >= entry_price * (1+SL): # 止损
capital *= (1-SL)
in_trade = False
equity_curve.append(capital)
equity_dates.append(date)
# 创建权益曲线数据框
equity_df = pd.DataFrame({'equity': equity_curve}, index=equity_dates)
策略表现分析
让我们分析策略的回测结果:
# 计算交易统计
total_trades = len(equity_df[equity_df['equity'].diff() != 0])
wins = sum(equity_df['equity'].diff() > 0)
losses = total_trades - wins
win_rate = wins / total_trades * 100 if total_trades > 0 else 0
print("========== BBKC Squeeze 策略回测结果 ==========")
print(f"总交易次数:{total_trades}")
print(f"盈利次数:{wins},亏损次数:{losses}")
print(f"胜率:{win_rate:.2f}%")
print(f"最终资金:${capital:.2f}(初始资金:${initial_capital})")
print(f"收益率:{(capital/initial_capital - 1)*100:.2f}%")
可视化分析
创建综合图表,展示价格走势、指标和权益曲线:
# 创建双轴图表
fig, ax1 = plt.subplots(figsize=(14, 8))
# 绘制价格和指标
ax1.plot(df.index, df['close'], color='black', alpha=0.6, label='ETH/USDC')
ax1.plot(df.index, df['bb_upper'], 'b--', alpha=0.5, label='布林带上轨')
ax1.plot(df.index, df['bb_lower'], 'b--', alpha=0.5, label='布林带下轨')
ax1.plot(df.index, df['kc_upper'], 'r--', alpha=
0.5, label='肯特纳通道上轨')
ax1.plot(df.index, df['kc_lower'], 'r--', alpha=0.5, label='肯特纳通道下轨')
ax1.plot(df.index, df['trend_ma'], 'purple', alpha=0.8, label='趋势线 (SMA 72)')
# 标记挤压区域
ax1.fill_between(df.index, df['kc_lower'], df['kc_upper'],
where=df['squeeze_on'], color='green', alpha=0.2,
label='挤压区域')
ax1.set_ylabel("价格 (USDC)", fontsize=12)
ax1.legend(loc="upper left")
# 绘制权益曲线
ax2 = ax1.twinx()
ax2.plot(equity_df.index, equity_df['equity'], 'green', linewidth=2,
label='权益曲线')
ax2.set_ylabel("账户权益 ($)", color='green', fontsize=12)
ax2.legend(loc="upper right")
plt.title(f"BBKC Squeeze 策略回测 - {symbol} {timeframe}", fontsize=14)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
策略优化建议
基于回测结果,以下是一些优化方向:
总结
BBKC Squeeze 策略通过识别波动率压缩期并结合趋势和强度过滤器,能够有效捕捉加密货币市场的突破行情。本文完整实现了该策略的 Python 代码,包括数据获取、指标计算、交易逻辑和回测分析。
该策略的核心优势在于:
需要注意的是,任何策略都不是万能的。在实盘交易前,建议进行更长时间周期的回测,并在不同市场环境下验证策略的稳健性。同时,合理的风险管理和资金管理同样重要。
参考文章
加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。财经数据与量化投研知识社区
核心权益如下:
- 赠送《财经数据宝典》完整文档,汇集多年财经数据维护经验
- 赠送《量化投研宝典》完整文档,汇集多年量化投研领域经验
- 赠送《PyBroker-入门及实战》视频课程,手把手学习量化策略开发
- 每日分享高质量量化投研文章(已更新 180+篇)、代码和相关资料
星球已有丰富内容积累,包括量化投研论文、财经高频数据、 PyBroker 视频教程、定期直播、数据分享和答疑解难。适合对量化投研和财经数据分析有兴趣的学习者及从业者。欢迎加入我们!