В этом примере показано, как сравнивать европейские Vanilla опционные цены инструмента с использованием BlackScholes модель и различные методы ценообразования. Методы ценообразования для этого сравнения - это Кокс-Росс-Рубинштейн, Лейзен-Реймер, конечная разница и аналитическая формула Блэка-Шоулза.
ratecurve ОбъектСоздать ratecurve объект с использованием ratecurve.
Settle = datetime(2019,01,01); Maturity = datetime(2022,01,01); Rate = 0.0111; Compounding = -1; ZeroCurve = ratecurve('zero',Settle,Maturity,Rate,'Compounding',Compounding);
BlackScholes Объект моделиИспользовать finmodel для создания BlackScholes объект модели.
Volatility = .35; BSModel = finmodel("BlackScholes",'Volatility',Volatility);
Vanilla Объект КИПИспользовать fininstrument для создания Vanilla объект прибора.
ExerciseDates = datetime(2019,09,01); Strike = 30; OptionType = 'call'; EuropeanCallOption = fininstrument("Vanilla",'ExerciseDate',ExerciseDates,'Strike',Strike,... 'OptionType',OptionType,'Name',"vanilla_call_option");
Analytic, AssetTree, и FiniteDifference Объекты прайсераСоздайте два сценария для параметра «Ваниль». В первом сценарии опция находится вне денег (OTM). Во втором сценарии опция находится на деньги (банкомат).
% Define the number of levels of the tree for AssetTree pricer
NumPeriods = 55;Использовать finpricer для создания BlackScholes, AssetTree, и FiniteDifference объекты прайсера для опции OTM и используйте ratecurve объект для 'DiscountCurve' аргумент пары имя-значение.
SpotPriceOTM = 25; % Analytic Pricer AnalyticPricerOTM = finpricer('Analytic', 'Model', BSModel, 'SpotPrice', SpotPriceOTM, 'DiscountCurve', ZeroCurve); PriceBLSOTM = price(AnalyticPricerOTM, EuropeanCallOption); % AssetTree Pricer CRRPricerOTM = finpricer("AssetTree",'DiscountCurve',ZeroCurve,'Model',BSModel, 'SpotPrice',SpotPriceOTM, ... 'PricingMethod',"CoxRossRubinstein",'NumPeriods', NumPeriods, 'Maturity', ExerciseDates); PriceCRROTM = price(CRRPricerOTM, EuropeanCallOption); LRPricerOTM = finpricer("AssetTree",'DiscountCurve',ZeroCurve,'Model',BSModel, 'SpotPrice',SpotPriceOTM, ... 'PricingMethod',"LeisenReimer",'NumPeriods', NumPeriods, 'Maturity', ExerciseDates, 'Strike', Strike); PriceLROTM = price(LRPricerOTM, EuropeanCallOption); % FiniteDifference Pricer FDPricerOTM = finpricer('FiniteDifference', 'Model', BSModel, 'SpotPrice', SpotPriceOTM, 'DiscountCurve', ZeroCurve); PriceFDOTM = price(FDPricerOTM, EuropeanCallOption);
Использовать finpricer для создания BlackScholes, AssetTree, и FiniteDifference объекты прайсера для опции ATM и используйте ratecurve объект для 'DiscountCurve' аргумент пары имя-значение.
SpotPriceATM = 30; % Analytic Pricer AnalyticPricerATM = finpricer('Analytic', 'Model', BSModel, 'SpotPrice', SpotPriceATM, 'DiscountCurve', ZeroCurve); PriceBLSATM = price(AnalyticPricerATM, EuropeanCallOption); % AsetTree Pricer CRRPricerATM = finpricer("AssetTree",'DiscountCurve',ZeroCurve,'Model',BSModel, 'SpotPrice',SpotPriceATM, ... 'PricingMethod',"CoxRossRubinstein",'NumPeriods', NumPeriods, 'Maturity', ExerciseDates); PriceCRRATM = price(CRRPricerATM, EuropeanCallOption); LRPricerATM = finpricer("AssetTree",'DiscountCurve',ZeroCurve,'Model',BSModel, 'SpotPrice',SpotPriceATM, ... 'PricingMethod',"LeisenReimer",'NumPeriods', NumPeriods, 'Maturity', ExerciseDates, 'Strike', Strike); PriceLRATM = price(LRPricerATM, EuropeanCallOption); % FiniteDifference Pricer FDPricerATM = finpricer('FiniteDifference', 'Model', BSModel, 'SpotPrice', SpotPriceATM, 'DiscountCurve', ZeroCurve); PriceFDATM = price(FDPricerATM, EuropeanCallOption);
Используйте displayPricesVanillaCallOption в Local Functions для сравнения цен вызовов Vanilla для OTM.
displayPricesVanillaCallOption("OTM", PriceBLSOTM, PriceCRROTM, PriceLROTM, PriceFDOTM)Comparison of Vanilla Call Option Prices OTM: Black-Scholes: 1.280591 Cox-Ross-Rubinstein: 1.278306 Leisen-Reimer: 1.280651 Finite-Difference: 1.280599
Используйте displayPricesVanillaCallOption в Local Functions для сравнения цен вызовов Vanilla для банкомата.
displayPricesVanillaCallOption("ATM", PriceBLSATM, PriceCRRATM, PriceLRATM, PriceFDATM)Comparison of Vanilla Call Option Prices ATM: Black-Scholes: 3.505323 Cox-Ross-Rubinstein: 3.520559 Leisen-Reimer: 3.505377 Finite-Difference: 3.505452
AssetTree Калькулятор ценСоздайте графики для визуализации изменений сходимости при увеличении числа шагов в биномиальном расчете для моделей дерева Кокса-Росса-Рубинштейна и Лейзена-Реймера, а также влияния на сходимость изменений в цене актива.
% Define the number of time steps of the tree NPoints = 240; % Cox-Ross-Rubinstein NumPeriodCRR = 5 : 1 : NPoints; NbStepCRR = length(NumPeriodCRR); PriceOTMCRR = nan(NbStepCRR, 1); PriceATMCRR = PriceOTMCRR; for i = 1 : NbStepCRR PricerCRROTM = finpricer("AssetTree",'DiscountCurve',ZeroCurve,'Model',BSModel, 'SpotPrice',SpotPriceOTM, ... 'PricingMethod',"CoxRossRubinstein",'NumPeriods', NumPeriodCRR(i), 'Maturity', ExerciseDates); PriceOTMCRR(i) = price(PricerCRROTM, EuropeanCallOption); PricerCRRATM = finpricer("AssetTree",'DiscountCurve',ZeroCurve,'Model',BSModel, 'SpotPrice',SpotPriceATM, ... 'PricingMethod',"CoxRossRubinstein",'NumPeriods', NumPeriodCRR(i), 'Maturity', ExerciseDates); PriceATMCRR(i) = price(PricerCRRATM, EuropeanCallOption); end % Leisen-Reimer NumPeriodLR = 5 : 2 : NPoints; NbStepLR = length(NumPeriodLR); PriceOTMLR = nan(NbStepLR, 1); PriceATMLR = PriceOTMLR; for i = 1 : NbStepLR PricerLROTM = finpricer("AssetTree",'DiscountCurve',ZeroCurve,'Model',BSModel, 'SpotPrice',SpotPriceOTM, ... 'PricingMethod',"LeisenReimer",'NumPeriods', NumPeriodLR(i), 'Maturity', ExerciseDates, 'Strike', Strike); PriceOTMLR(i) = price(PricerLROTM, EuropeanCallOption); PricerLRATM = finpricer("AssetTree",'DiscountCurve',ZeroCurve,'Model',BSModel, 'SpotPrice',SpotPriceATM, ... 'PricingMethod',"LeisenReimer",'NumPeriods', NumPeriodLR(i), 'Maturity', ExerciseDates, 'Strike', Strike); PriceATMLR(i) = price(PricerLRATM, EuropeanCallOption); end
Постройте график сходимости моделей CRR и LR к решению Блэка-Шоулза для опции OTM.
% Cox-Ross-Rubinstein plot(NumPeriodCRR, PriceOTMCRR); hold on; plot(NumPeriodCRR, PriceBLSOTM*ones(NbStepCRR,1),'Color',[0 0.9 0], 'linewidth', 1.5); % Leisen-Reimer plot(NumPeriodLR, PriceOTMLR, 'Color',[0.9 0 0], 'linewidth', 1.5); % Concentrate the area of interest by clipping on the Y axis at five times the % LR price: YLimDelta = 5*abs(PriceOTMLR(1) - PriceBLSOTM); ax = gca; ax.YLim = [PriceBLSOTM - YLimDelta PriceBLSOTM + YLimDelta]; ax.XLim = [5 NPoints]; % Annotate plot titleString = sprintf('\nConvergence of CRR and LR Models to a BLS Solution (OTM)\nStrike = %d, Asset Price = %d', Strike , SpotPriceOTM); title(titleString) ylabel('Option Price') xlabel('Number of Steps') legend('CRR', 'BLS', 'LR', 'Location', 'NorthEast')

Обратите внимание, что модель Лейзена-Реймера удаляет колебания и создает оценки, близкие к модели Блэка-Шоулза, используя лишь небольшое количество шагов.
Постройте график конвергенции моделей CRR и LR в решение Black-Scholes для опции ATM.
% Cox-Ross-Rubinstein figure; plot(NumPeriodCRR, PriceATMCRR); hold on; plot(NumPeriodCRR, PriceBLSATM*ones(NbStepCRR,1),'Color',[0 0.9 0], 'linewidth', 1.5); % Leisen-Reimer plot(NumPeriodLR, PriceATMLR, 'Color',[0.9 0 0], 'linewidth', 1.5); % Concentrate the area of interest by clipping on the Y axis at five times the % LR price: YLimDelta = 5*abs(PriceATMLR(1) - PriceBLSATM); ax = gca; ax.YLim = [PriceBLSATM - YLimDelta PriceBLSATM + YLimDelta]; ax.XLim = [5 NPoints]; % Annotate plot titleString = sprintf('\nConvergence of CRR and LR Models to a BLS Solution (ATM)\nStrike = %d, Asset Price = %d', Strike , SpotPriceATM); title(titleString) ylabel('Option Price') xlabel('Number of Steps') legend('CRR', 'BLS', 'LR', 'Location', 'NorthEast')

В то время как биномиальная модель CRR и модель Блэка-Шоулза сходятся по мере увеличения количества временных шагов, эта сходимость, за исключением вариантов «у денег», является чем угодно, кроме гладкой или однородной.
function displayPricesVanillaCallOption(type, PriceBLS, PriceCRR, PriceLR, PriceFD) fprintf('Comparison of Vanilla Call Option Prices %s:\n', type); fprintf('\n'); fprintf('Black-Scholes: %f\n', PriceBLS); fprintf('Cox-Ross-Rubinstein: %f\n', PriceCRR); fprintf('Leisen-Reimer: %f\n', PriceLR); fprintf('Finite-Difference: %f\n', PriceFD); fprintf('\n'); end
AssetTree | BlackScholes | FiniteDifference | Vanilla