Ценовые европейские колл-опционы ванили Используя и различные калькуляторы цен акции модели Блэка-Шоулза

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

Вычислите цену опции ванили за опцию 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

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

Сравнение цен опции ванили, когда опция является OTM

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

Сравнение цен опции ванили, когда опция является ATM

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

Первый сценарий: колл-опцион OTM ванили

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

Figure contains an axes object. The axes object 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.

Заметьте, что модель Лайзена-Раймера удаляет колебание и производит оценки близко к модели Black-Scholes только с помощью небольшого количества шагов.

Второй сценарий: колл-опцион ATM ванили

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

Figure contains an axes object. The axes object 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 и модель 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

Смотрите также

| | |

Связанные примеры

Больше о

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