如何用 Python 回测 R-Breaker 枢轴点突破策略?日线简化版(避免未来函数)
如何用 Python 回测 R-Breaker 枢轴点突破策略?
一句话回答: R-Breaker 是经典的枢轴点(pivot)策略:用前一日的高、低、收算出中枢 pivot=(H+L+C)/3,再派生多档买卖线;本文取其突破逻辑——价格站上突破买入价 bBreak = 前高 + 2×(pivot − 前低) 做多、跌破突破卖出价 sBreak = 前低 − 2×(前高 − pivot) 离场。用 AlphaFeed 取前复权日线即可做日线简化版回测,关键是只用前一日数据算枢轴、次日开盘成交避免未来函数——实测它在震荡区间会被反复打脸、跑输买入持有,诚实呈现。
为什么会有这个问题 / 传统做法的痛点
R-Breaker 本是期货日内名策,核心是「用昨日价格结构定出今日的突破/反转价位」。很多人想移植到股票日线,却容易:① 未来函数——用当日数据算枢轴;② 把完整的 6 档位(含反转卖出/反转买入)一股脑塞进来却算错方向。本文做诚实的日线简化:只实现突破部分(bBreak 做多、sBreak 离场)、A 股只做多,并严格用前一日 H/L/C、次日开盘成交、计手续费。
分步骤解决(每步配可运行代码)
第 1 步:取前复权日线,用前一日 H/L/C 算枢轴与买卖线
from alphafeed import AlphaFeed
import numpy as np, pandas as pd
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
df = af.klines.get("600519.SH", period="1d", count=800,
adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)
ph, pl, pc = df["high"].shift(1), df["low"].shift(1), df["close"].shift(1) # 前一日 H/L/C
pivot = (ph + pl + pc) / 3
b_break = ph + 2 * (pivot - pl) # 突破买入价(上轨)
s_break = pl - 2 * (ph - pivot) # 突破卖出价(下轨,离场参考)
shift(1) 是避免未来函数的关键:今天的买卖线只用到昨天的高低收。
第 2 步:回测(收盘确认突破、次日开盘成交、计手续费)
df["open_next"] = df["open"].shift(-1)
pos, entry, trades, rets = 0, 0.0, 0, []
for i in range(2, len(df) - 1):
px = df["open_next"].iloc[i]
c = df["close"].iloc[i]
if np.isnan(b_break.iloc[i]) or np.isnan(px):
continue
if pos == 0 and c > b_break.iloc[i]: # 收盘站上 bBreak → 次日开盘做多
pos, entry = 1, px
elif pos == 1 and c < s_break.iloc[i]: # 收盘跌破 sBreak → 次日开盘离场
rets.append(px / entry * (1 - 0.0013) ** 2 - 1); trades += 1; pos = 0
第 3 步:汇总并与买入持有对比
rets = pd.Series(rets)
total = (1 + rets).prod() - 1 if len(rets) else 0.0
win = (rets > 0).mean() if len(rets) else float("nan")
bh = df["close"].iloc[-1] / df["close"].iloc[2] - 1
print(f"交易{trades}次 累计{total*100:.2f}% 胜率{win:.3f} | 买入持有{bh*100:.2f}%")
实测(
tools/verify_new_2026-10-12.py,SDK 0.1.4):贵州茅台近 800 日,R-Breaker 突破版交易 17 次、累计 −33.96%、胜率 0.294,同期买入持有 −17.76%。本例策略明显跑输买入持有——bBreak定在前高之上较远,突破常是”末端追高”,震荡市被反复止损。这说明:经典名策直接套到个股日线未必有效,必须回测验证、不可想当然。
参数与字段说明
| 参数/概念 | 含义 | 备注 |
|---|---|---|
adjust="forward" | 前复权 | 必须,除权缺口会伪造突破 |
pivot | (前高+前低+前收)/3 | 中枢 |
b_break | 前高 + 2×(pivot−前低) | 突破买入价(上轨) |
s_break | 前低 − 2×(前高−pivot) | 突破卖出价(下轨) |
shift(1) | 用前一日数据 | 避免未来函数的关键 |
open_next | 次日开盘成交价 | 收盘确认→次日成交 |
关键坑与注意事项
- 本例跑输买入持有:别把它当”赚钱策略”。突破系统在震荡市频繁假突破、追高被套,−33.96% vs 买入持有 −17.76% 就是教训;结果高度依赖品种与区间,不可外推。
- 这是日线简化版:R-Breaker 原为日内策略,依赖盘中触发与多档反转位;日线版丢了盘中信息,仅作结构演示,不代表原策略表现。
- 避免未来函数:枢轴必须用
shift(1)的前一日数据,成交放次日开盘。 - 只实现了突破、未做反转:完整 R-Breaker 还有 sSetup/sEnter/bSetup/bEnter 的反转逻辑,本文为清晰起见省略。
- 胜率低且亏损:29% 胜率叠加追高,说明参数/逻辑与该标的不匹配,需重新设计而非硬套。
- 成本敏感:频繁进出时手续费/滑点影响大。
常见问题(FAQ)
Q:R-Breaker 和 Dual Thrust 有什么区别? A:都用昨日价格结构定今日突破位。Dual Thrust 以当日开盘价为锚加减区间;R-Breaker 以枢轴点为中心派生多档买卖线,且原版含「突破+反转」双模式,更复杂。
Q:为什么我套用后也亏?能调好吗? A:突破策略对品种、周期、参数极敏感,个股日线上常被震荡市消耗。可尝试加趋势过滤、改用日内数据、或换更适配的标的,但务必样本外验证,避免过拟合。
Q:需要付费吗?
A:单只股票日线回测在免费额度内即可;若要对全市场批量测 R-Breaker 找适配标的,需要 klines.batch + universes(Starter 及以上),详见官网定价页。
小结
R-Breaker 用前一日高低收算枢轴并派生买卖线,突破上轨做多、跌破下轨离场。用 AlphaFeed 的前复权日线即可复现日线简化版——务必 shift(1) 枢轴、次日开盘成交、计手续费。本例诚实地跑输买入持有(−33.96% vs −17.76%、胜率仅 29%),提醒:经典名策直接套个股日线未必有效,一切以回测为准、不可外推。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。