Darren Webb

Development Team

Montego Data Limited

September 2001-13

This article () shows various derivative models

Thewritten in Java, more will be added as we complete the library in Java, C++ and Visual Basic For Applications.

Available is Swing Java Jar File: Derivatives Models if you just wish to run the models without page documentation.

Default Security with Java is only to allow trusted code Allowing JavaApplets And JavaSwingJar To Run is needed for this site.

Excel VBA Models

The ubiquious option formula originates from Black-Scholes 1973

Research of the model over a decade allowed for a generalisation to extend it beyond the vanilla stock option pricing

by the usage of Cost of Carry

In programming terms: price = BlackScholes( pc, S, X, T, V, r, b )

Where pc is Put or Call ; S is Stock or Spot Price ; X is Strike ; T is Time ; V is Volatility ; r is domestic interest rate

and b is Cost of Carry

When

b = r, BlackScholes (1973) Stock Option Model

b = r - q, Merton (1973) Stock Option Model - continuous dividend yield q

b = 0, Black (1976) Futures Option Model

b = r - r

Note these are Closed-Form Solutions and the general rule is that they price European Options.

That is, they are assumed to follow the Brownian stochastic process

which is an assumption that the underlying asset is lognormally (geometrically) distributed.

The mathematical formula is as follows:

c

p

Where e is exp(), σ is volatility

and d

and d

As a computer algorithm in the C programming language:

double BlackScholes( char CallPutFlag, double S, double X, double T, double r, double b, double v )

{

double d1, d2, bs = 0.0;

d1 = (log(S / X) + (b + pow(v,2) / 2.0) * T) / (v * sqrt(T));

d2 = d1 - v * sqrt(T);

if ( CallPutFlag == 'C' )

bs = S * exp((b - r) * T) * CND(d1) - X * exp(-r * T) * CND(d2);

else if ( CallPutFlag == 'P' )

bs = X * exp(-r * T) * CND(-d2) - S * exp((b - r) * T) * CND(-d1);

return bs;

}

It should be recognised when using Black-76 to price Interest Rate Options:

Both the forward rate of the cap and the swap rate cannot be lognormal simultaneously.

This also applies to bond prices and swap rates: they cannot be lognormal at the same time.

If the bond price is assumed to be lognormal then the continuously compounded swap rate must be normally distributed.

The practical workaround is to adjust the volatility to kludge the option price based on trader experience.

Finally this leads to the Cumulative Normal Distribution [CND() - not shown here] function

This can be found in most text books. It is possible to use as little as four digit accuracy but it is much better to use six digit accuracy. Note 1 / 64 = 0.015625.

Professor Mark Garman in the 1980's recommended a CND() function to seven digits for Monetary Derivatives.

- a) The underlying asset is lognormally distributed
- b) With a cap the underlying Forward/Future rates are assumed to be lognormal
- c) With a swaption (option on a swap) the underlying swap rate is assumed to be lognormal

Both the forward rate of the cap and the swap rate cannot be lognormal simultaneously.

This also applies to bond prices and swap rates: they cannot be lognormal at the same time.

If the bond price is assumed to be lognormal then the continuously compounded swap rate must be normally distributed.

The practical workaround is to adjust the volatility to kludge the option price based on trader experience.

Finally this leads to the Cumulative Normal Distribution [CND() - not shown here] function

This can be found in most text books. It is possible to use as little as four digit accuracy but it is much better to use six digit accuracy. Note 1 / 64 = 0.015625.

Professor Mark Garman in the 1980's recommended a CND() function to seven digits for Monetary Derivatives.

Public Function GDelta(CallPutFlag As String, S As Double, X As Double, T As Double, r As Double, b As Double, v As Double) As Double Dim d1 As Double d1 = (Log(S / X) + (b + v ^ 2 / 2) * T) / (v * Sqr(T)) If CallPutFlag = "c" Then GDelta = Exp((b - r) * T) * CND(d1) ElseIf CallPutFlag = "p" Then GDelta = Exp((b - r) * T) * (CND(d1) - 1) End If End FunctionMontego Data Store Shop