Calculate American option prices using the Bjerksund-Stensland (1993) closed-form analytical approximation.

Unlike European options, American options can be exercised at any time up to and including expiration, which normally requires a numerical approach such as the Binomial Tree model (see get_binomial_model). The Bjerksund-Stensland model instead derives a closed-form approximation by assuming the early-exercise boundary is a flat trigger price: once the stock price crosses this level, immediate exercise is assumed optimal.

The approximation (call, cost of carry b = r - q smaller than r) is:

  • β = (0.5 - b / σ²) + sqrt((b / σ² - 0.5)² + 2r / σ²)
  • B∞ = β / (β - 1) * K
  • B0 = max(K, r / (r - b) * K)
  • h(T) = -(b * T + 2σ√T) * (B0 / (B∞ - B0))
  • I = B0 + (B∞ - B0) * (1 - e^h(T))

If S ≥ I, immediate exercise is optimal and the value is S - K. American puts are priced through the put-call transformation AmericanPut(S, K, T, r, b, σ) = AmericanCall(K, S, T, r - b, -b, σ).

Also known as: BS93, Bjerksund-Stensland approximation, American option approximation.

Bjerksund-Stensland Model in Python

get_bjerksund_stensland is part of the Options module of the open-source Finance Toolkit. Install it with:

pip install financetoolkit -U

Then call get_bjerksund_stensland as shown below.

from financetoolkit import Toolkit

toolkit = Toolkit(["AMZN", "AAPL"], api_key="FINANCIAL_MODELING_PREP_KEY")

bjerksund_stensland = toolkit.options.get_bjerksund_stensland()

bjerksund_stensland.loc['AMZN']

Parameters

get_bjerksund_stensland accepts the following parameters:

  • start_date (str | None, optional): The start date which determines the stock price. Defaults to None which means it will use the most recent date.
  • put_option (bool, optional): Whether to calculate the put option price. Defaults to False which means it will calculate the call option price.
  • strike_price_range (float): The 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.
  • strike_step_size (int): The 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.
  • expiration_time_range (int): The number of days to use for the time to expiration. Defaults to 30 which equals 30 days.
  • risk_free_rate (float, optional): The risk free rate to use for the calculation. Defaults to None which means it will use the current risk free rate.
  • dividend_yield (float, optional): The dividend yield to use for the calculation. Defaults to None which means it will use the dividend yield as obtained through annual historical data.
  • show_input_info (bool, optional): Whether to show the input information. Defaults to False.
  • rounding (int | None, optional): The number of decimals to round the results to. Defaults to 4.
  • standardize (bool, optional): Whether to standardize (Z-Score) the result across the time to expiration columns for each ticker and strike price. Defaults to False.
Share