From faac90c6ce1fe14c98941c59b53a1d22021be0bf Mon Sep 17 00:00:00 2001 From: claude_dev Date: Sun, 11 Oct 2026 18:33:12 +0800 Subject: [PATCH] =?UTF-8?q?fix(factor):=20VPS=E6=97=A5=E5=BA=A6wrapper=20r?= =?UTF-8?q?egistry=E5=AF=B9=E9=BD=90=E8=BF=90=E8=A1=8C=E5=89=AF=E6=9C=AC?= =?UTF-8?q?=E2=80=94=E2=80=9410-10=E9=94=99=E4=BD=8D=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E6=BC=8F=E4=BA=86=E6=9C=AC=E4=BB=B6(=E4=BB=8D=E6=8C=87config?= =?UTF-8?q?=E7=A7=8D=E5=AD=90),36=E4=B8=AAdecomposer=E5=9B=A0=E5=AD=90(10-?= =?UTF-8?q?09=E6=B3=A8=E5=86=8C)=E7=BC=BA=E5=B8=AD10-10=E9=A6=96=E7=8F=AD?= =?UTF-8?q?=E5=8D=B3=E6=AD=A4=E5=9B=A0;=E7=85=A7=E6=9C=88=E5=BA=A6wrapper?= =?UTF-8?q?=E5=90=8C=E6=AC=BEdata/+=E7=BC=BA=E6=A1=A3=E8=87=AA=E4=B8=BE,?= =?UTF-8?q?=E5=BD=93=E6=99=9A=E6=89=B9=E8=B5=B7=E5=85=A8=E5=91=98=E8=BF=9B?= =?UTF-8?q?=E6=89=B9;spec=E8=A1=A5=E5=AE=9E=E6=96=BD=E5=8B=98=E8=AF=AF=20[?= =?UTF-8?q?vps]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-09-22-research-to-trading-pipeline-design.md | 2 +- scripts/factor_research/run_factor_daily_wrapper.ps1 | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/superpowers/specs/2026-09-22-research-to-trading-pipeline-design.md b/docs/superpowers/specs/2026-09-22-research-to-trading-pipeline-design.md index 1d9396e6..ad2144ba 100644 --- a/docs/superpowers/specs/2026-09-22-research-to-trading-pipeline-design.md +++ b/docs/superpowers/specs/2026-09-22-research-to-trading-pipeline-design.md @@ -70,7 +70,7 @@ F 环是「管道」与「飞轮」的分界:归因发现→可能=衰减触 - **双机对拍=验证校准期机制(非永久双跑)**:对拍目的是验证与校准(防「当时就是错的」),不是刚需;首班 10-04 双机同评已双绿(一致 9/分歧 0),日度化后再跑**连续 4 周日度对拍关键指标(IC/t/rank)一致**即宣告验证通过→**VPS 独立日度跑**;NAS 降为**月度抽检对拍**(每月末快照对拍一次),「分歧超阈→不出降权告警、只开排查 issue(宁可误报排查,不可错发告警)」机制永久保留; - **出生盲区消解(本修订最大红利)**:新因子出生当夜/次日自动搭上日班车拿到 t,盲区从最长一个月缩到一天——「出生预考」议题不再需要; - **性能注记**:月度冷跑实测 40min 级;日度滚动下 12M 窗每天只滚一天,历史因子值全命中三级缓存(h5→md5 pkl),只有新截面要算,预期十几分钟级;首月实测校准,上限=40min 也放得下夜班窗口。 - - **调度实配(2026-10-10 落地)**:`monthly_batch --daily` 开关(as_of 直用不归一月末,label=`daily_` 前缀;月度链缺省行为不变)。双机日度任务 21:30(VPS schtask `sanguo-factor-daily`=XML Daily,wrapper=`scripts/factor_research/run_factor_daily_wrapper.ps1` 两段链:daily 批+`monthly_review` 日度对拍件;NAS DSM 任务每日 21:30,runner=`scripts/nas_sync/run_factor_daily_standalone.sh` 一次性容器同款)。**registry 对齐修正(存量错位)**:批侧(日度+月度)`--registry` 从 `config/` 种子改读 `data/` 运行副本——与控制台同源,decompose 新生/判死即时进批视野(旧错位=首班后出生的因子月度批不认识、墓园因子照常占算力;防御=运行副本缺失时从种子拷)。**日度对拍件落 `daily/` 子目录**(判定层端点只读根层,月末快照语义零改);月度四段链照旧每月第一个周日跑(正式报告/归因/缺口开单权威不动,①段重跑幂等)。对拍自动化(NAS 拉 VPS 件+`review_compare` 台账)=验证期工具,后续小班补。 + - **调度实配(2026-10-10 落地)**:`monthly_batch --daily` 开关(as_of 直用不归一月末,label=`daily_` 前缀;月度链缺省行为不变)。双机日度任务 21:30(VPS schtask `sanguo-factor-daily`=XML Daily,wrapper=`scripts/factor_research/run_factor_daily_wrapper.ps1` 两段链:daily 批+`monthly_review` 日度对拍件;NAS DSM 任务每日 21:30,runner=`scripts/nas_sync/run_factor_daily_standalone.sh` 一次性容器同款)。**registry 对齐修正(存量错位)**:批侧(日度+月度)`--registry` 从 `config/` 种子改读 `data/` 运行副本——与控制台同源,decompose 新生/判死即时进批视野(旧错位=首班后出生的因子月度批不认识、墓园因子照常占算力;防御=运行副本缺失时从种子拷)。⚠️ 实施勘误(10-11 补齐):10-10 只落了 NAS standalone 与 VPS 月度 wrapper,**VPS 日度 wrapper 漏改**(仍指 config 种子)→ 10-09 注册的 36 个 decomposer 因子缺席 10-10 首班(控制台可见但无评估值);10-11 修正后当晚批起全员进批。**日度对拍件落 `daily/` 子目录**(判定层端点只读根层,月末快照语义零改);月度四段链照旧每月第一个周日跑(正式报告/归因/缺口开单权威不动,①段重跑幂等)。对拍自动化(NAS 拉 VPS 件+`review_compare` 台账)=验证期工具,后续小班补。 - **日度/月度双层分工补丁(2026-10-11 拍板,首班实证后修订)**:首班(10-10)实证 daily 件已带 factor_stats 真值(icAll/positiveRatio/byYear),但根层月报件=10-04 旧 schema 无此字段且判定层端点只读根层→前端弹药速览区空到 11-01。两项拍板: - **速览读最新(数据可见性)**:FactorDetail 速览区 icStats 数据源=根层月报∪`daily/` 最新件**取 as_of 新者**——档案速览=最新可得(daily),衰减判定/研判卡/墓园触发**仍只读根层**(月末快照语义一行不动);「末次月度批」标签改「末次评估批」(日度化后批次本身已日更,旧名失真)。factor_stats 本质=每次批评估重算的累积统计(icAll=全期均值非某月值),非月度专属计算,两载体取新不改口径。 - **月度链①段复用日度批(计算不重叠,2026-10-11 用户定则「物理分开≠逻辑重叠,否则日度算一遍月度算一遍」)**:月末周日月度链 stage1(批评估)检测同 as_of 的日度批 eval 批次已存在→**跳过重算直接复用**(幂等≠不重算——重算=40min 级算力白烧),月度链只跑月度专属段(②批评报告读已复用的批结果+③缺口开单+④归因+verdict_replay);日度批缺席(任务挂了/数据晚到)才回退自算。eval 库追加语义不变(同 as_of 重跑幂等仍兜底)。 diff --git a/scripts/factor_research/run_factor_daily_wrapper.ps1 b/scripts/factor_research/run_factor_daily_wrapper.ps1 index e2bad27d..8d4b9396 100644 --- a/scripts/factor_research/run_factor_daily_wrapper.ps1 +++ b/scripts/factor_research/run_factor_daily_wrapper.ps1 @@ -25,12 +25,20 @@ Set-Location C:\sanguo_vnpy_v2 $PY = 'C:\Python310\python.exe' $EVAL_DB = 'C:\sanguo_vnpy_v2\data\factor_eval.db' -$REGISTRY = 'C:\sanguo_vnpy_v2\config\factor_registry.yaml' +$REGISTRY = 'C:\sanguo_vnpy_v2\data\factor_registry.yaml' # runtime copy, same + # source as the console (2026-10-11 alignment with NAS standalone + + # VPS monthly wrapper: decompose-registered factors enter the very + # next nightly batch; seed config/ kept only for bootstrapping below) $VNDB = 'C:\sanguo_vnpy_v2\data\quant_trading.db' $FUND_DIR = 'C:\sanguo_vnpy_v2\data\static' $OUT_DIR = 'C:\sanguo_vnpy_v2\reports\factor_monthly\daily' $LOG = Join-Path $OUT_DIR 'factor_daily_cron.log' +# runtime copy defense: seed from config if missing (machine never ran the API) +if (-not (Test-Path $REGISTRY)) { + Copy-Item 'C:\sanguo_vnpy_v2\config\factor_registry.yaml' $REGISTRY +} + # as_of = T-1 (yesterday): nightly batch evaluates up to last closed session $asof = (Get-Date).AddDays(-1).ToString('yyyy-MM-dd')