Main Content

spreadbyls

Price European or American spread options using Monte Carlo simulations

Description

Price = spreadbyls(RateSpec,StockSpec1,StockSpec2,Settle,Maturity,OptSpec,Strike,Corr) returns the price of a European or American call or put spread option using Monte Carlo simulations.

For American options, the Longstaff-Schwartz least squares method is used to calculate the early exercise premium.

Note

Alternatively, you can use the Spread object to price spread options. For more information, see Get Started with Workflows Using Object-Based Framework for Pricing Financial Instruments.

example

Price = spreadbyls(___,Name,Value) returns the price of a European or American call or put spread option using Monte Carlo simulations using optional name-value pair arguments.

[Price,Paths,Times,Z] = spreadbyls(RateSpec,StockSpec1,StockSpec2,Settle,Maturity,OptSpec,Strike,Corr) returns the Price, Paths, Times, and Z of a European or American call or put spread option using Monte Carlo simulations.

[Price,Paths,Times,Z] = spreadbyls(___,Name,Value) returns the Price, Paths, Times, and Z of a European or American call or put spread option using Monte Carlo simulations using optional name-value pair arguments.

Examples

collapse all

Define the spread option dates.

Settle = datetime(2012,1,1);
Maturity = datetime(2012,4,1);

Define asset 1. Price and volatility of RBOB gasoline

  Price1gallon = 2.85;          % $/gallon
  Price1 = Price1gallon * 42;   % $/barrel
  Vol1 = 0.29;

Define asset 2. Price and volatility of WTI crude oil

   Price2 = 93.20;         % $/barrel
   Vol2 = 0.36;

Define the correlation between the underlying asset prices of asset 1 and asset 2.

Corr = 0.42;

Define the spread option.

OptSpec = 'call';
Strike = 20;

Define the RateSpec.

rates = 0.05;
Compounding = -1;
Basis = 1;
RateSpec = intenvset('ValuationDate', Settle, 'StartDates', Settle, ...
'EndDates', Maturity, 'Rates', rates, ...
'Compounding', Compounding, 'Basis', Basis)
RateSpec = struct with fields:
           FinObj: 'RateSpec'
      Compounding: -1
             Disc: 0.9876
            Rates: 0.0500
         EndTimes: 0.2500
       StartTimes: 0
         EndDates: 734960
       StartDates: 734869
    ValuationDate: 734869
            Basis: 1
     EndMonthRule: 1

Define the StockSpec for the two assets.

StockSpec1 = stockspec(Vol1, Price1)
StockSpec1 = struct with fields:
             FinObj: 'StockSpec'
              Sigma: 0.2900
         AssetPrice: 119.7000
       DividendType: []
    DividendAmounts: 0
    ExDividendDates: []

StockSpec2 = stockspec(Vol2, Price2)
StockSpec2 = struct with fields:
             FinObj: 'StockSpec'
              Sigma: 0.3600
         AssetPrice: 93.2000
       DividendType: []
    DividendAmounts: 0
    ExDividendDates: []

Compute the spread option price using Monte Carlo simulation based on the Longstaff-Schwartz model.

Price = spreadbyls(RateSpec, StockSpec1, StockSpec2, Settle, ...
Maturity, OptSpec, Strike, Corr)
Price = 
11.0799

Input Arguments

collapse all

Interest-rate term structure (annualized and continuously compounded), specified by the RateSpec obtained from intenvset. For information on the interest-rate specification, see intenvset.

Data Types: struct

Stock specification for underlying asset 1. For information on the stock specification, see stockspec.

stockspec can handle other types of underlying assets. For example, for physical commodities the price is represented by StockSpec.Asset, the volatility is represented by StockSpec.Sigma, and the convenience yield is represented by StockSpec.DividendAmounts.

Data Types: struct

Stock specification for underlying asset 2. For information on the stock specification, see stockspec.

stockspec can handle other types of underlying assets. For example, for physical commodities the price is represented by StockSpec.Asset, the volatility is represented by StockSpec.Sigma, and the convenience yield is represented by StockSpec.DividendAmounts.

Data Types: struct

Settlement date for the spread option specified, as a scalar datetime, string, or date character vector.

To support existing code, spreadbyls also accepts serial date numbers as inputs, but they are not recommended.

Maturity date for spread option, specified as a scalar datetime, string, or date character vector.

To support existing code, spreadbyls also accepts serial date numbers as inputs, but they are not recommended.

Definition of option as 'call' or 'put', specified as a character vector.

Data Types: char

Option strike price value, specified, as a nonnegative scalar integer.

Data Types: double

Correlation between underlying asset prices, specified as a scalar integer.

Data Types: double

Name-Value Arguments

Specify optional pairs of arguments as Name1=Value1,...,NameN=ValueN, where Name is the argument name and Value is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

Before R2021a, use commas to separate each name and value, and enclose Name in quotes.

Example: Price = spreadbyls(RateSpec,StockSpec1,StockSpec2,Settle,Maturity,OptSpec,Strike,Corr,'AmericanOpt',1)

Option type, specified as the comma-separated pair consisting of 'AmericanOpt' and an integer scalar flag with value:

  • 0 — European

  • 1 — American

Note

For American options, the Longstaff-Schwartz least squares method is used to calculate the early exercise premium. For more information on the least squares method, see https://people.math.ethz.ch/%7Ehjfurrer/teaching/LongstaffSchwartzAmericanOptionsLeastSquareMonteCarlo.pdf.

Data Types: single | double

Scalar number of independent sample paths (simulation trials), specified as the comma-separated pair consisting of 'NumTrials' and a nonnegative integer.

Data Types: single | double

Scalar number of simulation periods per trial, specified as the comma-separated pair consisting of 'NumPeriods' and a nonnegative integer. NumPeriods is considered only when pricing European basket options. For American spread options, NumPeriod is equal to the number of exercise days during the life of the option.

Data Types: single | double

Time series array of dependent random variates, specified as the comma-separated pair consisting of 'Z' and a NumPeriods-by-2-by-NumTrials 3-D array. The Z value generates the Brownian motion vector (that is, Wiener processes) that drives the simulation.

Data Types: single | double

Indicator for antithetic sampling, specified as the comma-separated pair consisting of 'Antithetic' and a value of true or false.

Data Types: logical

Output Arguments

collapse all

Expected price of the spread option, returned as a 1-by-1 scalar.

Simulated paths of correlated state variables, returned as a NumPeriods + 1-by-2-by-NumTrials 3-D time series array. Each row of Paths is the transpose of the state vector X(t) at time t for a given trial.

Observation times associated with simulated paths, returned as a NumPeriods + 1-by-1 column vector of observation times associated with the simulated paths. Each element of Times is associated with the corresponding row of Paths.

Time series array of dependent random variates, returned as a NumPeriods-by-2-by-NumTrials 3-D array when Z is specified as an input argument. If the Z input argument is not specified, then the Z output argument contains the random variates generated internally.

More About

collapse all

Spread Option

A spread option is an option written on the difference of two underlying assets.

For example, a European call on the difference of two assets X1 and X2 would have the following pay off at maturity:

max(X1X2K,0)

where:

K is the strike price.

For more information, see Spread Option.

References

[1] Carmona, R., Durrleman, V. “Pricing and Hedging Spread Options.” SIAM Review. Vol. 45, No. 4, pp. 627–685, Society for Industrial and Applied Mathematics, 2003.

Version History

Introduced in R2013b

expand all