fix(data): 10-01 二轮审计吸收——白名单补四类+三注册表钉死测试; data-monitor 两班入自监; 旧名注册脚本根治; manifest 补齐; spec 三勘正 [vps] [nas]
CI/CD / test (push) Successful in 38s
CI/CD / nas-deploy (push) Successful in 3s
CI/CD / nas-verify (push) Successful in 12s

- P1-5 读写注册表脱节: EVENT_PANEL_TYPES 补 margin/sw_industry/dragon_tiger_seats/
  nb_daily(15→19, 09-12 四域注册采集时漏同步); 新增 test_whitelist_sync 钉死
  「采集 PER_DATE_TYPES 全族+gdhs == 白名单 == manifest domains ⊇」三同步义务;
  nb_hold 季频 asof 语义不进 exact-date 底座(钉死边界, 零消费方)
- P1-6 manifest 脱节: data_manifest.yaml 8 域→27 域(补事件面板族 19 类),
  消 data_gap_check 对真实供给误开缺口 issue 的潜伏面
- P1-10 监控自监: SCHTASKS +sanguo-data-monitor-morn/eve(17→19); 两 wrapper 本就
  恒 exit 0(设计预留), 非零=真崩, 零假红; 双班全死盲区待 strategy 域 health
  mtime 反盯(已转呈)
- docs_audit 旧名根治: register_schtasks.ps1 重写为现役 bs-daily/xt-daily
  (旧版重跑会复活死任务双开, 09-01 事故同源); bs_eod_wrapper/xt_eod_wrapper
  头注勘正
- docs_audit spec 三勘正: §16.1 白名单 14→19 类; §20.1「零改动自动可读」落空
  改「白名单一行即读+钉死测试」; §18.8 自称权威降级+ak-daily 07:35→19:00
  (VPS 实查)+xt 行名归一+ak-events 指针化; §20.10.2 硬计数指针化;
  §20.15.1/runbook 在岗 17→19
- docs_audit README §4 调度表整表换现役 10 任务; data-monitoring 计划加三行
  状态头注(初值退出权威位)

tests: data_platform+portfolio 1397 passed

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
2026-10-01 09:19:29 +08:00
parent d9c8535745
commit 075052da54
12 changed files with 140 additions and 34 deletions
+25
View File
@@ -1,6 +1,11 @@
# config/data_manifest.yaml
# 底座数据域清单(首版手工维护;data session 可接管自动生成,接口不变)
# key 命名=因子注册表 versions[].params.source 的取值空间(决议 J/§11.3-②)
# 10-01 二轮审计勘正(P1-6): 补齐事件面板族 19 类——凡 get_event_panel 白名单
# (EVENT_PANEL_TYPES,=采集 PER_DATE_TYPES 全族+gdhs)成员皆合法供给域,漏登记会让
# data_gap_check 对真实供给误开缺口 issue;同步钉死测试 test_whitelist_sync.py。
# per-stock 静态族(三表/forecast/express/financial_abstract/valuation/share_capital/
# top_holders)经 fundamentals_pit 加工口径供给,不单列。
domains:
bars_daily: {desc: 全A 日线(dbbardata), 状态: 生产}
fundamentals_pit: {desc: 财务136 PIT(fund_pit/dmsk), 状态: 生产}
@@ -10,3 +15,23 @@ domains:
dividend: {desc: 分红除息(dividCashPsBeforeTax), 状态: 生产}
corpus_sentiment: {desc: 情绪语料(news+ann 词表加工,S 族原料), 状态: 生产}
sw_industry_map: {desc: 申万一级映射(symbol→industry_code 1..31/industry_name; 未映射=0 为消费方约定), 状态: 生产}
# ---- 事件/快照面板族(get_event_panel 底座,1010+1001 两波补齐) ----
dragon_tiger: {desc: 龙虎榜明细(2020 起), 状态: 生产}
block_trade: {desc: 大宗交易明细, 状态: 生产}
margin: {desc: 两融个股明细(EM RZRQ_GGMX,2010 起双市含融券), 状态: 生产}
margin_sse: {desc: 上交所两融明细(官方源), 状态: 生产}
restricted: {desc: 限售解禁明细, 状态: 生产}
zt_pool: {desc: 涨停池(近 30 交易日窗), 状态: 生产}
zt_pool_zbgc: {desc: 炸板池(近 30 交易日窗), 状态: 生产}
zt_pool_dtgc: {desc: 跌停池(近 30 交易日窗), 状态: 生产}
fund_flow_industry: {desc: 行业资金流快照(新浪即时 90 行), 状态: 生产}
fund_flow_concept: {desc: 概念资金流快照(新浪即时 ~387 行), 状态: 生产}
ths_industry: {desc: 同花顺行业一览快照, 状态: 生产}
ths_concept: {desc: 同花顺概念名单快照, 状态: 生产}
xueqiu_hot: {desc: 雪球关注热度快照, 状态: 生产}
sina_sector: {desc: 新浪行业快照(同花顺对账源), 状态: 生产}
gdhs: {desc: 股东户数(季度末快照,2013Q1 起), 状态: 生产}
hot_rank: {desc: 东财人气榜快照(09-25 起 NAS 采集回推), 状态: 生产}
sw_industry: {desc: 申万一级行业成份逐日快照(~5,400 行/夜), 状态: 生产}
dragon_tiger_seats: {desc: 龙虎榜席位明细(增量,挂载日起), 状态: 生产}
nb_daily: {desc: 北向 HKEX 日统计(T-1~T 窗), 状态: 生产}
+14 -12
View File
@@ -53,20 +53,22 @@ sina/东财/腾讯─┘ constituent_unified─►┤
## 4. 增量管线(定时任务 schtask,VPS)
| schtask | 时间 | 职责 | LOOKBACK |
|---------|------|------|----------|
| `sanguo-bs-eod` | 18:05 | baostock 个股日线 + 15min + pe/pb | 7 天 |
| `sanguo-idx-eod` | 18:30 | 14 指数点位(sina 级联) | — |
| `sanguo-ak-eod` | 19:00 | akshare 日线静态 | — |
| `sanguo-ak-events` | 19:30 | 事件 | — |
| `sanguo-xt-eod` | 21:00+ ⚠️ | ETF/基金/北交所920 | 30 天 |
| `sanguo-ak-stock` | 周六 | 个股全量(top10 等) | — |
| `sanguo-ak-quarter` | 财报季(APR,MAY,SEP,NOV) | 三表 | — |
| `sanguo-index` | 月度 16 号 19:50 | 成份股月度增量 | — |
| schtask | 时间 | 职责 | wrapper | LOOKBACK |
|---------|------|------|---------|----------|
| `sanguo-bs-daily` | 18:05 日 | baostock 个股日线+15m+估值 → 串行季频财务 fund(08-20 重组单入口) | bs_daily_wrapper.ps1 | 7 天 |
| `sanguo-idx-daily` | 18:30 日 | 14 指数点位(sina 级联) | sina_index_eod_wrapper.ps1 | — |
| `sanguo-ak-daily` | 19:00 日 | akshare valuation/financial_abstract 逐股日更 | ak_eod_wrapper.ps1 | — |
| `sanguo-ak-events` | 19:30 日 | per-date 全族事件面板(清单权威=采集注册表 PER_DATE_TYPES) | ak_events_wrapper.ps1 | — |
| `sanguo-ak-events-retry` | 周一至五 20:30 起每小时×4 | ak-events 兜底重跑(marker 幂等) | ak_events_wrapper.ps1 | — |
| `sanguo-xt-daily` | 21:00 日 | ETF/基金/北交所920(xt 桥) | xt_eod_wrapper.ps1 | 30 天 |
| `sanguo-ak-vintage` | 09:00 日 | vintage 一致性自检(防线,不下载) | ak_vintage_wrapper.ps1 | — |
| `sanguo-ak-weekly` | 周六 03:00 | gdhs/share_capital/top_holders/financial_abstract+§20.13 三域 | ak_stock_wrapper.ps1 | — |
| `sanguo-ak-monthly` | 财报季首周六 02:00 | 三表+forecast/express 全量洗库(XML 注册方式) | ak_quarter_wrapper.ps1 | — |
| `sanguo-index` | 月度 16 号 19:50 | 成份股月度增量 | index_monthly_wrapper.ps1 | — |
⚠️ `xt-eod` 原 18:40 与 `bs-eod` 18:05 写锁重叠(WAL 单写)→ 建议 21:00+ 错峰。
(2026-10-01 二轮审计勘正:本表原为 07 月旧名 bs-eod/xt-eod/ak-eod/ak-stock/ak-quarter——08-20 重组+09-01 旧名复活双开事故后已全部更名;调度权威=register_*.ps1 与 monitor_registry.py SCHTASKS,时刻冲突以 VPS 实查为准。)
`sanguo-index` STEP0:`parse_csindex_announce` 回溯公告治偏差(000852/932000)+ `--indices` 刷 11 新指数;STEP1-3 migrate→merge。
`bs-eod` 已修 CLOSE_WAIT 卡死(per-stock commit + `_with_timeout` + 周期 relogin)。
写锁错峰已落地(xt-daily 21:00);bs CLOSE_WAIT 卡死修复与调度史详见 runbook。
---
+1 -1
View File
@@ -87,7 +87,7 @@
| sanguo-strategy-monitor-morn | 每日 08:05 | `strategy_monitor_wrapper.ps1 -Shift morn`(盘前引擎面:期望数/进程数/会话日零重启§11.0/报错风暴/日志新鲜度;开盘前 85min=relogin 7:50 后 15min) | 策略监控 |
| sanguo-strategy-monitor-eve | 每日 21:30 | 同 wrapper -Shift eve(盘后产物+订单链:IS 日报出跑/恒等式 resid/订单残留/成交 vs 台账/周报出跑;错峰 20:45 日报+21:00 xt_eod 之后、23:50 data-eve 之前;infra 09-28 核批无碰撞) | 策略监控 |
> 监控注记(spec §20.15):监控 wrapper 恒 exit 0(红态由 alerts/health 承载,防污染调度层自检的 Last Result 判读;**例外=`sanguo-xt-daily` 09-29 起 ETF/基金清单空时 rc=1 抬码**——桥板块接口死(redis rpc timeout)时 bj_codes(本地 sqlite 恒 39)掩护旧合并守卫致 rc=0 静默漏采 ETF 一晚[0928 全 ETF 停 0924 实案,靠 dbbardata_daily RED 抓到],现 ETF 清单空→仍写北交所但 rc=1,分诊见 last_result=1+日志「FATAL ETF/基金 universe EMPTY」);NAS 监控 v2 挂 `sanguo-vps-mirror` 16:00 班尾(`/volume1/stock/monitor_nas/run_monitor_nas.sh`→事件 JSON scp 至 VPS `data/monitor/inbox/`,VPS 两班摄取落库 host=nas;**runner 属宿主生效位,CI 不覆盖——改 repo 副本后须 `scp -O` 同步 `/volume1/stock/monitor_nas/`**,09-28 已同步);告警消费入口=前端「运维告警」页 `/ops-alerts`(四类 tab+ack,API `GET /api/v1/alerts`)。NAS/VPS 两侧检查器语义(**09-28 三修校准**;「VPS 侧日历」及之后各条=data_monitor 本体,非 NAS 检查器):dmsk=季频披露驱动域,改**季频锚**(最新 dt= 分区 ≥ 最近已过法定披露截止的季末:Q1→04-30/半年→**08-31**[1010 二审 P2-1 勘正,原写 09-30 向宽松错 30 天]/三季→10-31/年报→次年 04-30;分区名只认 ISO 格式防紧凑格式错序;旧 mtime 80h 对季频必假黄,0927 Q2 水位 06-30 停滞实案);vps-mirror 完成度在 16:00 班前查昨日 DONE 行(早班查当日必空;**09-29 修:push.log 的 DONE 行只带 [HH:MM:SS] 不带日期,旧按日期过滤行永剩 start→连黄[0926~28 实锤],改按 want_day 的 start 段内是否出现 DONE fail=0 判**)。VPS 侧日历=确认集(dbbardata 000300)∪近 15 日工作日假定集——未确认日缺失降黄、确认日缺失才红(治 dbbardata 晚间源滞后塌期望的循环依赖,09-25 首跑实案;09-29 首战立功:0928 ETF 缺写即被此规则抓红);**row-band 豁免按文件日期(latest)判**(09-28 修:lag 型 margin/margin_sse 的 exp=ok[-1-lag]=确认日,旧按 exp 判对闸门空写非确认日 0 行文件永不豁免);row-band 数值=经验带(dragon_tiger_seats 09-29 校准 (0,400)→(200,2000),实测 670~810;margin 09-30 校准 (200,4000)→(200,8000),实测 6051=两融标的逐年扩容涨破旧上限[0929/30 连黄实案];margin_sse 1010 同步 (200,8000),SSE 子集 ~3300 贴脸旧 4000 上限[二审 P2-2 预防性]);**schtask weekday 限 72h**(09-28 修:weekday 任务周五晚→周一晚班次跨度 69h,26h 限周一早班必假黄;真死 >72h 仍黄+next_run=N/A red 兜底,**主动禁用 Disabled 跳过**[1010 二审 P2-6:qmt-relogin 0929/30 检修暂停误红实案];bs-daily `last_result=1`=eod 腿 baostock 网络错等**真源故障照常黄,非口径问题**;strategy-monitor morn/eve 两班 1010 补入在岗名单[二审 P1-2:监控自身死亡全链静默缺口])。事件摄取=NAS events 文件带 `green_keys` 回传(VPS 据此 resolve NAS 告警);过程层日志窗=26h(防旧失败每日重炒)。
> 监控注记(spec §20.15):监控 wrapper 恒 exit 0(红态由 alerts/health 承载,防污染调度层自检的 Last Result 判读;**例外=`sanguo-xt-daily` 09-29 起 ETF/基金清单空时 rc=1 抬码**——桥板块接口死(redis rpc timeout)时 bj_codes(本地 sqlite 恒 39)掩护旧合并守卫致 rc=0 静默漏采 ETF 一晚[0928 全 ETF 停 0924 实案,靠 dbbardata_daily RED 抓到],现 ETF 清单空→仍写北交所但 rc=1,分诊见 last_result=1+日志「FATAL ETF/基金 universe EMPTY」);NAS 监控 v2 挂 `sanguo-vps-mirror` 16:00 班尾(`/volume1/stock/monitor_nas/run_monitor_nas.sh`→事件 JSON scp 至 VPS `data/monitor/inbox/`,VPS 两班摄取落库 host=nas;**runner 属宿主生效位,CI 不覆盖——改 repo 副本后须 `scp -O` 同步 `/volume1/stock/monitor_nas/`**,09-28 已同步);告警消费入口=前端「运维告警」页 `/ops-alerts`(四类 tab+ack,API `GET /api/v1/alerts`)。NAS/VPS 两侧检查器语义(**09-28 三修校准**;「VPS 侧日历」及之后各条=data_monitor 本体,非 NAS 检查器):dmsk=季频披露驱动域,改**季频锚**(最新 dt= 分区 ≥ 最近已过法定披露截止的季末:Q1→04-30/半年→**08-31**[1010 二审 P2-1 勘正,原写 09-30 向宽松错 30 天]/三季→10-31/年报→次年 04-30;分区名只认 ISO 格式防紧凑格式错序;旧 mtime 80h 对季频必假黄,0927 Q2 水位 06-30 停滞实案);vps-mirror 完成度在 16:00 班前查昨日 DONE 行(早班查当日必空;**09-29 修:push.log 的 DONE 行只带 [HH:MM:SS] 不带日期,旧按日期过滤行永剩 start→连黄[0926~28 实锤],改按 want_day 的 start 段内是否出现 DONE fail=0 判**)。VPS 侧日历=确认集(dbbardata 000300)∪近 15 日工作日假定集——未确认日缺失降黄、确认日缺失才红(治 dbbardata 晚间源滞后塌期望的循环依赖,09-25 首跑实案;09-29 首战立功:0928 ETF 缺写即被此规则抓红);**row-band 豁免按文件日期(latest)判**(09-28 修:lag 型 margin/margin_sse 的 exp=ok[-1-lag]=确认日,旧按 exp 判对闸门空写非确认日 0 行文件永不豁免);row-band 数值=经验带(dragon_tiger_seats 09-29 校准 (0,400)→(200,2000),实测 670~810;margin 09-30 校准 (200,4000)→(200,8000),实测 6051=两融标的逐年扩容涨破旧上限[0929/30 连黄实案];margin_sse 1010 同步 (200,8000),SSE 子集 ~3300 贴脸旧 4000 上限[二审 P2-2 预防性]);**schtask weekday 限 72h**(09-28 修:weekday 任务周五晚→周一晚班次跨度 69h,26h 限周一早班必假黄;真死 >72h 仍黄+next_run=N/A red 兜底,**主动禁用 Disabled 跳过**[1010 二审 P2-6:qmt-relogin 0929/30 检修暂停误红实案];bs-daily `last_result=1`=eod 腿 baostock 网络错等**真源故障照常黄,非口径问题**;strategy-monitor morn/eve 两班 1010 补入在岗名单[二审 P1-2:监控自身死亡全链静默缺口];data-monitor eve/morn 两班 10-01 二轮审计 P1-10 同款入岗[在岗共 19 个,两班互盯盖单班机械故障,双班全死盲区待 strategy 域 health mtime 反盯])。事件摄取=NAS events 文件带 `green_keys` 回传(VPS 据此 resolve NAS 告警);过程层日志窗=26h(防旧失败每日重炒)。
> **策略面监控注记(2026-09-28 v1 上线,方案档=docs/superpowers/plans/2026-09-28-strategy-ops-monitor.md)**:`scripts/strategy_monitor/` 三件套照数据轨——schtask 本机跑(**不经 ssh,生产读权限闸门问题根治**)+只读体检不修数据+wrapper 恒 exit 0+`source="strategy"` 写同一 alerts.db(API 零改动;前端 /ops-alerts 类别=数据/策略)。十检两班:morn=引擎期望数/进程数(wmic needle 自匹配防)/会话日零重启(**§11.0 盘窗口径,10-01 v1.2 重设计**:近 3 个确认交易日 09:15-15:30 内出生=违例,red 可达不经未确认降级;夜间/盘前出生=合法 deploy 窗;连休无新增确认日自然绿)/日志报错风暴/新鲜度(**live_\*+shadow_\* 现役全盯,09-30 修订**:修前只盯 live_\*=LIVE=0 时代全是 stopped 旧文件,stale 永黄/storm 恒空双失明);eve=IS 日报出跑/恒等式 resid≤1e-4/order_events 无残留/双轨配对逐对账(**10-01 v1.2 重设计**:live 账户↔shadow 镜像 instance_id 配对逐对笔数+金额±0.01,无 running live 账户=n/a 绿——shadow 桌本地撮合订单不出门,LIVE=0 时代独走日不构成对账对象;柜台↔台账恒等式仍归 15:10 仪式)/周报出跑;noon 班不注册按需手动。health 落 `data/monitor/health_strategy_{date}_{shift}.json`+`health_strategy_latest.json`(**health_latest.json 是数据域的,永不写**);绿班幂等 resolve_passed 消解(sw_industry 悬死案同纪律);交易日历=确认集∪工作日假定同款语义(`interval='d'`)。阈值初值跑两周后校准(数据轨同款纪律)。**连休预期形态(10-01 注)**:logs_stale 4d 带只免周末,国庆/春节等长假第 5 日起 morn 班黄=诚实陈旧信号非故障(值班预期已列,勿当事故处置)。schtask 注册=`register_strategy_monitor_schtasks.ps1` 随 promote 上 VPS 后由 infra 执行一次(工法照 factor_monthly register 先例)。
@@ -1,5 +1,10 @@
# 数据面监控体系实施计划(spec §20.15 全量:alerts 存储+API → VPS 监控脚本 → 前端运维告警页 → NAS v2)
> **状态头注(2026-10-01 文档审计第二档-6 制度补)**:
> - **状态:已落地**——2026-09-25 起生产运行(VPS 两班 schtask+NAS v2+前端页),历 09-26~10-01 八轮校准,后续演进直接改码+spec。
> - **阈值/名单/带宽权威出处=`scripts/data_platform/monitor_registry.py`**;本档内嵌数字为设计初值,**不再更新**,照本档旧断言(如 SCHTASKS==14)跑必红。
> - 已被校准取代的初值:SCHTASKS 14→17(+strategy 两班)→19(+data-monitor 两班,10-01 二审 P1-10);margin 带 (200,4000)→(200,8000);seats (0,400)→(200,2000);sw_industry (20,60)→(4500,6000);日志窗 1/8 天→26h;ingest 绿键回传语义;health 单 overall→checks/alerts/overall 三字段;schtask weekday 限 72h+Disabled 跳过。
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 落地 spec §20.15 数据面监控全链:alerts sqlite 存储+API(sanguo_api)→ VPS 监控脚本 sanguo-data-monitor(23:50/08:05 两班 schtask,四层证据链查 23 类数据)→ vnpy 前端「运维告警」页(四类 tab+筛选+evidence+ack+红点角标)→ NAS 监控 v2(挂 vps-mirror 班尾,scp 推 VPS inbox 汇聚)。
@@ -368,7 +368,7 @@ baostock 栈=bs_* 系列,xtdata 栈=daily_update_xtdata,新浪指数=sina_index_
| 接口 | 定位 | 返回列 |
|---|---|---|
| `get_event_panel(event_type, date / start+end, trading_days_only=True)` | **保真底座**:白名单 14 类统一通道(§15.2 全部+gdhs),研究/因子探索用 | akshare 原样中文列 + `trade_date`(YYYY-MM-DD,文件名合成);**别把底座列名当生产契约** |
| `get_event_panel(event_type, date / start+end, trading_days_only=True)` | **保真底座**:白名单 19 类统一通道(§15.2 per-date 全族+gdhs;10-01 二审勘正:09-12 四域漏同步已补齐,同步义务钉死 test_whitelist_sync),研究/因子探索用 | akshare 原样中文列 + `trade_date`(YYYY-MM-DD,文件名合成);**别把底座列名当生产契约** |
| `get_limit_pool(kind="zt"\|"zbgc"\|"dtgc", date / start+end, ...)` | **涨停池门面**:kind 三合一(← tushare limit_list_d),唯一有消费契约的域先建(温度计/炸板率/行业集中度) | 英文标准列:`code/consecutive_boards/seal_amount/break_count/first_seal_time/industry/limit_stat`…(键名对齐 dsa) |
- 实现=TET Fetcher(`fetchers/event_panel.py`,FETCHERS 注册表新增 `event_panel`/`limit_pool`),
@@ -380,8 +380,8 @@ baostock 栈=bs_* 系列,xtdata 栈=daily_update_xtdata,新浪指数=sina_index_
- **trading_days_only=True(默认)**:用 `get_trade_days` 滤非交易日——治快照族「周中法定假日文件
=上一交易日态复制品」的区间双计数;`=False` 按周一~五枚举(=采集侧口径)
- 缺文件(洞/未来日/从未采集)=合法缺失→空 DataFrame;真空日(dtgc 0 跌停)→门面仍返标准列空表
- hot_rank 未挂载不在白名单(拍板后与采集注册表、PANEL_TYPES 三处同步加)
- 新数据类型接入=底座白名单加一行(零新方法);某域有消费契约后再升格门面(YAGNI,不加投机门面)
- hot_rank 已于 09-04 挂载入白名单(原「拍板后三处同步加」注记兑现;09-25 起采集迁 NAS 回推,§20.14)
- 新数据类型接入=底座白名单加一行(零新方法)+`test_whitelist_sync` 钉死同步义务(10-01 二审:09-12 四域漏同步即此病);nb_hold=季频 asof 语义(快照仅季末变更日落文件)不进 exact-date 底座;某域有消费契约后再升格门面(YAGNI,不加投机门面)
### 16.2 MCP 出口预留
@@ -617,7 +617,7 @@ state 机制+单实例锁+测试 → T3 DSM 任务注册(admin 身份)+首周人
~1 周后即可供 factor 做事件因子回测;全文/PDF 为月级慢车道自然推进。**用户已批开工**
(2026-09-06「都按你说的来吧」)。
### 18.8 全局下载方案与存放位置总表(回应「不想搞好几套」——本节=现势唯一完整说明)
### 18.8 全局下载方案与存放位置总表(回应「不想搞好几套」——分工总览;**调度任务名/时刻现势以 §20.10.2 为准**)
**一条规则,不是几套方案**:每类数据**唯一权威源+唯一权威位置**(§14.2 既定原则),**采集发起位置
跟随权威位置**——数值类(行情/估值/报表/事件面板)权威=VPS,既有任务家族不变;文本语料类(新闻/
@@ -630,10 +630,10 @@ daily/weekly/monthly/events 三频率+ak-vintage 自检):
| 任务 | 机器 | 时刻 | 内容 | 权威落点 |
|---|---|---|---|---|
| sanguo-bs-daily | VPS | 18:05 | baostock 日线/15m/估值/财务 fund | dbbardata + valuation_baostock/ |
| sanguo-xt-eod | VPS | 21:00(09-12 起错峰,§20 调度表为准;18:40 为旧值勘误 09-25) | xtdata ETF+个股当日实时 | dbbardata |
| sanguo-xt-daily | VPS | 21:00(旧名 xt-eod/旧时 18:40,08-20 更名+09-12 错峰勘误归一) | xtdata ETF+个股当日实时 | dbbardata |
| sanguo-idx-eod | VPS | 每日 | 指数点位 | SSE 表 |
| sanguo-ak-daily | VPS | 07:35 | akshare 低频日更 | static/ |
| sanguo-ak-events | VPS | 19:30 | A 档 15 类事件面板(时间守卫) | static/ |
| sanguo-ak-daily | VPS | 19:00(10-01 二审勘正:07:35 为设计期旧值,VPS 实查 19:00) | akshare 低频日更 | static/ |
| sanguo-ak-events | VPS | 19:30 | A 档 per-date 全族事件面板(清单权威=采集注册表 PER_DATE_TYPES;hot_rank 09-25 迁 NAS §20.14;时间守卫) | static/ |
| sanguo-ak-weekly | VPS | 周六 03:00 | gdhs/share_capital/top_holders/northbound | static/ |
| sanguo-ak-monthly | VPS | 首周六 | 三表全量马拉松(55h 跑道) | static/ |
| ak-vintage 自检 | VPS | 09:00 | 缺日/错标防线 | vintage_status.json |
@@ -1002,7 +1002,10 @@ factor 排序作废,四域全部融合进现有数据体系;北向做二次探
- **§15.1 单脚本注册表零新采集脚本(用户钦定)**:四域全部注册进
`akshare_static_download.py` TYPES + fetch 函数,不新建任何脚本。
- **全部落 `data/static/<type>/` per-date parquet+marker** → §16 泛型底座
`get_event_panel` 零改动自动可读(消费出口现成)。
`get_event_panel` 白名单一行即读(10-01 二审勘正:原写「零改动自动可读」落空——
09-12 四域注册采集时漏同步 EVENT_PANEL_TYPES,本波补齐 margin/sw_industry/
dragon_tiger_seats/nb_daily 并以 `test_whitelist_sync` 钉死;nb_hold 季频 asof
语义不进底座)。
- **不碰 dbbardata**(非行情,事件/截面族);**不碰 constituent_unified**(不动守护库;
申万走快照域模式,变更史由逐日快照+计入日期列承担)。
- **东财直连纪律**:RPTA/RPT_BILLBOARD datacenter 家族串行、复用 session、
@@ -1230,7 +1233,7 @@ rc 不再抬 1(T-1 查询或 skip);ak-events schtask rc=0;fa 下个周
| sanguo-bs-daily | 18:05 日 | 个股日线+15m 增量→dbbardata;拆估值列→年 parquet;fund 腿回灌 | baostock | quant_trading.db 39.85G+valuation_baostock 0.68G+fundamentals_baostock 21M |
| sanguo-idx-daily | 18:30 日 | 9 指数日线 | 新浪 | dbbardata |
| sanguo-ak-daily | 19:00 日 | valuation ~5,570 股逐股 --force(新上市数缓增,2026-09 实测 5,569 采/5,570 文件) | akshare/EM | static/valuation |
| sanguo-ak-events | 19:30 日 | 21 类 per-date:dragon_tiger/block_trade/restricted(2020 起 1,751 日)/zt_pool×3(09-02 起)/fund_flow×2/ths×2/xueqiu/sina_sector/hot_rank/sw_industry+margin(T-3~T-1)+margin_sse(T-2~T-1)+dragon_tiger_seats(T-1~T)+nb_daily(T-1~T)+nb_hold(季)。**(hot_rank 09-25 起摘除迁 NAS 采集,§20.14;xueqiu_hot 同批改 curl 版)** | EM/新浪/同花顺/雪球/HKEX/申万宏源 | static/ 各域 |
| sanguo-ak-events | 19:30 日 | per-date 全族(清单权威=akshare_static_download.PER_DATE_TYPES,现 18 类;事件主表 2020 起 1,751 日;lag 窗 margin T-3~T-1/margin_sse T-2~T-1/seats T-1~T/nb_daily T-1~T/nb_hold 季)。**(hot_rank 09-25 起摘除迁 NAS 采集,§20.14;xueqiu_hot 同批改 curl 版)** | EM/新浪/同花顺/雪球/HKEX/申万宏源 | static/ 各域 |
| sanguo-xt-daily | 21:00 日 | ETF/基金日线+个股补缺 | xt 桥 | dbbardata |
| sanguo-ak-vintage | 09:00 日 | vintage 一致性自检(防线,不下载) | — | vintage_status.json |
| sanguo-ak-weekly | 周六 03:00 | gdhs(53 期,2013Q1 源头边界)/share_capital/top_holders(10.9 万文件)/financial_abstract(09-16 挪入,新浪限流对策)+margin 缺口回补+**§20.13 三域(09-22): pledge_ratio 周五快照(--start 20210108)/pledge_detail 月桶全量/research_report 周窗(--start 20210701)** | EM/新浪/reportapi | static/ |
@@ -1782,7 +1785,7 @@ schema 特殊低估交集教训);限速纪律沿 §19.9 采集纪律表;VP
| vintage 自检结论 | 日 | vintage_status.json | 读结论字段 | ak-vintage 09:00 |
| 磁盘水位 | 日 | — | 剩余>20G | — |
**调度层另含**:17 个 schtask 在岗检查(下次运行≠N/A、上次运行=预期班次、上次结果;**主动禁用 Disabled 跳过**——1010 二审 P2-6,qmt-relogin 检修暂停误红实案;strategy-monitor morn/eve 两班 1010 补入名单——监控自身死亡全链静默缺口)——retry 任务「一次性跑完即死」案即此类。
**调度层另含**:19 个 schtask 在岗检查(下次运行≠N/A、上次运行=预期班次、上次结果;**主动禁用 Disabled 跳过**——1010 二审 P2-6,qmt-relogin 检修暂停误红实案;strategy-monitor morn/eve 两班 1010 补入名单——监控自身死亡全链静默缺口;data-monitor eve/morn 两班 10-01 二轮审计 P1-10 同款入岗,两班互盯盖单班机械故障,双班全死盲区由 strategy 域 health 文件 mtime 反盯补)——retry 任务「一次性跑完即死」案即此类。
#### 20.15.2 四层证据链与分类学
+8 -2
View File
@@ -226,13 +226,19 @@ class FundamentalsQueryParams(_QueryBase):
# (akshare_static_download.py)及 static_vintage_check.PANEL_TYPES 口径一致;
# hot_rank 2026-09-04 拍板挂载(墙测量5轮收官:emappdata 夜间开窗,19:30 档
# 失败零连带——单 unit 失败不触断路器,次夜自动重试)。
# 2026-10-01 二轮审计勘正(P1-5 读写注册表脱节): 09-12 四域注册采集侧时
# 漏同步本白名单,spec §20.1「零改动自动可读」落空——补 margin/sw_industry/
# dragon_tiger_seats/nb_daily。不变量=采集 PER_DATE_TYPES 全族+gdhs,由
# tests/data_platform/test_whitelist_sync.py 钉死(采集侧新增而白名单漏=红)。
# nb_hold 不进:季频 asof 语义(快照仅季末变更日落文件,364/365 天空帧误导
# 探索),零消费方,留专用通道(YAGNI)。
EVENT_PANEL_TYPES = frozenset({
"dragon_tiger", "block_trade", "margin_sse", "restricted",
"dragon_tiger", "block_trade", "margin", "margin_sse", "restricted",
"zt_pool", "zt_pool_zbgc", "zt_pool_dtgc",
"fund_flow_industry", "fund_flow_concept",
"ths_industry", "ths_concept",
"xueqiu_hot", "sina_sector", "gdhs",
"hot_rank",
"hot_rank", "sw_industry", "dragon_tiger_seats", "nb_daily",
})
+3 -1
View File
@@ -1,4 +1,6 @@
# bs_eod_wrapper.ps1 — sanguo-bs-eod schtask wrapper (18:05 baostock 个股 EOD 增量)
# bs_eod_wrapper.ps1 — 手动单跑入口 (无 schtask 挂载; 10-01 二轮审计勘正旧注释)
# 2026-08-20 重组后本 wrapper 的旧任务 sanguo-bs-eod 已并为 sanguo-bs-daily
# (bs_daily_wrapper.ps1 -> bs_daily_main.py 直接串行调 bs_eod.py, 不经本文件)。
# 方案A: 个股日线+15min -> dbbardata('d'/'15m') + pe/pb -> valuation_baostock
$env:http_proxy = ''
$env:https_proxy = ''
+7 -1
View File
@@ -127,9 +127,13 @@ def _dir_entries():
REGISTRY = (_PER_DATE + _WEEKLY + _MONTH + _YEAR + _dir_entries()
+ _DB_SAMPLE + _MISC)
# 调度层在岗检查(spec §20.15.1 表后注: 17 个 schtask; retry 一次性死案即此类)
# 调度层在岗检查(spec §20.15.1 表后注: 19 个 schtask; retry 一次性死案即此类)
# 1010 二审 P1-2: strategy-monitor 两班补进名单——否则监控自身被禁用/损坏时
# alerts/health 停更且全链静默(在岗检查正是为此立的设计)
# 10-01 二轮审计 P1-10: data-monitor 两班(eve 23:50/morn 08:05)同款入岗——
# 两班互盯盖单班机械故障(wrapper 恒 exit 0,红态不污染 last_result,非零=真崩);
# 双班全死仍有盲区,根治=外部反盯(strategy_monitor 侧 health 文件 mtime 检查,
# 归 strategy 域)
SCHTASKS = [
("sanguo-qmt-relogin", "daily"),
("sanguo-qmt-sentinel", "always"),
@@ -148,4 +152,6 @@ SCHTASKS = [
("sanguo-idx-daily", "daily"),
("sanguo-strategy-monitor-morn", "daily"),
("sanguo-strategy-monitor-eve", "daily"),
("sanguo-data-monitor-morn", "daily"),
("sanguo-data-monitor-eve", "daily"),
]
+11 -5
View File
@@ -1,9 +1,15 @@
# register_schtasks.ps1 — 注册方案A 核心 2 个日增量 schtask (bs-eod 18:05, xt-eod 18:40)
# akshare 三表(季度低频) / 成份股(月度) 留 disabled, 后续单独处理
schtasks /create /tn sanguo-bs-eod /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\bs_eod_wrapper.ps1" /sc daily /st 18:05 /ru SYSTEM /rl HIGHEST /f
schtasks /create /tn sanguo-xt-eod /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\xt_eod_wrapper.ps1" /sc daily /st 18:40 /ru SYSTEM /rl HIGHEST /f
# register_schtasks.ps1 — 注册方案A 核心 2 个日增量 schtask (bs-daily 18:05, xt-daily 21:00)
#
# ⚠️ 命名史 (10-01 二轮审计勘正, 同 register_akshare_schtasks.ps1 09-01 事故教训):
# 本脚本 2026-07 版仍建旧名 sanguo-bs-eod(18:05)/sanguo-xt-eod(18:40)——
# 2026-08-20 重组后 bs-eod+bs-fund 已并为 sanguo-bs-daily(bs_daily_wrapper 单入口
# 串行), xt 任务更名 sanguo-xt-daily 且 09-12 起错峰 21:00。旧名重跑会复活死任务
# 与现役任务双开并发(09-01 ak-stock 复活双开同源风险)。本脚本已重写为现场命名,
# /f 幂等覆盖同配置, 重跑无害。
schtasks /create /tn sanguo-bs-daily /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\bs_daily_wrapper.ps1" /sc daily /st 18:05 /ru SYSTEM /rl HIGHEST /f
schtasks /create /tn sanguo-xt-daily /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\xt_eod_wrapper.ps1" /sc daily /st 21:00 /ru SYSTEM /rl HIGHEST /f
Write-Output "=== VERIFY ==="
foreach ($t in @('sanguo-bs-eod', 'sanguo-xt-eod', 'sanguo-daily-update', 'sanguo-bs-akshare', 'sanguo-bs-daily-increment', 'sanguo-index-hist')) {
foreach ($t in @('sanguo-bs-daily', 'sanguo-xt-daily')) {
$q = schtasks /query /tn $t /fo list 2>&1 | Out-String
$status = ($q -split "`n" | Where-Object { $_ -match 'Status' } | Select-Object -First 1).Trim()
Write-Output (" {0,-28} {1}" -f $t, $status)
+2 -1
View File
@@ -1,4 +1,5 @@
# xt_eod_wrapper.ps1 - sanguo-xt-eod schtask wrapper (21:00 xtdata ETF/fund EOD increment)
# xt_eod_wrapper.ps1 - sanguo-xt-daily schtask wrapper (21:00 xtdata ETF/fund EOD increment)
# (renamed from sanguo-xt-eod in the 2026-08-20 reorg; file name kept, 10-01 audit note)
# plan A: ETF/fund (baostock blind zone) -> dbbardata('d')
# 2026-09-10 data leg switch: xtquant via big-QMT redis bridge shim
# (xtquant_bridge PYTHONPATH -> in-process full market data). Replaces the dead
+3 -1
View File
@@ -32,7 +32,9 @@ def test_hot_rank_producer_nas_and_disabled_northbound():
def test_schtask_watchlist_count():
assert len(reg.SCHTASKS) == 17 # 1010 补 strategy-monitor 两班(二审 P1-2: 监控自身死亡全链静默)
assert len(reg.SCHTASKS) == 19 # 1010 strategy 两班 + 10-01 data-monitor 两班(P1-10 自监入岗)
assert ("sanguo-ak-events-retry", "weekday") in reg.SCHTASKS
assert ("sanguo-strategy-monitor-morn", "daily") in reg.SCHTASKS
assert ("sanguo-strategy-monitor-eve", "daily") in reg.SCHTASKS
assert ("sanguo-data-monitor-morn", "daily") in reg.SCHTASKS
assert ("sanguo-data-monitor-eve", "daily") in reg.SCHTASKS
@@ -0,0 +1,48 @@
# tests/data_platform/test_whitelist_sync.py
"""三注册表同步钉死(2026-10-01 二轮审计 P1-5/P1-6 读写注册表脱结根治).
实案: 09-12 四域(margin/sw_industry/dragon_tiger_seats/nb_daily)注册采集侧时
漏同步 EVENT_PANEL_TYPES, spec §20.1「零改动自动可读」落空——采集在跑、读取
raise, 脱节无人发现。本测试把两条同步义务变成 CI 红线:
① 采集 PER_DATE_TYPES 全族+gdhs == EVENT_PANEL_TYPES(采集新增而白名单漏=红)
② data_manifest.yaml domains ⊇ EVENT_PANEL_TYPES(面板域漏登记=data_gap_check
对真实供给误开缺口 issue)
"""
from pathlib import Path
import yaml
import akshare_static_download as dl # noqa: E402 (conftest 已加 sys.path)
from sanguo_portfolio.providers.fetchers.base import (
EVENT_PANEL_TYPES,
EventPanelQueryParams,
)
_ROOT = Path(__file__).resolve().parents[2]
def test_event_panel_whitelist_equals_per_date_family():
"""不变量: 白名单 = 采集 per-date 全族 + gdhs(多=脏键, 少=读写脱节)."""
expected = set(dl.PER_DATE_TYPES) | {"gdhs"}
assert EVENT_PANEL_TYPES == expected, (
f"白名单与采集注册表脱节: 多={sorted(EVENT_PANEL_TYPES - expected)} "
f"少={sorted(expected - EVENT_PANEL_TYPES)}")
def test_nb_hold_not_in_whitelist():
"""nb_hold=季频 asof 语义(仅季末变更日落文件)不进 exact-date 底座——钉死边界."""
assert "nb_hold" not in EVENT_PANEL_TYPES
def test_manifest_covers_event_panel_types():
with open(_ROOT / "config" / "data_manifest.yaml", encoding="utf-8") as f:
domains = set((yaml.safe_load(f) or {}).get("domains") or {})
missing = EVENT_PANEL_TYPES - domains
assert not missing, f"manifest 漏事件面板域(gap_check 会误开缺口): {sorted(missing)}"
def test_new_panel_types_pass_validator():
"""1010 补的四类可直接过入参校验(读取链路 _read_type_frames 为泛型已覆盖)."""
for t in ("margin", "sw_industry", "dragon_tiger_seats", "nb_daily"):
q = EventPanelQueryParams(event_type=t, date="2026-09-30")
assert q.event_type == t