第三.01 R-Breaker

📘 本章重点

  • 理解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是一个能陪你很久的策略。

💡 思考题

  1. R-Breaker策略的“反转信号”为什么需要“先观察后确认”的双重机制?如果去掉观察位,直接用反转位触发信号,会发生什么?
  2. R-Breaker与菲阿里四价(第三.05)都使用了“突破”逻辑,但R-Breaker多了观察位和反转位。这两种策略在震荡市中的表现差异是什么?为什么?
  3. R-Breaker策略要求收盘前强制平仓。如果允许持仓过夜,策略的收益和风险会如何变化?请从隔夜跳空和趋势延续两个角度分析。
  4. R-Breaker的经典参数(0.35、1.07、0.07、0.25)是在特定市场条件下得出的。如果你要将R-Breaker应用到一个波动率明显不同的品种上(如从沪深300股指期货转到螺纹钢期货),你会如何调整这些参数?请说明你的调整逻辑。
  5. (展望题) R-Breaker已经存在了三十多年,其核心框架至今仍被广泛使用。你认为一个策略能够“长寿”的关键因素是什么?在AI和机器学习时代,像R-Breaker这样基于固定规则的传统策略是否还有生命力?

八、引用/参考出处

网上内容

学术论文与研报(元信息)

  • 程序化交易系列研究之五《全球顶尖程序化交易模型研究》(2012-02-02)——R-Breaker在全球顶尖交易系统中的地位与排名
  • 程序化交易系列研究之六《R-Breaker模型后续测试及优化》(2012-06-26)——沪深300股指期货上的回测与参数优化
  • 股指期货日内量化投资策略研究——R-Breaker在国内市场的应用与改进
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容

欢迎注册,发表评论

邀请码为:uHpQJBTMc9PYEr2