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
- 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
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