【量化系统从0到1】回测引擎:性能不是难点,语义才是
回测引擎的主线不是"跑得快"而是"把 A 股语义做对":自研 142 行撮合核心、价格口径必须自洽(后复权修掉除权日假跳变)、费用用 Decimal 精确到一分钱、验证逼出三个 bug——以及 Rust 为什么最终没有写(50 票实测 0.3 秒,全市场按线性外推约 30 秒)。
回测引擎的主线不是"跑得快"而是"把 A 股语义做对":自研 142 行撮合核心、价格口径必须自洽(后复权修掉除权日假跳变)、费用用 Decimal 精确到一分钱、验证逼出三个 bug——以及 Rust 为什么最终没有写(50 票实测 0.3 秒,全市场按线性外推约 30 秒)。
个人量化系统的存储选型:先刻画数据特征,再推导方案——行情/因子用 parquet、财务/任务用 SQLite、元数据用 JSON。不选择什么比选择什么更重要:DuckDB、PostgreSQL 被排除的理由,以及它们的触发条件。
跑得快实录:profiling 实测 50 票纯计算不到 1 秒、全市场外推 30 秒——按决策表 Rust 取消、分区存储和 tj-web 推迟,三个大复杂度全部缓刑;把「什么时候优化」写成可对照的触发阈值。
跑得稳实录:任务表让跑批可追溯,调度写进代码不依赖宿主 cron(Docker/本地同构),备份先做、告警克制,以及「机制就绪不等于验证完成」的诚实边界。
跑得准实录:样本扩到 50 只后发现回测里 +300% 的假收益——真实价撮合在除权日权益跳变,账户换后复权口径;补全数据校验,IC 验证动量 20 日在 10/20 日窗口显著为正。
能跑阶段实录:契约先行防返工,接口文档和实际的落差,复权因子校验被真实数据推翻,验证逼出三个 bug,以及「10 万买不起一手茅台」的资金约束教训。
开工前我把设计做到了 v0.6,拆成四份文档,然后发现自己违背了刚写完的《架构不是设计出来的》:一行代码没写,却在讨论"怎么写对"。复盘哪些设计该留、哪些是阶段前移,以及如何用四阶段路线图补救。