www.gusucode.com > fininst 案例源码程序 matlab代码 > fininst/optionpricingdemo.m
%% Pricing European Call Options Using Different Equity Models % % This example illustrates how the Financial Instruments Toolbox(TM) is used % to price European vanilla call options using different equity models. % % The example compares call option prices using the Cox-Ross-Rubinstein model, % the Leisen-Reimer model and the Black-Scholes closed formula. % Copyright 1995-2014 The MathWorks, Inc. %% Define the Call Instrument % Consider a European call option, with an exercise price of $30 on January 1, 2010. % The option expires on Sep 1, 2010. Assume that the underlying stock provides % no dividends. The stock is trading at $25 and has a volatility of 35% per annum. % The annualized continuously compounded risk-free rate is 1.11% per annum. % Option Settle = 'Jan-01-2010'; Maturity = 'Sep-01-2010'; Strike = 30; OptSpec = 'call'; % Stock AssetPrice = 25; Sigma = .35; %% Create the Interest Rate Term Structure StartDates = '01 Jan 2010'; EndDates = '01 Jan 2013'; Rates = 0.0111; ValuationDate = '01 Jan 2010'; Compounding = -1; RateSpec = intenvset('Compounding',Compounding,'StartDates', StartDates,... 'EndDates', EndDates, 'Rates', Rates,'ValuationDate', ValuationDate); %% Create the Stock Structure % Suppose we wish to create two scenarios. The first one assumes that % AssetPrice is currently $25, the option is out of the money (OTM). % The second scenario assumes that the option is at the money (ATM), and % therefore AssetPriceATM = 30. AssetPriceATM = 30; StockSpec = stockspec(Sigma, AssetPrice); StockSpecATM = stockspec(Sigma, AssetPriceATM); %% Price the Options Using the Black-Scholes Closed Formula % Use the function 'optstockbybls' in the Financial Instruments Toolbox to % compute the price of the European call options. % Price the option with AssetPrice = 25 PriceBLS = optstockbybls(RateSpec, StockSpec, Settle, Maturity, OptSpec, Strike); % Price the option with AssetPrice = 30 PriceBLSATM = optstockbybls(RateSpec, StockSpecATM, Settle, Maturity, OptSpec, Strike); %% Build the Cox-Ross-Rubinstein Tree % Create the time specification of the tree NumPeriods = 15; CRRTimeSpec = crrtimespec(ValuationDate, Maturity, NumPeriods); % Build the tree CRRTree = crrtree(StockSpec, RateSpec, CRRTimeSpec); CRRTreeATM = crrtree(StockSpecATM, RateSpec, CRRTimeSpec); %% Build the Leisen-Reimer Tree % Create the time specification of the tree LRTimeSpec = lrtimespec(ValuationDate, Maturity, NumPeriods); % Use the default method 'PP1' (Peizer-Pratt method 1 inversion)to build % the tree LRTree = lrtree(StockSpec, RateSpec, LRTimeSpec, Strike); LRTreeATM = lrtree(StockSpecATM, RateSpec, LRTimeSpec, Strike); %% Price the Options Using the Cox-Ross-Rubinstein (CRR) Model PriceCRR = optstockbycrr(CRRTree, OptSpec, Strike, Settle, Maturity); PriceCRRATM = optstockbycrr(CRRTreeATM, OptSpec, Strike, Settle, Maturity); %% Price the Options Using the Leisen-Reimer (LR) Model PriceLR = optstockbylr(LRTree, OptSpec, Strike, Settle, Maturity); PriceLRATM = optstockbylr(LRTreeATM, OptSpec, Strike, Settle, Maturity); %% Compare BLS, CRR and LR Results sprintf('PriceBLS: \t%f\nPriceCRR: \t%f\nPriceLR:\t%f\n', PriceBLS, ... PriceCRR, PriceLR) sprintf('\t== ATM ==\nPriceBLS ATM: \t%f\nPriceCRR ATM: \t%f\nPriceLR ATM:\t%f\n', PriceBLSATM, ... PriceCRRATM, PriceLRATM) %% Convergence of CRR and LR Models to a BLS Solution % The following tables compare call option prices using the CRR and LR models % against the results obtained with the Black-Scholes formula. % % While the CRR binomial model and the Black-Scholes model converge as the % number of time steps gets large and the length of each step gets small, this % convergence, except for at the money options, is anything but smooth or % uniform. % % The tables below show that the Leisen-Reimer model reduces the size of the % error with even as few steps of 45. % % % Strike = 30, Asset Price = 30 % ------------------------------------- % #Steps LR CRR % 15 3.4986 3.5539 % 25 3.4981 3.5314 % 45 3.4980 3.5165 % 65 3.4979 3.5108 % 85 3.4979 3.5077 % 105 3.4979 3.5058 % 201 3.4979 3.5020 % 501 3.4979 3.4996 % 999 3.4979 3.4987 % % % % % Strike = 30, Asset Price = 25 % ------------------------------------- % #Steps LR CRR % 15 1.2758 1.2950 % 25 1.2754 1.2627 % 45 1.2751 1.2851 % 65 1.2751 1.2692 % 85 1.2751 1.2812 % 105 1.2751 1.2766 % 201 1.2751 1.2723 % 501 1.2751 1.2759 % 999 1.2751 1.2756 % %% Analyze the Effect of the Number of Periods on the Price of the Options % The following graphs show how convergence changes as the number % of steps in the binomial calculation increases, as well as the impact on % convergence to changes to the stock price. % Observe that the Leisen-Reimer model removes the oscillation and % produces estimates close to the Black-Scholes model using only a small % number of steps. NPoints = 300; % Cox-Ross-Rubinstein NumPeriodCRR = 5 : 1 : NPoints; NbStepCRR = length(NumPeriodCRR); PriceCRR = nan(NbStepCRR, 1); PriceCRRATM = PriceCRR; for i = 1 : NbStepCRR CRRTimeSpec = crrtimespec(ValuationDate, Maturity, NumPeriodCRR(i)); CRRT = crrtree(StockSpec, RateSpec, CRRTimeSpec); PriceCRR(i) = optstockbycrr(CRRT, OptSpec, Strike,ValuationDate, Maturity) ; CRRTATM = crrtree(StockSpecATM, RateSpec, CRRTimeSpec); PriceCRRATM(i) = optstockbycrr(CRRTATM, OptSpec, Strike,ValuationDate, Maturity) ; end; % Now with Leisen-Reimer NumPeriodLR = 5 : 2 : NPoints; NbStepLR = length(NumPeriodLR); PriceLR = nan(NbStepLR, 1); PriceLRATM = PriceLR; for i = 1 : NbStepLR LRTimeSpec = lrtimespec(ValuationDate, Maturity, NumPeriodLR(i)); LRT = lrtree(StockSpec, RateSpec, LRTimeSpec, Strike); PriceLR(i) = optstockbylr(LRT, OptSpec, Strike,ValuationDate, Maturity) ; LRTATM = lrtree(StockSpecATM, RateSpec, LRTimeSpec, Strike); PriceLRATM(i) = optstockbylr(LRTATM, OptSpec, Strike,ValuationDate, Maturity) ; end; %% % First scenario: Out of the Money call option % For Cox-Ross-Rubinstein plot(NumPeriodCRR, PriceCRR); hold on; plot(NumPeriodCRR, PriceBLS*ones(NbStepCRR,1),'Color',[0 0.9 0], 'linewidth', 1.5); % For Leisen-Reimer plot(NumPeriodLR, PriceLR, 'Color',[0.9 0 0], 'linewidth', 1.5); % Concentrate in the area of interest by clipping on the Y axis at 5x the % LR Price: YLimDelta = 5*abs(PriceLR(1) - PriceBLS); ax = gca; ax.YLim = [PriceBLS-YLimDelta PriceBLS+YLimDelta]; % Annotate Plot titleString = sprintf('\nConvergence of CRR and LR models to a BLS Solution (OTM)\nStrike = %d, Asset Price = %d', Strike , AssetPrice); title(titleString) ylabel('Option Price') xlabel('Number of Steps') legend('CRR', 'BLS', 'LR', 'Location', 'NorthEast') %% % Second scenario: At the Money call option % For Cox-Ross-Rubinstein figure; plot(NumPeriodCRR, PriceCRRATM); hold on; plot(NumPeriodCRR, PriceBLSATM*ones(NbStepCRR,1),'Color',[0 0.9 0], 'linewidth', 1.5); % For Leisen-Reimer plot(NumPeriodLR, PriceLRATM, 'Color',[0.9 0 0], 'linewidth', 1.5); % Concentrate in the area of interest by clipping on the Y axis at 5x the % LR Price: YLimDelta = 5*abs(PriceLRATM(1) - PriceBLSATM); ax = gca; ax.YLim = [PriceBLSATM-YLimDelta PriceBLSATM+YLimDelta]; % Annotate Plot titleString = sprintf('\nConvergence of CRR and LR models to a BLS Solution (ATM)\nStrike = %d, Asset Price = %d', Strike , AssetPriceATM); title(titleString) ylabel('Option Price') xlabel('Number of Steps') legend('CRR', 'BLS', 'LR', 'Location', 'NorthEast')