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

В этом примере показано, как оценить бермудские свопции с помощью моделей процентных ставок в Financial Instruments 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-нет вызова -1.

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

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

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

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);

Вычисление цен на Swaption с использованием модели Black's

Цены свопциона вычисляются с помощью Модель. Затем можно использовать цены свопциона для сравнения прогнозируемых значений модели. Чтобы вычислить цены свопциона с помощью модели Black's:

% 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=[θ(t)-αr]dt+σdW

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

Этот пример использует функцию 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

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

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

dx(t)=-ax(t)dt+σdW1(t)

dy(t)=-by(t)dt+ηdW2(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) отличается от моделей с короткой ставкой тем, что она развивает набор дискретных форвардных ставок. В частности, lognormal LMM задает следующее диффузионное уравнение для каждой прямой скорости

dFi(t)Fi=-μidt+σi(t)dWi

где

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

dWi(t)dWj(t)=ρij

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

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

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

σi(t)=ϕi(a(Ti-t)+b)ec(Ti-t)+d

где ϕ корректирует кривую, чтобы соответствовать волатильности для ith скорость переадресации. В данном примере все Phi's будут приняты, чтобы быть 1.

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

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

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

(vα,βLFM)2=i,j=α+1βwi(0)wj(0)Fi(0)Fj(0)ρi,jSα,β(0)20Tασi(t)σj(t)dt

где

wi(t)=τiP(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. Бриго, Д. и Ф. Меркурио. Модели процентной ставки - теория и практика с улыбкой, инфляцией и кредитом. Springer Verlag, 2007.

  3. Glasserman, P. Monte Carlo Методы в финансовой инженерии. Спрингер, 2003.

  4. Hull, J. Options, Futures и другие производные. Prentice Hall, 2008.

  5. Ребонато, Р., К. Маккей и Р. Уайт. Модель рынка Sabr/Libor: ценообразование, калибровка и хеджирование для сложных производных по процентным ставкам. John Wiley & Sons, 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

См. также

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

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

Подробнее о