模型在回测里赚钱,上线就亏:9000 行代码教我的列架构设计
- URL: https://mp.weixin.qq.com/s/BmR2CaHWXxbceJOdop2ryw
- Date Saved: 2026-06-24
- Source: WeChat
- Tags: ai-engineering, crypto-trading
Summary
深度分析 intelligent-trading-bot (ITB) 开源项目的架构设计,揭示其解决 ML 量化交易中「特征漂移」问题的三个核心架构决策。
核心问题:特征漂移(Feature Drift)
回测时模型表现好、实盘就亏的根本原因往往不是模型本身,而是训练时和生产环境中特征计算逻辑的微妙差异(窗口边界、NaN 处理、talib 不稳定周期等)。
三个架构决策
1. 列即函数(Column = Function)
- 所有数据(K线、技术指标、标签、ML预测、信号)存在一张 DataFrame
- 每列要么是源列(OHLCV),要么是派生列(DAG 依赖图)
- 特征、标签、ML预测在列模型下完全同构——都是「输入列 → 输出列」的函数
- 区别仅在于数据方向(过去/未来)和参数来源(手填/训练得到)
2. dirty_records — DAG 脏节点追踪
- 同一个 generate_feature_set 函数,通过 last_rows 参数区分离线全量 vs 在线增量
- 在线模式逐行调用 talib(性能换正确性),保证每行输入与离线完全一致
- dirty_records 机制追踪新数据影响的行数,只重算必要部分
3. 声明式生成器 — config 驱动 + 动态解析
- 配置中用
module:function格式动态加载生成器 - 新增特征不需要改框架代码,只需写函数 + 加配置
- 支持 trainable 生成器(train=true 训练,train=false 预测)
关键洞察
- 特征、标签、预测被当成三种不同的东西,是所有问题的根源
- 一旦统一为「列的函数」,漂移就不可能发生
- 用性能换正确性(在线逐行计算)是刻意的设计选择
- 项目地址:intelligent-trading-bot(GitHub)