12 KiB
sanguo_vnpy_v2 因子功能审计报告 — Rebuttal
回应日期:2026-09-27 | 回应对象:
reports/factor-review-report.md(2026-09-26 三层背靠背审计) 方法:10 条 finding 逐条独立取证(对码复现 + 运行时探针 + 对 NAS 在位产物硬复核),非引用式回应 红线遵守: rebuttal 全程零写入仓库/生产——唯一产出=本报告 状态:仅 rebuttal,未修任何文件;修复批等用户口令
一、总结论(一句话)
审计质量高、主链正面结论全部接受;10 条 finding 中 8 条全盘认(F-1/F-2/F-3/F-4/F-5/F-7/F-8/F-10),F-6 认但归属域需限定(错在 data 域三处文件,因子域档记录正确),F-9 认事实、驳修法(统一常量的基线平移代价大于收益);另对审稿本身提出 3 处勘误(F-2 实验权重口径、F-2 盲区更深一层、F-4 成因修正)并直接消解 2 项「需人工」(#2 截面目录、#5 对拍件路径)。
二、逐条判定表
| # | 审稿主张 | 我的独立复核 | 判定 |
|---|---|---|---|
| F-1 🔴 | S 族 4 因子评估管线不可达(鸡生蛋) | 代码链+运行时探针双复现 | 认 |
| F-2 🔴 | ridge 对照通道实质失效 | 独立数值实验复现 no-op;盲区比审稿更深 | 认+补证 |
| F-3 🟡 | 血统注册表 5/8 名漂移 | 8 名直跑:3 HIT / 5 MISS,逐字吻合(⚠️09-27 补正:原审计「计 9 因子/5/9」系条目数误记,yaml 实 8 条目;本行原文「9 名/4 HIT」同笔误沿写) | 认 |
| F-4 🟡 | 「12 源≈+7%」不可复现 | 三口径复核吻合审稿;成因可定位=验收汇报算术错误 | 认+修正成因 |
| F-5 🟡 | 8 算子≠13 | register_fast_ops 实数 13,文档 §3 写 8 |
认 |
| F-6 🟡 | 「vt_symbol 形」两处误标 | 实锤,但错在 data 域三处;因子域档正确 | 认+限定归属 |
| F-7 🟢 | fast_ops 绝对路径 | fast_ops.py:19 写死 Mac 绝对路径 |
认 |
| F-8 🟢 | _quantile_mask 死代码 |
:81-82 被 :93-94 覆盖 |
认 |
| F-9 🟢 | 年化 244 vs √252 双轨 | 事实认;「统一常量」修法有基线平移代价 | 部分认 |
| F-10 🟢 | 测试盲区六项 | 10.1/10.2 随 F-1/F-2 修自动闭环;10.3-10.6 合理 | 认 |
三、认领项明细(复核证据)
F-1 | S 族评估管线不可达 —— 认
审稿证据链完全复现:
-
sanguo_factor/__init__.py(全文 7 行)导入 library/alpha_datasets/fundamental_library/composite_library/composite_weighting/composite_rolling——无 sentiment_library; -
全树业务导入点唯一:
batch_eval.py:178,位于if sent_names:分支内;而sent_names筛选(batch_eval.py:85-86)依赖get_factor(n).category == "sentiment",即筛选先于注册; -
运行时探针(本机 venv310 实跑):
import sanguo_factor → get_factor('sent_mom_20') = None import sanguo_factor.sentiment_library → get_factor('sent_mom_20') = {...category: sentiment} -
失败形态补充(与审稿一致):
_eval_one对未注册因子返回{"error": "因子未注册: <name>"}落 errors 列表——响亮不静默,但设计文档 §3「S 族 ✅ TDD」与管线实际不可达的矛盾成立,Q3 披露潮首跑即撞的潜伏定性维持 🔴。
审稿建议修法(提升为模块级导入)无异议。
F-2 | ridge 对照实质失效 —— 认,且盲区比审稿更深
独立数值实验(按真实调用链复现,非引用审稿数字):
- 真实权重链:
size_log~N(22,0.8)→mkt=e^size_log(≈3.6e9 元)→attribution.py:347传 w=√市值(1.5e4~2.3e5)→solve_day内sw=√w→A=Σw·xx'; - n=4000、两源相关 ≈0.98、z 分数设计阵:mean diag(A)≈2.6e8,λ/meanDiag≈3.9e-9,max|β_ols−β_ridge|≈1.3e-8(相对差 ~4e-6)——月度贡献量级 ~1e-3,对照通道在任何真实场景下等价 OLS,
ridge_flip恒空; - 「标准化设计阵固定档」注释(
attribution.py:150)名不副实:A 被 WLS 权重放大后未归一。审稿结论完全成立。
盲区补证:test_attribute_ridge_flip_detected(tests/factor/test_attribution.py:296-314)只断言 isinstance(res["ridge_flip"], list)——连「非空」都没断言。审稿表述「小量级合成数据恰好绕开尺度问题」低估了问题:该测试对任何实现(包括恒空实现)都通过,不是量级巧合,是断言缺失。修复须同时补「强共线+真实市值量级下 flip 可触发」的数值断言。
F-3 | 血统注册表 5/8 名漂移 —— 认
8 名直跑(venv310 实测;⚠️09-27 补正:下表即全量 8 条目,原文「9 名直跑/4 HIT」系沿写审计「计 9 因子」的条目数笔误——实际 8 条目=3 HIT+5 MISS):
| registry 名 | 解析 | 库名 |
|---|---|---|
| pledge_net_chg | ✅ HIT | 同名 |
| res_target_upside | ✅ HIT | 同名 |
| res_fwd_ep | ✅ HIT | 同名 |
| fa_gross_margin | ❌ MISS | fund_gross_margin(fundamental_library.py:35) |
| s01_buzz | ❌ MISS | sent_mom_20 |
| s02_sentiment_delta | ❌ MISS | sent_chg |
| s03_event_count | ❌ MISS | sent_burst |
| s04_tone_shift | ❌ MISS | news_vol_chg |
与审稿逐字一致。注意 F-3 的 s0 四名同时依赖 F-1 修复*(sentiment_library 当前不可达,即使 yaml 改名对齐后 get_factor 仍 None)——两修联动。
F-4 | 「12 源合计≈+7%」不可复现 —— 认,成因修正
对 NAS 在位产物(/volume1/stock/factor_cross_section/attribution/attribution_2026-09-23.json)硬复核:
| 口径 | 实测 | 审稿 |
|---|---|---|
| contribution_ret 月度算术和(12 源) | +2.8521% | +2.85% ✅ |
| cum_ret 字段合计 | +2.9571% | +2.96% ✅ |
| market / industry / specific / size | +65.42% / −14.00% / −12.57% / +1.11% | 逐项 ✅ |
关键定位:我当时验收汇报的 per-factor 极值是对的(alpha42 −3.41% / klow +3.27%,与产物吻合到两位小数),错的只有「合计≈+7%」一行——系验收汇报的算术/口径错误,非产物缺陷、也非审稿猜测的「被覆盖的更早跑」(该文件 09-26 17:02 生成后未再被覆盖;+7% 出现在 inf 修复后第二轮的验收汇报里,两轮产物同名仅第一轮被第二轮覆盖)。产物健康度不受影响:六项诊断+四桶结构与审稿对上 3-4 位小数。基线记录应修订为 +2.85%(算术和)。
F-5 | 8 算子≠13 —— 认
fast_ops.py:617-631 实注册 13:ts_mean/std/sum/min/max/corr/cov/rank/decay_linear/slope/rsquare/resi/quantile;factor-system-design.md:60 写「8 算子原生覆盖」。文档滞后 5 个(ts_corr_v2/cov_v2 大窗原生路等后续增量未回写)。纯文档修。
F-7 | fast_ops 绝对路径 —— 认
fast_ops.py:19 _VNPY_SRC = "/Users/chufeng/.openclaw/..." 写死;同仓 alpha_datasets.py:10/batch_eval.py:12/fundamental_neutralize.py:31 均 dirname(__file__) 相对定位。当前被 batch_eval 先注入相对路径掩盖,裸 import sanguo_factor.fast_ops 于 VPS 即 ModuleNotFoundError。一行修,照邻居模式。
F-8 | _quantile_mask 死代码 —— 认
metrics.py:81-82 按 -inf 填充算一遍 ranks,:93-94 按 +inf 重算覆盖;中间残留「Actually, let me think more carefully」过程注释。结果正确(测试在),纯卫生修:删首次计算+过程注释。
F-10 | 测试盲区清单 —— 认
- 10.1(S 族管线可达性集成断言)、10.2(ridge 尺度真实性)随 F-1/F-2 修复自动闭环(修复方案已含各自回归测试);
- 10.3(227 可算无守门)/10.4(composite↔factor_topn round-trip)/10.5(universe 缓存负例)/10.6(gate↔registry 联动)为合理观察,随下波排期。
四、对审稿的三处勘误(结论成立,证据需修正)
- F-2 数值实验权重口径:审稿域 6 写「调用方传 w=√市值」——正确;但 F-2 实验
λ/mean(diag)≈6.3e-14对应的是 w=市值(原始 3e8~1.6e10),非真实调用链的 w=√市值。按真实链复现为 λ/meanDiag≈3.9e-9(相对差 4e-6)。两个量级都是 no-op,结论不变;审稿实验数字与其自身域 6 描述不同源,修订时应以真实调用链数字为准。 - F-2 盲区定性:见上文——「小量级绕开」应为「断言缺失」(测试连非空都没断言)。
- F-4 成因:「可能是基线记录自某次被覆盖的更早跑」不成立——+7% 是 rebuttal 方(本 session)验收汇报的算术错误,时间线与文件覆盖史均可排除(见 F-4 节)。
五、两条有保留意见
F-6 | 「vt_symbol 形」误标 —— 认,但归属域限定
误标实锤于三处 data 域文件:
| 位置 | 原文 |
|---|---|
scripts/data_platform/export_sw_industry_map.py:7 |
「列 = symbol(vt_symbol 形 600519.SH)」 |
scripts/data_platform/export_sw_industry_map.py:18 |
函数名 to_vt_symbol(实产通用形) |
docs/superpowers/specs/2026-07-21-data-source-fusion-design.md:1031 |
「三列[symbol(vt_symbol 形)…]」 |
而因子域档 factor-system-design.md:200 记录的形态正确:「表交付 .SH/.SZ 通用形态, 消费端 _norm_symbol 归一到 vt 形」。功能两侧自洽(审稿已证 unknown_industry_share=0)。修复归属 data 域(docstring+函数名+spec 一行措辞),跨域——届时最多提醒 data session 一次,不越界代改。
F-9 | 年化基数双轨 —— 认事实,驳「统一常量」修法
事实全认:metrics.py:13 TRADING_DAYS_PER_YEAR=244 vs attribution.py:469 √252,跨线比较存在 ~1.6% 系统性口径差。
驳修法:评估线 244 下已沉淀 h2 考场值+排行榜全部历史年化基线,统一常量=全部已落库基线平移 1.6%、新旧不可比,代价大于收益(当前无任何消费方跨线直接比较两口径)。建议:
- 首选:spec 口径表并列注明双轨(审稿自己给出的备选);
- 若坚持统一:只动归因线 √252→√244(归因线落库基线少、代价最小),不动评估线 244。
六、「需人工」清单消解
| # | 审稿项 | 回应 |
|---|---|---|
| 1 | VPS schtask 月度批评任务核验 | 归 infra 域(VPS 运维);「月度链未在 VPS 产出」与阶段定位(首班 10-04、部署接线等用户在场)一致,非缺陷 |
| 2 | 归因输入截面目录定位 | 消解:批跑在 NAS 一次性容器(runbook §7.7),--sections-dir /volume1/stock/factor_cross_section;VPS 件=infra #578 冒烟投放的生效位副本,VPS 树内自然无输入。NAS 侧 §7.7 命令即复现;VPS 侧截面生产已含在 10-04 月度批方案(13 源截面增量前置)。「临时目录 mkdtemp」猜测不成立(CLI 显式指定目录) |
| 3 | 「227 可算」复核 | 认——需数据机全量跑批,静态不可判 |
| 4 | v2c 12 档案拟合产物核验 | 认——超本次范围 |
| 5 | NAS 对拍件位置 | 消解:/volume1/stock/factor_cross_section/attribution/(在位者件 attribution_<end>.json + challenger/ 子目录带因子名) |
七、修复批建议形状(等口令,未动)
| 波次 | 内容 | 域 |
|---|---|---|
| 我域代码+测试 | F-1(sentiment 导入提升+集成回归)/ F-2(ridge 尺度不变形+flip 非空数值断言)/ F-7(相对路径一行)/ F-8(删死代码) | sanguo_factor/ |
| 我域配置+文档 | F-3(yaml 5 名对齐库名,与 F-1 联动)/ F-4(基线记录修订 +2.85%)/ F-5(文档 8→13) | config/ + docs/ |
| 跨域提醒(各一次) | F-6(data 域三处措辞)/ F-9(口径表注明,或仅归因线改 √244) | data/infra 域 |
拆批、优先级、是否随下波「推vps」攒批——均等用户示下。