В этом примере показано, как сравнить европейский 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). Во втором сценарии опция является на уровне денег (ATM).
% 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
в Локальных функциях, чтобы сравнить досрочные цены Ванили для 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
в Локальных функциях, чтобы сравнить досрочные цены Ванили для ATM.
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')
Заметьте, что модель Лайзена-Раймера удаляет колебание и производит оценки близко к модели Black-Scholes только с помощью небольшого количества шагов.
Постройте сходимость моделей CRR и LR к решению Блэка-Шоулза для опции 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 и модель Black-Scholes сходятся как количество увеличений временных шагов, эта сходимость, за исключением опций в деньгах, совсем не является гладкой или универсальна.
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