Main Content

Equity Derivatives Using Closed-Form Solutions

Introduction

Financial Instruments Toolbox™ supports four types of closed-form solutions and analytical approximations to calculate price and sensitivities (greeks) of vanilla options:

  • Black-Scholes model

  • Black model

  • Roll-Geske-Whaley model

  • Bjerksund-Stensland 2002 model

Black-Scholes Model

The Black-Scholes model is one of the most commonly used models to price European calls and puts. It serves as a basis for many closed-form solutions used for pricing options. The standard Black-Scholes model is based on the following assumptions:

  • There are no dividends paid during the life of the option.

  • The option can only be exercised at maturity.

  • The markets operate under a Markov process in continuous time.

  • No commissions are paid.

  • The risk-free interest rate is known and constant.

  • Returns on the underlying stocks are log-normally distributed.

Note

The Black-Scholes model implemented in Financial Instruments Toolbox software allows dividends. The following three dividend methods are supported:

  • Cash dividend

  • Continuous dividend yield

  • Constant dividend yield

However, not all Black-Scholes closed-form pricing functions support all three dividend methods. For more information on specifying the dividend methods, see stockspec.

Closed-form solutions based on a Black-Scholes model support the following tasks.

Task

Function

Price European options with different dividends using the Black-Scholes option pricing model.

optstockbybls

Calculate European option prices and sensitivities using the Black-Scholes option pricing model.

optstocksensbybls

Calculate implied volatility on European options using the Black-Scholes option pricing model.

impvbybls

Price European simple chooser options using Black-Scholes model.

chooserbybls

For an example using the Black-Scholes model, see Pricing Using the Black-Scholes Model.

Black Model

Use the Black model for pricing European options on physical commodities, forwards or futures. The Black model supported by Financial Instruments Toolbox software is a special case of the Black-Scholes model. The Black model uses a forward price as an underlier in place of a spot price. The assumption is that the forward price at maturity of the option is log-normally distributed.

Closed-form solutions for a Black model support the following tasks.

Task

Function

Price European options on futures using the Black option pricing model.

optstockbyblk

Calculate European option prices and sensitivities on futures using the Black option pricing model.

optstocksensbyblk

Calculate implied volatility for European options using the Black option pricing model.

impvbyblk

For an example using the Black model, see Pricing Using the Black Model.

Roll-Geske-Whaley Model

Use the Roll-Geske-Whaley approximation method to price American call options paying a single cash dividend. This model is based on the modification of the observed stock price for the present value of the dividend and also supports a compound option to account for the possibility of early exercise. The Roll-Geske-Whaley model has drawbacks due to an escrowed dividend price approach which may lead to arbitrage. For further explanation, see Options, Futures, and Other Derivatives by John Hull.

Closed-form solutions for a Roll-Geske-Whaley model support the following tasks.

Task

Function

Price American call options with a single cash dividend using the Roll-Geske-Whaley option pricing model.

optstockbyrgw

Calculate American call prices and sensitivities using the Roll-Geske-Whaley option pricing model.

optstocksensbyrgw

Calculate implied volatility for American call options using the Roll-Geske-Whaley option pricing model.

impvbyrgw

For an example using the Roll-Geske-Whaley model, see Pricing Using the Roll-Geske-Whaley Model.

Bjerksund-Stensland 2002 Model

Use the Bjerksund-Stensland 2002 model for pricing American puts and calls with continuous dividend yield. This model works by dividing the time to maturity of the option in two separate parts, each with its own flat exercise boundary (trigger price). The Bjerksund-Stensland 2002 method is a generalization of the Bjerksund and Stensland 1993 method and is considered to be computationally efficient. For further explanation, see Closed Form Valuation of American Options by Bjerksund and Stensland.

Closed-form solutions for a Bjerksund-Stensland 2002 model support the following tasks.

Task

Function

Price American options with continuous dividend yield using the Bjerksund-Stensland 2002 option pricing model.

optstockbybjs

Calculate American options prices and sensitivities using the Bjerksund-Stensland 2002 option pricing model.

optstocksensbybjs

Calculate implied volatility for American options using the Bjerksund-Stensland 2002 option pricing model.

impvbybjs

For an example using the Bjerksund-Stensland 2002 model, see Pricing Using the Bjerksund-Stensland Model.

Barone-Adesi-Whaley Model

The Barone-Adesi-Whaley model is used for pricing American vanilla options. Closed-form solutions for a Barone-Adesi-Whaley model support the following tasks.

Task

Function

Calculate the prices of an American call and put options using the Barone-Adesi-Whaley approximation model.

optstockbybaw

Calculate the prices and sensitivities of an American call and put options using the Barone-Adesi-Whaley approximation model.

optstocksensbybaw

Calculate the implied volatility for American options using the Barone-Adesi-Whaley model.

impvbybaw

For an example using the Barone-Adesi-Whaley model, see Compute American Option Prices Using the Barone-Adesi and Whaley Option Pricing Model.

Pricing Using the Black-Scholes Model

Consider a European stock option with an exercise price of $40 on January 1, 2008 that expires on July 1, 2008. Assume that the underlying stock pays dividends of $0.50 on March 1 and June 1. The stock is trading at $40 and has a volatility of 30% per annum. The risk-free rate is 4% per annum. Using this data, calculate the price of a call and a put option on the stock using the Black-Scholes option pricing model:

Strike = 40;
AssetPrice = 40;
Sigma = .3;
Rates = 0.04;
Settle = 'Jan-01-08';
Maturity = 'Jul-01-08';

Div1 = 'March-01-2008';
Div2 = 'Jun-01-2008';

Create RateSpec and StockSpec:

RateSpec = intenvset('ValuationDate', Settle, 'StartDates', Settle, 'EndDates',...
Maturity, 'Rates', Rates, 'Compounding', -1);

StockSpec = stockspec(Sigma, AssetPrice, {'cash'}, 0.50,{Div1,Div2});

Define two options, one call and one put:

OptSpec = {'call'; 'put'};

Calculate the price of the European options:

Price = optstockbybls(RateSpec, StockSpec, Settle, Maturity, OptSpec, Strike)
Price =

    3.2063
    3.4027

The first element of the Price vector represents the price of the call ($3.21); the second is the price of the put ($3.40). Use the function optstocksensbybls to compute six sensitivities for the Black-Scholes model: delta, gamma, vega, lambda, rho, and theta and the price of the option.

The selection of output parameters and their order is determined by the optional input parameter OutSpec. This parameter is a cell array of character vectors, each one specifying a desired output parameter. The order in which these output parameters are returned by the function is the same as the order of the character vectors contained in OutSpec.

As an example, consider the same options as the previous example. To calculate their Delta, Rho, Price, and Gamma, build the cell array OutSpec as follows:

OutSpec = {'delta', 'rho', 'price', 'gamma'};

[Delta, Rho, Price, Gamma] = optstocksensbybls(RateSpec, StockSpec, Settle,...
Maturity, OptSpec, Strike, 'OutSpec', OutSpec)
Delta =

    0.5328
   -0.4672


Rho =

    8.7902
  -10.8138


Price =

    3.2063
    3.4027


Gamma =

    0.0480
    0.0480

Pricing Using the Black Model

Consider two European call options on a futures contract with exercise prices of $20 and $25 that expire on September 1, 2008. Assume that on May 1, 2008 the contract is trading at $20 and has a volatility of 35% per annum. The risk-free rate is 4% per annum. Using this data, calculate the price of the call futures options using the Black model:

Strike = [20; 25];
AssetPrice = 20;
Sigma = .35;
Rates = 0.04;
Settle = 'May-01-08';
Maturity = 'Sep-01-08';

Create RateSpec and StockSpec:

RateSpec = intenvset('ValuationDate', Settle, 'StartDates', Settle,...
'EndDates', Maturity, 'Rates', Rates, 'Compounding', -1);

StockSpec = stockspec(Sigma, AssetPrice);

Define the call option:

OptSpec = {'call'};

Calculate price and all sensitivities of the European futures options:

OutSpec = {'All'} 

[Delta, Gamma, Vega, Lambda, Rho, Theta, Price] = optstocksensbyblk(RateSpec,...
StockSpec, Settle, Maturity, OptSpec, Strike, 'OutSpec', OutSpec);
Price =

    1.5903
    0.3037

The first element of the Price vector represents the price of the call with an exercise price of $20 ($1.59); the second is the price of the call with an exercise price of $25 ($2.89).

The function impvbyblk is used to compute the implied volatility using the Black option pricing model. Assuming that the previous European call futures are trading at $1.5903 and $0.3037, you can calculate their implied volatility:

Volatility = impvbyblk(RateSpec, StockSpec, Settle, Maturity,...
OptSpec,  Strike, Price);

As expected, you get volatilities of 35%. If the call futures were trading at $1.50 and $0.50 in the market, the implied volatility would be 33% and 42%:

Volatility = impvbyblk(RateSpec, StockSpec, Settle, Maturity,...
OptSpec,  Strike, [1.50;0.5])
Volatility =

    0.3301
    0.4148

Pricing Using the Roll-Geske-Whaley Model

Consider two American call options, with exercise prices of $110 and $100 on June 1, 2008, that expire on June 1, 2009. Assume that the underlying stock pays dividends of $0.001 on December 1, 2008. The stock is trading at $80 and has a volatility of 20% per annum. The risk-free rate is 6% per annum. Using this data, calculate the price of the American calls using the Roll-Geske-Whaley option pricing model:

AssetPrice = 80;
Settle = 'Jun-01-2008';
Maturity = 'Jun-01-2009';
Strike = [110; 100];

Rate = 0.06;
Sigma  = 0.2;

DivAmount = 0.001;
DivDate = 'Dec-01-2008';

Create RateSpec and StockSpec:

StockSpec = stockspec(Sigma, AssetPrice, {'cash'}, DivAmount, DivDate);

RateSpec = intenvset('ValuationDate', Settle, 'StartDates', Settle,...
'EndDates', Maturity, 'Rates', Rate, 'Compounding', -1);

Calculate the call prices:

Price  = optstockbyrgw(RateSpec, StockSpec, Settle, Maturity, Strike)
Price =

    0.8398
    2.0236

The first element of the Price vector represents the price of the call with an exercise price of $110 ($0.84); the second is the price of the call with an exercise price of $100 ($2.02).

Pricing Using the Bjerksund-Stensland Model

Consider four American stock options (two calls and two puts) with an exercise price of $100 that expire on July 1, 2008. Assume that the underlying stock pays a continuous dividend yield of 4% as of January 1, 2008. The stock has a volatility of 20% per annum and the risk-free rate is 8% per annum. Using this data, calculate the price of the American calls and puts assuming the following current prices of the stock: $80, $90 (for the calls) and $100 and $110 (for the puts):

Settle = 'Jan-1-2008';
Maturity = 'Jul-1-2008';
Strike = 100;
AssetPrice = [80; 90; 100; 110];
DivYield = 0.04;

Rate = 0.08;
Sigma = 0.20;

Create RateSpec and StockSpec:

StockSpec = stockspec(Sigma, AssetPrice, {'continuous'}, DivYield);

RateSpec = intenvset('ValuationDate', Settle, 'StartDates', Settle,...
'EndDates', Maturity, 'Rates', Rate, 'Compounding', -1);

Define the option type:

OptSpec = {'call'; 'call'; 'put'; 'put'};

Compute the option prices:

Price = optstockbybjs(RateSpec, StockSpec, Settle, Maturity, OptSpec, Strike)
Price =

    0.4144
    2.1804
    4.7253
    1.7164

The first two elements of the Price vector represent the price of the calls ($0.41 and $2.18), the last two elements represent the price of the put options ($4.72 and $1.72). Use the function optstocksensbybjs to compute six sensitivities for the Bjerksund-Stensland model: delta, gamma, vega, lambda, rho, and theta and the price of the option. The selection of output parameters and their order is determined by the optional input parameter OutSpec. This parameter is a cell array of character vectors, each one specifying a desired output parameter. The order in which these output parameters are returned by the function is the same as the order of the character vectors contained in OutSpec. As an example, consider the same options as the previous example. To calculate their delta, gamma, and price, build the cell array OutSpec as follows:

OutSpec = {'delta', 'gamma', 'price'};

The outputs of optstocksensbybjs are in the same order as in OutSpec.

[Delta, Gamma, Price] = optstocksensbybjs(RateSpec, StockSpec, Settle,...
Maturity, OptSpec, Strike, 'OutSpec', OutSpec)
Delta =

    0.0843
    0.2912
    0.4803
    0.2261

Gamma =

    0.0136
    0.0267
    0.0304
    0.0217

Price =

    0.4144
    2.1804
    4.7253
    1.7164

For more information on the Bjerksund-Stensland model, see Closed-Form Solutions Modeling.

Compute American Option Prices Using the Barone-Adesi and Whaley Option Pricing Model

Consider an American call option with an exercise price of $120. The option expires on Jan 1, 2018. The stock has a volatility of 14% per annum, and the annualized continuously compounded risk-free rate is 4% per annum as of Jan 1, 2016. Using this data, calculate the price of the American call, assuming the price of the stock is $125 and pays a dividend of 2%.

StartDate  = datetime(2016,1,1);
EndDate = datetime(2018,1,1);
Basis = 1;
Compounding = -1;
Rates = 0.04;

Define the RateSpec.

RateSpec = intenvset('ValuationDate',StartDate,'StartDate',StartDate,'EndDate',EndDate, ...
'Rates',Rates,'Basis',Basis,'Compounding',Compounding)
RateSpec = struct with fields:
           FinObj: 'RateSpec'
      Compounding: -1
             Disc: 0.9231
            Rates: 0.0400
         EndTimes: 2
       StartTimes: 0
         EndDates: 737061
       StartDates: 736330
    ValuationDate: 736330
            Basis: 1
     EndMonthRule: 1

Define the StockSpec.

Dividend = 0.02;
AssetPrice = 125;
Volatility = 0.14;

StockSpec = stockspec(Volatility,AssetPrice,'Continuous',Dividend)
StockSpec = struct with fields:
             FinObj: 'StockSpec'
              Sigma: 0.1400
         AssetPrice: 125
       DividendType: {'continuous'}
    DividendAmounts: 0.0200
    ExDividendDates: []

Define the American option.

OptSpec = 'call';
Strike = 120;
Settle = datetime(2016,1,1);
Maturity = datetime(2018,1,1);

Compute the price for the American option.

Price = optstockbybaw(RateSpec,StockSpec,Settle,Maturity,OptSpec,Strike)
Price = 
14.5180

See Also

| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |

Related Examples

More About