%% Compute Rainbow Option Prices Using the Stulz Option Pricing Model
% Consider a European rainbow option that gives the holder the right to buy either $100,000 worth of an equity index at a strike price of 1000 (asset 1) or $100,000 of a government bond (asset 2) with a strike price of 100% of face value, whichever is worth more at the end of 12 months. On January 15, 2008, the equity index is trading at 950, pays a dividend of 2% annually and has a return volatility of 22%. Also on January 15, 2008, the government bond is trading at 98, pays a coupon yield of 6%, and has a return volatility of 15%. The risk-free rate is 5%. Using this data, if the correlation between the rates of return is -0.5, 0, and 0.5, calculate the price of the European rainbow option.
% Since the asset prices in this example are in different units, it is necessary to work in either index points (asset 1) or in dollars (asset 2). The European rainbow option allows the holder to buy the following: 100 units of the equity index at $1000 each (for a total of $100,000) or 1000 units of the government bonds at $100 each (for a total of $100,000). To convert the bond price (asset 2) to index units (asset 1), you must make the following adjustments:
% Multiply the strike price and current price of the government bond by 10 (1000/100).
% Multiply the option price by 100, considering that there are 100 equity index units in the option.
% Once these adjustments are introduced, the strike price is the same for both assets ($1000). First, create the RateSpec:

Settle = 'Jan-15-2008';
Maturity = 'Jan-15-2009';
Rates = 0.05;
Basis = 1;

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

%
% Create the two StockSpec definitions.

AssetPrice1 = 950;   % Asset 1 => Equity index
AssetPrice2 = 980;   % Asset 2 => Government bond
Sigma1 = 0.22;
Sigma2 = 0.15;
Div1 = 0.02; 
Div2 = 0.06; 

StockSpec1 = stockspec(Sigma1, AssetPrice1, 'continuous', Div1)
StockSpec2 = stockspec(Sigma2, AssetPrice2, 'continuous', Div2)

%
% Calculate the price of the options for different correlation levels.

Strike = 1000 ; 
Corr = [-0.5; 0; 0.5];
OptSpec = 'call';

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

% These are the prices of one unit. This means that the premium is 11166.83, 10377.15, and 9244.12 (for 100 units).
% Copyright 2015 The MathWorks, Inc.