状态滚动重估 · 最小补丁架构

cross-section-pipeline 引擎零改造思路(除 1 处小补丁)
997
输出列/股/日 = 983 因子 + 14 状态标量(全股同值伪列)
1 处
引擎补丁(append 投影降级)· 其余零引擎改动
~10 min
每日更新后全量重投影耗时(997 因子量级)
① peaks_metrics.rs(新)
compute_peaks_full:移植 sandbox v3 逻辑
983 因子 + 14 状态标量(当日副产品)
v1 读盘 / v2 传数据双版本
② colblk 写入(补丁 A)
8 shard × 997 列;append_batch 已投影时
自动降级未投影 → 追加 → 重新投影
唯一引擎改动点
③ regime_engine.py(新,Python 层)
读 14 状态标量列 → 状态标量表(14×N 天)
每日滚动重估 [t−W, t−1]:PCA + k=4 聚类 + 阈值
→ 每日 params(毫秒级,KB 级输入)
④ 组合层(新,Python 层)
params → 符号表 / 族乘数 / 黑名单 17 /
中性化门控 → 983 因子变换 → 回测
Rust 侧:5 处注册照规范 tail_pipeline_engine 已支持 names 子集(997 存 983 回测) 补丁 A:factor_store_v5.rs:691-694 约 10 行 断点续算 _completed_dates 机制现成
一次性批量计算(10 年)
rp.run_factor_pipeline_cross_section(
    pipeline="peaks", tasks=rp.td.get_range(20150105, 20260717),
    n_jobs=400, expected_result_length=997,
    trading_days=list(rp.td.trading_days),
    store_dir=f"/hdd/.../factor_store_peaks",
    store_factor_names=rp.py_peaks_names(),
)   # update_mode 默认 False:清空重建 → 自动投影
耗时:11.41 天/分钟 × 2798 天 ≈ 4.1 小时(8 进程 × 50 线程)+ 首次投影(997 因子约 10 分钟级)。状态标量/因子全程无跨日依赖,任务间完全独立,天然并行。
每日更新最新一天(含滚动重估)
# Step 1:只算新日期(pending 由 _completed_dates 过滤)
rp.run_factor_pipeline_cross_section(
    pipeline="peaks", tasks=[最新交易日], update_mode=True,
    n_jobs=400, expected_result_length=997, ...)
#   → 补丁 A 自动降级投影 → 追加 → 全量重投影(幂等)

# Step 2:滚动重估增量(窗口自动前移,毫秒级)
params = regime_engine.fit(state_table)   # [t−W, t−1] PCA+聚类+阈值

# Step 3:组合层 → 最终因子 → 回测
成本:单日计算(1 进程全力)+ 全量重投影 ~10 分钟 + 滚动重估毫秒级。防前视:聚类只用 t−1 及以前标量表,params 在 t 日应用。