关于 mlb-category-state-analyzer
用于 Yahoo Fantasy MLB H2H 类别联赛的分析技能,帮助管理者结合当前比分和投影制定推进、维持或放弃类别的计划。它将类别胜率模拟与比赛状态信号结合起来。
主要功能
- 01结合模拟概率与类别状态
- 02计算类别位置、压力和可达性
- 03为十个类别排序并制定计划
- 04生成带来源与模拟信息的信号文件
适用场景
- 01判断周中应优先争取哪些类别
- 02根据剩余比赛量评估类别追赶空间
- 03为下游阵容、弃标和串流决策提供信号
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ lyndonkl/ claude --skill mlb-category-state-analyzer安装后在 Claude Code 中输入/mlb-category-state-analyzer确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
resources/methodology.mdtemplate.mdresources/evaluators/rubric_mlb_category_state_analyzer.json详细介绍
MLB 分类状态分析器
目录
示例
情景:第 3 周,K L 的 Boomers(球队 5)对阵 Los Doyers。周三上午(周中)。还剩 4 个计分日。
对阵原始比分(从 Yahoo 对阵页面获取):
| 分类 | 我方 | 对手 | 差距 | 剩余比赛场次(我方/对手) |
|---|---|---|---|---|
| R | 28 | 31 | -3 | 26 / 22 |
| HR | 9 | 7 | +2 | 26 / 22 |
| RBI | 30 | 29 | +1 | 26 / 22 |
| SB | 4 | 6 | -2 | 26 / 22 |
| OBP | .342(82 PA) | .336(78 PA) | +.006 | 26 / 22 GP |
| K | 42 | 38 | +4 | 9 次 SP 先发 / 7 次 SP 先发 |
| ERA | 3.80(21 IP) | 4.12(19 IP) | -0.32(更好) | 9 / 7 |
| WHIP | 1.18(21 IP) | 1.25(19 IP) | -0.07(更好) | 9 / 7 |
| QS | 2 | 1 | +1 | 9 / 7 |
| SV | 3 | 5 | -2 | 约 8 个 RP 比赛日 / 约 8 个 RP 比赛日 |
为模拟构建的预测(本周剩余时间的 {mean, stddev} — 参见 resources/methodology.md):
| 分类 | 我方预测 | 对手预测 |
|---|---|---|
| R | 最终 52 ± 9 | 最终 57 ± 8 |
| HR | 最终 15 ± 3.5 | 最终 13 ± 3.2 |
| RBI | 最终 52 ± 9 | 最终 55 ± 8 |
| SB | 最终 6 ± 2.3 | 最终 10 ± 2.5 |
| OBP | .346 ± .015 | .341 ± .014 |
| K | 最终 96 ± 11 | 最终 85 ± 10 |
| ERA | 3.88 ± 0.40 | 4.05 ± 0.45 |
| WHIP | 1.20 ± 0.07 | 1.25 ± 0.08 |
| QS | 最终 6.1 ± 1.5 | 最终 3.8 ± 1.4 |
| SV | 最终 4.8 ± 1.4 | 最终 7.7 ± 1.5 |
委托给 matchup-win-probability-sim,参数如下:
cat_list = [R, HR, RBI, SB, OBP, K, ERA, WHIP, QS, SV]cat_inverse_list = [ERA, WHIP]cat_win_threshold = 6our_per_cat_projection/opp_per_cat_projection使用上表数据sim_mode = "monte_carlo",n_simulations = 10000,random_seed = 42
模拟输出(由此技能使用):
matchup_win_probability = 0.58per_cat_win_probability:R 0.36、HR 0.65、RBI 0.42、SB 0.16、OBP 0.60、K 0.74、ERA 0.62、WHIP 0.68、QS 0.85、SV 0.10expected_cats_won = 5.18
各分类信号(根据模拟输出和棒球状态推导 — 参见 resources/methodology.md):
| 分类 | 位置(来自状态) | 压力(状态 + 节奏) | 可达性(= round(100 × p_cat)) | 放弃评分(= f(1 − p_cat) + 波动性) | 判断 |
|---|---|---|---|---|---|
| R | 落后 | 72 | 36 | 44 | 争取(有竞争) |
| HR | 领先 | 48 | 65 | 21 | 保持 |
| RBI | 领先(优势微弱) | 65 | 42 | 35 | 争取 |
| SB | 落后 | 55 | 16 | 58 | 评估是否放弃 |
| OBP | 领先(优势微弱) | 70 | 60 | 24 | 争取 |
| K | 领先 | 55 | 74 | 16 | 争取 |
| ERA | 领先 | 62 | 62 | 23 | 争取 |
| WHIP | 领先 | 60 | 68 | 19 | 保持 |
| QS | 领先 | 78 | 85 | 9 | 全力争取 |
| SV | 落后 | 38 | 10 | 84 | 放弃 |
总体建议:争取 6 项、保持 2 项、放弃 2 项。 对阵获胜概率为 58%(优势中立)。
- 争取(6 项):HR、OBP、K、ERA、QS — 每项的
per_cat_win_probability ≥ 0.60。另外,RBI 是有竞争且可争取的第 6 项。 - 保持(2 项):WHIP(基本锁定)、R(可达性偏低,但不至于真正放弃)。
- 放弃(2 项):SB(p = 0.16,可达性低)和 SV(p = 0.10 + 波动性加成 → 放弃评分 84)。
对其他 Agent 的后续影响:
- 阵容优化器:
matchup_win_probability = 0.58→ 优势中立,采用标准的 daily_quality 优化(不调整方差)。 - 选秀权分析器:优先考虑 SP(QS、K、ERA)和 OBP 较高的打者;不优先考虑终结者或速度型球员。
- 轮换策略师:所有能贡献 QS 的 SP 都先发;跳过任何有投不满 5 局风险的投手。
工作流
复制此清单并跟踪进度:
MLB Category State Analysis Progress:
- [ ] Step 1: Pull current matchup scores from Yahoo
- [ ] Step 2: Count remaining games/PAs/IP for both rosters
- [ ] Step 3: Build per-cat projection dicts ({mean, stddev}) for both rosters
- [ ] Step 4: Delegate to matchup-win-probability-sim (pass cat_list, projections, threshold=6, inverse=[ERA,WHIP])
- [ ] Step 5: Derive cat_position (from state), cat_pressure, cat_reachability, cat_punt_score from sim output
- [ ] Step 6: Rank cats and emit push/maintain/punt plan
- [ ] Step 7: Write signal file with YAML frontmatter (include matchup_win_probability from sim)
步骤 1:获取当前对阵比分
抓取 Yahoo 对阵页面:https://baseball.fantasysports.yahoo.com/b1/23756/5/matchup?week=N。提取两支球队在 10 个类别中的当前总量。对于比率类别(OBP、ERA、WHIP),还要记录分母(OBP 的 PA,ERA/WHIP 的 IP)。这是必需项——没有比率背后的数据量,就无法构建比率类别预测。
- 5 个打击类别:R、HR、RBI、SB、OBP(+ 打数 / 打席)
- 5 个投球类别:K、ERA、WHIP、QS、SV(+ 投球局数)
- 在信号文件中引用来源 URL
请参阅 resources/methodology.md 中的抓取流程,以及 Yahoo 无法访问时的备用方案。
步骤 2:统计剩余比赛 / PA / IP
对于每支阵容,统计其球员在本计分周期剩余时间内将参加的 MLB 比赛数量,并预测 PA(打者)和 IP(投手)。
- 打者剩余比赛数:将(每位入选打者所属球队的比赛数 × 其首发概率)求和
- 投手剩余先发次数:每支阵容在本周剩余时间内安排的 SP 先发次数
- 救援投手剩余天数:天数 × 符合条件的 RP 数量(用于 SV 预测)
- 数据量差距:如果一支球队的比赛数明显更多,这会直接反映在预测均值中(也会体现在
per_cat_win_probability中)
使用 MLB.com 赛程和预计先发投手列表。请参阅 resources/methodology.md。
步骤 3:构建逐类别预测字典
为每支球队构建一个字典 {cat: {mean, stddev}},其中 mean 是预测的最终值(或剩余值,但两支球队必须始终使用同一种口径——选择一种即可),stddev 则反映剩余数据量带来的不确定性。
- 计数类别(R、HR、RBI、SB、K、QS、SV):
mean = current_total + Σ(per-player per-game rate × games remaining × daily_quality)。默认 CV 为stddev ≈ 0.35 × expected_remaining。 - 比率类别(OBP、ERA、WHIP):
mean = (current_ratio × current_volume + projected_remaining_ratio × remaining_volume) / total_volume。stddev ≈ σ_per_obs / sqrt(total_volume)——总 IP/PA 越多,标准差越小。 - 两个字典的键必须完全一致,并与联盟的
cat_list完全相符。 - 使用 OBP(而非 AVG),并使用上游
mlb-player-analyzer信号中的qs_probability(而非 W)——参见 Guardrails。
步骤 4:委托给 matchup-win-probability-sim
使用格式正确的输入负载调用同级技能:
inputs to matchup-win-probability-sim:
cat_list: [R, HR, RBI, SB, OBP, K, ERA, WHIP, QS, SV]
cat_inverse_list: [ERA, WHIP]
cat_win_threshold: 6
our_per_cat_projection: <dict from Step 3>
opp_per_cat_projection: <dict from Step 3>
sim_mode: "monte_carlo"
n_simulations: 10000
random_seed: 42
tie_rule: "half"
outputs consumed:
matchup_win_probability (float in [0,1])
per_cat_win_probability (dict[cat, float])
expected_cats_won (float)
variance_estimate (float)
- 两个预测字典中均包含全部 10 个类别
-
cat_inverse_list = [ERA, WHIP](数值越低越好) -
cat_win_threshold = 6(Yahoo 10 类别多数胜出) - 传入种子以确保结果可复现
- 捕获模拟输出字段并存储,以供步骤 5 使用
步骤 5:根据模拟输出 + 状态推导逐类别信号
应用 resources/methodology.md 中的公式。概率计算由模拟负责;本技能负责解读棒球状态。
-
cat_position∈ {winning, tied, losing}——根据当前总量在本地计算(而非使用模拟结果)。正确处理比率类别的方向(OBP 越高越有利;ERA/WHIP 越低越有利)。 -
cat_pressure(0–100)——根据位置、接近程度、数据量优势和已锁定标志进行简单算术计算。参见快速参考中的压力公式。 -
cat_reachability(0–100)——现在 = round(100 × per_cat_win_probability[cat]),直接取自模拟结果。 -
cat_punt_score(0–100)——(100 × (1 − per_cat_win_probability[cat])) × 0.6 + 30 × is_volatile + 20 × below_min_threshold − 10 × has_spillover,并将结果限制在范围内。
步骤 6:排序并输出计划
按 cat_pressure × cat_reachability / 100 对全部 10 个类别排序:
- 前 6 项:争取——将这些类别列为优先考虑对象,用于弃留名单操作、串流和安排先发
- 中间 2 项:维持——保持当前态势,不要过度投入
- 后 2 项:评估是否放弃——如果
cat_punt_score > 60,确认放弃;否则维持 在 H2H Cats 中,目标是赢下 10 项中的 6 项。一个稳妥的计划是“争取 6 项,最多让出 4 项”。输出信号格式请参见 resources/template.md。
第 7 步:编写信号文件
使用 YAML frontmatter 写入 signals/YYYY-MM-DD-cat-state.md(type: cat-state)。将模拟结果中的 matchup_win_probability 作为顶层字段包含在内。持久化之前,使用 mlb-signal-emitter 验证。
- 10 项类别全部齐全,且每项都包含全部 4 个信号
- 在 frontmatter 中记录
matchup_win_probability和expected_cats_won - 记录
sim_meta块(sim_mode、n_simulations、random_seed),以便复现 - 置信度应反映数据质量(如果 Yahoo 抓取不完整,则降低置信度)
-
source_urls包含 Yahoo 对阵页面、MLB.com 赛程页面,以及对模拟技能的引用 - 记录红队调查结果(例如:“对手即将迎来一名一周先发两场的王牌投手,可能同时扭转 K、ERA 和 WHIP”)
使用 resources/evaluators/rubric_mlb_category_state_analyzer.json 验证输出。最低要求:平均分达到 3.5 或以上。
常见模式
模式 1:周中均势
- 典型的周三上午状态:已有 3–4 项类别稳操胜券,3–4 项势均力敌,2–3 项波动较大。
- 行动:全力争取势均力敌的类别,对已锁定的胜利顺势而为,忽略已锁定的失利。
- 模拟的每项类别概率已反映这一点——
p ∈ [0.40, 0.65]的类别就是争夺中的类别。
模式 2:比赛量不均衡的对阵
- 我们还剩 30 场击球手比赛,对手还剩 22 场。我们的计数类类别预测均值因此上升;模拟中的
per_cat_win_probability对 R/HR/RBI/SB 的值也会相应上升。 - 行动:排满阵容(减少休息日,优先选择有双重赛的球队),竞价争取临时补位球员。比赛量优势标记会提升施压加成,可争取性加成则由模拟自动提升。
模式 3:王牌投手即将先发两场(己方或对手)
- 一名投手一周先发两场,可能同时影响 K、ERA、WHIP 和 QS。
- 在预测字典中编码这一点:提高其预期 IP 和 K,改善 ERA/WHIP 均值(朝其 ERA/WHIP 靠拢),并按每次预期达到 QS 水准的先发约 0.45 提高 QS 均值。
- 随后,模拟会显示
per_cat_win_probability中 4 项投球类别的概率同时变动。
模式 4:救援成功类别的波动
- SV 出现频率较低;一次 walkoff 救援失败就可能扭转该类别。
- 在预测字典中,为每名已锁定的终结者设置较低的均值(每周 ≤ 2.5)和适中的标准差(≥ 1.2)。如果落后 2 项以上,模拟自然会报告接近 0.1–0.25 的
per_cat_win_probability。 cat_punt_score中的 +30 波动性加成(在此处应用,而非模拟中)会在模拟的可争取性评估一致时,推动放弃争取 SV。
模式 5:比率类类别“冻结”
- 一周接近尾声时,如果对手远未达到 IP/PA 最低要求(例如周五只有 9 IP,且没有更多先发),其比率类类别就会锁定在当前数值。
- 在对手的比率类类别中,将标准差设为接近零,并将其均值设为不利或弃权的数值。随后,模拟会对这些类别返回
per_cat_win_probability ≈ 1.0。
注意事项
-
绝不能仅根据比率计算 OBP/ERA/WHIP——必须包含样本量(PA/IP)。 10 次 PA 的 .400 OBP 并不比 82 次 PA 的 .342 更好。比率类分类的 projection-dict 均值/标准差必须来自加权平均公式;模拟会将其视为真实值。
-
QS 是头号分类,不是胜场。 本联盟使用优质先发(6+ IP、≤3 ER)。投满 5 局得分为零。预测剩余 QS 时,将每次 SP 先发乘以其 QS 概率(来自
mlb-player-analyzer的qs_probability信号)——不要只统计排定的先发次数。 -
OBP 是第 5 类,不是 AVG。 保送计入统计。预测 OBP 贡献时,使用球员的 OBP(而非 AVG)。像 Juan Soto 这样高保送、低打击率的球员,在这个联盟中的价值高于其原始安打率所显示的价值。
-
SV 波动很大——信号一致时相信放弃该分类的判断。 与累积型打击分类不同,剩余 3 天时即使只落后 2 次救援成功,
per_cat_win_probability也很低,与阵容无关。如果你阵容中的终结者角色尚未确定(检查save_role_certainty< 70 → 自动列为放弃候选),就不要争取救援成功。cat_punt_score中的波动性加成在这里应用,而不是在模拟中应用——模拟返回的是原始概率。 -
cat_reachability来自模拟——不要重新计算。 这是委托处理。如果模拟返回per_cat_win_probability[R] = 0.36,那么cat_reachability[R] = 36。不要在这里使用 z-score 捷径或最佳/最差情况分桶——这些属于旧启发式方法,现在由模拟技能负责。 -
已锁定的分类仍需压力调整,而不是设为零。 已锁定的胜局仍有
cat_pressure ≈ 40(已稳拿)。已锁定的败局仍有cat_pressure ≈ 20(停止投入)。不要将它们设为零——下游 Agent 会使用非零值来决定替补还是放弃球员。 -
比率类分类需要最低 IP/PA 规则。 Yahoo 对投手比率类分类设有最低要求(每周通常为 20 IP)。如果任一阵容在临近周末时仍低于最低要求,该比率类分类可能会自动判负。调用模拟前,将此规则编码到 projection dict 中(stddev → 0,mean → 惩罚值),并向
cat_punt_score添加 +20below_min_threshold。 -
绝不重新推导上游信号。
qs_probability、sb_opportunity、obp_contribution、save_role_certainty来自mlb-player-analyzer。从信号目录读取,不要重新计算。 -
始终向模拟传入
random_seed。 否则,两次运行此技能会产生略有差异的cat_reachability值,导致执行差异比较的下游 Agent 产生混淆。默认种子:42。
快速参考
当前数学逻辑所在位置:
| 信号 | 归属 | 公式 |
|---|---|---|
cat_position | 此技能 | 根据当前总数计算的枚举值(考虑比率指标方向) |
cat_pressure | 此技能 | 基线 50 + 20 × 接近程度 + 15 × 波动性优势 − 10 × 已锁定胜局 − 30 × 已锁定败局 |
cat_reachability | 委托给 matchup-win-probability-sim | = round(100 × per_cat_win_probability[cat]) |
cat_punt_score | 此技能(使用模拟输出) | (100 × (1 − p_cat)) × 0.6 + 30 × 高波动性 + 20 × 低于最低门槛 − 10 × 溢出 |
matchup_win_probability | 委托给 matchup-win-probability-sim | 蒙特卡洛 P(cats_won ≥ 6) |
cat_pressure =
50 # neutral baseline
+ 20 × (is_close_margin: deficit/lead ≤ 10% of total)
+ 15 × (opponent_volume_exhausted: we have more games left)
- 10 × (locked_in_win)
- 30 × (locked_in_loss)
clamp(0, 100)
cat_reachability = round(100 × per_cat_win_probability[cat]) # from sim
cat_punt_score =
(100 - cat_reachability) × 0.6 # base: if we can't reach, consider punting
+ 30 × (cat is traditionally volatile: SV)
+ 20 × (below min-PA/IP threshold)
- 10 × (cat has spillover: K→QS, OBP→R, HR→R+RBI)
clamp(0, 100)
联盟常量(来自 context/league-config.md):
- 10 项数据:R、HR、RBI、SB、OBP、K、ERA、WHIP、QS、SV
- 反向数据项:ERA、WHIP(越低越好——作为
cat_inverse_list传给模拟器) - OBP(而非 AVG)——保送很重要
- QS(而非 W)——投球 6+ 局且自责分 ≤3
- H2H 数据项赛制,目标 = 每周赢下 10 项中的 6 项以上(
cat_win_threshold = 6) - 每日锁定阵容;每周对决从周一持续到周日
信号文件输出架构(来自 context/frameworks/signal-framework.md):
---
type: cat-state
date: YYYY-MM-DD
emitted_by: mlb-category-state-analyzer
week: N
matchup_opponent: <team name>
scoring_days_remaining: N
matchup_win_probability: 0.58 # from matchup-win-probability-sim
expected_cats_won: 5.18 # from matchup-win-probability-sim
sim_meta:
sim_mode: monte_carlo
n_simulations: 10000
random_seed: 42
synthesis_confidence: 0.0-1.0
source_urls:
- https://baseball.fantasysports.yahoo.com/b1/23756/5/matchup?week=N
---
正文:每项数据的表格 + 整体的冲刺/维持/放弃建议 + 红队审查结果。
下游使用的阈值:
| Agent | 阈值 | 影响 |
|---|---|---|
| 选秀分析器 | cat_pressure ≥ 60 | 优先选择能补强该项数据的目标 |
| 先发策略师 | cat_pressure (ERA/WHIP) < 30 | 允许使用风险更高的先发(我们正在放弃这些数据项) |
| 阵容优化器 | matchup_win_probability < 0.4 / > 0.6 | 处于劣势时追求波动性/处于优势时降低波动性 |
| 交易分析器 | 权重 trade_cat_delta | 乘以 cat_pressure / 50 |
关键资源:
- resources/template.md:信号文件输出格式、每项数据的表格、模拟集成的完整示例
- resources/methodology.md:Yahoo 抓取流程、剩余比赛投影、构建每项数据的投影字典、模拟集成公式
- resources/evaluators/rubric_mlb_category_state_analyzer.json:评估标准
- 同级技能:
matchup-win-probability-sim——通过蒙特卡洛/泊松二项分布负责每项数据和对决级别的获胜概率计算
所需输入:
- 当前对决比分(10 项数据,双方球队,包含比率数据项的数量)
- 双方球队的阵容 ID
- 截至周日的 MLB 剩余赛程
- 上游信号:
qs_probability、save_role_certainty、obp_contribution、sb_opportunity、daily_quality - 联盟配置(数据项列表、最低 IP/PA 阈值、
cat_win_threshold)
生成的输出:
signals/YYYY-MM-DD-cat-state.md——包含 10 项数据表格、整体计划、matchup_win_probability、置信度和来源 URL 的信号文件- 每项数据的
cat_position、cat_pressure、cat_reachability、cat_punt_score - 整体“冲刺 N 项、维持 M 项、放弃 P 项”建议(N + M + P = 10,目标为 N ≥ 6)
- 用于阵容优化器波动性决策的
matchup_win_probability(来自模拟委托方)