R-Breaker是一种结合趋势跟踪与反转交易的经典日内量化交易策略。自1994年由Richard Saidenberg提出后,它曾连续多年在《Futures Truth》杂志的评选中位列前十大盈利策略。
策略核心:六个关键价位
策略的核心逻辑依赖于根据前一交易日的价格数据(最高价、最低价、收盘价),计算出六个关键价位,作为当日交易的决策锚点。这六个价位自上而下分别是:
- 突破买入价 与 突破卖出价:用于在空仓状态下识别并追随趋势。
- 观察卖出价 与 观察买入价:用于监控价格,预警潜在的反转机会。
- 反转卖出价 与 反转买入价:用于在持仓状态下确认反转信号,执行反手操作。
一套广泛使用的经典计算公式如下:
- 中心价 = (昨日最高价 + 昨日收盘价 + 昨日最低价) / 3
- 突破买入价 = 昨日最高价 + 2 × (中心价 - 昨日最低价)
- 突破卖出价 = 昨日最低价 - 2 × (昨日最高价 - 中心价)
- ... (其他价位计算类似,依据不同变体有所差异)
独特的双模式交易逻辑
R-Breaker的交易逻辑根据账户的持仓状态清晰分为两部分:
- 趋势跟踪模式(空仓时):当盘中价格向上突破“突破买入价”时,开仓做多;当价格向下跌破“突破卖出价”时,开仓做空。这是对强势趋势的顺势追击。
- 反转交易模式(持仓时):这是策略设计的精妙之处。例如,当你持有多单时,如果当日价格曾冲高触及“观察卖出价”,但随后回落并跌破了“反转卖出价”,策略便会平掉多单并立即反手做空。空单的反转逻辑与之对称。这种机制旨在趋势可能衰竭时,及时锁定利润并捕捉反向波动的机会。
应用场景与策略局限
R-Breaker主要设计用于期货市场的日内短线交易,通常在收盘前了结所有头寸,避免隔夜风险。它在市场波动率较高的环境中通常表现更为出色。
然而,作为一个经典策略,R-Breaker也存在一些固有的局限性,在应用Python进行实现和回测时需特别注意:
- 依赖市场波动:在趋势不明、整日震荡的“牛皮市”中,策略可能频繁触发信号导致连续小额亏损。
- 存在过时风险:随着市场参与者认知的普及,其简单规则的盈利空间可能被逐渐压缩。
- 参数敏感性:策略表现对计算公式中的系数(如上述公式中的倍数2)较为敏感,不当的参数优化容易导致过拟合。
因此,在实际应用中,交易者常对其进行改进,例如引入动态止损止盈、增加波动率过滤器以避免在震荡市中交易,或将其作为信号源之一与其他策略结合使用。
Python策略代码实现
以下是一个基于Python的R-Breaker策略简化代码框架,展示了核心的交易逻辑。请注意,实际部署需要完整的交易接口和大数据环境支持。
'''backtest
start: 2019-01-01 00:00:00
end: 2021-01-01 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''
def onTick():
# 获取历史K线数据
exchange.SetContractType('rb000')
bars_arr = exchange.GetRecords(PERIOD_D1)
if len(bars_arr) < 2:
return
# 获取昨日价格
yesterday_high = bars_arr[-2]['High']
yesterday_low = bars_arr[-2]['Low']
yesterday_close = bars_arr[-2]['Close']
# 计算关键价位 (此处为一种变体计算示例)
pivot = (yesterday_high + yesterday_close + yesterday_low) / 3
r3 = yesterday_high + 2 * (pivot - yesterday_low) # 突破买入价
r2 = pivot + (yesterday_high - yesterday_low) # 观察卖出价
r1 = 2 * pivot - yesterday_low # 反转卖出价
s1 = 2 * pivot - yesterday_high # 反转买入价
s2 = pivot - (yesterday_high - yesterday_low) # 观察买入价
s3 = yesterday_low - 2 * (yesterday_high - pivot) # 突破卖出价
# 获取今日价格及当前价
today_high = bars_arr[-1]['High']
today_low = bars_arr[-1]['Low']
current_price = _C(exchange.GetTicker).Last
# 获取当前持仓状态
position_arr = _C(exchange.GetPosition)
if len(position_arr) > 0:
# ... 解析持仓方向与数量 ...
position = 1 # 示例:假设持有多单
else:
position = 0
# 核心交易逻辑
if position == 0: # 空仓,执行趋势跟踪
if current_price > r3:
exchange.SetDirection("buy")
exchange.Buy(current_price + 1, 1) # 开多单
if current_price < s3:
exchange.SetDirection("sell")
exchange.Sell(current_price - 1, 1) # 开空单
elif position > 0: # 持有多单,监控反转
if (today_high > r2 and current_price < r1) or current_price < s3:
# 平多反手开空
exchange.SetDirection("closebuy")
exchange.Sell(current_price - 1, 1)
exchange.SetDirection("sell")
exchange.Sell(current_price - 1, 1)
elif position < 0: # 持有空单,监控反转
if (today_low < s2 and current_price > s1) or current_price > r3:
# 平空反手开多
exchange.SetDirection("closesell")
exchange.Buy(current_price + 1, 1)
exchange.SetDirection("buy")
exchange.Buy(current_price + 1, 1)
def main():
while True:
onTick()
Sleep(1000)
策略参数与绩效
对策略进行回测时,调整关键价位的计算公式参数会直接影响策略的进攻性和防守性,从而改变最终的收益曲线和风险指标。一个稳健的算法需要在历史回测与样本外测试中寻找平衡。

策略参数设置界面示意
|