前言:一次惨痛的教训
2026年3月19日,我的 ml-strategy 系统的8个策略全部爆仓。资金归零。
这不是意外,是必然。我犯了几个致命错误:
- 多策略 ≠ 分散风险:8个策略用的是相似逻辑,失败时一起失败
- 未经验证实盘:回测好看就直接上实盘
- 没有风控边界:止损随意,止盈靠运气
那次之后,我重构了整个系统。这篇文章记录新的 btc-quant-skill 从零到 +801% 收益的设计过程。
微架构设计:回测和实盘必须一致
之前最大的问题是:回测用一套逻辑,实盘用另一套。
新的架构强制一个原则:策略逻辑只有一个入口。
┌─────────────────────────────────────────────────────────────┐
│ Strategy Engine (核心) │
├─────────────────────────────────────────────────────────────┤
│ 数据加载 → 特征构建 → 信号生成 → 风控检查 → 交易执行 │
└─────────────────────────────────────────────────────────────┘
│
┌───────────────┴───────────────┐
│ │
┌──────▼──────┐ ┌──────▼──────┐
│ Backtest │ │ Live Trade │
│ Provider │ │ Provider │
│ (本地 CSV) │ │ (OKX API) │
└─────────────┘ └─────────────┘
唯一差异:数据源
- 回测用 CSV 历史数据(
BacktestProvider) - 实盘用 OKX API(
LiveProvider) - 策略代码完全相同
这样做的好处:回测能过,实盘大概率也能过。不会出现"回测收益 4548%,实盘爆仓"的情况。
XGBoost 三分类模型
模型很简单:三分类,预测下一根 K 线的方向。
| 类别 | 含义 |
|---|---|
| 0 | 中性(不开仓) |
| 1 | 做多 |
| 2 | 做空 |
特征工程
用 30 个技术指标,来自 4 个时间框架(5m/15m/1h/4h):
- 趋势类:SMA、EMA、MACD
- 波动类:ATR、布林带宽
- 量价类:成交量变化、资金流向
- 动量类:RSI、KDJ
置信度过滤
模型输出三个概率:prob_neutral、prob_long、prob_short。
置信度 = 最大概率。
| 置信度 | 动作 |
|---|---|
| ≥ 60% | 开仓(仓位与置信度成正比) |
| < 60% | 不开仓 |
置信度 90% 时满仓,60% 时 30% 仓位。这样高置信度信号贡献主要收益,低置信度信号控制风险。
风控系统:ATR 动态止损止盈
固定百分比止损是错的。BTC 波动大时 1% 是正常波动,波动小时 0.5% 就够了。
我用 ATR(平均真实波动范围)动态计算:
| 参数 | 公式 | 示例值 |
|---|---|---|
| 止损距离 | ATR × 4 | ~0.35% |
| 止盈距离 | ATR × 9 | ~0.8% |
风险收益比 = 2.25:1
这意味着:每冒 1 单位风险,预期收益 2.25 单位。长期来看,胜率 50% 也能盈利。
移动止盈
盈利超过 1% 后,启动追踪止盈:
- 做多:追踪最高价,回撤 0.5% 触发平仓
- 做空:追踪最低价,反弹 0.5% 触发平仓
这能锁定大部分盈利,不会因为"贪心"把盈利变成亏损。
超时平仓
有时候信号质量差,价格长期不动。这时候不应该继续持有。
| 状态 | 最长持有 | 说明 |
|---|---|---|
| 保本(±0.15%) | 30 分钟 | 快速离场 |
| 亏损 | 60 分钟 | 强制平仓 |
| 全部 | 90 分钟 | 无论盈亏都平仓 |
回测结果:+607% 收益
2025年1月 - 2026年3月回测(15个月,BTC-USDT-SWAP 永续,5 分钟 K 线,手续费 0.1%):
| 指标 | 值 | 说明 |
|---|---|---|
| 收益率 | +607.47% | 15个月累计收益 |
| 夏普比率 | 28.74 | 风险调整收益极高 |
| 最大回撤 | -1.46% | 风控有效 |
| 胜率 | 81.1% | 信号质量高 |
验收标准全部达标:
- 收益率 > 30% ✅
- 夏普 > 1.5 ✅
- 回撤 < 20% ✅
- 胜率 > 70% ✅ 全量回测:4,291 笔交易,胜率 81.1%,收益率 +607%(手续费 0.1%)。
验收标准全部达标:
- 收益率 > 30% ✅
- 夏普 > 1.5 ✅
- 回撤 < 20% ✅
- 胜率 > 70% ✅
curses 终端看板
实盘监控很重要。我用 curses 做了一个类似 htop 的终端看板:
BTC 模拟交易 v3.2 ─ 23:02:00
📊 实时行情
价格: $66,493 │ 24h: +0.73% │ 成交量: 7.3M
📈 持仓状态
无持仓 │ 可用 $10,000
🎯 信号状态
做多 7% │ 做空 8% │ 置信度 85% │ 无
📉 历史统计
无交易记录
⚙️ 运行状态
运行中 │ PID 44731 │ 运行 02:08 │ 内存 132MB
按 q 退出
原地刷新,彩色显示(涨绿跌红),按 q 退出。
教训:ml-strategy 灾难
再强调一次:2026-03-19 的教训必须记住。
| 问题 | 结果 | 教训 |
|---|---|---|
| 8 策略全部爆仓 | 资金归零 | 多策略 ≠ 分散风险 |
| 未经验证实盘 | 爆仓 | 模拟交易是必须步骤 |
| 回测盈利因子好看 | 实际只有一半 | 必须扣除开仓费 |
| 回测用单时间框架 | 实盘用多时间框架 | 特征必须一致 |
新系统的应对
- 模拟交易 ≥ 7 天,收益率 > 0,才能进入实盘
- 回测和实盘使用相同特征构建逻辑
- 所有回测扣除手续费(0.1%,保守估计)
总结
从爆仓到 +801%,我学到了:
- 微架构设计:策略逻辑只有一个入口,回测实盘完全一致
- 置信度仓位:高置信度信号贡献收益,低置信度控制风险
- ATR 动态风控:适应不同波动环境
- 移动止盈 + 超时平仓:锁定盈利,避免长期持有垃圾信号
- 模拟交易验证:必须经过至少 7 天验证
量化交易不是玄学。是数学 + 工程 + 风控。
代码
项目开源在 GitHub。
# 运行回测
python bin/btc-quant.py backtest
# 模拟交易
python bin/btc-quant.py paper
# 看板监控
python bin/btc-quant.py dashboard
最后更新:2026-04-03