Commit Graph

6 Commits

Author SHA1 Message Date
claude_dev dbb5ed5aa8 feat(data): P0指数日K双源——bs_eod主循环后追加baostock指数段(2006+全量REPLACE)——治指数点位单源停更史(000300曾停7-16/000938停2023/932000三源无):①INDEX_CODES 15只=探针实证有数(300/500/1000/上证50/中证100/上证综指/深成/创业板+399303国证2000替932000+中证行业6只928/931-935;932000/000938/000985/929/930/936/937 baostock无→不进列表免每日warning刷屏)②同PK(symbol,exchange,datetime,interval)唯一索引INSERT OR REPLACE,与sina idx-eod存量行互备后写者胜,datetime归一纯日期同格式③段在主循环后:query达限跳过守DAILY_LIMIT预算;段内单指数fetch/upsert异常只log不外抛,退出码语义不变(schtask结果码可见)④fetch复用fetch_k_with_timeout(计QUERY_COUNT约15query/天可忽略)+relogin兜底;+10测试(sh/sz映射/REPLACE不双行/空行跳过/容错续跑/代码表卫生/达限跳过/正常跑调用);relogin计数3测试补run_index_eod隔离mock(指数段自身relogin是预期新行为);data_platform 126绿 [vps] 2026-08-20 09:49:13 +08:00
claude_dev 95bdf8a27d fix(data): bs_eod启动登录重试——治08-18型瞬断整天缺口——main()登录失败不再当场exit2,改login_with_retry串行重试(1+2轮,间隔120s/300s,无并发不触封禁红线;用户拍板2026-08-20:优先自身健壮性,实测无频繁重连/超48k配额);瞬时闪断(10054/10002007)秒~分钟级恢复,2/5分钟两轮覆盖;仍失败才exit2,次日18:05例行LOOKBACK=7自愈(自愈机制本就完好,重试只是把'当晚瞬断'消掉);+4测试(首试成功不等待/第2次恢复/3次全败False/集成exit2契约保持);data_platform 116绿 [vps]
CI/CD / test (push) Successful in 13s
CI/CD / nas-deploy (push) Successful in 41s
CI/CD / nas-verify (push) Successful in 16s
2026-08-20 08:49:53 +08:00
claude_dev f94a145587 fix(data): bs_eod 卡死根治 — per-stock commit + baostock 超时包装 + 周期 relogin
根因(py-spy dump + netstat CLOSE_WAIT 实证): baostock 服务端关长连接→CLOSE_WAIT, send_msg 静默阻塞不抛异常, socket.setdefaulttimeout 不被 baostock 自己 socket 遵守, relogin 只在 error_code≠0 救不了; 一把大事务全程持 WAL 锁阻断全库。修复: per-stock commit 去大事务 + _with_timeout 线程超时包 fetch_k 打破静默 hang + 周期 relogin 每500主动刷连接。VPS --limit 3 验证 11s 不 hang。
2026-07-28 20:36:11 +08:00
claude_dev b06af336c3 fix(data): bs_eod 15min datetime 格式 bug 根治 + --no-daily 选项
bug 根因(2026-07-25): baostock 15min 实测 date='2026-07-21'(带 -),
time='20260721094500000'(17 位 YYYYMMDDHHMMSSmmm)。原代码假设 date 纯数字 +
time[:6] 取年月, 产乱 datetime 致 dbbardata 15min 全市场停 2026-07-17(8 天
没正确累积), 日线正常(7-24)。

修复:
- 提纯函数 _build_15m_dt(date_series, time_series): date 直连 + 从 17 位 time
  第 8-12 位提取 HHMM, 产出 'YYYY-MM-DD HH:MM:00' (符合 GLOB 清理模式)
- upsert_15m 调用 _build_15m_dt 替代内联拼接
- 新增 --no-daily 选项(只跑 15min, 用于重灌快), 与 --no-15m 对称
- TDD: 8 case 覆盖(09:45/14:30/15:00/13:00/跨日/多行混合/GLOB 格式)
- conftest.py 修补 sibling import 在 pytest 下可用
2026-07-25 21:14:12 +08:00
claude_dev 114a69e997 fix(data): dbbardata 日线双行根治(统一纯日期+helper,留ROWID max去重)
根因: dbbardata UNIQUE(symbol,exchange,interval,datetime) 按字符串字面比较,
多写入路径混用 'YYYY-MM-DD' 与 'YYYY-MM-DD 00:00:00' -> 同一交易日双行,
INSERT OR REPLACE 不去重 -> 回测交易日翻倍/pivot duplicate/信号异常。

方案A (统一纯日期, 详见 Main Agent 诊断):
- 新增 scripts/data_platform/dbbardata_utils.py: normalize_daily_dt(s)
  取前 10 字符, None/短串安全
- 4 个日线写入脚本写入前调 helper:
  - bs_eod.py (sanguo-bs-eod 个股日线 baostock)
  - migrate_daily_baostock.py (历史迁移)
  - xt_eod.py (sanguo-xt-eod ETF/基金 xtata)
  - import_vnpy_daily_fast.py (NAS 日线 parquet 导入, 加防御)
- TDD: tests/data_platform/test_dbbardata_utils.py 9 cases 全过
- 回归: tests/data_platform + tests/portfolio 199 passed 12 skipped

peewee DateTimeField formats 含 '%Y-%m-%d' (阶段0 VPS 实测确认),
读纯日期不崩, 方案A 前提成立。

15min 干净, 不动 (分钟必须带时分)。只改日线 interval='d'。

数据层根治, 不在 provider 适配兜底 (用户铁律)。
2026-07-23 12:18:41 +08:00
claude_dev c2a89d01a4 feat(data): 方案A 数据层落地(spec §14)— DB唯一表+治幸存者偏差+权威源
spec §14 方案A 数据层迁移完成 + E2E 验证(read_db_daily: 在市/退市治偏差/ETF 全OK):
- dbbardata('d') 1826万含退市(治回测幸存者偏差, INSERT OR REPLACE staging迁移, WHERE OHLC NOT NULL+COALESCE)
- constituent_unified 7110行/9指数(300/500/50 baostock全集 + 深证4指 akshare cni union + 中证1000/2000 snapshot)
- pe/pb 不进DB -> valuation_baostock/<year>.parquet 按年宽表(2003-2026)
- 废弃 daily_baostock_full/bs_index_constituent(rename _old 保留); 旧4 schtask disabled
- 新 schtask sanguo-bs-eod 18:05(baostock个股日线+15min+拆pe/pb DAILY_LIMIT 48000) + sanguo-xt-eod 18:40(ETF/基金xtata)
- 权威源: baostock个股日线+估值+15min+复权+300/500/50 / xtata ETF+基金+当天实时 / akshare三表+事件+深证中证成份股
- 全程备份+staging+_old保留可回滚; 脚本 audit/probe/migrate/merge/cleanup/fix_config/verify/bs_eod/xt_eod/wrapper/register_schtasks
- 待办(spec §6 使用层): LocalParquetProvider 接 constituent_unified+valuation_baostock + 实时拼接
2026-07-23 07:20:34 +08:00