docs(audit): strategy域10-01两轮审计处置记录——10项全处置(修7/评估2/延期有据1+data转呈件采纳); P1-9十五点位印花税对齐+生产行核对项; P1-13 Phase3删除方案(先代读核实在册实例); P0-4前视全评估(三上下文语义漂移矩阵+方案a推荐+重验证义务+P1-13先行时序); P2-2滑点需reconcile标定/P2-5并infra P1-2同主题 [nas] [no-doc]
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
# 10-01 两轮审计 strategy 域处置记录
|
||||
|
||||
- 日期:2026-10-01(strategy session)
|
||||
- 输入:infra 转呈的跨域吸收件 10 项(架构审计 P1-9/P1-13/P0-4 + 文档审计定点件 4-10)+ data 转呈件 1 项(P1-10 另一半)
|
||||
- 纪律:逐条亲读源码实证后再处置(判读前先读写入方源码);大件出评估不动码(infra 口径「先出评估再动」)
|
||||
|
||||
## 一、处置总表
|
||||
|
||||
| # | 审计项 | 处置 | 落点 |
|
||||
|---|--------|------|------|
|
||||
| 1 | P1-9 影子印花税 0.001 vs 万5 | **修**(15 点位全对齐 0.0005) | 本波 commit①;生产行核对项见 §三 |
|
||||
| 2 | P1-13 _ex 副本漂移 | **评估+计划**(Phase 3 删除有据,先代读核实在册实例) | §四 |
|
||||
| 3 | P0-4 动量/轮动回测前视 | **评估**(已实证;修复方案 a 推荐,排 P1-13 之后专项波) | §五 |
|
||||
| 4 | paper-shadow 文档(checkpoint/CLI/费率) | **修**(三处勘误) | 本波 docs commit |
|
||||
| 5 | dev-test-prod §12 创业板口径 | **修**(改「按策略区分」+ 实测映射表) | 同上 |
|
||||
| 6 | ashare C1 定寸描述相悖 | **修**(勘误=engine.size 首根 bar 一次定死,亲读 ashare_engine 坐实) | 同上 |
|
||||
| 7 | budget-spec A2 占位+B2 透传承诺相反 | **修**(两处勘误:表未回填+fail-fast 有意设计回写) | 同上 |
|
||||
| 8 | phase3d/3c/迁移评估/strategy-ops 到期未回填 | **修**(状态头注+§6.5 终态回填+ops §6 定案回填+plan 入库) | 同上 |
|
||||
| 9 | joinquant 档案三处漂移 | **修**(932000 后记/_ex 补记/前视边界声明) | 同上 |
|
||||
| 10 | P2-2 费用滑点三处 / P2-5 先卖后买无事务 | **延期有据**(并入成本诚实化波/与 infra P1-2 同主题) | §六 |
|
||||
| + | P1-10 另一半(data 转呈:互为外盯) | **采纳并实施**(v1.3 第十一检 data_monitor_alive) | 本波 commit② |
|
||||
|
||||
## 二、P1-9 印花税对齐(已修)
|
||||
|
||||
**实证**:`live_instance_ledger.py:32 STAMP_TAX=0.0005`(现行万5,09-25 调研勘误)为唯一权威;`ashare_engine.py`(cta_engine 侧)与 `sanguo_trader/persistence.py:114` 亦已是 0.0005——**09-25 勘误只修了两处,portfolio/影子链 15 点位漏网**:
|
||||
|
||||
| 点位 | 性质 |
|
||||
|------|------|
|
||||
| `sanguo_trader/shadow/broker.py:33` | 构造默认 |
|
||||
| `sanguo_trader/shadow/runner.py:44` | env 缺省 |
|
||||
| `sanguo_trader/shadow/supervisor.py:60` | 账户行缺省兜底 |
|
||||
| `sanguo_trader/portfolio_paper.py:88` | NAS paper 回测参数兜底 |
|
||||
| `sanguo_portfolio/runner_backtest.py:54,:510` | CLI 默认+params 兜底 |
|
||||
| `sanguo_portfolio/live_strategy.py:282` | live 装配 OrderCost |
|
||||
| 8×策略文件 `close_tax=0.001`(4 母本+4 _ex 副本) | 策略内 OrderCost |
|
||||
|
||||
**测试**:`test_sell_stamp_duty_default_is_current_rate`(broker 缺省=万5)+ sparse-row env 断言(supervisor 兜底)。既有测试全部显式传参不受影响(1036 passed)。
|
||||
|
||||
**⚠️ 生产行核对项(infra 域,代读一轮)**:`supervisor.py:60`/`portfolio_paper.py:88` 均为 `acc.get("stamp_duty_rate") or <default>` ——**VPS 在册 paper_accounts 行若带显式 0.001,不随默认翻**。请核对 `SELECT id,name,stamp_duty_rate FROM paper_accounts WHERE stamp_duty_rate IS NOT NULL AND stamp_duty_rate!=0.0005`,有则一行 UPDATE(或重播种时对齐)。回测数字影响:卖出费率减半 → 略乐观方向的修正,属对齐事实非口径选择。
|
||||
|
||||
## 三、(并入上表)
|
||||
|
||||
## 四、P1-13 _ex 副本处置方案
|
||||
|
||||
**事实**:4 副本=TET Phase 2 验证副本(issue #19),文件头自述「与母本 diff 只应有取数调用机械替换(`get_*`→`get_*_ex`)+ 类名后缀」「**验证通过后 Phase 3 删除本副本**」。Phase 2 等值已验证(memory:四 _ex 接口+副本对照等值 ✅)→ **Phase 3 删除有文件自述授权**。
|
||||
|
||||
**漂移实证**:momentum_timing_ex.py 476 行 vs 母本 551(母本后加的当日预取缓存 `_ensure_day_panel` 副本没有)——「双轨对照同一逻辑」的不变量已破;all_weather_ex 668 vs 747。
|
||||
|
||||
**阻断项(删前必须)**:
|
||||
1. 副本挂进 live 工厂表(`live_strategy.py:77-84`),生产可实例化(VPS 曾有 shadow#42=all_weather_ex 先例)→ **需代读核对 VPS paper_accounts 无任何 `*_ex` strategy 在册行**(running 或 stopped 均算——stopped 行重启舰队时会被 supervisor 重拉吗?不会,但保留行引用类名,删除后手工重启该账户会 KeyError)。有在册→先迁实例再删。
|
||||
2. NAS test 库同理(test_paper_routes 有 portfolio_all_weather_ex running fixture,纯测试可随改)。
|
||||
3. 删除后 provider `get_*_ex` 四接口失去唯一消费者 → provider 域(同为我域)决定收编或留作 TET 契约。
|
||||
|
||||
**建议**:下一班车主张执行删除(删 4 文件+工厂表 4 项+`__init__` 导出+测试 parametrize 回退母本单列);不采「re-sync+CI diff 守卫」——为验证脚手架永久付维护费不值。**本波已先把 8 文件 stamp 税率对齐**(机械改动,无论删否都对,避免「反正要删就不修」留下另一套费率口径)。
|
||||
|
||||
## 五、P0-4 前视偏差评估(最重件,未动码)
|
||||
|
||||
### 5.1 机制(逐行实证)
|
||||
|
||||
- `momentum_timing.py` 9:30 决策(`b.run_daily(self.handle_data, "9:30")`),而 **5 处** `get_closes_panel(..., end=cur_date)` 上界含当日(`_ensure_day_panel:260`/`_cal_rps:338`/`_select_stocks:400`/`_cal_buy_sign:455` + 直查回退两处)+ `:197` 涨跌停查询用 `cur_date`。回测库 dbbardata 当日日线已在 → `panel.iloc[-1]`=9:30 尚未产生的当日收盘价;`get_limit_status_batch` 内部 `blist[0]` 注释自称「当日 T」用当日 close 判板。
|
||||
- `all_weather.py:249` monthly_adjustment(9:30)涨跌停查询用 `current_dt`;`:488` stop_loss(14:00)用 `now_time`——同病(14:00 拿当日收盘判板)。
|
||||
- **干净对照**(证明仓内有正确范式):factor_topn「截面严格早于调仓日」(`factor_topn.py:108-123`)+ 涨跌停用 `previous_date`;small_cap 全链 `previous_date`;value_selection PIT+`previous_date`。
|
||||
- `get_current_tick`(provider 无日期钳制取最近 close):无策略消费面(filters 注释自证已弃用),非活跃泄漏向量。
|
||||
|
||||
### 5.2 三个执行上下文的语义漂移(病根)
|
||||
|
||||
| 上下文 | 当日 bar 在库? | 9:30 handler 实际取到 | 判定 |
|
||||
|--------|----------------|----------------------|------|
|
||||
| 回测(bar 钟面) | 在 | **当日收盘价** | **前视(bug 本体)** |
|
||||
| VPS shadow 盘中(现役) | 不在(eod 18:05/21:00 才写) | T-1 收盘 | 合法=修复后语义 |
|
||||
| NAS 20:30 run_live_step(LIVE=0 休眠中) | 在(当日双源已拉) | 当日收盘 | 收盘后决策不构成前视,但与 9:30 语义同一代码漂移 |
|
||||
|
||||
**关键结论:修复对现役生产(VPS 影子盘中)零行为变化**——它本来就取不到当日 bar;修复只让回测与实盘对齐。NAS 20:30 路径复通时需按「9:30 语义=T-1」文档化(或届时给 20:30 handler 单独日期语义)。
|
||||
|
||||
### 5.3 修复方案对比
|
||||
|
||||
| 方案 | 内容 | 代价 | 推荐 |
|
||||
|------|------|------|------|
|
||||
| a | 策略层:9:30/14:00 定时任务的取数上界统一 `previous_date`(momentum 5+1 点位、all_weather 2 点位),对齐 factor_topn/small_cap/value 现行范式 | 小(~8 行+测试);回测数字变化=更诚实;live 零变化 | ⭐ |
|
||||
| b | provider 层 as_of 注入(context 携带决策时刻,查询 clamp 到决策前最后完整 bar) | 动全部策略+引擎接口,波及面大 | 否(本轮) |
|
||||
| c | get_limit_status_batch 加 as_of 参数 | 介于两者;a 落地后不必要 | 否 |
|
||||
|
||||
### 5.4 重验证义务(修复 ≠ 完工)
|
||||
|
||||
1. momentum_timing、all_weather 回测重跑(同 1272 日窗口径)出修复前后偏差报告;**all_weather 15.48% 夏普验收数字需重评**;动量系若参与过晋级评审需复核。
|
||||
2. factor 基线(factor_topn 链)本就干净,不受影响,**无需重跑**。
|
||||
3. 时序:**P1-13 删除先行**(避免母本副本修两遍)→ P0-4 修复 → 重跑重评。
|
||||
|
||||
## 六、P2-2/P2-5 延期理由(抗辩式)
|
||||
|
||||
- **P2-2 滑点三处**(回测默认引擎 24.6bps 或显式 / live FixedSlippage 0.001 / 策略内 0):印花税分量**本轮已修**(事实修正);佣金已一致(万3+5 元)。滑点分量=口径选择,**需用 reconcile 历史(实盘成交价 vs 影子成交价差)标定后才有唯一真相**——三处统一到一个未标定值只是把错误收敛成一致的错误。挂账:reconcile 数据在库(infra 域取数+我域定口径),与 §五修复同波执行=「回测成本与前视诚实化」专项。
|
||||
- **P2-5 先卖后买无事务性**:真实缺口但月度策略下窗自愈;最危险的「空目标→全清仓」路径已被空名单守卫堵住(151f84b+65921c5)。全事务化=两阶段调仓大改,与架构审计 P1-2(live_step 事务化,infra 域)同一「步骤幂等/事务」主题,**合并设计更合算**,单独立项拆开做两次返工。
|
||||
|
||||
## 七、P1-10 另一半(data 转呈件,已采纳)
|
||||
|
||||
strategy_monitor v1.3 第十一检 `data_monitor_alive`:data-monitor `health_latest.json`(每日两班原子写,节假日照跑)mtime >26h=红(两班全死且其 SCHTASKS 自检无人执行的结构洞);文件缺失亦红;morn+eve 双班携带。与 data 域 075052d(SCHTASKS 17→19 盯我方两班)互为反向。工法=logs_stale 同族 file-mtime;测试三态(新鲜绿/停滞红/缺失红)+ 周日仅剩此检的语义更新。
|
||||
|
||||
## 八、遗留与交接
|
||||
|
||||
- infra:§二生产行核对(stamp 显式值);§四代读(VPS `SELECT ... strategies LIKE '%_ex%'`)。
|
||||
- 用户可见项:P0-4 修复将改变 momentum/all_weather 回测数字(更保守),届时出偏差报告再拍板是否影响任何在途晋级。
|
||||
Reference in New Issue
Block a user