В этом примере показано, как сравнить европейские 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
Объекты прейскурантаСоздайте два сценария для опции Vanilla. В первом сценарии опция не из денег (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
в Локальные функции для сравнения цен на вызов 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
в локальных функциях для сравнения цен на вызов 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 к решению Black-Scholes для опции 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