Checkpoint — 2026-05-31


状态总结


本次 checkpoint 记录了从 v2 分支开始的所有重要变更,供 Codex review 使用。


---


一、数据库修复


1.1 多 DB 清理

- **问题**: 项目存在 3 个数据库文件

- `titan007.db` (根目录, 1.9MB, 11,279条) — 主库子集

- `titan007-monitor/titan007.db` (23MB, 88,290条) — 唯一主库

- `titan007-monitor/titan007/titan007.db` (0字节) — 空文件

- **修复**: 删除根目录 DB 和空文件,只保留 `titan007-monitor/titan007.db`


1.2 日期格式统一

- **问题**: `match_time` 字段存在两种格式混用

- `YYYY-MM-DD HH:MM` (旧数据, 71,091条)

- `YY-MM-DD HH:MM` (新抓取数据, 17,199条)

- 混用导致 `ORDER BY match_time ASC` 排序错误(字符串比较 `'2025-11' < '25-08'`)

- **修复**:

- 备份: `titan007.db.bak`

- 验证: 旧格式残留 = 0

- **防止复发**: `titan007/database.py:save_match()` 新增插入时自动归一化


1.3 排序 Bug 影响案例

- Valladolid `2026-05-25` 在旧排序中被错误插入 `2024-06-03` 和 `25-08-16` 之间

- 导致引擎误判 2024-25 赛季 12 连败延续到 2026-05-25,产生假信号

- 修复后该注消失,阈值9 2026年注数从 3 → 2(正确)


---


二、回测引擎修复


文件: `backtest/engine.py`

- **排序修复**: `ORDER BY` 从 CASE 归一化表达式简化回 `ORDER BY match_time ASC`(日期已统一)

- **过滤修复**: `min_match_time` 条件从 CASE 表达式简化回 `match_time >= ?`

- **新增字段**: `BetRecord` 创建时补充 `league=match.league`


文件: `backtest/models.py`

- `BetRecord` dataclass 新增 `league: str` 字段


文件: `backtest/strategies.py`

- 验证无 bug(水位计算 `ah + 1` 正确,非固定赔率)


---


三、脚本修复


`scripts/batch_backtest.py`

- 年份提取从 `bet.match_time[:4]` 直接使用(日期统一后无需格式判断)


`scripts/yearly_investment_report.py`

- `norm_year(t)` 简化为 `t[:4]`

- `norm_ym(t)` 简化为 `t[:7]`


`scripts/full_threshold_report.py`

- 同上简化


---


四、新增脚本


脚本功能
`scripts/full_threshold_report.py`阈值3~9详细投注报表(含赢半/输半/走水分类)
`scripts/yearly_investment_report.py`逐年投资分析报告(含最大回撤、月度分布、逐笔记录)
`scripts/league12_full_backtest.py`12联赛全模式批量回测
`scripts/equity_chart.py`资金曲线图 + 最大回撤可视化(matplotlib)

---


五、回测结论(已验证,日期修复后)


**范围**: 12联赛,亚盘顺追 (win_pan + lose_pan),2020-01-01 起,每注1000元


阈值总注总盈亏ROI全局最大回撤
311,204+55,760元+0.5%72,695元
45,325+76,530元+1.4%60,025元
52,550+142,070元+5.6%24,560元
61,284+103,030元+8.0%16,830元
7667+59,975元+9.0%10,880元
8350+36,830元+10.5%8,165元
9188+24,025元+12.8%5,240元

**最大回撤发生时间(阈值5为例)**:

- 峰值: 2025-09-13,累计 +160,515元

- 谷值: 2026-03-22,累计 +135,955元

- 历时 245注 / 约6个月


**逐年 ROI**:


阈值2020202120222023202420252026*
3-1.1%+2.2%+1.2%+2.8%-0.9%+0.3%-4.1%
4+0.2%+7.2%+0.9%+3.7%-0.4%+0.7%-8.6%
5+1.8%+9.4%+5.9%+9.4%+8.1%+0.2%-2.5%
6+1.6%+13.9%+10.3%+13.1%+10.0%+4.4%-16.0%
7+13.6%+10.5%+12.4%+12.4%+4.6%+10.2%-22.5%
8+21.5%+14.5%+21.0%+4.4%+11.2%+6.4%-46.8%
9+39.4%+16.5%+16.8%+11.7%-1.4%+1.0%-4.5%

> *2026年赛季未完,样本极少,不具参考价值


---


六、生成的报告文件



docs/

├── CHECKPOINT_2026_05_31.md ← 本文件

├── BACKTEST_AH_REAL_ODDS.md 真实赔率亚盘回测总结

├── yearly_reports/

│ ├── INVESTMENT_ANALYSIS.md 投资策略分析(含资金管理建议)

│ ├── 2020.md ~ 2026.md 逐年详细报告(含最大回撤、月度、逐笔)

├── threshold_reports/

│ ├── SUMMARY.md 阈值3~9汇总

│ └── 顺追_threshold03~09.md 每阈值详细投注记录

└── charts/

├── all_thresholds_equity.png 所有阈值资金曲线叠加

├── threshold_03~09_equity.png 单阈值详细图(含最大回撤标注)

└── drawdown_heatmap.png 逐年最大回撤热力图



---


七、数据库当前状态


项目
文件`titan007-monitor/titan007.db`
总记录88,290 条
联赛数233
球队数825
日期范围2005-10-23 ~ 2026-05-25
日期格式100% `YYYY-MM-DD HH:MM`
备份`titan007.db.bak` (修复前)

---


八、待 Review 的关键代码


优先级高

1. `backtest/engine.py` — 核心回测逻辑,排序、过滤、连续计算

2. `backtest/strategies.py` — 水位计算(`ah + 1` 转欧赔)

3. `titan007/database.py:save_match()` — 日期归一化逻辑


优先级中

4. `scripts/equity_chart.py` — 最大回撤计算算法 `calc_dd_info()`

5. `scripts/yearly_investment_report.py` — 逐年统计与回撤计算


已知限制

- 2026年数据截至 2026-05-25,赛季未完

- 阈值9年均仅27注,统计显著性有限

- 水位数据覆盖率:阈值7-9为100%,阈值3-4约62%(使用固定赔率1.90兜底)