- name
- football-betting-prediction
- description
- 竞彩足球 / 体彩混合过关的赛事预测与出单方案设计,以及赛前临场复核、赛果回填与复盘。适用于胜平负/让球/比分/总进球/半全场及串关组合分析;含数据源停摆降级预案、负期望资金纪律与防编造铁律。
Triggers: "预测足彩", "竞彩", "足球预测", "足球比赛结果", "胜平负", "让球", "比分预测", "总进球", "半全场", "串关", "过关", "胆材", "混合过关", "投注方案", "临场复核", "出票前确认", "sporttery", "体彩".
# 竞彩足球混合过关预测 v5.13
> 更新日期:2026-09-22(**v5.13 硬控制四分类瘦身·大哥拍板**):撤 5——开季限1(回测净机会成本 -244/34轮)、小联赛限1(被无锚闸门覆盖的冗余保护)、胶着避开(636轮回测 0 触发,与平局轨互斥)、超低赔通道(0 触发死代码,代码+测试删)、战意标注义务(消融证伪后仅存的成本,并入 matchPlay.specialVars)。放 5——freq-band/彩票档 3 腿降级出选项卡(标注+买否大哥定,<3 才关档;2 腿 HAD 串=废除形状不出)、CRS 禁串条文纠偏(单关优先+点名可组串,与 09-18 指令对齐)、自查清单 29 项分流(机器断言 `validate_card_assertions` 自动跑:同场限一/木桶/预算红线)、耦合计算脚本化(`coupling_at_least_one` 枚举精确展开+跨档折叠,出卡自动输出 couplingHit)。收 1——出票核对单加 livescan 落盘核对行。**原则**:硬条件存续唯一正当性=实证挡过真实伤害;gateRule/假设层/资金纪律三大闸门不动。
> 更新日期:2026-09-22(**v5.12 比赛推演层**):Step -1 升级"推演→假设→验证"四步铁序——新增 `matchPlay` 五槽位(rotation/tactics/goalSource/script/specialVars)强制覆盖比赛画面;assumption=推演的压缩结论,统计特征罗列不得充当假设主体(09-21 英锦标赛轮漏判"大轮换惯例"为判例:全场最强变量零覆盖)。推演仅做快筛候选场、不新增采集;Step 6.5 升级"推演回改"(真实首发回改 matchPlay 再定稿)。**背景**:大哥 09-22 审计定性"系统在结合概率与 EV 给预测,没真的预测比赛"——战意/H2H 等比赛理解成分被消融纪律移除后,假设层执行也退化成统计特征堆砌,v5.12 把"预测比赛"重新强制进流程。
> 更新日期:2026-09-18(**v5.11 假设层补写进 skill**):新增 `Step -1 假设层`作为决策入口 + 铁律 12「假设先行·EV 不选腿」;撤销"EV≤0 不得入选"硬门槛(降级为事后指标)。**根因**:2026-09-16 大哥拍板的假设驱动只写进 memory 未写进 skill,而 skill 806 行里"假设"仅出现 1 次(且指"关间独立假设"),13 步计算流程被当成决策流程使用 → 09-18 会话按 EV 降序捞腿冒充假设驱动。**skill 与 memory 冲突时以 memory 为准**(memory 是最新拍板,skill 可能滞后)。
> 更新日期:2026-09-22(**v5.11 转正·大哥拍板**):假设层撤销观察验证期,转正为正式版——周末大轮直接按正式流程跑(每场逐场落 hypothesis 字段)。首轮实证 09-21(3 场 hypothesis/fused/final/chainSteps 100% 落字段);同日全链审计确认出票闸门完备(boldplay 引擎腿默认 pending、`filter_buyable` 挡无假设腿、卡面假设优先排序),并补两条执行规矩(无锚模板腿同等适用 / 晚上架补录场,见 Step -1 判定标准)。
> 更新日期:2026-09-16(常见比分赔率条件模板):新增 `skill/references/score-odds-template.md`,将1:0、0:1、2:0、2:1、0:2、1:2按胜平负热门赔率区间与形状族纳入比分预筛;历史条件频率只作基线,不得替代本场模型概率。
> 更新日期:2026-09-15(比分形状校准补强):方向与精确比分分离;强队零封集中、低估弱队进球、同形状候选伪分散纳入硬复盘字段;新增 `skill/references/score-calibration.md`,先影子比较 DC、freq-band 与校准混合链,样本达标前不替换生产概率源。
> 更新日期:2026-09-11(形状回测实证标注 ★ engine/scripts/research/shape_backtest.py·636 轮孪生票·fd 四季 16414 场 B365 收盘:①三形状(4串1/4串11/全2关-4)**期望回收率打平**(100.7~103.8%·配对差 CI 全跨 0·分季冠军轮换),真差异全在**方差**——容错族回款轮占比 96.8% vs 4串1 38.5%、连灭 1 vs 10、回撤减半:保底档 4串11 骨架实证=**同等回报下路径质量,非更高回报**;②选腿 α 唯一来源=**热度集中**(top4 vs 随机 +4.5~23pp·B365 超热腿系统性慷慨=favorite-longshot bias 强形式·全中率实测 38.5% vs 去水理论 21%),**B365 抽水 6.41% ≠ 体彩 12.9%,回收率绝对值禁外推体彩加注**——体彩价是否存活靠实盘 CLV 验证;③排除逻辑阶梯 v2:胶着排除 top4 口径 **0 触发冗余**、开季限1 市场口径**负贡献**(丢 34 开季赚钱轮·净额差 -244——纪律动机是模型保护(开季 DC 失真)不在市场口径废立范围)、超低赔通道 p≥0.55 下 **0 触发死代码**——两条零成本保险保留勿记功;④报告 data/04-summaries/2026-09-11-shape-backtest.html + shape-backtest-v2-report.json)
> 更新日期:2026-09-04(批次4 规则三条 · 审计修复设计 docs/2026-09-04-prediction-audit-fix-design.html:①轮次判定定式=insight gameweek 先查+standing 已赛场次一致性校验,ESPN 榜只做参考(当日法甲 ESPN 推 R4 实为 R3 靠 insight 勘定)②四星踩线(65~67%)+基面反向→降半档 ③保底腿全含于彩票档→必须算耦合概率(v5.1 条款补执行))
> 更新日期:2026-09-04(平局轨入轨第五条:`poolSingle.HAD=1` 单关资格前置核验——09-03 周四001 入轨四条全过但该场 HAD 不可单关,被迫与周四002 组混串;09-04 结算平腿 @3.10 命中(2:2)被捆绑腿拖死整注归零(单关口径应回 31 元)。=0 降级路径=①与合格腿混串(须对捆绑腿有独立信心,CRS/TTG/HAFU 单关资格全场=1 不受限)或②撤注,不硬凑;出票核对单环节必查此字段)
> 更新日期:2026-09-03(v5.8 实票×推荐对齐——系统同推制六件套:票腿 agreement 五值/偏好档案 gateRule/登记对照回执/推荐 play 三态每场必答/tickets.html ⑤ 一致率区块;底子=16票60腿分析:一致腿40%vs偏离14%、高一致票+212.9vs零一致-75.6、排除场照买0%全亏,设计见 docs/2026-09-03-ticket-recommend-alignment-design.html)
> 更新日期:2026-09-03(v5.7 平局轨:搏奖档内 HAD 平单关——入轨四条 p平≥28%+极差<12pp+R4起+每轮≤2注,胶着是灵魂(极差加回测 18%→60%)、开季系数抬平污染禁入、杯赛富矿放行、星级豁免、EV 不拦截、永久单关;无影子期无转正符合门槛即纳入,设计见 docs/2026-09-03-draw-track-design.html)
> 更新日期:2026-09-02(v5.6 彩票档:boldplay 两档制→三档制,HAD/HHAD N串1×1倍=2元合格腿全上 4~8 串、p_fused≥0.55/超低赔≤1.25 门槛、无预算管理独立轮红线,设计见 docs/2026-09-02-lottery-tier-design.html)
> 更新日期:2026-08-27(v5.3 比分选法重设计 freq-band:联赛频率模板+球队平移+形状带+q排序为默认链路,DC 退出比分选择;--method=amix 过渡保留一个月待回测对照,设计见 docs/2026-08-27-freq-band-design.html)
> 更新日期:2026-08-26(v5.2 修正三向经 --adjust 传导全玩法(三域重标定+池级温度+半场参数,设计见 docs/2026-08-26-pool-coverage-design.html);v5.3 起该传导仅服务 amix 过渡路径)
> 更新日期:2026-08-25(v5.1 实战纪律回灌:高赔池全量 EV 扫描 / 注间耦合计算 / 静默失败追查入铁律 / 用户偏好形状档案 / 方案命名规范+对比表;v5.0 阶梯出票卡为默认输出)
> 实战基线:方向正确率 63.2%(12/19),比分命中率 26.3%(5/19);CLV 记录自 v4.1 起
## 文件存储路径 ★ v4.0 新增
所有预测相关文件统一存储在 `$FOOTBALL_HOME` 项目根目录中(环境变量,由 install 脚本设置;未设则用 skill 目录的父级 `../` 推导):
| 目录 | 用途 | 文件命名 |
|:---|:---|:---|
| `data/00-leagues/` | 联赛画像(积分榜/场均进球/冷门率/TOP 比分) | `{league}.json` |
| `data/01-teams/` | 最新球队信息(排名、阵容、伤停) | `{联赛名}/` 按联赛分子目录 |
| `data/02-results/` | 历史比赛结果(赛果回填)+ `league/` 本地赛果库 | `YYYY-MM-DD.json` 按日期 |
| `data/03-predictions/` | 最近预测文件 | `YYYY-MM-DD*.html` |
| `data/04-summaries/` | 预测总结与复盘(含 corpus.json/trend.html) | `YYYY-MM-DD-review.html` |
| `data/05-trends/` | **赛前情报时序库**(intel-timeline,docs/2026-08-30-intel-timeline-design.html):`{date}-odds.json` 五池赔率 diff 增量链(刷新自动落盘)/ `{date}-intel.json` 情报摘要(insight 拉取自动落盘)/ `{date}-livescan.json` 临场扫描事件(skill 录入,`trends_snapshot.py livescan` 校验通道);2026-08-29 前的 livescan 为 legacy 格式双格式兼容 | `YYYY-MM-DD-{odds\|intel\|livescan}.json` |
| `engine/cache/` | DC 参数缓存 + models/ 版本存档 + fusion.json + 体彩缓存 | `{league}_dc.json` 等 |
| `skill/references/` | 低频参考(官方规则/系数详表/教训档案,按需加载) | `*.md` |
**执行时自动归档**:
- Step 7 报告输出 → 保存到 `data/03-predictions/`
- Step 8 赛果回填 → 保存到 `data/02-results/`
- Step 8 复盘报告 → 保存到 `data/04-summaries/`
- Step 3 采集的球队数据 → 更新到 `data/01-teams/`
---
## 适用范围
- 竞彩足球:胜平负 / 让球胜平负 / 总进球 / 半全场 / 比分,及混合过关
- 90 分钟常规时间(含伤停补时)结果预测
- 不适用:加时点球、冠军竞猜、滚球
---
## 〇、十条铁律(违反即返工)
| # | 铁律 | 来源教训 |
|:--:|:---|:---|
| 1 | **绝不编造数据**:交锋/球员/战绩查不到就标 ❓,每条数据标注来源 + 加载状态 | v1 编造数据导致信任崩塌 |
| 2 | **用户反馈优先级最高**:用户提供的信息 > 模型推断,置信度 +1 级 | 忽视"长崎主场强"反馈致预测失误 |
| 3 | **出票前终端实盘核对**:编号 × 联赛 × 主客三重验证,官方对阵偶有错误 | 2026-08-17 001 场次实际不存在 |
| 4 | **失败降级纪律**:同一数据任务失败 ≤ 2 次即停;全源失败降级为"官方赔率 + 排名 + 赛季阶段"主线分析,如实标注缺失维度并下调置信度 | — |
| 5 | **模型 ≠ 必中**:方向精度实测 60~65% 区间(基线 63.2%);赔率以官方终端为准,预估仅作决策参考 | — |
| 6 | **赛果必须回填**:每轮预测后自动查询赛果并回填到预测记录,完成五维复盘统计 | v4.0 新增:无闭环 = 无法迭代 |
| 7 | **归档禁止整文件覆盖** ★ v4.6:同日期重跑时必须先读旧 `data/02-results/` 文件——同 schema 则增量合并赛果字段,不同 schema 则另存 `-r1` 后缀新文件;预测记录与 plans 格式须遵 Step 8 v4.6 schema(corpus.py 双格式兼容已就位) | 2026-08-22 f4558c2 事故:matches[] 覆盖 records[] 致 52 条语料归零,靠 git 历史抢救 |
| 8 | **比分选法三步铁律 + 空结果追查** ★ v5.3:比分选择 = freq-band(legacy 路径默认;v5.5 翻身档=三池 EV 选优,CRS q 源仍 freq-band):①生存阈模板真实频率 q≥1%(平移不救真实出现不足的比分,c=0 永不入选)②赔率只做形状带门槛(桂林 10-17/梅州 18-28)不做排序③带内真实频率最高者胜出,每场 1 腿;**2026-09-22 放宽(大哥拍板):3 腿降级出 3串1 选项卡**(标注"腿数不足"+买否大哥拍板),<3 腿才关档;脚本输出空列表/空结果 = 异常必须追查,**禁止静默跳过**;方案里声明选腿结果(关档也要写)——玩法凭空消失 = 执行漏洞。`--method=amix`(DC×体彩EV 三池扫描)过渡保留一个月,调用须标注 | 2026-08-27 大哥质疑"比分总取最小赔率,赔率=购买热度≠真实结果"——模型审计已证 DC 无增量,A-MIX 却用 DC 找市场定价错误=自相矛盾(docs/2026-08-27-freq-band-design.html);8-25 双教训(DC TOP1 全低赔 EV-6.9%/空结果没追查)为同一病根 |
| 10 | **无锚联赛腿禁入保底胆** ★ v5.6:fd 不覆盖联赛(瑞超/日职/沙特/韩职等,无 Pinnacle 收盘锚)的场次**不得作为保底票胆材**——单锚先验(上轮收盘/联赛画像)不满足保底档的市场隐含 ≥65% 准入口径,只可入翻身池/搏奖池或平腿;保底胆必须是 fd 收盘锚场次 | 2026-08-31 周二 10 场全灭归因两假胆 EV-17~-19(无锚联赛被程序当胆,docs/2026-09-01-qa 归档);09-01 双轨分化设计复审补纪律线(C2) |
| 11 | **比分形状不得伪分散** ★ v5.9:方向命中与比分命中分开统计;强队候选不得全部落在零封族(1:0/2:0/3:0只算一个剧本),应按经回测的双方进球/零封概率保留相邻形状候选;官方首发/核心伤停更新比分尾部而非机械平移胜负。每场记录 `score_source`、`shape_family`、`p_btts`、`p_clean_sheet`、`topk_hit`,并在 `score-calibration.md` 规定的影子实验达标前禁止替换生产链。|
| 9 | **同场限一玩法·不同场可混串** ★ v5.6(最易看反):同一注串内**同一场次**只能选一种玩法(同场不能既买 CRS 又买 HAD);但**不同场次可用不同玩法组同一注串**(A场CRS+B场TTG+C场HAD 一注3串合法)=混合过关本义,**也是方案优化手段**——各场取 EV 最优玩法混串,低抽水池腿(TTG/HAFU 20.4% < CRS 33.9%)降整串期望抽水。**≠ 整注必须同玩法**:此误读致方案默认全同玩法串、从不评估混串优化(2026-08-31 实例:011 CRS@13 EV-7% 本可换 TTG@4.9 EV+4% 同注混串,因误读铁律而漏评估)。混串总关数 ≤ 最低玩法上限(木桶);同场跨票分池合法(001 CRS 单关票A + 001 HAD 3串票B) | 2026-08-31 大哥纠正:铁律被读反成"整注同玩法",方案系统性漏混串优化 |
| 12 | **假设先行·EV 不选腿** ★ v5.11/v5.12:选腿唯一入口 = Step -1 假设层(**先推演比赛画面 → 压缩可证伪判断 → 回填只做否决 → 最后看赔率**,四步铁序)。**禁止**:打开 EV/概率榜排序取前 N 名再补理由、把分档条件频率当本场证据、拿 EV 当推荐卖点或劝退理由、跳过 matchPlay 直接写 assumption(统计罗列 ≠ 假设)。`hypothesis.py` 必须实际调用,pending/refuted 腿不出票 | 2026-09-18 会话:全池 405 候选按 EV 降序捞 5 腿冒充假设驱动,事后自查发现 skill 里"假设"仅出现 1 次且与假设驱动无关(条文缺失 → 13 步计算流程被当决策流程);同轮连带 5 个计算 bug(整票 EV 口径错、双重去水、温度长尾 artifact、λ 病态未过滤、分档查表冒充本场证据)——**在错误路线上修 bug 会强化错误方向**;09-22 大哥二次审计"没真的预测比赛"补推演工序 |
---
## 一、执行流程(13 步)
> **★ v5.11 流程入口改写(2026-09-18)**:13 步是**计算流程**,不是**决策流程**。决策入口 = Step -1 假设层,
> 13 步只在假设存活后启动、且只做验证与选注,**不得用于选腿**。2026-09-16 大哥拍板原话:
> 「基于各种影响因素大胆假设,而不是计算概率;有了大胆假设再回填小心验证。」
> 违反实例见 `references/lessons.md` 的 2026-09-18 条(EV 排序捞腿冒充假设驱动)。
```
Step -1 假设层(决策入口)★ v5.12:推演比赛画面 → 压缩可证伪判断 → 回填只做否决 → 存活腿才进 13 步
Step 0 模式判定(全局 / 快速)
Step 1 赛事与赔率采集(体彩五池=可买性 + Pinnacle 收盘=概率锚)★ v4.5 五池
Step 1.5 预筛选快排(赔率分层 → 搜索优先级排序)
Step 2 双锚隐含概率(Pinnacle 去水为概率基准)
Step 2.5 数据就绪检查 + 冷启动初始化(联赛画像/球队画像/别名)★ v4.3 新增
Step 3 深度数据采集与分级(A/B/C/D)— 联赛分组批量 + 本地知识库优先
Step 3.5 DC 模型概率 + logit 融合(含 ttg/hafu 输出)★ v4.5 扩展
Step 4 8 因子加权评分 + 修正系数(消融清单内,ξ=0.005)★ v4.1 修订
Step 5 星级评级(概率阈值 × 数据等级约束)
Step 6 玩法匹配与风险三档方案(🚀/⚖️/🛡️ + EV 硬门槛 + 资金纪律)★ v4.6
Step 6.5 出票前临场终审(信息边际 → 最终方案逻辑校验)★ 出票必经
Step 7 分层报告输出(摘要卡概率×赔率×EV → 推荐详情 → 排除简报)★ v4.6
Step 8 赛果回填 + 五维复盘 + 闭环学习(corpus/attribute/trend/learn)★ v4.5.1
```
并行控制:同一时间最多 4~5 个查询,按联赛分组采集,高关注度比赛优先。
---
## Step -1:假设层(决策入口)★ v5.11 新增(2026-09-16 拍板 / 09-18 补写进 skill / 09-22 v5.12 推演层)
**这一步在打开任何概率表、赔率表、EV 扫描之前执行。顺序颠倒即返工。**
### 四步铁序 ★ v5.12(原三步,"大胆假设"拆为推演+压缩两道工序)
| 步 | 动作 | 禁止 |
|:--:|:---|:---|
| ① **比赛推演** | 每个候选场写 `matchPlay` 五槽位(见下)——回答"这场比赛会怎么踢"。材料:insight + 积分榜 + 轮换惯例 + 赛制知识,**不新增采集** | 不得跳过推演直接写假设——没有画面支撑的 assumption 是统计特征罗列,不是预测(09-21 判例:英锦标赛轮漏判"小组赛大轮换"这一全场最强变量) |
| ② **假设压缩** | 从推演提炼一句**可证伪**判断(assumption)。用户观察 > 推演画面/球队特性/动机 > 统计特征 | **统计特征堆砌不得充当 assumption 主体**("近10场7平+垫底+H2H全平")——那是概率的另一种写法,不是比赛理解 |
| ③ **回填验证** | checks(H2H、主客分解、伤停、对手类型、赛制动机、日程密度)**只做否决不做排序** | 不得用验证结果给腿"打分排名";不得把反对证据包装成"信息差对赌" |
| ④ **最后看赔率** | 在存活假设里挑赔率最高的比分/玩法;决定串法与注数 | **不得打开赔率表、概率表、EV 榜**(①②③全程)——看了就不是假设,是事后合理化。赔率是**选注工具**,不是选腿依据 |
### matchPlay 五槽位规范 ★ v5.12
**"真的预测比赛"的最小骨架**——槽位是检查表不是论文,每条一两句话:
| 槽位 | 回答的问题 | 反面判例(09-21 缺失项) |
|:--|:--|:--|
| `rotation` 轮换 | 本场预计轮换幅度/首发变动(含轮换惯例依据:赛制/赛程密度) | 英锦标赛小组赛大轮换 8-10 人惯例——全场最强变量,零覆盖 |
| `tactics` 战术对位 | 谁摆大巴/谁压出来/中场争夺/教练风格对撞 | 克劳利客场必然铁桶——没写 |
| `goalSource` 进球来源 | 两队靠什么进球(定位球/反击/阵地/头球) | 米尔顿只有头球点、破不了铁桶——没写 |
| `script` 比赛画面 | 节奏/走向/最可能的比分画面 | "低强度低节奏 0:0/1:0/1:1"——没有 |
| `specialVars` 本场特有变量 | 动机/天气/赛制/突发(点球积分制等) | 点球积分制——当时唯一及格项 |
**成本控制**:推演只做 Step 1.5 快筛后的候选场(典型 6~10 场)**+ 平局轨候选场**(排除方向但推荐平局的场恰恰最需要胶着剧本画面);排除场(D 级/无锚直接排除)不推演——排除走 Step 1.5 定性快筛,与推演无关。
**落盘 schema**(hypothesis.json 每个假设新增 matchPlay 块):
```json
{
"matchNumStr": "周二002",
"matchPlay": {
"rotation": "预计双方轮换 6-8 人(英锦标赛小组赛惯例,两队周末均有联赛)",
"tactics": "克劳利客场摆 5-4-1 铁桶,米尔顿阵地战渗透弱",
"goalSource": "米尔顿定位球/头球为主;克劳利反击威胁低",
"script": "低强度低节奏,0:0 / 1:0 / 1:1 画面",
"specialVars": "点球积分制激励守平(点球胜2分/负1分)"
},
"assumption": "轮换环境下米尔顿锋无力+克劳利摆铁桶,90分钟平局被 4.25 低估",
"checks": [ "...不变..." ],
"verdict": "survived"
}
```
> 设计边界(大哥"不过度设计"原则):matchPlay 全部定性描述,**无评分、无调参、不进概率权重**——它治理的是"假设从哪来",不改 verdict 闸门逻辑;validate 不强制 matchPlay(旧数据兼容),执行质量靠自查与复盘对照。
### 判定标准(`hypothesis.py` 实现,必须实际调用)
- `make_hypothesis(assumption, checks)` 建假设;`verdict ∈ ("survived","refuted","pending")`
- **腿默认 `pending`;pending/refuted 一律进 `blockedByHypothesis` 不出票**——这是闸门全撤后唯一拦截
- **无锚场(dc_used=false)同等适用 ★ 2026-09-22 转正补条款**:联赛频率模板 / n>0 / q 值不是本场证据,纯模板腿 = pending 不得入票(09-17 杯赛轮 6 条 dc=null 模板腿直接入票为反例;v5.11 转正后引擎腿已全默认 pending,闸门挡在出票前)
- **晚上架补录场 ★ 2026-09-22 转正补条款**:出票前复扫发现新增上架场次,须补足假设 + 验证才可入票;来不及做功课的标"补录·未过假设层"禁入(09-18 周四002 上海申花上架晚于预测生成、10:24 复扫仅增量补录为反例)
- `filter_buyable(legs)` → (可买腿, 被挡腿);`sort_by_hypothesis` 用假设优先序(survived → pending → refuted),**不用赔率降序**
- `check_shared_legs(bets)` 查共用腿伪分散(多注共用一腿 = 表面 N 注实为 1 个失效点)
### 唯一保留的硬拦截
**假设被数据直接否定的腿不买。** 反面案例 = 米堡 2:1(H2H 四场米堡主场两次仅进 1 球 + 米尔沃尔防守型,数据明确反对"米堡主场场均 3 球所以能打 2:1")。买它不是大胆,是没做功课——**这条拦懒惰,不拦胆量**。
### 已撤销的门槛(不得复活)
带外例外(赔率形状带下限)、**EV 阈值**、**命中率下限**、freq_band q 值排序。这些从未真正拦截(T033 五条警示全标 🟡 不拦截、票照出全灭),且与"以小博大"冲突。
**EV / 命中率 = 事后复盘指标**,出票前不作推荐卖点、也不作劝退理由。大哥原话:「30 元赔进去无所谓」——0.86% 和 30% 命中率对他无意义,能不能中取决于假设对不对。
### 自查(每轮出票前必答)
1. 我这轮的腿是**先有判断**还是**先有 EV 排序**?后者 → 返工
2. 每条腿的假设能被什么数据证伪?查了吗?
3. 有没有把"分档条件频率/联赛平均"当成"本场证据"?(分档查表 ≠ 本场判断)
4. 每场 matchPlay 五槽位写全了吗?assumption 是推演的**压缩结论**还是统计特征罗列?——罗列 = 没真的预测比赛(09-22 大哥审计定性)
5. `hypothesis.py` 调了吗?被挡的腿有几条?
---
## Step 0:模式判定 ★ v4.0 新增
| 模式 | 触发条件 | 流程 |
|:---|:---|:---|
| **全局模式**(默认) | 用户说"帮我预测" / 未指定场次 | Step 1~8 全流程 |
| **快速模式** | 用户指定编号(如"帮我看看周五006") | 跳过 Step 1 全局采集,仅对指定场次执行 Step 2~7;如指定场次数据不足则提示用户 |
快速模式下仍须完成:赔率采集(仅该场)、数据分级、星级评级、推荐选项。不输出串关方案(除非用户追加)。
---
## Step 1:赛事与赔率采集(必须完成)★ v4.1 双锚制
**赛程采集优先用脚本**:`python sporttery_fetch.py`(直连 API,绕过 WebFetch 截断,拿全部在售场次)。WebFetch 有长度截断(实测只能拿 18 场,实际 52 场),**仅作脚本失效时的备选**。
**双锚原则**:体彩赔率(毛利>7%)只用于**可买性判断**(能不能买、算奖金);**概率锚**用 Pinnacle 收盘价(毛利~2.5%)去水。若 Pinnacle 数据不可得,标注"锚偏差 ~5pp,置信度下调一档"。
| 锚 | 来源 | 用途 |
|:---|:---|:---|
| 体彩官方 API | `sporttery_fetch.py`(直连,完整赛程+赔率) | 赛程编号、可买玩法、实际赔率、奖金计算、CLV 记录 |
| Pinnacle 收盘价 | oddsportal 存档 / Pinnacle 公开数据 / 搜索"match pinnacle closing odds" | 去水得市场真实概率,作为概率基准 |
必采字段:编号、联赛、主客队、开赛时间、**胜平负赔率 + 让球盘赔率**(逐一核验)+ Pinnacle 收盘三向赔率
检查项:
- [ ] 覆盖**所有比赛日**(不能只取第一天)
- [ ] 编号 × 联赛 × 主客队三重交叉验证
- [ ] 按联赛分组输出场次统计
- [ ] **场次完整性**:脚本拉取后核对编号连续性,如周五→周六→周日有断裂则补查(体彩偶有停售场次,编号跳号属正常)
- [ ] **双锚齐全**:至少 70% 场次拿到 Pinnacle 收盘价;未拿到的标注"锚缺失"并降级处理
- **刷新即快照 ★ v5.4**:任何路径刷新 `sporttery_matches.json` / 拉取 insight 自动落盘 `data/05-trends/` 时序(钩子内嵌,失败不阻断);手动补拍 `python engine/scripts/run.py snapshot [--insight 编号,编号]`
输出:`| # | 场次编号(体彩) | 联赛 | 主队[排名] | 客队[排名] | 开赛日期时间 | 体彩赔率 | Pinnacle收盘 |`(# 为全局序号,场次编号列=体彩编号 `周X00N`,两列并存职责不同勿混)
> 每场比赛标注全局序号 #1~#N,方便后续所有环节交叉引用。报告输出必须带**日期 + 编号**(2026-08-21 实测教训:无日期/编号无法回填赛果)。
---
## Step 1.5:预筛选快排 ★ v4.0 新增
拿到赔率后、深度搜索前,先做一轮 30 秒快速分级:
| 赔率特征 | 分级 | 搜索策略 |
|:---|:---|:---|
| 单方概率 >60% 或 <15% | **高确定性** | 优先搜索,大概率 A/B 级 |
View on GitHub