{
  "id": "arbitrage",
  "version": "659b62b8720a",
  "status": "published",
  "name": "Arbitrage Calculator",
  "question": "Is there an arbitrage in these odds?",
  "summary": "Checks whether the best odds on every outcome of one event add up to an arbitrage, and splits a total stake across the outcomes so each pays the same, with the profit or loss.",
  "category": "game",
  "subcategory": "betting",
  "url": "https://www.acalculator.org/game/arbitrage-calculator",
  "markdown": "https://www.acalculator.org/game/arbitrage-calculator.md",
  "kind": "function",
  "method": "With decimal odds dᵢ and total stake T: book B = Σ 1/dᵢ; stake on outcome i = T × (1/dᵢ) ÷ B; every outcome pays T ÷ B; profit = T ÷ B − T. An arbitrage exists when B < 1.",
  "assumptions": [
    "The outcomes listed cover every way the event can end, and exactly one of them wins.",
    "Each bet is placed at the odds shown, with no limits, fees or cancelled bets. In practice odds move and bookmakers may void or limit such bets.",
    "Stakes are exact; round them to what the bookmaker accepts, which changes the payouts slightly.",
    "Results are mathematics, not betting advice."
  ],
  "inputs": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
      "format": {
        "title": "Odds format",
        "description": "The format of every outcome’s odds: American, decimal, or fractional.",
        "type": "string",
        "enum": [
          "american",
          "decimal",
          "fractional"
        ]
      },
      "outcomes": {
        "title": "Outcomes",
        "description": "The best odds on each outcome of the event, one row per outcome. List every outcome.",
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "odds": {
              "title": "Odds",
              "description": "The best odds you can get on this outcome, in the chosen format.",
              "type": "string",
              "maxLength": 30
            }
          }
        }
      },
      "total": {
        "title": "Total stake",
        "description": "The total amount to spread across the outcomes.",
        "type": "number",
        "x-unit": "USD",
        "exclusiveMinimum": 0,
        "maximum": 1000000000
      }
    }
  },
  "outputs": {
    "profit": {
      "label": "Profit whichever outcome wins",
      "description": "The payout minus the total stake; negative when there is no arbitrage.",
      "format": "money"
    },
    "roi": {
      "label": "Return on the total stake",
      "description": "Profit ÷ total stake, in percent: 100 ÷ (sum of implied probabilities) − 1.",
      "format": "percent"
    },
    "arbitrage": {
      "label": "Arbitrage?",
      "description": "Yes when the equal payout is above the total stake (the implied probabilities add up to less than 100%).",
      "format": "text"
    },
    "book": {
      "label": "Sum of implied probabilities",
      "description": "The implied probabilities of all outcomes (100 ÷ decimal odds) added up.",
      "format": "percent"
    },
    "payout": {
      "label": "Payout whichever outcome wins",
      "description": "Total stake ÷ (sum of 1 ÷ decimal odds); the same for every outcome.",
      "format": "money"
    },
    "stake1": {
      "label": "Stake on outcome 1",
      "description": "The part of the total stake to bet on outcome 1: total × (1 ÷ its decimal odds) ÷ (sum of 1 ÷ decimal odds).",
      "format": "money"
    },
    "stake2": {
      "label": "Stake on outcome 2",
      "description": "The part of the total stake to bet on outcome 2: total × (1 ÷ its decimal odds) ÷ (sum of 1 ÷ decimal odds).",
      "format": "money"
    },
    "stake3": {
      "label": "Stake on outcome 3",
      "description": "The part of the total stake to bet on outcome 3: total × (1 ÷ its decimal odds) ÷ (sum of 1 ÷ decimal odds).",
      "format": "money"
    },
    "stake4": {
      "label": "Stake on outcome 4",
      "description": "The part of the total stake to bet on outcome 4: total × (1 ÷ its decimal odds) ÷ (sum of 1 ÷ decimal odds).",
      "format": "money"
    },
    "stake5": {
      "label": "Stake on outcome 5",
      "description": "The part of the total stake to bet on outcome 5: total × (1 ÷ its decimal odds) ÷ (sum of 1 ÷ decimal odds).",
      "format": "money"
    },
    "stake6": {
      "label": "Stake on outcome 6",
      "description": "The part of the total stake to bet on outcome 6: total × (1 ÷ its decimal odds) ÷ (sum of 1 ÷ decimal odds).",
      "format": "money"
    },
    "stake7": {
      "label": "Stake on outcome 7",
      "description": "The part of the total stake to bet on outcome 7: total × (1 ÷ its decimal odds) ÷ (sum of 1 ÷ decimal odds).",
      "format": "money"
    },
    "stake8": {
      "label": "Stake on outcome 8",
      "description": "The part of the total stake to bet on outcome 8: total × (1 ÷ its decimal odds) ÷ (sum of 1 ÷ decimal odds).",
      "format": "money"
    },
    "stake9": {
      "label": "Stake on outcome 9",
      "description": "The part of the total stake to bet on outcome 9: total × (1 ÷ its decimal odds) ÷ (sum of 1 ÷ decimal odds).",
      "format": "money"
    },
    "stake10": {
      "label": "Stake on outcome 10",
      "description": "The part of the total stake to bet on outcome 10: total × (1 ÷ its decimal odds) ÷ (sum of 1 ÷ decimal odds).",
      "format": "money"
    }
  },
  "defaultAnswer": {
    "inputs": {
      "format": "american",
      "outcomes": [
        {
          "odds": "+110"
        },
        {
          "odds": "+105"
        }
      ],
      "total": 1000
    },
    "outputs": {
      "profit": 37.34939759036138,
      "roi": 3.7349397590361377,
      "arbitrage": "Yes",
      "book": 96.39953542392567,
      "payout": 1037.3493975903614,
      "stake1": 493.9759036144578,
      "stake2": 506.0240963855421
    },
    "text": "Spreading $1,000.00 across the outcomes pays $1,037.35 whichever wins, a profit of $37.35."
  },
  "examples": [
    {
      "given": {
        "format": "american",
        "outcomes": [
          {
            "odds": "+110"
          },
          {
            "odds": "+105"
          }
        ],
        "total": 1000
      },
      "expect": {
        "book": 96.39953542392567,
        "arbitrage": "Yes",
        "stake1": 493.9759036144578,
        "stake2": 506.0240963855422,
        "payout": 1037.3493975903614,
        "profit": 37.34939759036143
      },
      "source": "hand calculation in content.mdx: 10/21 + 20/41 = 830/861; stakes 1000 × (10/21) ÷ (830/861)"
    },
    {
      "given": {
        "format": "decimal",
        "outcomes": [
          {
            "odds": "2.5"
          },
          {
            "odds": "3.6"
          },
          {
            "odds": "4"
          }
        ],
        "total": 100
      },
      "expect": {
        "book": 92.77777777777777,
        "arbitrage": "Yes",
        "stake1": 43.11377245508982,
        "payout": 107.78443113772455
      },
      "source": "hand calculation in content.mdx: 0.4 + 5/18 + 0.25 = 167/180; 100 × 180/167"
    },
    {
      "given": {
        "format": "american",
        "outcomes": [
          {
            "odds": "-110"
          },
          {
            "odds": "-110"
          }
        ],
        "total": 220
      },
      "expect": {
        "arbitrage": "No",
        "stake1": 110,
        "payout": 210,
        "profit": -10
      },
      "source": "hand calculation in content.mdx: 22/21 > 1, so no arbitrage; 220 × 21/22 = 210"
    }
  ],
  "sources": [
    "Wikipedia, Arbitrage betting: https://en.wikipedia.org/wiki/Arbitrage_betting",
    "Wikipedia, Fixed-odds betting (odds formats and overround): https://en.wikipedia.org/wiki/Fixed-odds_betting",
    "National Council on Problem Gambling, help and treatment (1-800-MY-RESET): https://www.ncpgambling.org/help-treatment/"
  ],
  "related": [
    "hedge",
    "no-vig",
    "betting-odds",
    "odds"
  ],
  "changelog": [
    {
      "date": "2026-09-28",
      "note": "Odds parser shapes and decimal comma, so a format switch never shows a false arbitrage (WP-70 QA)."
    }
  ]
}
