Files
2026-09-27 22:37:06 +08:00

12 KiB
Raw Permalink Blame History

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 族评估管线不可达 —— 认

审稿证据链完全复现:

  1. sanguo_factor/__init__.py(全文 7 行)导入 library/alpha_datasets/fundamental_library/composite_library/composite_weighting/composite_rolling——无 sentiment_library;

  2. 全树业务导入点唯一:batch_eval.py:178,位于 if sent_names: 分支内;而 sent_names 筛选(batch_eval.py:85-86)依赖 get_factor(n).category == "sentiment",即筛选先于注册;

  3. 运行时探针(本机 venv310 实跑):

    import sanguo_factor                    → get_factor('sent_mom_20') = None
    import sanguo_factor.sentiment_library  → get_factor('sent_mom_20') = {...category: sentiment}
    
  4. 失败形态补充(与审稿一致):_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 联动)为合理观察,随下波排期。

四、对审稿的三处勘误(结论成立,证据需修正)

  1. 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 描述不同源,修订时应以真实调用链数字为准。
  2. F-2 盲区定性:见上文——「小量级绕开」应为「断言缺失」(测试连非空都没断言)。
  3. 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」攒批——均等用户示下。