Calculate the closed-form price of a geometric-average Asian option using the Kemna & Vorst (1990) formula.

An Asian option’s payoff depends on the average price of the underlying stock over the option’s life, rather than the price at a single point in time, which typically makes it cheaper than the equivalent vanilla option (the averaging reduces variance). The geometric-average version has a closed-form solution based on an adjusted volatility and cost of carry:

  • σ_A = σ / √3
  • b_A = 0.5 * (b - σ²/6), where b = r - q is the cost of carry
  • d1 = (ln(S / K) + (b_A + σ_A²/2) * t) / (σ_A * √t)
  • d2 = d1 - σ_A * √t
  • Call Price = S * e^((b_A - r) * t) * N(d1) - K * e^(-r * t) * N(d2)
  • Put Price = K * e^(-r * t) * N(-d2) - S * e^((b_A - r) * t) * N(-d1)

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, N(d1) is the cumulative normal distribution of d1 and N(d2) is the cumulative normal distribution of d2.

Also known as: geometric Asian option, average rate option, average price option.

Asian Option in Python

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

pip install financetoolkit -U

Then call get_asian_option as shown below.

from financetoolkit import Toolkit

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

asian_option = toolkit.options.get_asian_option()

asian_option.loc['AMZN']

Parameters

get_asian_option 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