
用 Claude Code 和 claude-fable-5 搭建世界杯赔率波动监控器
用 Claude Code 和 claude-fable-5 搭建世界杯赔率波动监控器#
上一篇 Claude Code 项目里,我做了一个 2026 世界杯比赛预测 Demo:Python 负责 Elo / Poisson 概率计算,Crazyrouter 负责多模型解释和结构化输出。
这一篇继续沿着同一个系列,但换一个更工程化的场景:
能不能让 Claude Code 搭一个赔率波动监控器,然后通过 Crazyrouter 调用
claude-fable-5,把异常波动总结成可校验的 JSON?
先说清楚:这不是投注技巧,也不是投注建议。本文只讨论工程实现:数据如何计算、报警如何生成、模型如何解释、JSON 如何校验。
本次实测 API:
Base URL: https://cn.crazyrouter.com/v1
Model: claude-fable-5
Task: summarize odds movement alerts as valid JSON
为什么赔率波动适合做 Claude Code 项目?#
赔率波动看起来像体育话题,但从工程角度看,它本质上是一个时间序列监控问题。
你会遇到这些典型环节:
- 输入数据;
- opening odds 和 latest odds;
- 派生指标;
- 阈值判断;
- 异常报警;
- 人类可读总结;
- 合规边界和免责声明。
这比“让 AI 猜谁赢”更适合测试 AI Coding Agent。
正确的任务不是:
AI,告诉我该买谁。
而是:
Claude Code,帮我搭一个监控系统:计算隐含概率变化,发现异常波动,调用模型生成分析,但不要给投注建议。
这就是本文的核心。
项目架构#
Demo 流程很小,但完整:
sample odds CSV
↓
Python parser
↓
decimal odds → implied probability
↓
movement calculation
↓
alert threshold
↓
claude-fable-5 analysis through Crazyrouter
↓
JSON validation
↓
article/chart assets
生成目录:
generated/claude_code_odds_monitor_fable_20260613/
├── build_odds_monitor.py
├── sample_odds_movements.csv
├── odds_monitor_output.json
├── odds_movement_chart.svg
├── crazyrouter_raw_claude-fable-5.json
├── claude_fable_5_test_result.json
└── claude_fable_5_final_test_result.json
一句话总结:
Python 负责发现波动。
claude-fable-5 负责解释报警。
JSON validator 判断输出是否可用。
示例数据#
为了让 Demo 可复现,我没有接真实付费赔率 API,而是用了合成样例数据。
CSV 大概长这样:
match,market,opening_decimal,latest_decimal,timestamp
USA vs Paraguay,USA win,2.20,2.08,2026-06-12T08:00:00Z
USA vs Paraguay,Draw,3.55,3.65,2026-06-12T08:00:00Z
USA vs Paraguay,Paraguay win,3.10,3.25,2026-06-12T08:00:00Z
Brazil vs Morocco,Brazil win,1.78,1.72,2026-06-13T08:00:00Z
Qatar vs Canada,Canada win,2.08,1.92,2026-06-13T08:00:00Z
Germany vs Curaçao,Germany win,1.20,1.16,2026-06-14T08:00:00Z
生产环境里,这部分应该换成真实数据源,比如多家 bookmaker、时间戳快照、盘口快照、阵容和伤病新闻等。
从赔率计算隐含概率#
decimal odds 转隐含概率非常简单:
def implied_prob(decimal_odds):
return 1.0 / decimal_odds
然后比较 opening 和 latest:
open_p = implied_prob(opening)
latest_p = implied_prob(latest)
delta_pp = (latest_p - open_p) * 100
当变化超过阈值,比如 2.5 个百分点,就生成 alert:
if abs(delta_pp) >= 2.5:
alerts.append({
"match": match,
"market": market,
"direction": movement_direction,
"delta_pp": round(delta_pp, 2),
"note": "Large implied-probability movement; review news, lineup, liquidity, and data quality."
})
注意这里的重点:报警不是 LLM 猜出来的,而是确定性代码算出来的。
LLM 只负责解释,不负责替代计算。
示例报警结果#
脚本一共生成了 4 个显著波动:
[
{
"match": "USA vs Paraguay",
"market": "USA win",
"direction": "shortened",
"delta_pp": 2.62
},
{
"match": "Qatar vs Canada",
"market": "Qatar win",
"direction": "drifted",
"delta_pp": -3.18
},
{
"match": "Qatar vs Canada",
"market": "Canada win",
"direction": "shortened",
"delta_pp": 4.01
},
{
"match": "Germany vs Curaçao",
"market": "Germany win",
"direction": "shortened",
"delta_pp": 2.87
}
]
其中最大变化是 Qatar vs Canada 里 Canada win 的隐含概率上升了 4.01 个百分点。
这不代表“应该下注 Canada”。
它只代表:这个市场出现了足够大的变化,系统应该记录下来,并进一步检查阵容、伤病、流动性或数据质量。

通过 Crazyrouter 调用 claude-fable-5#
接下来,把 alerts 交给 claude-fable-5 做结构化解释。
调用方式依然是 OpenAI-compatible:
from openai import OpenAI
client = OpenAI(
api_key="YOUR_CRAZYROUTER_API_KEY",
base_url="https://cn.crazyrouter.com/v1",
)
请求里使用:
{
"model": "claude-fable-5",
"messages": [
{
"role": "user",
"content": "Return raw JSON only. Analyze these odds movement alerts for an engineering demo..."
}
],
"max_tokens": 1200
}
Prompt 明确要求:
No betting advice.
Output raw JSON only.
claude-fable-5 实测结果#
最终成功结果:
| Model | HTTP | Latency | Prompt tokens | Completion tokens | Total tokens | Valid JSON |
|---|---|---|---|---|---|---|
claude-fable-5 | 200 | 12.14s | 833 | 599 | 1432 | True |
模型返回了可解析 JSON,核心内容包括:
{
"summary": "4 significant odds movements detected across 3 matches...",
"alerts_count": 4,
"top_movement": {
"match": "Qatar vs Canada",
"market": "Canada win",
"direction": "shortened",
"delta_pp": 4.01
},
"checks": [
"Verify lineup announcements and injury news",
"Confirm market liquidity",
"Validate data feed integrity",
"Cross-check movements across bookmakers"
],
"recommendations": [
"Treat paired Qatar vs Canada movements as one correlated event",
"Add automated correlation detection",
"Log raw odds snapshots for audit"
],
"disclaimer": "This analysis is for engineering and data-quality demonstration purposes only. It does not constitute betting advice."
}
这类输出适合进入 dashboard、报警系统、日报生成器,而不是直接发成“推荐”。
一个真实踩坑:payload shape 很重要#
测试时有一个值得记录的问题。
第一次调用 claude-fable-5 返回:
HTTP 400
Invalid request
模型名没有错,/v1/models 里能看到 claude-fable-5。
问题出在 payload 兼容性。换成更简洁的请求结构后就成功了。
我还测试过较长的 JSON 输出任务:HTTP 200 了,但模型有时会包一层 Markdown code fence,或者接近输出上限。
最后可用模式是:
- 使用
model: claude-fable-5; - 输入尽量紧凑;
- 使用
max_tokens; - 明确要求 raw JSON;
- 无论如何都做 JSON validation。
这说明模型质量不只是“聪不聪明”。
工程里还要看:
- payload 兼容性;
- schema adherence;
- 输出长度行为;
- latency;
- retry / fallback;
- cost per accepted output。
为什么适合用 Crazyrouter?#
赔率监控器有很多模型相关任务:
- 总结大幅波动;
- 生成数据质量检查清单;
- 解释同一场比赛内的相关波动;
- 输出 analyst-friendly report;
- 避免生成投注建议。
不同模型在这些任务上的稳定性会不一样。
用 Crazyrouter 的好处是:
一个 API Key
一个 OpenAI-compatible Base URL
多个模型路由
统一 validation 层
后面想比较 claude-fable-5、GPT、Gemini、Qwen,只需要换 model 字段,不用重写应用。
Claude Code 真正应该做什么?#
这类项目里,Claude Code 的价值不是“帮你猜球”。
它应该帮你搭完整工程:
sample_odds_movements.csv:可复现输入;odds_monitor_output.json:确定性报警输出;odds_movement_chart.svg:可视化;crazyrouter_raw_claude-fable-5.json:原始 API 审计;claude_fable_5_final_test_result.json:校验证据;- 可发布文章。
也就是说,AI Coding Agent 更像项目执行器,而不是答案机器。
局限性#
这个 Demo 使用的是合成样例数据。
生产版本还需要:
- 真实 odds API;
- 多 bookmaker 数据;
- overround normalization;
- liquidity estimate;
- timestamp alignment;
- 阵容和伤病新闻;
- alert deduplication;
- 历史校准;
- 合规审查。
所以本文只讨论监控系统,不讨论投注策略。
后续升级方向#
下一版可以加入:
- 定时抓取 odds snapshot;
- 多数据源对比;
- 去水后的 implied probability;
- 同一场比赛内的相关波动检测;
- 新闻 / 阵容联动;
claude-fable-5、GPT、Gemini、Qwen 的多模型对比;- cost per valid JSON report;
- 小型 Web dashboard。
更重要的指标不是单纯 token 成本,而是:
cost per valid alert report
这包含失败请求、重试、坏 JSON、人工 debug 时间。
总结#
Claude Code 可以搭一个赔率波动监控器,但前提是任务边界要正确。
合理架构是:
Python 计算 implied probability movement。
Claude Code 搭 pipeline 和 artifacts。
claude-fable-5 通过 Crazyrouter 总结 alerts。
JSON validator 判断输出是否可用。
这篇是 Claude Code 项目系列第二篇:从“比赛预测”进入“监控系统”。
这种模式不只适合体育数据,也适合金融监控、API 可观测性、运营报警、客服分类等场景。
如果你想通过一个 OpenAI-compatible API 测试 claude-fable-5 或其他模型,可以试试 Crazyrouter:





