darkeril

V5.2 开发文档(完整版)

套利引擎V5.2 — Bug修复 + 策略优化 + 8信号源 + 策略配置化 + AB测试

V5.2 开发文档(完整版)

版本:V5.2 | 状态:待开发 | 负责人:露露 创建:2026-03-01 | 前置:V5.1 tag v5.1 commit d8ad879 V5.1-hotfix:commits 45bad254b841bc(P0修复已上线)


一、V5.1 现状总结

模拟盘数据(截至2026-03-01)

指标数值
总交易181笔
总盈亏+37.07R
每笔平均+0.20R
初始资金$10,000
当前余额~$17,414

按档位统计(关键数据)

档位笔数胜率总PnL每笔平均结论
85+ (heavy)5373.6%+15.00R+0.28R✅ 优质
80-848165.4%+4.11R+0.05R⚠️ 平庸
75-794178.0%+17.05R+0.42R✅ 最佳
70-74650.0%-2.65R-0.44R❌ 亏钱

手续费分析(核心发现)

币种SL距离%仓位价值隐含杠杆手续费/R
BTC0.43%$46,0004.6x0.23R
ETH0.56%$36,0003.6x0.18R
XRP0.44%$45,0004.5x0.05R
SOL0.58%$34,0003.4x0.04R

手续费公式fee_R = 2 × 0.05% × position_value / risk_usd

BTC盈亏比问题:TP2净利+0.89R vs SL净亏-1.23R,盈亏比仅0.72,需55%以上胜率才保本。

V5.1已修复的P0 Bug(hotfix已上线)

Bug影响修复Commit
pnl_r虚高2倍统计数据全部失真45bad25
冷却期阻断反向平仓反向信号无法关仓45bad25
分区月份Bug月底数据写入失败45bad25
SL/TP用市价不是限价SL超过1R2f9dce4
浮盈没算半仓持仓盈亏虚高4b841bc

二、V5.2 目标

核心目标

  1. 修复所有已知Bug(Claude Code审阅 + 实际使用发现的)
  2. FR+清算加入评分(8信号源完整版)
  3. 开仓阈值提到75分(砍掉70-74垃圾信号)
  4. 策略配置化框架(一套代码多份配置)
  5. AB测试(V5.1 vs V5.2并行对比)
  6. 24小时warmup(消除冷启动)

设计原则

  • 55%胜率必须盈利:盈亏比至少0.82:1
  • 无限趋近实盘:模拟盘和实盘逻辑完全一致
  • 数据驱动:所有决策基于数据,不拍脑袋

三、Bug修复清单

后端(15项)

ID优先级文件问题修复方案
P0-3P1signal_engine.py:285开仓价用30分VWAP而非实时价price = win_fast.trades[-1][2]
P0-4P2signal_engine+paper_monitor双进程并发写paper_tradesSELECT FOR UPDATE SKIP LOCKED
P1-2P2signal_engine.py:143-162浮点精度漂移(buy_vol/sell_vol)每10000次trim从deque重算sums
P1-3P1market_data_collector.py:51单连接无重连改用db.get_sync_conn()连接池
P1-4P3db.py:36-43连接池初始化线程不安全threading.Lock双重检查
P2-1P2market_data_collector.py:112XRP/SOL coinbase_premium KeyErrorif symbol not in pair_map: return
P2-3P2agg_trades_collector.py:77flush_buffer每秒调ensure_partitions移到定时任务(每小时一次)
P2-4P3liquidation_collector.py:127elif条件冗余改为else
P2-5P2signal_engine.py:209atr_percentile @property有写副作用拆成update_atr_history()方法
P2-6P2main.py:5541R=$200硬编码从paper_config.json动态读取
P3-1P2auth.py:15JWT密钥硬编码默认值启动时强制校验JWT_SECRET环境变量
P3-2P3main.py:17CORS allow_origins=["*"]限制为https://arb.zhouyangclaw.com
P3-3P3auth.py:316refresh token刷新非原子UPDATE...WHERE revoked=0 RETURNING
P3-4P3auth.py:292登录无频率限制slowapi或Redis计数器
NEW-1P1signal_engine.py:664冷启动warmup只有4小时分批加载24小时,加载完再出信号

前端(12项)

ID优先级文件问题修复方案
FE-P1-1P1lib/auth.tsx:113并发401多次refresh竞态单例Promise + _refreshPromise
FE-P1-2P1lib/auth.tsx:127刷新失败AuthContext未同步window.dispatchEvent("auth:session-expired")
FE-P1-3P1所有页面catch{}静默吞掉API错误每个组件加error state + 红色提示
FE-P1-4P2paper/page.tsx:119LatestSignals串行4请求Promise.allSettled并行
FE-P2-1P3app/page.tsx:52MiniKChart每30秒销毁重建只更新data不重建chart
FE-P2-3P2paper/page.tsx:20ControlPanel非admin可见校验isAdmin,非admin隐藏
FE-P2-4P1paper/page.tsx:181WebSocket无断线重连指数退避重连 + 断线提示
FE-P2-5P2paper/page.tsx:2171R=$200前端硬编码/api/paper/config读取
FE-P2-6P2signals/page.tsx:1015秒轮询5分钟数据改为300秒间隔
FE-P2-8P3paper/signals大量any类型定义TypeScript interface
FE-P3-1P3lib/auth.tsx:33Token存localStorage评估httpOnly cookie方案
FE-P3-3P3app/page.tsx:144Promise.all任一失败全丢Promise.allSettled

四、新功能:8信号源评分

当前6信号源 → V5.2增加2个

#信号源层级当前V5.2
1CVD三轨(fast/mid)方向层✅ 评分中保持
2P99大单流方向层✅ 评分中保持
3CVD加速度方向层✅ 评分中保持
4多空比+大户持仓比拥挤层✅ 评分中保持
5OI变化率环境层✅ 评分中保持
6Coinbase Premium辅助层✅ 评分中保持
7资金费率(FR)拥挤层⬜ 仅采集✅ 加入评分
8清算数据确认层⬜ 仅采集✅ 加入评分

FR评分逻辑(草案)

# 资金费率 → 拥挤层加分
# FR > 0.03% = 多头过度拥挤 → SHORT加分
# FR < -0.03% = 空头过度拥挤 → LONG加分
# |FR| > 0.1% = 极端值 → 反向强信号

funding_rate = self.market_indicators.get("funding_rate")
if funding_rate is not None:
    if direction == "LONG" and funding_rate < -0.0003:
        fr_score = 5  # 空头拥挤,做多有利
    elif direction == "SHORT" and funding_rate > 0.0003:
        fr_score = 5  # 多头拥挤,做空有利
    elif direction == "LONG" and funding_rate > 0.001:
        fr_score = -5  # 多头极度拥挤,做多危险(减分)
    elif direction == "SHORT" and funding_rate < -0.001:
        fr_score = -5  # 空头极度拥挤,做空危险
    else:
        fr_score = 0

清算数据评分逻辑(草案)

# 大额清算 → 确认层加分
# 大额空单清算 = 空头被清洗 → SHORT可能结束,LONG加分
# 大额多单清算 = 多头被清洗 → LONG可能结束,SHORT加分
# 5分钟内清算量 > 阈值 = 趋势加速信号

liq_long = self.market_indicators.get("long_liq_usd", 0)
liq_short = self.market_indicators.get("short_liq_usd", 0)
if direction == "LONG" and liq_short > 500000:
    liq_score = 5  # 大量空单被清算,趋势确认
elif direction == "SHORT" and liq_long > 500000:
    liq_score = 5
else:
    liq_score = 0

V5.2权重分配(草案)

层级V5.1权重V5.2权重变化
方向层45+540+5-5
拥挤层2025(+FR 5分)+5
环境层1515不变
确认层1520(+清算 5分)+5
辅助层55不变
总计100+5105+5+5

注:总分超过100不影响,阈值按绝对分数判断(75/80/85)


五、策略调整

开仓阈值调整

V5.1V5.2原因
最低开仓分60分75分70-74档位50%胜率,扣手续费亏钱
light档60-74取消数据证明低分信号无价值
standard档75-8475-84保持
heavy档85+85+保持

TP/SL倍数(待AB测试确认)

参数V5.1(方案A)V5.2候选(方案B)
SL2.0 × risk_atr3.0 × risk_atr
TP11.5 × risk_atr2.0 × risk_atr
TP23.0 × risk_atr4.0 × risk_atr
BTC手续费占比0.23R0.15R
TP2净利+0.89R+0.97R
SL净亏-1.23R-1.15R
盈亏比0.720.84
保本胜率58%54%

六、策略配置化框架

设计目标

一个signal-engine进程,支持多套策略配置并行。

配置文件结构

// strategies/v51.json
{
  "name": "v51_baseline",
  "threshold": 75,
  "weights": {
    "direction": 45,
    "crowding": 20,
    "environment": 15,
    "confirmation": 15,
    "auxiliary": 5
  },
  "tp_sl": {
    "sl_multiplier": 2.0,
    "tp1_multiplier": 1.5,
    "tp2_multiplier": 3.0
  },
  "signals": ["cvd", "p99", "accel", "ls_ratio", "oi", "coinbase_premium"]
}

// strategies/v52.json
{
  "name": "v52_8signals",
  "threshold": 75,
  "weights": {
    "direction": 40,
    "crowding": 25,
    "environment": 15,
    "confirmation": 20,
    "auxiliary": 5
  },
  "tp_sl": {
    "sl_multiplier": 3.0,
    "tp1_multiplier": 2.0,
    "tp2_multiplier": 4.0
  },
  "signals": ["cvd", "p99", "accel", "ls_ratio", "oi", "coinbase_premium", "funding_rate", "liquidation"]
}

paper_trades表新增字段

ALTER TABLE paper_trades ADD COLUMN strategy VARCHAR(32) DEFAULT 'v51_baseline';

七、AB测试方案

架构

signal_engine.py
    ├── evaluate_signal(state, strategy="v51") → score_A, signal_A
    ├── evaluate_signal(state, strategy="v52") → score_B, signal_B

    ├── paper_open_trade(strategy="v51", ...) → paper_trades.strategy='v51'
    └── paper_open_trade(strategy="v52", ...) → paper_trades.strategy='v52'

独立资金池

  • V5.1:$10,000虚拟资金,独立统计
  • V5.2:$10,000虚拟资金,独立统计

对比指标

指标V5.1V5.2
总笔数??
胜率??
每笔平均R??
最大回撤??
盈亏比??
PF??

测试周期

  • 两周(目标每策略100+笔)
  • 结束后选表现更好的上实盘

八、24小时Warmup

当前问题

signal-engine启动时只加载4小时数据,P99大单需要24小时窗口。

方案(范总确认)

def main():
    states = {sym: SymbolState(sym) for sym in SYMBOLS}
    
    # 分批加载24小时(每批100万条,避免OOM)
    for sym, state in states.items():
        load_historical_chunked(state, 24 * 3600 * 1000)
        logger.info(f"[{sym}] warmup complete")
    
    logger.info("=== 全部币种warmup完成,开始出信号 ===")
    # 这之后才开始评估循环

预估

  • 4币种24小时约2000-3000万条
  • 加载时间1-3分钟
  • 启动后信号质量从第一笔就是100%

九、V5.1-hotfix已修复清单(参考)

Commit内容
45bad25P0-1: 反向信号绕过冷却
45bad25P0-2: pnl_r统一(exit-entry)/risk_distance
45bad25P1-1: 分区月份+UTC修复
2f9dce4TP/SL改限价单模式(趋近实盘)
4b841bc前端浮盈半仓计算
d351949历史pnl_r修正脚本
8b73500Auth从SQLite迁移PG
9528d69recent_large_trades去重

十、开发排期(草案)

阶段时间内容产出
Phase 1Day 1-2Bug修复(P1全部 + P2重要的)代码+测试
Phase 2Day 2-3FR+清算评分逻辑signal_engine.py
Phase 3Day 3-4策略配置化框架strategies/*.json + 代码
Phase 4Day 4-5AB测试机制paper_trades.strategy字段
Phase 5Day 524h warmupsignal_engine.py
Phase 6Day 6-7前端Bug修复 + 策略对比页面前端代码
部署Day 7全部写好测好,一次性部署减少重启

十一、数据需求

当前数据量

  • aggTrades:7039万条(BTC 23天 + ETH 3天 + XRP/SOL 3天)
  • signal_indicators:2.7万+条
  • paper_trades:181笔
  • market_indicators:5400+条
  • liquidations:3600+条

V5.2需要的数据量

  • AB测试:每策略至少100笔 → 两周
  • 权重优化(Phase 1统计分析):300+笔
  • 回归分析:500+笔
  • ML优化:1000+笔

十二、风险与注意事项

  1. 手续费是盈亏关键 — BTC手续费0.23R/笔,必须控制交易频率
  2. 样本量不足 — 当前181笔,按分数段分析可能不稳定
  3. 过拟合风险 — 两周一次微调,每次±10-20%,不做大改
  4. AB测试期间 — 两套策略共享最大持仓4个,需要分配
  5. 24h warmup — 启动时间变长,需要告知运维(小周)
  6. 策略配置化 — 改动signal_engine核心代码,必须充分测试

本文档为V5.2开发的完整参考,开发过程中持续更新。 商业机密:策略细节不对外暴露。

On this page