PluginBench
Skill
Pass
Audit score 90

betting

machina-sports/sports-skills

Odds conversion, edge detection, Kelly criterion, arbitrage, and parlay analysis—pure computation, no API calls.

What is betting?

Betting analysis module for evaluating odds, detecting edges, sizing bets, and identifying arbitrage opportunities. Use when analyzing odds from any source (ESPN, Polymarket, Kalshi) to compute expected value, Kelly criterion, line movement, and parlay outcomes. Does not fetch live odds—obtain those from sport-specific skills or prediction markets first, then use this skill to analyze them.

  • Convert odds between American, decimal, and probability formats
  • De-vig sportsbook odds to extract fair probabilities
  • Detect positive expected value edges by comparing fair vs market probabilities
  • Calculate optimal bet sizing using Kelly criterion
  • Identify arbitrage opportunities across multiple sources
  • Analyze parlay legs and evaluate combined expected value

How to install betting

npx skills add https://github.com/machina-sports/sports-skills --skill betting
Claude Code
Cursor
Windsurf
Cline

How to use betting

  1. 1.Obtain odds from ESPN, Polymarket, Kalshi, or other sources using sport-specific skills or market APIs
  2. 2.Identify the odds format (American, decimal, or probability)
  3. 3.If using sportsbook odds, de-vig them first using `devig` to extract fair probabilities
  4. 4.Call the appropriate analysis command: `convert_odds`, `find_edge`, `find_arbitrage`, `parlay_analysis`, `line_movement`, or `kelly_criterion`
  5. 5.Interpret results to make informed betting decisions or identify opportunities

Use cases

Good for
  • Compare ESPN moneyline odds against Polymarket/Kalshi prediction market prices to find +EV bets
  • Detect guaranteed-profit arbitrage when different sources price outcomes differently
  • Evaluate whether a multi-leg parlay at given odds has positive expected value
  • De-vig standard -110/-110 spreads to understand true probability and vig percentage
  • Analyze how line movement from open to close indicates sharp money or market consensus shifts
Who it's for
  • Sports bettors evaluating odds and bet sizing
  • Prediction market traders comparing prices across platforms
  • Quantitative analysts studying line movement and market efficiency
  • Anyone comparing sportsbook odds against alternative probability sources

betting FAQ

Do I need to de-vig sportsbook odds before analyzing them?

Yes. Sportsbook odds include vig (house margin). Always run `devig` on ESPN or other sportsbook odds before comparing against prediction market prices or computing edge.

Can this skill fetch live odds from ESPN or prediction markets?

No. This module only analyzes odds you provide. Use sport-specific skills (nba, nfl, etc.) or the polymarket/kalshi skills to fetch odds first, then pass them to this skill.

What is the difference between `find_edge` and `evaluate_bet`?

`find_edge` compares a fair probability against a market probability. `evaluate_bet` does both de-vigging and edge detection in one step when you have sportsbook odds and a market price.

How do I know if a parlay has positive expected value?

Use `parlay_analysis` with the fair probabilities of each leg and the parlay odds offered. It returns edge and EV; positive EV means the bet is +EV.

What does 'arbitrage_found' mean?

If `find_arbitrage` returns true, the sum of implied probabilities across all outcomes is less than 1.0, guaranteeing profit regardless of outcome. The result includes the guaranteed ROI percentage.

Full instructions (SKILL.md)

Source of truth, from machina-sports/sports-skills.


name: betting description: | Betting analysis — odds conversion, de-vigging, edge detection, Kelly criterion, arbitrage detection, parlay analysis, and line movement. Pure computation, no API calls. Works with odds from any source: ESPN (American odds), Polymarket (decimal probabilities), Kalshi (integer probabilities).

Use when: user asks about bet sizing, expected value, edge analysis, Kelly criterion, arbitrage, parlays, line movement, odds conversion, or comparing odds across sources. Also use when you have odds from ESPN and a prediction market price and want to evaluate whether a bet has positive expected value. Don't use when: user asks for live odds or market data — use polymarket, kalshi, or the sport-specific skill to fetch odds first, then use this skill to analyze them. license: MIT metadata: author: machina-sports version: "0.2.0"

Betting Analysis

Before writing queries, consult references/api-reference.md for odds formats, command parameters, and key concepts.

Quick Start

sports-skills betting convert_odds --odds=-150 --from_format=american
sports-skills betting devig --odds=-150,+130 --format=american
sports-skills betting find_edge --fair_prob=0.58 --market_prob=0.52
sports-skills betting evaluate_bet --book_odds=-150,+130 --market_prob=0.52
sports-skills betting find_arbitrage --market_probs=0.48,0.49
sports-skills betting parlay_analysis --legs=0.58,0.62,0.55 --parlay_odds=600
sports-skills betting line_movement --open_odds=-140 --close_odds=-160

Python SDK:

from sports_skills import betting

betting.convert_odds(odds=-150, from_format="american")
betting.devig(odds="-150,+130", format="american")
betting.find_edge(fair_prob=0.58, market_prob=0.52)
betting.find_arbitrage(market_probs="0.48,0.49")
betting.parlay_analysis(legs="0.58,0.62,0.55", parlay_odds=600)
betting.line_movement(open_odds=-140, close_odds=-160)

CRITICAL: Before Any Analysis

CRITICAL: Before calling any analysis command, verify:

  • Odds format is correctly identified (american, decimal, or probability).
  • ESPN odds are de-vigged with devig before computing edge vs prediction market prices.
  • This module computes — it does not fetch. Obtain odds from sport-specific skills or polymarket/kalshi first.

Workflows

Compare ESPN vs Polymarket/Kalshi

  1. Get ESPN moneyline odds (e.g., from nba get_scoreboard): Home: -150, Away: +130
  2. Get Polymarket/Kalshi price for the same outcome (e.g., home at 0.52)
  3. De-vig: devig --odds=-150,+130 --format=american → Fair: Home 57.9%, Away 42.1%
  4. Compare: find_edge --fair_prob=0.579 --market_prob=0.52 → Edge: 5.9%, EV: 11.3%
  5. Or all in one step: evaluate_bet --book_odds=-150,+130 --market_prob=0.52

Arbitrage Detection

  1. Get best price per outcome from different sources (Polymarket home at 0.48, Kalshi away at 0.49)
  2. find_arbitrage --market_probs=0.48,0.49 --labels=home,away
  3. Total implied 0.97 (< 1.0) → arbitrage found, guaranteed ROI: 3.09%

Parlay Evaluation

  1. De-vig each leg: Leg 1 → 0.58, Leg 2 → 0.55, Leg 3 → 0.50
  2. parlay_analysis --legs=0.58,0.55,0.50 --parlay_odds=600
  3. Returns combined fair probability, edge, and Kelly fraction

Line Movement Analysis

  1. Get ESPN open and close lines: Open -140, Close -160
  2. line_movement --open_odds=-140 --close_odds=-160
  3. Returns probability shift, direction, and classification (sharp_action, steam_move, etc.)

Examples

Example 1: Edge check using ESPN and Polymarket prices User says: "Is there edge on the Lakers game? ESPN has them at -150 and Polymarket has them at 52 cents" Actions:

  1. Call devig(odds="-150,+130", format="american") → fair home probability ~58%
  2. Call find_edge(fair_prob=0.58, market_prob=0.52) → edge ~6%, positive EV
  3. Call kelly_criterion(fair_prob=0.58, market_prob=0.52) → optimal bet fraction Result: Present edge percentage, EV per dollar, and recommended bet size as % of bankroll

Example 2: Arbitrage opportunity detection User says: "Can I arb this? Polymarket has home at 48 cents and Kalshi has away at 49 cents" Actions:

  1. Call find_arbitrage(market_probs="0.48,0.49", labels="home,away")
  2. Check arbitrage_found in result Result: If arbitrage: present allocation percentages and guaranteed ROI. If not: present overround and explain no guaranteed profit

Example 3: Parlay evaluation User says: "Is this 3-leg parlay at +600 worth it?" Actions:

  1. De-vig each leg to get fair probabilities (e.g., 0.58, 0.62, 0.55)
  2. Call parlay_analysis(legs="0.58,0.62,0.55", parlay_odds=600) Result: Present combined fair probability, edge, EV, +EV or -EV verdict, and Kelly fraction

Example 4: Line movement interpretation User says: "The line moved from -140 to -160, what does that mean?" Actions:

  1. Call line_movement(open_odds=-140, close_odds=-160) Result: Present probability shift, direction, magnitude, and classification (sharp action, steam move, etc.)

Example 5: De-vig a standard spread User says: "What are the true odds for this spread? Both sides are -110" Actions:

  1. Call devig(odds="-110,-110", format="american") Result: Present each side as 50% fair probability, vig is ~4.5%

Example 6: Odds format conversion User says: "Convert -200 to implied probability" Actions:

  1. Call convert_odds(odds=-200, from_format="american") Result: Present 66.7% implied probability and 1.50 decimal odds

Commands that DO NOT exist — never call these

  • get_odds — does not exist. This module analyzes odds; it does not fetch them. Use nba-data/nfl-data/etc. for ESPN odds, or polymarket/kalshi for prediction market prices.
  • calculate_ev — does not exist. Use find_edge or evaluate_bet instead.
  • compare_markets — does not exist. Use the markets skill for cross-platform comparison.

If a command is not listed in references/api-reference.md, it does not exist.

Troubleshooting

Error: ValueError: unknown format when calling convert_odds Cause: The from_format parameter is not one of american, decimal, or probability Solution: Use exactly american, decimal, or probability as the format string

Error: find_edge returns negative EV when a positive edge is expected Cause: Fair probability and market probability may be reversed, or de-vigging was skipped Solution: Run devig on sportsbook odds first, then pass the de-vigged fair_prob to find_edge

Error: find_arbitrage shows no arbitrage even when prices seem low Cause: Prices may sum to more than 1.0 when all outcomes are correctly included Solution: Verify you are using the correct probabilities for all outcomes; check total_implied in the result

Error: Kelly fraction is very high (greater than 0.5) Cause: Edge estimate is very large — often from a miscalculated fair probability Solution: Use half-Kelly or quarter-Kelly for conservative sizing. Re-verify fair probability via devig