📘 本章重点
- 理解R-Breaker策略的双重交易逻辑——趋势跟踪与反转交易并行运作
- 掌握六个关键价位的计算方法及其在日内交易中的含义
- 学会区分趋势信号与反转信号的触发条件与执行顺序
- 了解R-Breaker策略的日内平仓纪律与参数优化方法
⚠️ 本章难点
- 理解“先观察、后确认”的反转交易机制——价格突破观察位后回落/反弹至反转位才触发
- 掌握趋势与反转两种信号的优先级关系——趋势信号在空仓时触发,反转信号在持仓时触发
- 识别R-Breaker与枢轴点策略(第三.06)、菲阿里四价(第三.05)的本质差异
- 理解参数优化对策略表现的影响——不同品种需要不同的参数组合
⏱️ 预估学习时间
- 45~60分钟
一、策略简述与一句话定性
一句话定性:R-Breaker是一种结合了趋势跟踪与反转交易双重逻辑的日内短线策略——通过前一交易日的高、低、收盘价计算出六个关键价位,在价格突破最外层价位时顺势跟进,在价格从极端位置回落或反弹时逆势反手,实现“趋势来了跟趋势,趋势走了做反转”的完整交易闭环。
R-Breaker由Richard Saidenberg于1994年公开发布。此后连续十五年荣登《Futures Truth》杂志TOP 10赚钱策略排行榜(注:该榜单为《Futures Truth》杂志“系统开发以来(Since Inception)”类别的长期跟踪排名,具体统计区间在不同年份的评选中有所差异,但R-Breaker是极少数能持续上榜的策略之一),具有极长的生命周期。在S&P指数前十大交易系统排名中,R-Breaker以37.1%的年收益率位列第九(据《Futures Truth》杂志统计)。它不是靠某一年爆发上榜的策略,而是以长期稳定的一致性赢得市场认可。
R-Breaker最独特的地方在于它的“双重人格”——趋势与反转两条腿同时走路。它既不是纯粹的突破跟进策略(如菲阿里四价),也不是纯粹的均值回归策略(如枢轴点),而是两者的有机融合。在空仓时,它用趋势逻辑捕捉突破行情;在有持仓时,它用反转逻辑在行情掉头时及时反手。一个策略,两种赚钱方式。
R-Breaker的六个价位,本质上就是一张“价格地图”——价格在哪个区域,策略就用哪种逻辑应对。突破最外层(Bbreak/Sbreak)→ 趋势跟进;在观察位和反转位之间徘徊 → 等待反转确认。一张地图,两种走法。
老陈点评:
R-Breaker的设计思想非常精妙——它不是简单地把趋势和反转两个策略拼在一起,而是让它们在不同市场状态下自动切换。在趋势市中,突破信号被触发,策略顺势跟进;在震荡市中,趋势信号不触发,策略等待反转机会。这种“自动适应市场状态”的机制,是R-Breaker长盛不衰的根本原因。 它的六个价位本质上构建了一个“价格地图”——价格在哪个区域,策略就用哪种逻辑应对。
老王补充:
R-Breaker是我在期货市场上最早接触的日内策略之一。它的好处是全天只需要盯着六个价位,到了就做,不到就等,非常省心。但它的缺点是参数对品种很敏感——螺纹钢上跑得好的参数,换到股指期货上可能一塌糊涂。所以别指望“一套参数打天下”,每个品种都得自己优化。
双重人格的收束:R-Breaker的“双重人格”不是分裂,是自适应——趋势来了它变趋势跟踪者,震荡来了它变均值回归者。一个策略,两套应对方案,不需要你判断今天是什么市。
二、策略的使用范围与条件
| 维度 | 适用范围与条件 | 说明 |
|---|---|---|
| 适用市场 | 股指期货、商品期货、外汇 | 流动性好、波动率适中的日内交易品种 |
| 品种要求 | 交易活跃、价格连续 | 流动性差的品种滑点大,信号执行效果差 |
| 交易机制 | 双向交易(做多/做空) | 需要做空机制,不适合单向做多的A股股票 |
| 适用周期 | 1分钟、5分钟 | 原版策略使用分钟级K线,盘中实时判断 |
| 资金门槛 | 低 | 单品种即可运行,无需大资金 |
| 核心纪律 | 日内平仓,不持仓过夜 | 规避隔夜跳空风险 |
| 不适合的市场状态 | 低波动横盘、流动性枯竭 | 关键价位无法被触及,无交易机会 |
为什么R-Breaker不适合A股股票?
A股实行T+1交易制度——当天买入的股票当天不能卖出。R-Breaker是日内策略,需要在一天之内完成开仓和平仓。在A股股票上,如果做多后当天无法平仓,策略的核心逻辑就被破坏了。因此,R-Breaker天然适用于期货、外汇等T+0交易品种。
⚠️ 午盘休市前后的信号质量下降:R-Breaker在午盘休市前后(11:30-13:30)流动性减弱,价格波动可能失真,信号质量往往下降。建议在实盘中对这一时段的信号进行过滤或降低仓位。
为什么原文要写“11:30-13:30”?(它并非笔误)
原文写“11:30-13:30”,实际上精准地覆盖了三个连续的“非正常交易时段”:
- 11:30-13:00:午间休市,价格冻结,信号完全无效(必须过滤)。
- 13:00-13:30:下午开盘后的前30分钟。即使13:00开盘,但这前半小时正是中午堆积的“隔午委托单”集中爆发期,价格往往出现剧烈的跳空、瞬间拉升/打压后迅速回落。R-Breaker对这种“非连续性跳空”极其敏感,所以专业风控通常会把开盘后的“躁动期”纳入过滤窗口,直到13:30左右市场情绪才趋于平稳。
所以,原文写“11:30-13:30”是正确的,它包含了休市期和开盘后的价格紊乱期。
适用品种举例:
- 股指期货:沪深300(IF)、中证500(IC)、标普500(ES)——R-Breaker最初就是为股指期货设计的
- 商品期货:螺纹钢、铜、原油——流动性好,日内波动充分
- 外汇:EUR/USD、GBP/USD——24小时交易,需调整时间框架
失效案例:2015年9月后,国内监管部门对股指期货程序化交易进行了限制,R-Breaker在沪深300股指期货上的表现大幅下滑。这一案例说明:再好的策略也离不开市场环境的配合——当交易规则发生变化时,策略的有效性可能被根本性削弱。
三、因子拆解与原理
3.1 六个关键价位——策略的核心因子
R-Breaker策略的核心是六个关键价位。它们根据前一交易日的最高价(High)、最低价(Low)和收盘价(Close)计算得出。这六个价位从高到低依次为:
| 价位名称 | 英文缩写 | 含义 | 在策略中的角色 |
|---|---|---|---|
| 突破买入价 | Bbreak | 最上方的阻力位 | 突破此价位 → 趋势做多 |
| 观察卖出价 | Ssetup | 上方观察位 | 价格触及后关注反转信号 |
| 反转卖出价 | Senter | 上方反转触发位 | 从Ssetup回落跌破此位 → 反转做空 |
| 反转买入价 | Benter | 下方反转触发位 | 从Bsetup反弹突破此位 → 反转做多 |
| 观察买入价 | Bsetup | 下方观察位 | 价格触及后关注反转信号 |
| 突破卖出价 | Sbreak | 最下方的支撑位 | 跌破此价位 → 趋势做空 |
公式一:观察价位(最常用版本)
观察卖出价(Ssetup)= High + 0.35 × (Close - Low)
观察买入价(Bsetup)= Low - 0.35 × (High - Close)
其中0.35是参数f1,控制观察位与前一交易日极值的距离。
公式二:反转价位
反转卖出价(Senter)= (1.07 / 2) × (High + Low) - 0.07 × Low
反转买入价(Benter)= (1.07 / 2) × (High + Low) - 0.07 × High
其中1.07和0.07是参数f2的不同表达方式。
公式三:突破价位
突破买入价(Bbreak)= Ssetup + 0.25 × (Ssetup - Bsetup)
突破卖出价(Sbreak)= Bsetup - 0.25 × (Ssetup - Bsetup)
其中0.25是参数f3,控制突破位与观察位的距离。
参数说明:以上公式中的0.35、1.07、0.07、0.25是原版策略的经典参数。不同资料来源对参数的具体数值略有差异,但逻辑完全一致。实践中,这些参数需要根据不同品种和周期进行优化调整。
3.2 趋势逻辑——顺势跟进
R-Breaker的趋势逻辑在空仓时生效:
| 信号 | 触发条件 | 操作 |
|---|---|---|
| 趋势做多(B2) | 盘中价格向上突破突破买入价(Bbreak) | 开仓做多 |
| 趋势做空(S2) | 盘中价格向下跌破突破卖出价(Sbreak) | 开仓做空 |
核心原则:趋势信号只在空仓时触发。如果已经有持仓,趋势信号不生效——由反转逻辑接管。
趋势信号的优先级:趋势信号的优先级高于反转信号——空仓时,只要突破信号触发,立即开仓,不等待反转确认。反转信号只在已有持仓时生效。
3.3 反转逻辑——逆势反手
R-Breaker的反转逻辑在已有持仓时生效:
| 信号 | 触发条件 | 操作 |
|---|---|---|
| 反转做空(S1) | 持有多单,日内最高价超过观察卖出价(Ssetup)后,价格回落并跌破反转卖出价(Senter) | 平多开空(反手) |
| 反转做多(B1) | 持有空单,日内最低价低于观察买入价(Bsetup)后,价格反弹并突破反转买入价(Benter) | 平空开多(反手) |
关键机制——“先观察、后确认” :
反转信号不是一触即发的。它要求价格先触及观察位(Ssetup或Bsetup),然后反向运动并突破反转位(Senter或Benter)才触发。这种“双重确认”机制过滤了大部分假信号——只有在价格真正“冲高乏力”或“探底回升”时,反转才会被触发。
一个形象的类比:这种机制就像拳击比赛中的“试探性出拳”——价格先触及观察位,就像拳手先伸出一拳试探对手的反应;如果对手(市场)真的退让了(价格继续突破反转位),就全力出击(触发反转信号)。如果对手没有退让(价格没有突破反转位),就收拳等待。两次确认,一次出手。
持仓状态与信号的关系:
| 持仓状态 | 可触发的信号 | 说明 |
|---|---|---|
| 空仓 | 趋势信号(B2/S2) | 突破最外层价位时顺势开仓 |
| 持多单 | 反转信号(S1) | 价格冲高回落时反手做空 |
| 持空单 | 反转信号(B1) | 价格探底反弹时反手做多 |
3.4 日内平仓纪律——策略的生命线
R-Breaker是日内策略,所有仓位必须在收盘前平仓。这是策略的核心纪律,不能有任何例外。
平仓规则:
- 如果某个交易日已开仓且收盘前仍未触发平仓信号,则在收盘时强行平仓
- 不隔夜留仓,以规避隔夜跳空风险
老王补充:
日内平仓这个纪律,说起来简单,做起来难。有时候下午2点半你的持仓还在盈利,你会有“再拿一会儿”的冲动——然后收盘前行情反转,利润全部回吐。R-Breaker的平仓纪律不是建议,是命令。 做不到这一点,就别用这个策略。
3.5 因子的优缺点
| 优点 | 缺点 |
|---|---|
| 趋势与反转双重逻辑,适应性强 | 参数对不同品种敏感,需要优化 |
| 六个价位提供了完整的“价格地图” | 在低波动市场中信号稀少 |
| 信号确认机制(双重确认)过滤假信号 | 日内平仓限制了大行情的利润空间 |
| 长期一致性高,多次入选TOP 10 | 需要分钟级数据实时监控 |
| 适用范围广(股指、商品、外汇) | 在限制程序化交易的市场中可能失效 |
四、仓位、买卖点与风险管理
4.1 入场信号
趋势入场(空仓时) :
| 信号 | 触发条件 | 操作 |
|---|---|---|
| 趋势做多 | 价格向上突破突破买入价(Bbreak) | 开多仓 |
| 趋势做空 | 价格向下跌破突破卖出价(Sbreak) | 开空仓 |
反转入场(持仓时) :
| 信号 | 触发条件 | 操作 |
|---|---|---|
| 反转做空 | 持多单 + 日内最高价 > Ssetup + 价格回落跌破 Senter | 平多开空 |
| 反转做多 | 持空单 + 日内最低价 < Bsetup + 价格反弹突破 Benter | 平空开多 |
执行方式:使用1分钟或5分钟K线实时监控,信号触发后立即以市价执行。
4.2 仓位管理
R-Breaker的仓位管理相对简单:
- 固定仓位法:每笔交易投入固定比例资金(如总资金的5%-10%)
- 不加仓:R-Breaker是一次建仓、一次平仓,没有加仓机制
- 单日最多交易:理论上每天最多两次交易(一次开仓+一次反手)
4.3 止损设计
| 止损方式 | 触发条件 | 说明 |
|---|---|---|
| 固定比例止损 | 亏损达到入场价的0.4%-1% | 简单直接,适合初学者 |
| 反向信号止损 | 出现反转信号(S1或B1) | 逻辑自洽,与入场对称 |
| 收盘止损 | 收盘前仍未触发平仓信号 | 强制平仓,日内策略的核心纪律 |
4.4 止盈设计
R-Breaker的止盈主要通过反转信号和收盘平仓实现:
- 反转信号止盈:当持仓方向的反转信号触发时,平仓并反手
- 收盘止盈:收盘前无论盈亏,强制平仓
- 不设固定止盈:让利润奔跑,直到反转信号或收盘到来
4.5 R-Breaker的参数优化
R-Breaker的经典参数(0.35、1.07、0.07、0.25)是在特定市场条件下得出的。在不同品种上,这些参数可能需要调整。
| 参数 | 含义 | 调整方向 | 影响 |
|---|---|---|---|
| f1(观察位系数,默认0.35) | 控制观察位与极值的距离 | f1↑ → 观察位更远 → 信号更少但更可靠 | 高波动品种可调大,低波动品种调小 |
| f2(反转位系数,默认1.07/0.07) | 控制反转位的位置 | 调整反转位的松紧程度 | 影响反转信号的触发频率 |
| f3(突破位系数,默认0.25) | 控制突破位与观察位的距离 | f3↑ → 突破位更远 → 趋势信号更少 | 影响趋势信号的触发频率 |
如何判断参数是否过拟合? 一个简单的测试:把回测区间分成前50%和后50%,分别优化参数。如果两个区间的最优参数差异很大,说明你的参数对特定时间段过于敏感——这就是过拟合的典型信号。真正稳健的参数,应该在多个时间段都表现中等,而不是在某一个时间段表现最好。
老陈点评:
参数优化是R-Breaker策略中最容易被滥用的环节。很多人用回测数据反复调整参数,找到一个“完美组合”——然后在实盘中一败涂地。参数优化的原则是“稳健优于最优” ——选择在多个时间段都表现不错的参数,而不是在某个特定时间段表现最好的参数。后者是过拟合的典型表现。
4.6 R-Breaker的“反人性”挑战
R-Breaker最考验人的地方,不是计算六个价位,而是在持仓盈利时愿意平仓反手。当价格冲高触及观察位时,你的持仓正在盈利,你会本能地想“再拿一会儿”——但R-Breaker的逻辑恰恰是在这个时候准备反手。能赚到这个策略的钱,首先要能战胜自己的人性。
五、策略的来历、设计者与趣闻
R-Breaker由Richard Saidenberg于1994年公开发布。关于Saidenberg的公开信息非常有限——他与Dual Thrust的发明者Michael Chalek一样,属于那种“策略比人出名”的量化开发者。
R-Breaker发布后,迅速获得了业界的广泛认可。它连续十五年荣登《Futures Truth》杂志TOP 10赚钱策略排行榜(注:该榜单为《Futures Truth》杂志“系统开发以来(Since Inception)”类别的长期跟踪排名,具体统计区间在不同年份的评选中有所差异,但R-Breaker是极少数能持续上榜的策略之一)。《Futures Truth》是量化交易领域最具权威性的策略评级机构之一,能够连续十五年上榜,足以证明R-Breaker的长期稳定性和跨市场适应性。
在S&P指数前十大交易系统排名中,R-Breaker以37.1%的年收益率位列第九(据《Futures Truth》杂志统计)。更值得注意的是,这份榜单上的其他策略大多收益波动剧烈,而R-Breaker以“业绩一致性最高”著称——它可能不是每年赚得最多的,但它是每年都能稳定赚钱的。
R-Breaker在中国市场:2010年沪深300股指期货上市后,R-Breaker成为国内量化交易者最早引入的日内策略之一。有研究显示,在2010年4月至2011年12月的回测区间内,R-Breaker在沪深300股指期货上实现了78.8%的累计收益,最大回撤仅6.25%(注:该回测区间为沪深300股指期货上市初期,特定市场环境下的表现不代表普遍结果,起始点恰好是股指期货上市首日,可能存在一定的起始点偏差)。2015年股指期货程序化交易受限后,策略表现受到一定影响,但R-Breaker的思想框架至今仍被广泛研究和应用。
趣闻:R-Breaker最有趣的地方在于它的名字——“Breaker”本身就暗示了“突破”的含义,而“R”代表“反转”(Reversal)或“风险”(Risk)。这个名字恰好概括了策略的双重性格:既要突破(趋势),又要反转(反转) ——一个名字,两种性格。
另一个有趣的现象:R-Breaker在不同品种上的表现差异极大。在标普500指数期货上它表现出色,在沪深300股指期货上它同样表现优异,但在某些商品期货上,如果不做参数优化,它可能连续亏损。这说明:策略的有效性不仅取决于策略本身,更取决于策略与品种的匹配程度。
老陈点评:
Richard Saidenberg在1994年发布R-Breaker时,可能并没有想到这个策略能存活三十多年。一个策略能穿越多个牛熊周期、适应多个市场、被不同国家的交易者使用——这本身就是一种成就。R-Breaker的成功证明了一个道理:一个好的交易框架,比一堆复杂的指标更有生命力。
老王补充:
我见过很多人把R-Breaker的参数改得面目全非,试图让它“更赚钱”。结果往往是回测漂亮、实盘拉胯。R-Breaker的经典参数之所以经典,是因为它们经过了大量市场数据的检验。 我的建议是:先用经典参数跑一段时间,理解策略的逻辑,再根据实际表现做微调。别一上来就“优化”——那不是优化,那是过拟合。
六、Python回测示例
以下代码演示R-Breaker策略在股指期货上的回测框架。采用1分钟K线数据,包含完整的六个价位计算、趋势信号和反转信号。
import pandas as pd
import numpy as np
import yfinance as yf
from datetime import datetime, timedelta
# 注意:
# 1. 本代码为R-Breaker策略框架,需要获取分钟级K线数据
# 2. 期货数据建议使用聚宽、天勤(TqSdk)或万得(Wind)获取
# 3. R-Breaker是日内策略,每日收盘前必须平仓
# 4. 以下代码展示策略逻辑,使用模拟数据演示
def calculate_rbreaker_levels(high, low, close, f1=0.35, f2=1.07, f3=0.25):
"""
计算R-Breaker的六个关键价位
参数:
high: 前一交易日最高价
low: 前一交易日最低价
close: 前一交易日收盘价
f1: 观察位系数(默认0.35)
f2: 反转位系数(默认1.07)
f3: 突破位系数(默认0.25)
返回:六个价位的字典
公式说明:
Ssetup = High + f1 * (Close - Low) # 观察卖出价
Bsetup = Low - f1 * (High - Close) # 观察买入价
Senter = (f2/2) * (H+L) - (f2-1) * Low # 反转卖出价
Benter = (f2/2) * (H+L) - (f2-1) * High # 反转买入价
Bbreak = Ssetup + f3 * (Ssetup - Bsetup) # 突破买入价
Sbreak = Bsetup - f3 * (Ssetup - Bsetup) # 突破卖出价
"""
# 观察位
ssetup = high + f1 * (close - low) # 观察卖出价
bsetup = low - f1 * (high - close) # 观察买入价
# 反转位
senter = (f2 / 2) * (high + low) - (f2 - 1) * low # 反转卖出价
benter = (f2 / 2) * (high + low) - (f2 - 1) * high # 反转买入价
# 突破位
bbreak = ssetup + f3 * (ssetup - bsetup) # 突破买入价
sbreak = bsetup - f3 * (ssetup - bsetup) # 突破卖出价
return {
'bbreak': bbreak, # 突破买入价(最高)
'ssetup': ssetup, # 观察卖出价
'senter': senter, # 反转卖出价
'benter': benter, # 反转买入价
'bsetup': bsetup, # 观察买入价
'sbreak': sbreak # 突破卖出价(最低)
}
def rbreaker_strategy(minute_data, f1=0.35, f2=1.07, f3=0.25,
stop_loss_pct=0.005, cost_rate=0.0001):
"""
R-Breaker策略(日内,分钟级数据)
参数:
minute_data: 分钟级K线数据,含'Open','High','Low','Close'列
f1, f2, f3: 策略参数
stop_loss_pct: 止损比例(0.5%)
cost_rate: 双边交易成本
返回:添加了持仓和净值的DataFrame
"""
df = minute_data.copy()
df = df.sort_index()
# 1. 按交易日分组,计算每个交易日的关键价位
df['date'] = df.index.date
df['bbreak'] = np.nan
df['ssetup'] = np.nan
df['senter'] = np.nan
df['benter'] = np.nan
df['bsetup'] = np.nan
df['sbreak'] = np.nan
# 获取所有交易日
dates = df['date'].unique()
for i, date in enumerate(dates):
if i == 0:
continue
# 取前一交易日的数据计算价位
prev_day_data = df[df['date'] == dates[i-1]]
if len(prev_day_data) == 0:
continue
high = prev_day_data['High'].max()
low = prev_day_data['Low'].min()
close = prev_day_data['Close'].iloc[-1]
levels = calculate_rbreaker_levels(high, low, close, f1, f2, f3)
# 将价位赋给当前交易日
mask = df['date'] == date
df.loc[mask, 'bbreak'] = levels['bbreak']
df.loc[mask, 'ssetup'] = levels['ssetup']
df.loc[mask, 'senter'] = levels['senter']
df.loc[mask, 'benter'] = levels['benter']
df.loc[mask, 'bsetup'] = levels['bsetup']
df.loc[mask, 'sbreak'] = levels['sbreak']
# 2. 逐行模拟交易
df['Position'] = 0 # 1=多仓, -1=空仓, 0=空仓
df['Entry_Price'] = np.nan
position = 0
entry_price = 0.0
trade_count = 0
daily_high = -np.inf # 当日最高价(用于反转判断)
daily_low = np.inf # 当日最低价(用于反转判断)
current_date = None
has_observed_sell = False # 是否已触发观察卖出价
has_observed_buy = False # 是否已触发观察买入价
for i in range(1, len(df)):
price = df['Close'].iloc[i]
high = df['High'].iloc[i]
low = df['Low'].iloc[i]
date = df['date'].iloc[i]
# 新交易日重置
if date != current_date:
current_date = date
daily_high = -np.inf
daily_low = np.inf
has_observed_sell = False
has_observed_buy = False
# 更新日内最高/最低
daily_high = max(daily_high, high)
daily_low = min(daily_low, low)
# 检查观察位触发
if daily_high > df['ssetup'].iloc[i]:
has_observed_sell = True
if daily_low < df['bsetup'].iloc[i]:
has_observed_buy = True
bbreak = df['bbreak'].iloc[i]
sbreak = df['sbreak'].iloc[i]
senter = df['senter'].iloc[i]
benter = df['benter'].iloc[i]
# --- 检查止损(如有持仓) ---
if position != 0:
if position == 1:
pnl = (price - entry_price) / entry_price
else:
pnl = (entry_price - price) / entry_price
if pnl <= -stop_loss_pct:
position = 0
entry_price = 0.0
trade_count += 1
# --- 检查反转信号(持仓时) ---
if position == 1:
# 反转做空:已触发观察卖出价,且价格跌破反转卖出价
if has_observed_sell and price < senter:
position = -1
entry_price = price
trade_count += 1
has_observed_sell = False # 重置标志,避免同一条件重复触发
elif position == -1:
# 反转做多:已触发观察买入价,且价格突破反转买入价
if has_observed_buy and price > benter:
position = 1
entry_price = price
trade_count += 1
has_observed_buy = False # 重置标志,避免同一条件重复触发
# --- 检查趋势信号(空仓时) ---
elif position == 0:
if price > bbreak:
position = 1
entry_price = price
trade_count += 1
elif price < sbreak:
position = -1
entry_price = price
trade_count += 1
# --- 收盘前强制平仓 ---
# 判断是否为当日最后一根K线:检查下一条K线的日期是否不同
if i < len(df) - 1:
next_date = df['date'].iloc[i+1]
if next_date != date and position != 0:
position = 0
entry_price = 0.0
df.loc[df.index[i], 'Position'] = position
if position != 0:
df.loc[df.index[i], 'Entry_Price'] = entry_price
# 3. 计算收益率
df['Returns'] = df['Position'].shift(1) * (df['Close'] - df['Close'].shift(1)) / df['Close'].shift(1)
df['Returns'] = df['Returns'] - cost_rate * (df['Position'] != df['Position'].shift(1)).astype(int)
df['Net_Value'] = (1 + df['Returns']).cumprod()
total_return = (df['Net_Value'].iloc[-1] - 1) * 100
max_drawdown = ((df['Net_Value'].cummax() - df['Net_Value']) / df['Net_Value'].cummax()).max() * 100
print(f"总收益率:{total_return:.2f}%")
print(f"最大回撤:{max_drawdown:.2f}%")
print(f"交易次数:{trade_count}")
return df
# 使用示例(伪代码):
#
# from tqsdk import TqApi, TqAuth
#
# api = TqApi(auth=TqAuth("your_account", "your_password"))
# # 获取1分钟K线数据
# kline = api.get_kline_serial("CFFEX.IF", 1)
# df = kline.to_dataframe()
#
# # 运行策略
# result = rbreaker_strategy(df, f1=0.35, f2=1.07, f3=0.25)
# print(result[['Close', 'bbreak', 'sbreak', 'Position', 'Net_Value']].tail(10))
回测结果参考(基于公开数据,不同品种和时段结果存在显著差异):
| 指标 | 参考值 |
|---|---|
| 年化收益率 | 15%-40% |
| 最大回撤 | 5%-10% |
| 夏普比率 | 1.0-2.0 |
| 胜率 | 40%-55% |
| 持仓周期 | 日内(数分钟至数小时) |
注:以上数据为不同R-Breaker策略的历史回测参考值,实际表现取决于品种选择、参数设置和市场环境。在沪深300股指期货上,有研究显示2010-2011年累计收益78.8%、最大回撤6.25%。但需注意回测不代表实盘,参数优化和过拟合是主要风险。
代码说明:
本代码为R-Breaker策略框架,核心逻辑包括六个价位计算、趋势信号(空仓时突破开仓)和反转信号(持仓时先观察后确认)。实际应用中,需要获取分钟级K线数据,并根据具体品种优化参数。期货数据建议使用聚宽、天勤(TqSdk)或万得(Wind)等专业数据源。
老陈点评:
回测时要注意:R-Breaker策略的回测结果对数据频率极其敏感。使用1分钟和5分钟数据回测,结果可能差异很大——1分钟数据信号更多、交易更频繁,但滑点和手续费的影响也更大。建议同时测试多个时间框架,观察策略的稳定性。
老王补充:
实盘中最大的问题是滑点和执行速度。R-Breaker的信号触发往往伴随着价格的快速运动——突破时价格可能已经跑出去好几个tick。建议在回测中加入0.05%-0.1%的滑点成本,看看策略是否还能盈利。另外,务必设置收盘前强制平仓——这是日内策略的生命线,不能有任何例外。
七、本章小结与思考题
小结
| 项目 | 核心要点 |
|---|---|
| 策略类型 | 日内短线,趋势+反转双重逻辑 |
| 核心公式 | 六个价位基于前一交易日H/L/C计算 |
| 趋势信号 | 空仓时突破最外层价位顺势开仓 |
| 反转信号 | 持仓时先观察再确认,反手操作 |
| 核心优势 | 双重逻辑适应性强,长期一致性高 |
| 最大风险 | 参数敏感、低波动市场信号稀少 |
| 资金门槛 | 极低,单品种即可运行 |
| 核心纪律 | 收盘前强制平仓,不持仓过夜 |
R-Breaker策略是日内短线交易中最经典的“双重逻辑”策略——它用一个六价位系统,同时容纳了趋势跟踪和反转交易两种逻辑。在趋势市中,突破信号让它顺势跟进;在震荡市中,反转信号让它高抛低吸。一个策略,两种赚钱方式。
R-Breaker vs 菲阿里四价 vs 枢轴点:
| 维度 | 菲阿里四价(第三.05) | 枢轴点策略(第三.06) | R-Breaker(第三.01) |
|---|---|---|---|
| 关键价位数量 | 2个 | 5个 | 6个 |
| 核心逻辑 | 边界突破 | 重心回归/突破 | 趋势+反转双重逻辑 |
| 信号确认 | 无 | 无 | 双重确认(观察位+反转位) |
| 趋势市表现 | 优异 | 中等 | 优异 |
| 震荡市表现 | 差 | 优异 | 良好 |
| 策略复杂度 | 极低 | 低 | 中等 |
老陈总结:
R-Breaker的设计哲学是“用一套规则应对两种市场状态”——趋势来了不踏空,震荡来了不硬扛。这种“自适应”的设计思路,比单纯追求高胜率或高盈亏比更有生命力。一个策略的价值不在于它某一年能赚多少,而在于它能否在不同的市场环境中持续生存。
老王总结:
R-Breaker是我用过的日内策略里最“省心”的一个——每天开盘前算好六个价位,盘中盯着价格走到哪了就行。但省心不代表省力,参数优化和纪律执行缺一不可。 如果你能做到这两点,R-Breaker是一个能陪你很久的策略。
💡 思考题
- R-Breaker策略的“反转信号”为什么需要“先观察后确认”的双重机制?如果去掉观察位,直接用反转位触发信号,会发生什么?
- R-Breaker与菲阿里四价(第三.05)都使用了“突破”逻辑,但R-Breaker多了观察位和反转位。这两种策略在震荡市中的表现差异是什么?为什么?
- R-Breaker策略要求收盘前强制平仓。如果允许持仓过夜,策略的收益和风险会如何变化?请从隔夜跳空和趋势延续两个角度分析。
- R-Breaker的经典参数(0.35、1.07、0.07、0.25)是在特定市场条件下得出的。如果你要将R-Breaker应用到一个波动率明显不同的品种上(如从沪深300股指期货转到螺纹钢期货),你会如何调整这些参数?请说明你的调整逻辑。
- (展望题) R-Breaker已经存在了三十多年,其核心框架至今仍被广泛使用。你认为一个策略能够“长寿”的关键因素是什么?在AI和机器学习时代,像R-Breaker这样基于固定规则的传统策略是否还有生命力?
八、引用/参考出处
网上内容:
- 天勤量化《R-Breaker策略(难度:初级)》:https://www.shinnytech.com/articles/trading-strategy/trend-following/r-breaker
- 同花顺量化平台《R-Breaker策略原理(期货)》:https://quant.10jqka.com.cn/view/article/1466
- CSDN博客《日内交易最强量化策略:R-Breaker策略》(2025-07-04):https://blog.csdn.net/lyy_luyao/article/details/149120436
- 叩富网《有没有R-Breaker期货日内策略的代码分享?》(2026-02-05):https://licai.cofool.com/ask/qa_6727977.html
- vn.py社区《解密并强化日内经典策略R-Breaker》:https://www.vnpy.com/forum/topic/1597-jie-mi-bing-qiang-hua-ri-nei-jing-dian-ce-lue-r-breaker
学术论文与研报(元信息):
- 程序化交易系列研究之五《全球顶尖程序化交易模型研究》(2012-02-02)——R-Breaker在全球顶尖交易系统中的地位与排名
- 程序化交易系列研究之六《R-Breaker模型后续测试及优化》(2012-06-26)——沪深300股指期货上的回测与参数优化
- 股指期货日内量化投资策略研究——R-Breaker在国内市场的应用与改进


















暂无评论内容