exponenta event banner

Ценовые европейские варианты ванильных коллов с использованием модели 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 Объекты прайсера

Создайте два сценария для параметра «Ваниль». В первом сценарии опция находится вне денег (OTM). Во втором сценарии опция находится на деньги (банкомат).

% 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 в 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

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

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

См. также

| | |

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

Подробнее

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