10.定向交易策略实战
定向交易策略是量化交易中最直观的玩法——判断市场方向,顺势而为。不同于做市策略在双边挂单中赚取价差,定向策略的核心是"看对方向",在上涨时做多,下跌时做空。Hummingbot 的 V2 框架为这类策略提供了优雅的实现方式,将信号生成、仓位管理和风险控制解耦成独立组件。
Bollinger Bands 策略实现
Bollinger Bands(布林带)是 John Bollinger 在 1980 年代发明的经典技术指标,由三条线组成:中轨是简单移动平均线(SMA),上下轨则是中轨加减若干倍标准差。这个指标完美融合了趋势和波动率信息——带宽收窄意味着市场进入盘整,带宽扩张则预示行情启动。
在 Hummingbot 中,Bollinger V1 控制器采用了一个巧妙的信号生成逻辑:Bollinger Bands Percent(BBP)。这个指标计算当前价格相对于布林带的位置,公式为 (price - lower_band) / (upper_band - lower_band)。当 BBP 低于阈值时做多,高于阈值时做空,纯粹而简洁。
策略配置实战
创建 Bollinger 策略配置非常简单:
create --script-config v2_bollinger_v1_config
系统会引导我们完成参数设置。这里重点看几个核心参数:
| 参数 | 说明 | 示例值 |
|---|---|---|
bb_length |
计算 SMA 的 K 线根数 | 100 |
bb_std |
标准差倍数 | 2.0 |
bb_long_threshold |
做多阈值,BBP 低于此值开多 | 0.3 |
bb_short_threshold |
做空阈值,BBP 高于此值开空 | 0.7 |
bb_long_threshold 和 bb_short_threshold 的设计很讲究。传统布林带策略可能在价格触及下轨时做多、触及上轨时做空,但 BBP 阈值方式给了我们更精细的控制。比如设置 bb_long_threshold=0.3 意味着价格跌破布林带中线偏下位置就考虑做多,而不是非要等到触及下轨,这样能更早捕捉反转机会。
仓位管理的三重屏障
Bollinger 策略继承了 V2 框架的 PositionExecutor,采用"三重屏障"风控体系:
# 配置示例
stop_loss: 0.01 # 1% 止损
take_profit: 0.03 # 3% 止盈
time_limit: 21600 # 6 小时强制平仓
trailing_stop_activation_price_delta: 0.008 # 0.8% 激活追踪止损
trailing_stop_trailing_delta: 0.004 # 0.4% 追踪距离
这套机制同时监控三个退出条件:亏损达到止损线、盈利达到止盈线、持仓时间超过时限。追踪止损在价格向有利方向移动时自动调整,锁定利润。实际运行中,建议根据交易品种的波动特性调整这些参数。高波动品种需要更宽的止损,低波动品种可以设置更紧的止盈。
状态监控与调优
运行 status 命令后,界面会清晰展示当前信号、BBP 值、仓位状态等关键信息。观察一段时间后,可能会发现某些交易对在特定时间段表现更好。这时可以调整 cooldown_time 参数,控制两次开仓之间的最小间隔,避免过度交易。
MACD-BB 组合策略
单一指标总有局限性。MACD-BB 策略将 MACD 的趋势判断能力与布林带的波动率分析结合,形成更稳健的信号系统。MACD 负责回答"趋势方向",布林带负责确认"入场时机"。
双指标协同逻辑
MACD 由三部分组成:快线(12 周期 EMA 减 26 周期 EMA)、慢线(快线的 9 周期 EMA)和柱状图(快线减慢线)。传统用法是金叉做多、死叉做空,但 MACD-BB 策略采用了更复杂的判断:
- 做多条件:MACD 柱状图为正(趋势向上)且 BBP 低于做多阈值
- 做空条件:MACD 柱状图为负(趋势向下)且 BBP 高于做空阈值
这种设计避免了在逆势中盲目入场。即使价格触及布林带下轨,如果 MACD 显示大趋势仍在下跌,策略也不会贸然做多。
参数配置详解
创建配置的命令:
create --script-config v2_macd_bb_v1_config
关键参数分为三组:
MACD 参数
macd_fast: 21 # 快线 EMA 周期
macd_slow: 42 # 慢线 EMA 周期
macd_signal: 9 # 信号线 EMA 周期
布林带参数
bb_length: 100
bb_std: 2.0
bb_long_threshold: 0.3
bb_short_threshold: 0.7
风控参数
stop_loss: 0.01
take_profit: 0.06 # 止盈放宽到 6%,给趋势留出空间
time_limit: 86400 # 24 小时
MACD 参数中,macd_fast 和 macd_slow 的默认值 21/42 比传统的 12/26 更平滑,减少了假信号。这是为加密货币市场 24/7 不间断交易特性优化的结果,避免了传统股市参数在币市的"水土不服"。
实战中的信号过滤
实际部署时,建议增加信号过滤逻辑。比如只在 MACD 柱状图绝对值大于某个阈值时才入场,确保趋势强度足够。这可以通过修改控制器源码实现:
# 在 macd_bb_v1.py 的 get_signal 方法中
macd_strength = abs(macd_histogram)
if macd_strength < self.min_macd_strength:
return 0 # 不生成信号
这种微调能让策略在震荡市中更保守,在趋势市中更积极。
Trend Follower 趋势跟踪
趋势跟踪是量化交易的圣杯。Trend Follower 策略使用双均线(SMA)判断大趋势方向,再用布林带确认入场点,逻辑清晰且易于理解。
双均线交叉原理
策略使用两条简单移动平均线:
sma_fast: 20 周期,反映短期趋势sma_slow: 100 周期,反映长期趋势
当快线在上、慢线在下时,判定为上升趋势,只做多不做空;反之则只做空不做多。这种"顺大势"的设计,让策略在单边行情中能吃到完整波段。
布林带辅助入场
在确定趋势方向后,策略用布林带判断具体入场时机。上升趋势中,当价格回调到布林带中轨附近(BBP 低于阈值)时做多;下降趋势中,当价格反弹到中轨附近时做空。这样既顺势,又避免了追高风险。
配置与参数
create --script-config v2_trend_follower_v1_config
核心参数:
sma_fast: 20
sma_slow: 100
bb_length: 100
bb_std: 2.0
bb_threshold: 0.2 # 比 Bollinger 策略更严格
bb_threshold=0.2 意味着入场位置更靠近布林带下轨(做多时)或上轨(做空时),安全边际更高。配合 cooldown_time: 15 秒,策略在趋势行情中能持续加仓,在反转时快速止损。
趋势过滤的进阶玩法
可以引入 ADX(平均趋向指数)作为趋势强度过滤器。ADX 大于 25 时才允许开仓,避免在震荡市中频繁止损。这需要修改控制器源码,在 get_signal 方法中增加判断:
adx = self.adx_indicator.adx()
if adx < self.min_adx:
return 0
这种组合让策略在强趋势中全力出击,在弱趋势中保持观望,盈亏比显著提升。
技术指标信号生成
V2 框架的信号生成机制高度模块化。所有定向交易控制器都继承自 DirectionalTradingControllerBase,必须实现 get_signal 方法。这个方法返回三个值:
1: 做多信号-1: 做空信号0: 无信号
信号生成的通用模式
典型的信号生成流程如下:
graph TD
A[获取K线数据] --> B[计算技术指标]
B --> C[判断趋势方向]
C --> D[检查入场条件]
D --> E{是否满足?}
E -->|是| F[返回信号 1/-1]
E -->|否| G[返回信号 0]
F --> H[检查仓位管理]
G --> H
H --> I[生成ExecutorAction]
这个流程在 on_tick 方法中每秒钟执行一次。关键在于,信号生成只负责判断方向,不处理具体下单逻辑。下单、止损、止盈都由 PositionExecutor 统一管理,实现了策略逻辑与执行逻辑的解耦。
多时间框架分析
专业交易者常用多时间框架确认信号。比如用 1 小时 K 线判断大趋势,用 5 分钟 K 线找入场点。V2 框架支持同时订阅多个时间框架:
# 在控制器中配置
self.candles = {
"1h": CandlesFactory.get_candle(connector, trading_pair, interval="1h"),
"5m": CandlesFactory.get_candle(connector, trading_pair, interval="5m")
}
信号生成时先检查 1 小时趋势,再确认 5 分钟入场条件,胜率会大幅提升。这种多周期共振的思路,是专业量化团队的标配。
自定义指标扩展
如果内置指标不够用,可以轻松添加自定义指标。继承 CandlesBase 类,实现 calculate_indicators 方法:
class MyCustomCandles(CandlesBase):
def calculate_indicators(self):
super().calculate_indicators()
# 添加自定义计算
self.df['my_indicator'] = self.df['close'].rolling(20).std() / self.df['close'].rolling(20).mean()
然后将这个自定义 Candles 类注入控制器,就能在 get_signal 中使用新指标了。这种扩展性让 V2 框架能适配任何复杂的量化模型。
入场与出场逻辑设计
定向策略的精髓在于入场和出场的艺术。V2 框架通过 PositionExecutor 提供了专业的三重屏障系统,但如何设置参数需要深思熟虑。
入场逻辑的三种模式
1. 突破入场 价格突破关键阻力位时入场,适合动量策略。配置示例:
entry_price_delta: 0.005 # 突破 0.5% 后入场
2. 回调入场 价格回调到支撑区域时入场,适合趋势跟踪。Trend Follower 就是这种模式。
3. 分批入场 不一次性满仓,而是分批次建仓。可以通过修改控制器实现:
# 在 get_executor_actions 中
if signal != 0 and self.current_position_size < self.max_position:
# 只增加部分仓位
order_amount = self.order_amount * 0.5
出场逻辑的精细化控制
三重屏障提供了基础风控,但可以根据策略特性增强:
时间退出
# 在 PositionExecutor 配置中
time_limit: 3600 # 1 小时后强制平仓
适合日内交易策略,避免隔夜风险。
波动率退出 当市场波动率突然放大时,即使未达到止盈止损也提前离场。这需要实时监控 ATR 或波动率指数:
# 在控制器中增加检查
current_volatility = self.atr_indicator.atr()
if current_volatility > self.volatility_threshold * 2:
# 生成平仓动作
return [StopExecutorAction(...)]
利润保护退出 盈利达到一定幅度后,启动更紧的止损:
trailing_stop_activation_price_delta: 0.02 # 盈利 2% 激活
trailing_stop_trailing_delta: 0.005 # 回撤 0.5% 触发
这种设计让利润奔跑的同时,保护已得收益。
仓位大小的动态调整
固定仓位大小在波动率变化剧烈的市场中不够灵活。可以引入波动率调整:
# 根据 ATR 动态调整订单金额
atr = self.atr_indicator.atr()
volatility_factor = atr / self.baseline_atr
adjusted_amount = self.order_amount_usd / volatility_factor
波动率高时自动减仓,波动率低时加仓,让策略在不同市场环境下保持风险一致性。
策略参数优化方法
参数优化是量化交易的终极挑战。V2 框架提供了回测功能,让我们能在历史数据上验证参数组合。
参数空间搜索
对于 Bollinger 策略,关键参数是 bb_length、bb_std、bb_long_threshold 和 bb_short_threshold。可以采用网格搜索:
# 伪代码示例
for length in [50, 100, 200]:
for std in [1.5, 2.0, 2.5]:
for threshold in [0.2, 0.3, 0.4]:
# 运行回测
performance = backtest(...)
# 记录夏普比率、最大回撤等指标
但全网格搜索计算量巨大。更聪明的方法是使用遗传算法或贝叶斯优化,Hummingbot 的 Quants Lab 提供了这些高级工具。
避免过拟合的实战经验
参数优化最容易陷入的陷阱是过拟合——参数在历史数据上表现完美,实盘中却连连亏损。几个实战经验:
1. 样本外测试 将数据分为训练集和测试集。在训练集上优化参数,在测试集上验证效果。如果测试集表现大幅下滑,说明过拟合了。
2. 参数稳定性检验
小幅调整参数,观察策略表现是否稳定。如果 bb_length 从 100 改为 105 就导致收益腰斩,说明策略对参数过于敏感,实盘可靠性存疑。
3. 多品种验证 在 BTC、ETH、SOL 等多个品种上用同一套参数测试。如果只在单一品种上有效,可能是数据挖掘的巧合。
4. 简化参数集 参数越多,过拟合风险越大。Bollinger 策略的 4 个核心参数已经是最小集合。如果还想添加更多过滤条件,务必谨慎。
参数优化的自动化流程
V2 框架支持将优化后的参数直接应用到控制器配置。推荐的工作流是:
# 1. 生成基准配置
create --script-config v2_bollinger_v1_config
# 2. 在 Quants Lab 中运行参数扫描
# 这会生成参数性能热力图
# 3. 选择最优参数组合,更新 YAML 文件
# 直接修改 conf/scripts/your_config.yml
# 4. 实盘前进行模拟交易
start --script v2_bollinger_v1_config.py --conf your_config.yml --paper
--paper 参数启动模拟交易模式,在不承担真实风险的情况下观察策略表现。建议至少观察 1-2 周,确认信号生成、仓位管理都符合预期后再上实盘。
动态参数调整
市场状态会变化,固定参数可能失效。可以实现参数的动态调整:
# 在控制器中
def adjust_parameters(self):
# 根据近期波动率调整布林带标准差
recent_volatility = self.calculate_recent_volatility()
if recent_volatility > self.high_vol_threshold:
self.bb_std = 2.5 # 波动率高时放宽带宽
else:
self.bb_std = 1.8 # 波动率低时收紧
这种自适应机制让策略在不同市场周期中保持活力。但动态参数也增加了复杂度,需要更严格的回测验证。
定向交易策略的魅力在于逻辑清晰、易于理解。从 Bollinger 的单指标入门,到 MACD-BB 的双指标组合,再到 Trend Follower 的趋势过滤,每一步都在增强策略的健壮性。V2 框架的模块化设计让我们能专注于信号生成逻辑,而将繁琐的订单管理、风控执行交给专业的 Executor 处理。
下一章将深入探讨 K 线数据与技术指标的集成,学习如何为策略添加更多维度的市场信息,让交易决策更加精准。技术指标是策略的眼睛,看得越清晰,交易就越有信心。