fix(data): 监控日历假定集剔交易所休市表日——连休假黄根治+CI 跨年强制年更 [vps]
根治 valuation_baostock/dbbardata_daily/dbbardata_index 三域国庆连休天天假黄:
- monitor_registry.EXCHANGE_HOLIDAYS 年度休市表(仅工作日): 2026 表=dbbardata
000300 实证(至 1002)+交易所 2026-09-17 公告(中秋 0925~27/国庆 1001~1007 休,
10-08[周四]复市——勘正全员「10-09 开盘」旧误记)
- data_monitor._calendar_days: 假定集剔休市日(已知假日=零期望当夜即绿);
fail-safe=表缺年不扣(黄照旧绝不静默转绿); 确认集恒保留(表错不吞真相)
- CI 年更闸 test_holiday_table_covers_current_year: 当年无表即红(25063ca
禁裸墙钟教条的故意例外); 场景日随休市表重定向三测(0925 已知假日走绿路径,
未登记日容忍语义改 0924 钉)
- TDD 4 新测, data_platform 682 绿; spec §20.15.2+runbook 同步
This commit is contained in:
@@ -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=滚动分位带(10-01 P2-6 拍板根治:带内判据 P1~P99,窗口=最近 30 个 prior 文件剔 0 行真空与被测观测,非 0 观测<10 回退静态整带;registry 值语义升格 floor+冷启动回退,floor=绝对下限永不下调。三次手动校准史[seats 09-29 (0,400)→(200,2000) 实测 670~810;margin 09-30 (200,4000)→(200,8000) 实测 6051=两融标的逐年扩容;margin_sse 1010 同步]即静态上限被真实增长涨破的滚动化论证;上界失控由 trailing-P99 兜住[双写翻倍 Day1 即黄]。值班预期:公告驱动缓涨(两融标的扩容类)在窗口吸收期会连黄数日~数周——按公告核对后可容忍,勿当故障);**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(防旧失败每日重炒)。
|
||||
> 监控注记(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 缺写即被此规则抓红);**10-03 假定集剔休市表日**(`monitor_registry.EXCHANGE_HOLIDAYS` 年度表=已知假日零期望当夜即绿;表缺年不扣黄照旧绝不静默转绿;当年无表 CI 红强制年更;只登 dbbardata 实证+交易所公告日——2026 表国庆段=1001~1007 休、**10-08[周四]复市**,勿沿用「10-09 开盘」旧误记);**row-band 豁免按文件日期(latest)判**(09-28 修:lag 型 margin/margin_sse 的 exp=ok[-1-lag]=确认日,旧按 exp 判对闸门空写非确认日 0 行文件永不豁免);row-band=滚动分位带(10-01 P2-6 拍板根治:带内判据 P1~P99,窗口=最近 30 个 prior 文件剔 0 行真空与被测观测,非 0 观测<10 回退静态整带;registry 值语义升格 floor+冷启动回退,floor=绝对下限永不下调。三次手动校准史[seats 09-29 (0,400)→(200,2000) 实测 670~810;margin 09-30 (200,4000)→(200,8000) 实测 6051=两融标的逐年扩容;margin_sse 1010 同步]即静态上限被真实增长涨破的滚动化论证;上界失控由 trailing-P99 兜住[双写翻倍 Day1 即黄]。值班预期:公告驱动缓涨(两融标的扩容类)在窗口吸收期会连黄数日~数周——按公告核对后可容忍,勿当故障);**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 班不注册按需手动。**setpoint 翻转(10-01 _ex 退役配套)**:engines_expected 7→3(退役 57/60/61/62 后现役=58/59/63);工序=本 setpoint 上 VPS → infra 停退四实例(needle 按 account id 精确 kill)→ 次日 morn 3/3 双绿;**部署到停退之间的间隙班 engines_expected 会红 7vs3=已知有界预期窗,非事故**。**第十一检(10-01 v1.3, P1-10 互为外盯)**:`data_monitor_alive`=data-monitor `health_latest.json` mtime 新鲜度(>26h=其两班全死且 SCHTASKS 自检无人执行的结构洞,morn+eve 两班外盯兜底;文件缺失亦红;与 data 域 SCHTASKS 盯我方两班互为反向)。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 先例)。
|
||||
|
||||
|
||||
@@ -1803,7 +1803,7 @@ schema 特殊低估交集教训);限速纪律沿 §19.9 采集纪律表;VP
|
||||
|
||||
分类学四层:**调度层**(任务在岗+班次延迟)、**过程层**(统计行分诊+熔断连累检测——周班某类型熔断会跳过后续整批类型)、**结果层**(注册表逐类型新鲜度+行数带宽+交易日历对齐防节假日误报)、**衍生层**(前夜红项自愈回看+xcheck findings 趋势消费[ NAS 侧 ]+磁盘水位)。
|
||||
|
||||
**结果层缺失分级(定案,09-26 中秋反转案)**:交易日历=确认集(dbbardata 000300 实证)∪近 15 日工作日假定集(防 dbbardata 晚间源滞后塌全体期望)。缺失遇未确认日=黄(节假日/合并窗/源滞后三态容忍),**不因时间升红**——2026-09-25 周五中秋休市实案(9-25~9-27 连休):时间基线升级(越过次日 ready 即红)会在 0926~0927 晚把全 per_date 域连坐误红,三源(baostock/sina/EM)同缺一日本就是休市形态而非源滞后;确认日缺失=红(跨域互证=真是交易日)。真漏采兜底=确认集推进(市场恢复交易后 exp 随 confirmed 前移,latest 落后已确认 exp → 确认日红接手)+调度层 schtask 在岗+过程层统计行,纵深分工。**09-27 审计终局 P1 四修**:①kind 归并修复——绿路径统一返 stale key 而 rows key 只在黄时存在,rows 类黄绿班永不 resolve(sw_industry/block_trade 悬死实案)→ 绿班 passed 恒收 `data-{name}-rows`(全 kind);②row-band 豁免——未确认日 0 行空文件(节假日闸门产物)不告 rows(block_trade band 下限>0 误黄实案),交易日 0 行仍黄保持感知;③weekly 锚 confirmed 过滤——`expected_weekly` 周五锚须在确认集(假定集假周五 0925/1002 免疫,锚自动回上一真周五),**confirmed 空集降级不过滤防 exp=None 静默假绿**;④health 拆 `checks_overall`/`alerts_overall`(overall 保兼容取最坏)——防 checks 全绿而 alerts 层 26h 窗旧红回声时晨检被 overall=red 误导航。**09-28 开盘巡检三修(monitor 口径噪声根治)**:①row-band 豁免改按**文件日期(latest)**判而非 exp——lag 型 per_date(margin/margin_sse T-1,registry `lag=1`)的 exp=ok[-1-lag]=确认日,旧豁免条件对闸门空写的非确认日 0 行文件(0927 `20260925_margin_sse.parquet` 假黄实案)永不成立;weekly 同型(假周五空写文件)。②schtask weekday 限 26h→**72h**——weekday 任务(ak-events-retry 20:30/qmt-probe0915 09:15)周五晚跑完→周一晚班次跨度 69h,26h 限周一早班必假黄(0928 实案 57h/71h);真死 >72h 仍黄+next_run=N/A→red 兜底。③NAS `nas-dmsk` mtime 80h→**季频披露锚**——dmsk 五域季频披露驱动(无新披露不写盘,Q2 报告期水位 06-30 停滞属正常节奏),改「最新 dt= 分区 ≥ 最近已过法定披露截止的季末」(Q1→04-30/半年报→**08-31**[1010 二审 P2-1 勘正:法定=上半年结束后 2 个月内,原写 09-30 向宽松错 30 天]/三季报→10-31/年报→次年 04-30;五域取 max,三表法定必披露为门槛主体,express/forecast 条件披露只助推 latest 不抬门槛;分区名只认 ISO `YYYY-MM-DD` 格式防紧凑格式静默错序)。另:bs-daily `last_result=1`(0927 eod 腿 baostock 网络错误 10002007,fund 腿独立照跑、窗口无新交易日无数据损失)与 ak-weekly `rc=1`(share_capital failed 群)为**正确告警**非口径问题,不改。
|
||||
**结果层缺失分级(定案,09-26 中秋反转案)**:交易日历=确认集(dbbardata 000300 实证)∪近 15 日工作日假定集(防 dbbardata 晚间源滞后塌全体期望)。缺失遇未确认日=黄(节假日/合并窗/源滞后三态容忍),**不因时间升红**——2026-09-25 周五中秋休市实案(9-25~9-27 连休):时间基线升级(越过次日 ready 即红)会在 0926~0927 晚把全 per_date 域连坐误红,三源(baostock/sina/EM)同缺一日本就是休市形态而非源滞后;确认日缺失=红(跨域互证=真是交易日)。真漏采兜底=确认集推进(市场恢复交易后 exp 随 confirmed 前移,latest 落后已确认 exp → 确认日红接手)+调度层 schtask 在岗+过程层统计行,纵深分工。**09-27 审计终局 P1 四修**:①kind 归并修复——绿路径统一返 stale key 而 rows key 只在黄时存在,rows 类黄绿班永不 resolve(sw_industry/block_trade 悬死实案)→ 绿班 passed 恒收 `data-{name}-rows`(全 kind);②row-band 豁免——未确认日 0 行空文件(节假日闸门产物)不告 rows(block_trade band 下限>0 误黄实案),交易日 0 行仍黄保持感知;③weekly 锚 confirmed 过滤——`expected_weekly` 周五锚须在确认集(假定集假周五 0925/1002 免疫,锚自动回上一真周五),**confirmed 空集降级不过滤防 exp=None 静默假绿**;④health 拆 `checks_overall`/`alerts_overall`(overall 保兼容取最坏)——防 checks 全绿而 alerts 层 26h 窗旧红回声时晨检被 overall=red 误导航。**09-28 开盘巡检三修(monitor 口径噪声根治)**:①row-band 豁免改按**文件日期(latest)**判而非 exp——lag 型 per_date(margin/margin_sse T-1,registry `lag=1`)的 exp=ok[-1-lag]=确认日,旧豁免条件对闸门空写的非确认日 0 行文件(0927 `20260925_margin_sse.parquet` 假黄实案)永不成立;weekly 同型(假周五空写文件)。②schtask weekday 限 26h→**72h**——weekday 任务(ak-events-retry 20:30/qmt-probe0915 09:15)周五晚跑完→周一晚班次跨度 69h,26h 限周一早班必假黄(0928 实案 57h/71h);真死 >72h 仍黄+next_run=N/A→red 兜底。③NAS `nas-dmsk` mtime 80h→**季频披露锚**——dmsk 五域季频披露驱动(无新披露不写盘,Q2 报告期水位 06-30 停滞属正常节奏),改「最新 dt= 分区 ≥ 最近已过法定披露截止的季末」(Q1→04-30/半年报→**08-31**[1010 二审 P2-1 勘正:法定=上半年结束后 2 个月内,原写 09-30 向宽松错 30 天]/三季报→10-31/年报→次年 04-30;五域取 max,三表法定必披露为门槛主体,express/forecast 条件披露只助推 latest 不抬门槛;分区名只认 ISO `YYYY-MM-DD` 格式防紧凑格式静默错序)。另:bs-daily `last_result=1`(0927 eod 腿 baostock 网络错误 10002007,fund 腿独立照跑、窗口无新交易日无数据损失)与 ak-weekly `rc=1`(share_capital failed 群)为**正确告警**非口径问题,不改。**10-03 休市表根治(连休假黄)**:假定集剔 `monitor_registry.EXCHANGE_HOLIDAYS`(年度交易所休市表,仅工作日休市日)——已知假日=零期望,0925 中秋/1001~1007 国庆类连休当夜即绿不再假黄;**fail-safe=表缺年不扣(黄照旧,绝不静默转绿)**;当年无表 → CI `test_holiday_table_covers_current_year` 红强制年更(25063ca「禁裸墙钟」教条的故意例外——此测试职责就是墙钟敏感);确认集恒保留(数据本体是真相,表错不吞真相);错登真交易日会掩盖真缺失 → 只登 dbbardata 实证+交易所公告日(2026 表=000300 实证至 1002+2026-09-17 公告:中秋 0925~27 休/国庆 **1001~1007 休、10-08[周四]复市**——勘正全员「10-09 开盘」旧误记)。
|
||||
|
||||
#### 20.15.3 两班调度与产物
|
||||
|
||||
|
||||
@@ -399,6 +399,23 @@ def write_health(data_root, health):
|
||||
os.replace(tmp, os.path.join(d, fn))
|
||||
|
||||
|
||||
def _calendar_days(confirmed_days, now_date, lookback=15):
|
||||
"""结果层日历 = 确认集(dbbardata 000300 实证) ∪ 近 lookback 日工作日假定集
|
||||
(09-25 首跑实锤的循环依赖修: dbbardata 晚间源滞后/漏日会把全体期望塌一天,
|
||||
误红鲜活域)。10-03 假黄根治: 假定集剔 EXCHANGE_HOLIDAYS 休市日(已知假日=
|
||||
零期望); 表缺年=不扣(黄照旧绝不静默转绿)。确认集恒保留——数据本体是真相,
|
||||
表错不吞真相。语义: 缺失遇「未确认日」一律降黄(未登记休市/合并窗/源滞后
|
||||
三态容忍); 确认日缺失才红(跨域互证: 某域有该日数据=真是交易日)。"""
|
||||
union = set(confirmed_days)
|
||||
d0 = now_date - dt.timedelta(days=lookback)
|
||||
while d0 <= now_date:
|
||||
hol = reg.EXCHANGE_HOLIDAYS.get(d0.year)
|
||||
if d0.weekday() < 5 and (hol is None or d0.strftime("%Y%m%d") not in hol):
|
||||
union.add(d0.isoformat())
|
||||
d0 += dt.timedelta(days=1)
|
||||
return sorted(union)
|
||||
|
||||
|
||||
def main(argv=None):
|
||||
ap = argparse.ArgumentParser(description=__doc__)
|
||||
ap.add_argument("--shift", choices=["evening", "morning"], default="evening")
|
||||
@@ -416,18 +433,8 @@ def main(argv=None):
|
||||
|
||||
days = chk.trading_days(
|
||||
os.path.join(args.data_root, "quant_trading.db"), now.date())
|
||||
# 日历=确认集(dbbardata 000300 实证) ∪ 近 15 日工作日假定集(09-25 首跑实锤的
|
||||
# 循环依赖修: dbbardata 晚间源滞后/漏日会把全体期望塌一天, 误红鲜活域).
|
||||
# 语义: 缺失遇「未确认日」(不在 dbbardata) 一律降黄——节假日/合并窗/源滞后
|
||||
# 三态容忍; 确认日缺失才红(跨域互证: 某域有该日数据=真是交易日).
|
||||
confirmed = {d.replace("-", "") for d in days}
|
||||
union = set(days)
|
||||
d0 = now.date() - dt.timedelta(days=15)
|
||||
while d0 <= now.date():
|
||||
if d0.weekday() < 5:
|
||||
union.add(d0.isoformat())
|
||||
d0 += dt.timedelta(days=1)
|
||||
days = sorted(union)
|
||||
days = _calendar_days(days, now.date()) # 语义见函数 docstring(10-03 加休市表剔除)
|
||||
ctx = {"data_root": args.data_root, "days": days, "now": now,
|
||||
"confirmed_days": confirmed}
|
||||
|
||||
|
||||
@@ -21,6 +21,24 @@ row_band 语义(10-01 P2-6 滚动分位带, 用户拍板「监控问题统一处
|
||||
"""
|
||||
import re
|
||||
|
||||
# 沪深北交易所年度休市表(仅工作日休市日; 周末由 weekday<5 过滤兜)——data_monitor
|
||||
# 假定集剔除用(10-03 假黄根治)。2026 表=VPS dbbardata 000300 实证(至 1002)+
|
||||
# 交易所 2026-09-17 中秋国庆公告(1001~1007 休, **10-08[周四]复市**——勿沿用
|
||||
# 10-09 旧误记)。年更义务: 当年无表→CI test_holiday_table_covers_current_year
|
||||
# 红强制补表; 表缺年=不扣假定集(黄照旧绝不静默转绿)。错登真交易日会掩盖真
|
||||
# 缺失——只登实证/官方公告日, 勿凭记忆添。
|
||||
EXCHANGE_HOLIDAYS = {
|
||||
2026: {
|
||||
"20260101", "20260102", # 元旦
|
||||
"20260216", "20260217", "20260218", "20260219", "20260220", "20260223", # 春节
|
||||
"20260406", # 清明
|
||||
"20260501", "20260504", "20260505", # 劳动节
|
||||
"20260619", # 端午
|
||||
"20260925", # 中秋
|
||||
"20261001", "20261002", "20261005", "20261006", "20261007", # 国庆(1008 复市)
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
def _pd(name, band, ready="20:30", lag=0, severity="red", producer="vps"):
|
||||
return {"name": name, "kind": "per_date", "root": "static", "subdir": name,
|
||||
|
||||
@@ -215,11 +215,13 @@ def test_breaker_emits_own_key(tree, tmp_path):
|
||||
|
||||
|
||||
def test_assumed_today_downgrades_unconfirmed_misses(tree, tmp_path):
|
||||
"""09-25 首跑实案: 日历锚(dbbardata 000300)晚间尚未合并今日 →
|
||||
per_date 数据在今日=绿; db_sample 缺今日=降黄(未确认日); 整体 rc=0."""
|
||||
"""09-25 首跑实案(10-03 场景日改双删: 0925 已入休市表不再入假定集,
|
||||
未确认容忍语义改用 0924 钉): dbbardata 锚缺未确认工作日 → per_date
|
||||
数据在=绿; db_sample 缺该日=降黄(未确认日); 整体 rc=0."""
|
||||
db = tmp_path / "alerts.db"
|
||||
conn = sqlite3.connect(tree / "quant_trading.db")
|
||||
conn.execute("DELETE FROM dbbardata WHERE datetime='2026-09-25'")
|
||||
conn.execute("DELETE FROM dbbardata WHERE datetime IN"
|
||||
" ('2026-09-24','2026-09-25')")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
rc = _run(tree, db)
|
||||
@@ -232,10 +234,12 @@ def test_assumed_today_downgrades_unconfirmed_misses(tree, tmp_path):
|
||||
|
||||
|
||||
def test_per_date_unconfirmed_miss_is_yellow(tree, tmp_path):
|
||||
"""节假日容忍: 当日既无 dbbardata 确认又无本域数据 → 黄(疑似节假日)非红."""
|
||||
"""未登记日容忍: 当日既无 dbbardata 确认又无本域数据 → 黄(疑似节假日)非红.
|
||||
(场景日 0924=休市表外工作日; 0925 已入表走 test_known_holiday 绿路径.)"""
|
||||
db = tmp_path / "alerts.db"
|
||||
conn = sqlite3.connect(tree / "quant_trading.db")
|
||||
conn.execute("DELETE FROM dbbardata WHERE datetime='2026-09-25'")
|
||||
conn.execute("DELETE FROM dbbardata WHERE datetime IN"
|
||||
" ('2026-09-24','2026-09-25')")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
for f in (tree / "static" / "xueqiu_hot").glob("20260925*"):
|
||||
@@ -250,13 +254,15 @@ def test_per_date_unconfirmed_miss_is_yellow(tree, tmp_path):
|
||||
|
||||
def test_holiday_unconfirmed_miss_stays_yellow_across_weekend(
|
||||
tree, tmp_path, monkeypatch):
|
||||
"""中秋实案(2026-09-25 周五休市, 9-28 开市): 未确认日缺失拖过次日 ready
|
||||
跨整个周末仍黄不升红——时间基线升级会在节假日连坐误红全 per_date 域.
|
||||
真缺口兜底=确认集推进(市场恢复后 exp 随 confirmed 前移, 确认日缺失=红)
|
||||
+调度/过程层, 纵深分工定案(f86ed10 升红规则回滚案)."""
|
||||
"""跨周末容忍: 未确认日(表外工作日 0924)缺失拖过次日 ready 跨整个周末
|
||||
仍黄不升红——时间基线升级会在节假日连坐误红全 per_date 域(09-25 中秋
|
||||
实案原始语义; 10-03 场景日随休市表改双删). 真缺口兜底=确认集推进(市场
|
||||
恢复后 exp 随 confirmed 前移, 确认日缺失=红)+调度/过程层, 纵深分工定案
|
||||
(f86ed10 升红规则回滚案)."""
|
||||
db = tmp_path / "alerts.db"
|
||||
conn = sqlite3.connect(tree / "quant_trading.db")
|
||||
conn.execute("DELETE FROM dbbardata WHERE datetime='2026-09-25'")
|
||||
conn.execute("DELETE FROM dbbardata WHERE datetime IN"
|
||||
" ('2026-09-24','2026-09-25')")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
for f in (tree / "static" / "xueqiu_hot").glob("20260925*"):
|
||||
@@ -270,6 +276,50 @@ def test_holiday_unconfirmed_miss_stays_yellow_across_weekend(
|
||||
assert hot["evidence"]["evidence"]["unconfirmed_day"] is True
|
||||
|
||||
|
||||
def test_known_holiday_excluded_no_yellow(tree, tmp_path):
|
||||
"""中秋 0925 实案复盘(假黄根治验证): 0925 在休市表→不入假定集; 即便
|
||||
dbbardata 全天未合并(确认集缺 0925), 期望自动回落 0924(确认且在) →
|
||||
dbbardata 双查绿——修前同场景是 yellow。已知假日=零期望, 假黄当日消."""
|
||||
db = tmp_path / "alerts.db"
|
||||
conn = sqlite3.connect(tree / "quant_trading.db")
|
||||
conn.execute("DELETE FROM dbbardata WHERE datetime='2026-09-25'")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
assert _run(tree, db) == 0
|
||||
health = json.loads((tree / "monitor" / "health_latest.json").read_text())
|
||||
by_key = {c["key"]: c for c in health["checks"]}
|
||||
assert by_key["data-dbbardata_daily-stale"]["status"] == "green"
|
||||
assert by_key["data-dbbardata_index-stale"]["status"] == "green"
|
||||
|
||||
|
||||
def test_calendar_days_excludes_listed_holidays():
|
||||
"""假定集剔休市表日(国庆窗 10-06 视角, 公告=1001~1007 休/1008 复市):
|
||||
窗内假日全不入; 0930 平常工作日照入; 0925(中秋)假定侧不入——但确认集
|
||||
恒保留(数据本体>表, 表错不吞真相)."""
|
||||
days = dm._calendar_days(["2026-09-30", "2026-09-25"], dt.date(2026, 10, 6))
|
||||
for gone in ("2026-10-01", "2026-10-02", "2026-10-05",
|
||||
"2026-10-06", "2026-10-07"):
|
||||
assert gone not in days
|
||||
assert "2026-09-30" in days # 平常工作日
|
||||
assert "2026-09-25" in days # 确认集保留(虽是假日)
|
||||
|
||||
|
||||
def test_calendar_days_missing_year_fails_safe():
|
||||
"""fail-safe: 表缺年(2027 未登记)→工作日照入假定集(黄照旧)——跨年不补表
|
||||
只丢本次收益, 绝不静默转绿."""
|
||||
days = dm._calendar_days([], dt.date(2027, 1, 4))
|
||||
assert "2027-01-04" in days # 缺年不扣
|
||||
assert "2026-12-31" in days # 2026 表无 12 月假日, 正常入
|
||||
|
||||
|
||||
def test_holiday_table_covers_current_year():
|
||||
"""跨年强制年更闸: 当年无休市表→CI 红。25063ca「禁裸墙钟」教条的故意
|
||||
例外——此测试职责就是墙钟敏感(换年即红逼补表), 锚日桩会废掉闸门."""
|
||||
assert dt.date.today().year in reg.EXCHANGE_HOLIDAYS, (
|
||||
"EXCHANGE_HOLIDAYS 缺当年表: 按沪深北交易所年度休市公告补齐(仅工作日)"
|
||||
"——缺表不会误绿(fail-safe), 但连休假黄会回来")
|
||||
|
||||
|
||||
def test_morning_confirmed_miss_upgrades_red(tree, tmp_path):
|
||||
"""次日晨班: 日历坐实今日(000300 已入) 但样本缺 → 升红."""
|
||||
db = tmp_path / "alerts.db"
|
||||
|
||||
Reference in New Issue
Block a user