exponenta event banner

Ценообразование бермудских свопционов с симуляцией Монте-Карло

В этом примере показано, как оценивать бермудские свопционы с использованием моделей процентных ставок в Toolbox™ финансовых инструментов. В частности, однофакторная модель Халла-Уайта, линейная гауссова двухфакторная модель и рыночная модель LIBOR калибруются по рыночным данным, а затем используются для генерации путей процентных ставок с использованием моделирования Монте-Карло.

Нулевая кривая

В этом примере ZeroRates для нулевой кривой жестко кодируется. Нулевую кривую можно также создать путем начальной загрузки нулевой кривой из рыночных данных (например, депозитов, фьючерсов/форвардов и свопов). Жестко закодированные данные для нулевой кривой определяются как:

Settle = datenum('21-Jul-2008');

% Zero Curve
CurveDates = daysadd(Settle,360*([1 3 5 7 10 20]),1);
ZeroRates = [1.9 2.6 3.1 3.5 4 4.3]'/100;

plot(CurveDates,ZeroRates)
datetick
title(['Zero Curve for ' datestr(Settle)]);

Figure contains an axes. The axes with title Zero Curve for 21-Jul-2008 contains an object of type line.

RateSpec = intenvset('Rates',ZeroRates,'EndDates',CurveDates,'StartDate',Settle);

Определение параметров свопциона

В этом примере вычисляется цена бермудского свопциона 10-no-call-1.

BermudanExerciseDates = daysadd(Settle,360*(1:9),1);
BermudanMaturity = datenum('21-Jul-2018');
BermudanStrike = .045;

Модель черного и матрица волатильности свопциона

Модель Блэка часто используется для ценообразования и цитирования европейских процентных опционов, то есть кэпов, этажей и свопционов. В случае свопционов модель Блэка используется для обозначения волатильности с учетом текущей наблюдаемой рыночной цены. Следующая матрица показывает черную подразумеваемую волатильность для диапазона дат исполнения свопциона (столбцов) и базовых сроков свопа (строк).

SwaptionBlackVol = [22 21 19 17 15 13 12
    21 19 17 16 15 13 11
    20 18 16 15 14 12 11
    19 17 15 14 13 12 10
    18 16 14 13 12 11 10
    15 14 13 12 12 11 10
    13 13 12 11 11 10 9]/100;
ExerciseDates = [1:5 7 10];
Tenors = [1:5 7 10];

EurExDatesFull = repmat(daysadd(Settle,ExerciseDates*360,1)',...
    length(Tenors),1);
EurMatFull = reshape(daysadd(EurExDatesFull,...
    repmat(360*Tenors,1,length(ExerciseDates)),1),size(EurExDatesFull));

Выбор калибровочных приборов

Выбор приборов для калибровки модели является одной из задач калибровки. Для бермудских свопционов обычно выполняется калибровка по европейским свопционам, которые являются совместимыми с бермудским свопционом, который требуется оценить. В этом случае при калибровке используются все свопционы, имеющие базовый тенор, который созревает до наступления срока действия свопциона, который должен быть оценен.

% Find the swaptions that expire on or before the maturity date of the
% sample swaption
relidx = find(EurMatFull <= BermudanMaturity);

Расчет цен свопциона с использованием модели черного

Цены свопциона рассчитываются с использованием модели Блэка. Затем можно использовать цены свопциона для сравнения прогнозируемых значений модели. Для расчета цен свопциона с использованием модели Блэка:

% Compute Swaption Prices using Black's model
SwaptionBlackPrices = zeros(size(SwaptionBlackVol));
SwaptionStrike = zeros(size(SwaptionBlackVol));

for iSwaption=1:length(ExerciseDates)
    for iTenor=1:length(Tenors)
        [~,SwaptionStrike(iTenor,iSwaption)] = swapbyzero(RateSpec,[NaN 0], Settle, EurMatFull(iTenor,iSwaption),...
            'StartDate',EurExDatesFull(iTenor,iSwaption),'LegReset',[1 1]);
        SwaptionBlackPrices(iTenor,iSwaption) = swaptionbyblk(RateSpec, 'call', SwaptionStrike(iTenor,iSwaption),Settle, ...
            EurExDatesFull(iTenor,iSwaption), EurMatFull(iTenor,iSwaption), SwaptionBlackVol(iTenor,iSwaption));
    end
end

Параметры моделирования

Следующие параметры используются, когда каждая дата упражнения является датой моделирования.

nPeriods = 9;
DeltaTime = 1;
nTrials = 1000;

Tenor = (1:10)';

SimDates = daysadd(Settle,360*DeltaTime*(0:nPeriods),1);
SimTimes = diff(yearfrac(SimDates(1),SimDates));

Модель белого корпуса с коэффициентом 1

Однофакторная модель Халл-Уайт описывает эволюцию короткой скорости и определяется следующим образом:

dr = [start( t) -αr] dt + startdW

Модель Халл-Уайт калибруется с помощью функции swaptionbyhw, который создает триномиальное дерево для оценки свопционов. Калибровка состоит из минимизации разницы между наблюдаемыми рыночными ценами (рассчитанными выше с использованием матрицы предполагаемой волатильности свопциона Черного) и прогнозируемыми ценами модели.

В этом примере используется функция Optimization Toolbox™ lsqnonlin чтобы найти набор параметров, который минимизирует разницу между наблюдаемыми и прогнозируемыми значениями. Однако могут быть подходящими другие подходы (например, смоделированный отжиг). В переменных задаются начальные параметры и ограничения для α и λ x0 , lb, и ub; они также могут варьироваться в зависимости от конкретного подхода к калибровке.

warnId = 'fininst:swaptionbyirtree:IgnoredSettle';
warnStruct = warning('off',warnId); % Turn warning off

TimeSpec = hwtimespec(Settle,daysadd(Settle,360*(1:11),1), 2);
HW1Fobjfun = @(x) SwaptionBlackPrices(relidx) - ...
    swaptionbyhw(hwtree(hwvolspec(Settle,'11-Aug-2015',x(2),'11-Aug-2015',x(1)), RateSpec, TimeSpec), 'call', SwaptionStrike(relidx),...
    EurExDatesFull(relidx), 0, EurExDatesFull(relidx), EurMatFull(relidx));
options = optimset('disp','iter','MaxFunEvals',1000,'TolFun',1e-5);

% Find the parameters that minimize the difference between the observed and
% predicted prices
x0 = [.1 .01];
lb = [0 0];
ub = [1 1];

HW1Fparams = lsqnonlin(HW1Fobjfun,x0,lb,ub,options);
                                         Norm of      First-order 
 Iteration  Func-count     f(x)          step          optimality
     0          3        0.953772                          20.5
     1          6        0.142828      0.0169199           1.53      
     2          9        0.123022      0.0146705           2.31      
     3         12        0.122222      0.0154098          0.482      
     4         15        0.122217     0.00131297         0.0041      

Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.
warning(warnStruct); % Turn warnings on

HW_alpha = HW1Fparams(1);
HW_sigma = HW1Fparams(2);

% Construct the HullWhite1F model using the HullWhite1F constructor.
HW1F = HullWhite1F(RateSpec,HW_alpha,HW_sigma);

% Use Monte Carlo simulation to generate the interest-rate paths with
% HullWhite1F.simTermStructs.
HW1FSimPaths = HW1F.simTermStructs(nPeriods,'NTRIALS',nTrials,...
    'DeltaTime',DeltaTime,'Tenor',Tenor,'antithetic',true);

% Examine one simulation
trialIdx = 1;
figure
surf(Tenor,SimDates,HW1FSimPaths(:,:,trialIdx))
datetick y keepticks keeplimits
title(['Evolution of the Zero Curve for Trial:' num2str(trialIdx) ' of Hull White Model'])
xlabel('Tenor (Years)')

Figure contains an axes. The axes with title Evolution of the Zero Curve for Trial:1 of Hull White Model contains an object of type surface.

% Price the swaption using the helper function hBermudanSwaption
HW1FBermPrice = hBermudanSwaption(HW1FSimPaths,SimDates,Tenor,BermudanStrike,...
    BermudanExerciseDates,BermudanMaturity);

Линейная 2-факторная модель Гаусса

Линейная гауссовская двухфакторная модель (называемая G2 + + по Бриго и Меркурио) также является моделью с короткой скоростью, но включает два фактора. В частности:

r (t) = x (t) + y (t) + (t)

dx (t) = -ax (t) dt + startdW1 (t)

dy (t) = -by (t) dt + startdW2 (t)

где dW1 (t) dW2 (t) - двумерное броуновское движение с корреляцией

dW1 (t) dW2 (t) =

и λ - функция, выбранная для соответствия начальной нулевой кривой.

Можно использовать функцию swaptionbylg2f для вычисления аналитических значений цены свопциона для параметров модели и калибровки модели. Калибровка состоит из минимизации разницы между наблюдаемыми рыночными ценами и прогнозируемыми ценами модели.

% Calibrate the set of parameters that minimize the difference between the
% observed and predicted values using swaptionbylg2f and lsqnonlin.
G2PPobjfun = @(x) SwaptionBlackPrices(relidx) - ...
    swaptionbylg2f(RateSpec,x(1),x(2),x(3),x(4),x(5),SwaptionStrike(relidx),...
    EurExDatesFull(relidx),EurMatFull(relidx),'Reset',1);
x0 = [.2 .1 .02 .01 -.5];
lb = [0 0 0 0 -1];
ub = [1 1 1 1 1];
LG2Fparams = lsqnonlin(G2PPobjfun,x0,lb,ub,options);
                                         Norm of      First-order 
 Iteration  Func-count     f(x)          step          optimality
     0          6         11.9838                          66.5
     1         12         1.35076      0.0967223           8.47      
     2         18         1.35076       0.111744           8.47      
     3         24        0.439341      0.0279361           1.29      
     4         30        0.237917      0.0558721           3.49      
     5         36        0.126732      0.0836846           7.51      
     6         42       0.0395759      0.0137735           7.43      
     7         48       0.0265828      0.0355771          0.787      
     8         54       0.0252764       0.111744            0.5      
     9         60       0.0228936       0.196793          0.338      
    10         66       0.0222739       0.106678         0.0946      
    11         72       0.0221799      0.0380108          0.911      
    12         78       0.0221726      0.0163391           1.37      

Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.
LG2f_a = LG2Fparams(1);
LG2f_b = LG2Fparams(2);
LG2f_sigma = LG2Fparams(3);
LG2f_eta = LG2Fparams(4);
LG2f_rho = LG2Fparams(5);

% Create the G2PP object and use Monte Carlo simulation to generate the
% interest-rate paths with LinearGaussian2F.simTermStructs.
G2PP = LinearGaussian2F(RateSpec,LG2f_a,LG2f_b,LG2f_sigma,LG2f_eta,LG2f_rho);

G2PPSimPaths = G2PP.simTermStructs(nPeriods,'NTRIALS',nTrials,...
    'DeltaTime',DeltaTime,'Tenor',Tenor,'antithetic',true);

% Examine one simulation
trialIdx = 1;
figure
surf(Tenor,SimDates,G2PPSimPaths(:,:,trialIdx))
datetick y keepticks keeplimits
title(['Evolution of the Zero Curve for Trial:' num2str(trialIdx) ' of G2++ Model'])
xlabel('Tenor (Years)')

Figure contains an axes. The axes with title Evolution of the Zero Curve for Trial:1 of G2++ Model contains an object of type surface.

% Price the swaption using the helper function hBermudanSwaption
LG2FBermPrice = hBermudanSwaption(G2PPSimPaths,SimDates,Tenor,BermudanStrike,BermudanExerciseDates,BermudanMaturity);

Рыночная модель LIBOR

Рыночная модель LIBOR (LMM) отличается от моделей с короткими ставками тем, что она развивает набор дискретных форвардных ставок. В частности, логнормальный LMM задает следующее уравнение диффузии для каждой прямой скорости

dFi (t) Fi = -

где

starti - функция волатильности для каждой скорости, а dW - N размерное геометрическое броуновское движение с:

dWi (t) dWj (t) = αij

LMM связывает дрейфы форвардных ставок на основе аргументов отсутствия арбитража.

Выбор с LMM заключается в том, как моделировать волатильность и корреляцию и как оценивать параметры этих моделей для волатильности и корреляции. На практике можно использовать комбинацию исторических данных (например, наблюдаемую корреляцию между форвардными ставками) и текущих рыночных данных. В этом примере используются только данные свопциона. Кроме того, существует множество различных параметров волатильности и корреляции. В этом примере используются две относительно простые параметризации.

Одной из наиболее популярных функциональных форм в литературе для волатильности является:

starti (t) = δ i (a (Ti-t) + b) ec (Ti-t) + d

где startкорректирует кривую в соответствии с волатильностью для i-ой форвардной ставки. Для этого примера, все Phi будут приняты, чтобы быть 1.

Для корреляции используется следующая функциональная форма:

βi, j = e-β 'i-j |

После определения функциональных форм параметры должны оцениваться с использованием рыночных данных. Одним из полезных приближений, первоначально разработанных Ребонато, является следующее, которое вычисляет волатильность черного для европейского свопциона, учитывая LMM с набором функций волатильности и корреляционной матрицей.

(, βLFM) 2=∑i,j=α+1βwi (0) wj (0) Fi (0) Fj (0) αi, jSα, β (0) 2∫0Tασi (t)

где

wi (t) = startiP (t, Ti) ∑k=α+1βτkP (t, tk)

Этот расчет выполняется с использованием blackvolbyrebonato для вычисления аналитических значений цены свопциона для параметров модели, а также для калибровки модели. Калибровка состоит из минимизации разницы между наблюдаемой подразумеваемой волатильностью черного и прогнозируемой волатильностью черного.

nRates = 10;

CorrFunc = @(i,j,Beta) exp(-Beta*abs(i-j));

objfun = @(x) SwaptionBlackVol(relidx) - blackvolbyrebonato(RateSpec,...
    repmat({@(t) ones(size(t)).*(x(1)*t + x(2)).*exp(-x(3)*t) + x(4)},nRates-1,1),...
    CorrFunc(meshgrid(1:nRates-1)',meshgrid(1:nRates-1),x(5)),...
    EurExDatesFull(relidx),EurMatFull(relidx),'Period',1);

x0 = [.2 .05 1 .05 .2];
lb = [0 0 .5 0 .01];
ub = [1 1 2 .3 1];
LMMparams = lsqnonlin(objfun,x0,lb,ub,options);
                                         Norm of      First-order 
 Iteration  Func-count     f(x)          step          optimality
     0          6        0.156251                         0.483
     1         12      0.00870177       0.188164         0.0339      
     2         18      0.00463441       0.165527        0.00095      
     3         24      0.00331055       0.351017         0.0154      
     4         30      0.00294775      0.0892616       7.47e-05      
     5         36      0.00281565       0.385779        0.00917      
     6         42      0.00278988      0.0145632       4.15e-05      
     7         48      0.00278522       0.115043        0.00116      

Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.
% Calculate VolFunc for the LMM object.
a = LMMparams(1);
b = LMMparams(2);
c = LMMparams(3);
d = LMMparams(4);

Beta = LMMparams(5);

VolFunc = repmat({@(t) ones(size(t)).*(a*t + b).*exp(-c*t) + d},nRates-1,1);

% Plot the volatility function
figure
fplot(VolFunc{1},[0 20])
title('Volatility Function')

Figure contains an axes. The axes with title Volatility Function contains an object of type functionline.

% Inspect the correlation matrix
CorrelationMatrix = CorrFunc(meshgrid(1:nRates-1)',meshgrid(1:nRates-1),Beta);
displayCorrelationMatrix(CorrelationMatrix);
Correlation Matrix
1.000 0.990 0.980 0.970 0.961 0.951 0.942 0.932 0.923  
0.990 1.000 0.990 0.980 0.970 0.961 0.951 0.942 0.932  
0.980 0.990 1.000 0.990 0.980 0.970 0.961 0.951 0.942  
0.970 0.980 0.990 1.000 0.990 0.980 0.970 0.961 0.951  
0.961 0.970 0.980 0.990 1.000 0.990 0.980 0.970 0.961  
0.951 0.961 0.970 0.980 0.990 1.000 0.990 0.980 0.970  
0.942 0.951 0.961 0.970 0.980 0.990 1.000 0.990 0.980  
0.932 0.942 0.951 0.961 0.970 0.980 0.990 1.000 0.990  
0.923 0.932 0.942 0.951 0.961 0.970 0.980 0.990 1.000  
% Create the LMM object and use Monte Carlo simulation to generate the 
% interest-rate paths with LiborMarketModel.simTermStructs.
LMM = LiborMarketModel(RateSpec,VolFunc,CorrelationMatrix,'Period',1);

[LMMZeroRates, ForwardRates] = LMM.simTermStructs(nPeriods,'nTrials',nTrials);

% Examine one simulation
trialIdx = 1;
figure
tmpPlotData = LMMZeroRates(:,:,trialIdx);
tmpPlotData(tmpPlotData == 0) = NaN;
surf(Tenor,SimDates,tmpPlotData)
title(['Evolution of the Zero Curve for Trial:' num2str(trialIdx) ' of LIBOR Market Model'])
xlabel('Tenor (Years)')

Figure contains an axes. The axes with title Evolution of the Zero Curve for Trial:1 of LIBOR Market Model contains an object of type surface.

% Price the swaption using the helper function hBermudanSwaption
LMMTenor = 1:10;
LMMBermPrice = hBermudanSwaption(LMMZeroRates,SimDates,LMMTenor,.045,BermudanExerciseDates,BermudanMaturity);

Результаты

displayResults(nTrials, nPeriods, HW1FBermPrice, LG2FBermPrice, LMMBermPrice);
     # of Monte Carlo Trials:     1000
     # of Time Periods/Trial:        9

HW1F Bermudan Swaption Price:   3.7577
LG2F Bermudan Swaption Price:   3.5576
 LMM Bermudan Swaption Price:   3.4911

Библиография

Этот пример основан на следующих книгах, статьях и журнальных статьях:

  1. Андерсен, Л. и В. Питербарг. Моделирование процентных ставок. Atlantic Financial Press, 2010.

  2. Бриго, Д. и Ф. Меркурио. Модели процентных ставок - теория и практика с улыбкой, инфляция и кредит. Спрингер Верлаг, 2007.

  3. Glasserman, P. Monte Carlo Methods in Financial Engineering. Спрингер, 2003.

  4. Халл, Дж. Опционы, фьючерсы и другие деривативы. Прентис Холл, 2008.

  5. Ребонато, Р., К. МакКей и Р. Уайт. Рыночная модель Sabr/Libor: расчет цен, калибровка и хеджирование для комплексных процентных деривативов. Джон Уайли и сыновья, 2010.

Служебные функции

function displayCorrelationMatrix(CorrelationMatrix)
fprintf('Correlation Matrix\n');
fprintf([repmat('%1.3f ',1,length(CorrelationMatrix)) ' \n'],CorrelationMatrix);
end

function displayResults(nTrials, nPeriods, HW1FBermPrice, LG2FBermPrice, LMMBermPrice)
fprintf('     # of Monte Carlo Trials: %8d\n'    , nTrials);
fprintf('     # of Time Periods/Trial: %8d\n\n'  , nPeriods);
fprintf('HW1F Bermudan Swaption Price: %8.4f\n', HW1FBermPrice);
fprintf('LG2F Bermudan Swaption Price: %8.4f\n', LG2FBermPrice);
fprintf(' LMM Bermudan Swaption Price: %8.4f\n', LMMBermPrice);
end

См. также

| | | | | | | | | | | | | | | | | | | |

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

Подробнее