Calculate the Binomial Option Pricing Model, a mathematical model used to estimate the price of European and American style options. It does so by creating a binomial tree of price paths for the underlying asset, and then working backwards through the tree to determine the price of the option at each node.

By default the stock price (the traded close), risk free rate, dividend yield and volatility of the most recent date are used; changing the start date prices the option as of that date instead. The volatility is the annualized standard deviation of the daily returns over the year before that date and the dividend yield the dividends of the 365 days up to that date relative to its close, so an earlier start date only uses what was known on that date. The exception is a date in the first year of the price history: without a full year before it, it takes the dividend yield of the first date that has one.

The formulas are as follows:

\[\text{time step} (\Delta t) = T / n\] \[\text{up movement} (u) = e ^{\sigma \cdot \sqrt{\Delta t}}\] \[\text{down movement} (d) = 1 / u\] \[\text{risk neutral probability} (p) = (e ^{(r - q) \cdot \Delta t} - d) / (u - d)\] \[\text{stock price at each node} = S \cdot u ^{j} \cdot d ^{n - j}\] \[\text{call option price at expiration date} = \max(S - K,\; 0)\] \[\text{put option price at expiration date} = \max(K - S,\; 0)\]

For European Style options:

\[\text{call option price at each node} = (p \cdot C_{u} + (1 - p) \cdot C_{d}) \cdot e ^{- r \cdot \Delta t}\] \[\text{put option price at each node} = (p \cdot P_{u} + (1 - p) \cdot P_{d}) \cdot e ^{- r \cdot \Delta t}\]

For American Style options:

\[\text{call option price at each node} = \max(S - K,\; (p \cdot C_{u} + (1 - p) \cdot C_{d}) \cdot e ^{- r \cdot \Delta t})\] \[\text{put option price at each node} = \max(K - S,\; (p \cdot P_{u} + (1 - p) \cdot P_{d}) \cdot e ^{- r \cdot \Delta t})\]

Where S is the stock price, K is the strike price, r is the risk free rate, q is the dividend yield, σ is the volatility, T is the time to expiration, Δt is the length of one time step, j is the number of up movements, n is the number of time steps, C_u is the call option price at the up movement, C_d is the call option price at the down movement, P_u is the put option price at the up movement and P_d is the put option price at the down movement.

The resulting output is a DataFrame containing the tickers, strike prices and movements as the index and the time to expiration as the columns. The movements index contains the number of up movements and the number of down movements. The output is the binomial tree displayed in a table. E.g. when using 10 time steps, the table for each strike price from each company will contain the actual binomial tree as also depicted in the image found here: https://en.wikipedia.org/wiki/Binomial_options_pricing_model#Method

Also known as: binomial tree, lattice model, option pricing.

Binomial Model in Python or via the MCP

Install the Finance Toolkit with:

pip install financetoolkit -U

Then call get_binomial_model as shown below.

from financetoolkit import Toolkit

toolkit = Toolkit(
    ["KO"],
    api_key="FINANCIAL_MODELING_PREP_KEY",
    start_date="2025-01-01",
    end_date="2025-12-31",
)

binomial_model = toolkit.options.get_binomial_model(
    strike_price_range=0, strike_step_size=1, timesteps=5
)

binomial_model.loc["KO"]

Or, after setting up the Finance Toolkit MCP, ask:

What does a five-step binomial tree look like for a one-year European call on Coca-Cola struck at the money from the close of 31 December 2025?

Which returns:

  2025-12-31 2026-03-14 2026-05-26 2026-08-07 2026-10-19 2026-12-31
(69, ‘UUUUU’) 5.821 9.067 13.6268 19.594 26.7232 34.524
(69, ‘DUUUU’) nan 2.7196 4.7251 7.9735 12.8942 19.479
(69, ‘DDUUU’) nan nan 0.7891 1.6034 3.2581 6.6205
(69, ‘DDDUU’) nan nan nan 0 0 0
(69, ‘DDDDU’) nan nan nan nan 0 0
(69, ‘DDDDD’) nan nan nan nan nan 0

Parameters

get_binomial_model accepts the following parameters.

ParameterTypeDescriptionExample
start_datestr | NoneThe date whose price, volatility and rates the values start from; a date without prices (a weekend or a holiday) uses the last trading day before it, and a ticker without a price on that day is left out with a warning. Defaults to None, which uses the last date of the historical data."2021-01-01"
put_optionboolWhether to calculate the put option price. Defaults to False which means it will calculate the call option price.True
american_optionboolWhether to value an American option, which can be exercised at every node, instead of a European option. Defaults to False.True
strike_price_rangefloatThe percentage range to use for the strike prices. Defaults to 0.25 which equals 25% and thus results in strike prices from 75 to 125 if the current stock price is 100.0.1
strike_step_sizeintThe step size to use for the strike prices. Defaults to 5 which means that the strike prices will be 75, 80, 85, 90, 95, 100, 105, 110, 115 and 120 if the current stock price is 100.1
time_to_expirationfloatThe number of years to use for the time to expiration. Defaults to 1 which equals one year.2
timestepsintThe number of time steps to use for the binomial tree. Defaults to 10 which equals 10 time steps. This will be evenly distributed over the time to expiration.100
risk_free_ratefloatThe risk free rate to use for the calculation. Defaults to None, which uses the Toolkit’s risk-free rate on the pricing date: the 10-year Treasury yield unless the Toolkit’s risk_free_rate parameter selects ‘13w’, ‘5y’ or ‘30y’, converted from its semi-annual bond-equivalent quote to continuous compounding. A rate passed here is used as given, as a continuously compounded rate.0.04
dividend_yieldfloatThe dividend yield to use for the calculation. Defaults to None, which uses the dividend yield on the pricing date (the dividends of the 365 days up to it relative to its close, as the continuously compounded ln(1 + q)). A given value is used as a continuous yield.0.02
show_input_infoboolWhether to show the input information. Defaults to False.True
roundingint | NoneThe number of decimals to round the results to. Defaults to None, which uses the rounding of the Toolkit (4 unless set otherwise).2
standardizeboolWhether to standardize (Z-Score) the result across the time to expiration columns for each ticker and strike price. Defaults to False.True
Share