Цены Европейские опции Vanilla Call с использованием модели Black-Scholes и различных ценников на акции

В этом примере показано, как сравнить европейские 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;

Вычислите стоимость опции Vanilla для опции OTM

Использование 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);

Вычислите стоимость Опция для ATM Option

Использование 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);

Сравнение цен опций Vanilla, когда опция OTM

Используйте 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

Сравнение цен опций Vanilla, когда опция является банкоматом

Используйте 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

Первый сценарий: OTM Vanilla Call Option

Постройте график сходимости моделей 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')

Figure contains an axes. The axes with title Convergence of CRR and LR Models to a BLS Solution (OTM) Strike = 30, Asset Price = 25 contains 3 objects of type line. These objects represent CRR, BLS, LR.

Заметьте, что модель Лейзена-Реймера удаляет колебания и выдает оценки, близкие к модели Блэка-Скоулза, используя только небольшое количество шагов.

Второй сценарий: ATM Vanilla Call Option

Постройте график сходимости моделей 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')

Figure contains an axes. The axes with title Convergence of CRR and LR Models to a BLS Solution (ATM) Strike = 30, Asset Price = 30 contains 3 objects of type line. These objects represent CRR, BLS, LR.

В то время как биномиальная модель 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

См. также

| | |

Похожие примеры

Подробнее о

Внешние веб-сайты