mcpField
M
mlb-category-state-analyzer

mlb-category-state-analyzer

github.com/lyndonkl数据与数据库18742 次安装10 周前更新
代码仓库

关于 mlb-category-state-analyzer

用于 Yahoo Fantasy MLB H2H 类别联赛的分析技能,帮助管理者结合当前比分和投影制定推进、维持或放弃类别的计划。它将类别胜率模拟与比赛状态信号结合起来。

主要功能

  1. 01结合模拟概率与类别状态
  2. 02计算类别位置、压力和可达性
  3. 03为十个类别排序并制定计划
  4. 04生成带来源与模拟信息的信号文件

适用场景

  1. 01判断周中应优先争取哪些类别
  2. 02根据剩余比赛量评估类别追赶空间
  3. 03为下游阵容、弃标和串流决策提供信号

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/lyndonkl/claude --skill mlb-category-state-analyzer

安装后在 Claude Code 中输入/mlb-category-state-analyzer确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

resources/
methodology.md
template.md
resources/evaluators/
rubric_mlb_category_state_analyzer.json

详细介绍

MLB 分类状态分析器

目录

示例

情景:第 3 周,K L 的 Boomers(球队 5)对阵 Los Doyers。周三上午(周中)。还剩 4 个计分日。

对阵原始比分(从 Yahoo 对阵页面获取):

分类我方对手差距剩余比赛场次(我方/对手)
R2831-326 / 22
HR97+226 / 22
RBI3029+126 / 22
SB46-226 / 22
OBP.342(82 PA).336(78 PA)+.00626 / 22 GP
K4238+49 次 SP 先发 / 7 次 SP 先发
ERA3.80(21 IP)4.12(19 IP)-0.32(更好)9 / 7
WHIP1.18(21 IP)1.25(19 IP)-0.07(更好)9 / 7
QS21+19 / 7
SV35-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
ERA3.88 ± 0.404.05 ± 0.45
WHIP1.20 ± 0.071.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 = 6
  • our_per_cat_projection / opp_per_cat_projection 使用上表数据
  • sim_mode = "monte_carlo",n_simulations = 10000,random_seed = 42

模拟输出(由此技能使用):

  • matchup_win_probability = 0.58
  • per_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.10
  • expected_cats_won = 5.18

各分类信号(根据模拟输出和棒球状态推导 — 参见 resources/methodology.md):

分类位置(来自状态)压力(状态 + 节奏)可达性(= round(100 × p_cat))放弃评分(= f(1 − p_cat) + 波动性)判断
R落后723644争取(有竞争)
HR领先486521保持
RBI领先(优势微弱)654235争取
SB落后551658评估是否放弃
OBP领先(优势微弱)706024争取
K领先557416争取
ERA领先626223争取
WHIP领先606819保持
QS领先78859全力争取
SV落后381084放弃

总体建议:争取 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。

请参阅 resources/methodology.md。

步骤 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。

注意事项

  1. 绝不能仅根据比率计算 OBP/ERA/WHIP——必须包含样本量(PA/IP)。 10 次 PA 的 .400 OBP 并不比 82 次 PA 的 .342 更好。比率类分类的 projection-dict 均值/标准差必须来自加权平均公式;模拟会将其视为真实值。

  2. QS 是头号分类,不是胜场。 本联盟使用优质先发(6+ IP、≤3 ER)。投满 5 局得分为零。预测剩余 QS 时,将每次 SP 先发乘以其 QS 概率(来自 mlb-player-analyzer 的 qs_probability 信号)——不要只统计排定的先发次数。

  3. OBP 是第 5 类,不是 AVG。 保送计入统计。预测 OBP 贡献时,使用球员的 OBP(而非 AVG)。像 Juan Soto 这样高保送、低打击率的球员,在这个联盟中的价值高于其原始安打率所显示的价值。

  4. SV 波动很大——信号一致时相信放弃该分类的判断。 与累积型打击分类不同,剩余 3 天时即使只落后 2 次救援成功,per_cat_win_probability 也很低,与阵容无关。如果你阵容中的终结者角色尚未确定(检查 save_role_certainty < 70 → 自动列为放弃候选),就不要争取救援成功。cat_punt_score 中的波动性加成在这里应用,而不是在模拟中应用——模拟返回的是原始概率。

  5. cat_reachability 来自模拟——不要重新计算。 这是委托处理。如果模拟返回 per_cat_win_probability[R] = 0.36,那么 cat_reachability[R] = 36。不要在这里使用 z-score 捷径或最佳/最差情况分桶——这些属于旧启发式方法,现在由模拟技能负责。

  6. 已锁定的分类仍需压力调整,而不是设为零。 已锁定的胜局仍有 cat_pressure ≈ 40(已稳拿)。已锁定的败局仍有 cat_pressure ≈ 20(停止投入)。不要将它们设为零——下游 Agent 会使用非零值来决定替补还是放弃球员。

  7. 比率类分类需要最低 IP/PA 规则。 Yahoo 对投手比率类分类设有最低要求(每周通常为 20 IP)。如果任一阵容在临近周末时仍低于最低要求,该比率类分类可能会自动判负。调用模拟前,将此规则编码到 projection dict 中(stddev → 0,mean → 惩罚值),并向 cat_punt_score 添加 +20 below_min_threshold。

  8. 绝不重新推导上游信号。 qs_probability、sb_opportunity、obp_contribution、save_role_certainty 来自 mlb-player-analyzer。从信号目录读取,不要重新计算。

  9. 始终向模拟传入 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

关键资源:

所需输入:

  • 当前对决比分(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(来自模拟委托方)

评论

支持 Markdown