Garman-Kohlhagen Model
Calculate the Garman-Kohlhagen Model, a variant of the Black-Scholes model used to price European-style options on foreign exchange (FX) rates.
Because holding foreign currency earns the foreign risk-free rate (analogous to a continuous dividend yield on a stock), the Garman-Kohlhagen model uses the foreign risk-free rate in place of the dividend yield used in the standard Black-Scholes model.
The formulas are as follows:
\[d_{1} = (\ln(S / K) + (r - r_{f} + (\sigma ^{2}) / 2) \cdot t) / (\sigma \cdot \sqrt{t})\] \[d_{2} = d_{1} - \sigma \cdot \sqrt{t}\] \[\text{Call Option Price} = S \cdot e ^{- r_{f} \cdot t} \cdot N(d_{1}) - K \cdot e ^{- r \cdot t} \cdot N(d_{2})\] \[\text{Put Option Price} = K \cdot e ^{- r \cdot t} \cdot N(- d_{2}) - S \cdot e ^{- r_{f} \cdot t} \cdot N(- d_{1})\]Where S is the spot exchange rate, K is the strike price, r is the domestic risk-free rate, r_f is the foreign risk-free rate, σ 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: the Black-Scholes model for currency options, FX option pricing model.
Garman-Kohlhagen Model in Python or via the MCP
Install the Finance Toolkit with:
pip install financetoolkit -U
Then call get_garman_kohlhagen as shown below.
from financetoolkit import Toolkit
toolkit = Toolkit(
["USDJPY"],
api_key="FINANCIAL_MODELING_PREP_KEY",
start_date="2025-01-01",
end_date="2025-12-31",
)
garman_kohlhagen = toolkit.options.get_garman_kohlhagen(
strike_price_range=0.05,
strike_step_size=2,
expiration_time_range=91,
risk_free_rate=0.0075,
foreign_risk_free_rate=0.0375,
)
garman_kohlhagen.loc["USDJPY", ["2026-01-30", "2026-03-01", "2026-03-31"]]
Or, after setting up the Finance Toolkit MCP, ask:
What was a call on the dollar against the yen worth under the Garman-Kohlhagen model at the end of 2025, with a 0.75% yen and a 3.75% dollar interest rate, for the expiries of 30 January, 1 March and 31 March 2026 and strikes within 5% of the exchange rate in steps of 2 yen?
Which returns:
| Strike Price | 2026-01-30 | 2026-03-01 | 2026-03-31 |
|---|---|---|---|
| 148 | 8.4856 | 8.266 | 8.1462 |
| 150 | 6.5551 | 6.4903 | 6.498 |
| 152 | 4.7422 | 4.8793 | 5.0189 |
| 154 | 3.1505 | 3.4884 | 3.741 |
| 156 | 1.8845 | 2.3571 | 2.683 |
| 158 | 0.9971 | 1.4973 | 1.8467 |
| 160 | 0.4601 | 0.8903 | 1.2176 |
| 162 | 0.1832 | 0.494 | 0.7678 |
Parameters
get_garman_kohlhagen accepts the following parameters.
| Parameter | Type | Description | Example |
|---|---|---|---|
start_date | str | None | The 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_option | bool | Whether to calculate the put option price. Defaults to False which means it will calculate the call option price. | True |
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. | 0.1 |
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. | 1 |
expiration_time_range | int | The number of days to use for the time to expiration: the columns are the expirations 1 up to expiration_time_range - 1 days after the start date. Defaults to 30, which gives expirations of 1 to 29 days. | 90 |
risk_free_rate | float | The domestic 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 |
foreign_risk_free_rate | float | The foreign risk free rate to use for the calculation, which plays the role of the dividend yield in the standard Black-Scholes model. Defaults to 0.0. | 0.03 |
show_input_info | bool | Whether to show the input information. Defaults to False. | True |
rounding | int | None | The number of decimals to round the results to. Defaults to None, which uses the rounding of the Toolkit (4 unless set otherwise). | 2 |
standardize | bool | Whether to standardize (Z-Score) the result across the time to expiration columns for each ticker and strike price. Defaults to False. | True |