# Garman Kohlhagen Model and VBA

Get VBA and an Excel spreadsheet for the Garman Kohlhagen model, a method of pricing European foreign exchange options.

The Garman Kohlhagen model generalizes the standard Black-Scholes model to include two interest rates – one for a domestic currency, and one for a foreign currency. The dividend yield is replaced by the foreign currency interset rate. The size of the interest rate gap between a foreign and domestic currency affects the pricing of these options.

The model was published in 1976 by Mark Garman and Steven Kohlhagen, and predicts that foreign exchange options are cheaper than standard European option for a call but more expensive for a put.

The Garman Kohlhagen model assumes

• European-style options with a pre-determined expiration date,
• foreign and domestic interest rates and the exchange rate are constant,
• the market is efficient (i.e. no arbitrage),
• there are no transaction costs,
• and the exchange rate has a log-normal price distribution
The governing equations are
• rd and rf are the domestic and foreign interest rates
• S0 is the spot rate (i.e. foreign exchange rate)
• K is the strike
• T is the maturity time
• σ is the foreign exchange rate volatility
• N is the cumulative normal distribution

## Garman Kohlhagen Model in VBA

This VBA implements the equations above, and can be used in Excel. However, you can just download the Excel spreadsheet which uses this code at the bottom of this article.
```Function GarmanKohlhagen(CallOrPut As String, SpotRate As Double, Strike As Double, TimeToMaturity As Double, DomesticInterestRate As Double, ForeignInterestRate As Double, Volatility As Double) As Double   Dim d1 As Double, d2 As Double   d1 = (Log(SpotRate / Strike) + (DomesticInterestRate - ForeignInterestRate + Volatility ^ 2 / 2) * TimeToMaturity) / (Volatility * Sqr(TimeToMaturity)) d2 = d1 - Volatility * Sqr(TimeToMaturity)   If CallOrPut = "Call" Then GarmanKohlhagen = SpotRate * Exp(-ForeignInterestRate * TimeToMaturity) * Application.NormSDist(d1) - Strike * Exp(-DomesticInterestRate * TimeToMaturity) * Application.NormSDist(d2) ElseIf CallOrPut = "Put" Then GarmanKohlhagen = Strike * Exp(-DomesticInterestRate * TimeToMaturity) * Application.NormSDist(-d2) - SpotRate * Exp(-ForeignInterestRate * TimeToMaturity) * Application.NormSDist(-d1) End If   End Function```