Implied Odds Probabilities (implied)#
This submodule provides a comprehensive toolkit for converting bookmaker odds into their underlying “true” probabilities. It achieves this by removing the bookmaker’s margin (the overround) using various statistical methods.
The primary entry point is the calculate_implied() function, which handles all calculations and returns a structured data object.
Quick Start#
Here’s a basic example of how to convert decimal odds into probabilities using the default multiplicative method.
import penaltyblog as pb
# Odds for a Home Win, Draw, and Away Win
odds = [2.7, 2.3, 4.4]
result = pb.implied.calculate_implied(odds)
print(f"Probabilities: {result.probabilities}")
print(f"Margin: {result.margin:.4f}")
print(f"Method Used: {result.method.value}")
Probabilities: [0.35873803615739097, 0.4211272598369373, 0.22013470400567173]
Margin: 0.0324
Method Used: multiplicative
Main Function#
All calculations are performed through this central function. It accepts various odds formats and allows you to specify the desired calculation method.
penaltyblog.implied.calculate_implied(
odds: Union[List[float], List[str], OddsInput],
method: Union[str, ImpliedMethod] = ImpliedMethod.MULTIPLICATIVE,
odds_format: Union[str, OddsFormat] = OddsFormat.DECIMAL,
market_names: Optional[List[str]] = None,
) -> ImpliedProbabilities
Description#
Calculate implied probabilities from odds using the specified method.
Parameters
odds (
List[float] | List[str] | OddsInput): The odds to convert. Can be a list of values or anOddsInputobject.method (
str | ImpliedMethod, optional): The method to use. Defaults to"multiplicative".odds_format (
str | OddsFormat, optional): The format of the provided odds. Defaults to"decimal".market_names (
List[str], optional): Names for each market outcome.
Returns
ImpliedProbabilities: A type-safe container with the calculated probabilities and metadata.
Data Models#
The submodule uses type-safe dataclasses for handling odds input and probability output. This ensures your code is clear, predictable, and less prone to errors.
OddsInput#
The OddsInput class is used to standardize various odds formats (Decimal, American, Fractional) before calculation. While it’s often used internally, you can instantiate it directly.
Attributes:
odds: The list of original odds.
odds_format: The format of the odds (e.g.,
OddsFormat.DECIMAL).market_names: The names for each outcome.
Methods:
to_decimal(): Converts the stored odds to decimal format.
ImpliedProbabilities Output#
The ImpliedProbabilities class is the return type for all calculations. It’s a container holding the results and useful metadata.
Attributes:
probabilities: A list of the calculated “true” probabilities.
margin: The original margin (overround) from the bookmaker’s odds.
method: The method used for the calculation (e.g.,
ImpliedMethod.SHIN).market_names: The names for each outcome.
method_params: A dictionary containing any special parameters returned by the method (e.g., Shin’s
zor Power’sk).
Properties:
probabilities_dict: Returns the probabilities as a dictionary mapped to the market names.
Available Methods & Formats#
You can easily specify which calculation method to use and what format the input odds are in.
Calculation Methods#
The method parameter accepts a string or an ImpliedMethod enum member. Each method represents a different theory of how the bookmaker’s margin is applied.
MULTIPLICATIVE(default)ADDITIVEPOWERSHINDIFFERENTIAL_MARGIN_WEIGHTINGODDS_RATIOLOGARITHMIC
Odds Formats#
The odds_format parameter accepts a string or an OddsFormat enum member.
DECIMAL(default)AMERICANFRACTIONAL
Advanced Usage#
Using Different Methods and Formats#
Here’s how to calculate probabilities from American odds using Shin’s method. This example also shows how to access method-specific parameters from the result.
import penaltyblog as pb
from penaltyblog.implied.models import ImpliedMethod, OddsFormat
american_odds = ["+170", "+130", "+340"]
market_names = ["Home", "Draw", "Away"]
result = pb.implied.calculate_implied(
odds=american_odds,
method=ImpliedMethod.SHIN,
odds_format=OddsFormat.AMERICAN,
market_names=market_names,
)
print(f"Shin's Probabilities: {result.probabilities}")
# Access method-specific parameters returned by some methods
if result.method_params and "z" in result.method_params:
print(f"Shin's z parameter: {result.method_params['z']:.4f}")
Shin's Probabilities: [0.35934391959159157, 0.42324384818283234, 0.21741223222458853]
Shin's z parameter: 0.0162