基于《Scalp 进阶学习笔记》(南桥价格行为体系)对 BTC 进行的 Price Action 剥头皮策略量化实现。
原文将 scalp 入场分为 3 大类共 5 种执行方式,本质上围绕两种市场状态展开:
| 市场状态 | 入场方式 | 核心逻辑 |
|---|---|---|
| 强趋势/窄通道 | 突破单 scalp | 顺势而为,趋势K极值挂止损突破单 |
| 宽幅震荡区间 | 突破单(区间上下沿) | 反转结构+信号K,押注反转 |
| 宽幅震荡区间 | 市价单 | 大阳收盘做空 / 大阴收盘做多,押注 80% 突破失败 |
| 震荡区间 | 限价单①前高前低 | 在前高前低挂反向限价单 |
| 窄震荡区间 | 限价单②第二根趋势K极值 | 押注不会出现连续 3 根趋势K |
| 震荡区间 | 限价单③解套战法 | 在被套趋势K收盘价做反转 |
两条底层信念:
- 强趋势必延续,弱信号必反转
- 震荡区间内约 80% 的突破会失败
弱交易员的常见问题(PDF 第 4 页):
- 仓位过大导致情绪化抗单
- 无法连续高频进场,错过趋势利润
- 把"成本价/上次盈亏"当锚点,而不是结构与触发
| PA 概念 | 量化定义 |
|---|---|
| 趋势K | ` |
| 信号K(针形) | 一侧影线 > 2 × 实体,另一侧影线 < 实体 |
| 信号K(吞没) | 当前K实体完全包含前一K实体且方向相反 |
| 强趋势 | ADX > 25 且收盘价连续在 EMA20 同侧,HH/HL 或 LH/LL |
| 窄通道 | Donchian(20) 宽度 < 2 × ATR(14) |
| 宽幅震荡区间 | Donchian(50) 宽度 > 3 × ATR(14) 且 ADX < 20,且上下沿各有 ≥ 2 次触碰 |
| 区间 MM(中线) | (Donchian_high + Donchian_low) / 2 |
| 反转结构(双顶/底) | 两个高/低点价差 ≤ 0.3 × ATR,且中间有效回撤 |
| 反转结构(楔形) | 滑动窗口内 swing 高低点的回归斜率收敛 |
| 被套K | 趋势K 出现后 N 根内价格反向击穿其开盘价,标记其收盘价为埋伏位 |
┌───────────────────────────────────────────────────────┐
│ Market Regime Detector │
│ trend / narrow_channel / wide_range / undefined │
└───────────────────┬───────────────────────────────────┘
│
┌───────────┼───────────────┐
▼ ▼ ▼
┌────────┐ ┌─────────┐ ┌──────────┐
│ trend │ │ narrow │ │ wide │
│ scalp │ │ channel │ │ range │
└────────┘ └─────────┘ └──────────┘
│ │ │
▼ ▼ ▼
突破单顺势 突破单/限价② 市价单 + 限价①③
每根 K 线收盘后执行以下流程:
- regime 判定 → 决定当前可用的入场方式
- 结构识别 → 是否处在反转结构、是否有信号K、是否有被套K
- 生成信号 → 进场价、止损、止盈
- 风控过滤 → 仓位、最大持仓数、当日亏损上限
- 执行下单 → 限价/市价/止损单
- 仓位:单笔风险 = 账户权益 ×
risk_per_trade(默认 0.5%),按 stop 距离反推手数 - 每日最大亏损:连亏 3 笔或日亏损 ≥ 3% 立即停止当日交易(对应 PDF "停止交易、远离电脑")
- 强制 R:R:突破单 ≥ 1:1.5,限价反转 ≥ 1:1,市价单 ≥ 1:2
- 持仓时间限制:scalp 单笔持仓 ≤ 30 根 K 线,超时强平
- 反向信号优先:出现明确反向信号K 时优先于止盈/止损平仓
owen-quant/
├── README.md # 本文档
├── requirements.txt # 依赖
├── config.py # 所有参数集中管理
├── data_loader.py # 通过 ccxt 拉取 BTC K 线
├── indicators.py # 趋势K、信号K、ATR、ADX、Donchian
├── structures.py # 反转结构与被套K 识别
├── regime.py # 市场状态判定
├── signals.py # 5 种入场信号生成器
├── strategy.py # 策略主类(信号 → 订单)
├── backtest.py # 向量化回测引擎
├── main.py # 入口:拉数据 → 回测 → 报告
└── .gitignore
# 安装依赖
pip install -r requirements.txt
# 拉取 BTC 5m K 线并回测
python main.py --symbol BTC/USDT --timeframe 5m --days 30
# 自定义参数
python main.py --symbol BTC/USDT --timeframe 1m --days 7 \
--risk 0.005 --enable-trend --enable-range --enable-limit- 本策略不构成投资建议。剥头皮策略对滑点、手续费、撮合速度极度敏感,回测正收益不等于实盘正收益。
- 手续费假设:Binance USDT 永续 taker 0.04% / maker 0.02%,需根据 VIP 等级调整。
- 滑点假设:每笔 0.02%。实盘中行情快速移动时可能更高。
- 数据频率:默认 5m,1m 噪声大但样本多,建议至少 2 周以上数据。
- PA 量化必有失真:原文依赖交易员对"结构"的主观识别,本实现使用规则化阈值,会过滤掉部分人眼可见的机会,也会产生人眼不会下的单。参数调优是核心工作。
- 未实现:手动画线的关键位、多时间框架共振、订单簿/盘口数据。