Оценка бермудского Swaptions с симуляцией Монте-Карло

В этом примере показано, как оценить бермудский swaptions использование моделей процентной ставки в Financial Instruments Toolbox™. А именно, Белая как оболочка одна факторная модель, Линейная Гауссова 2D факторная модель и Модель Рынка 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);

Задайте параметры Swaption

В данном примере вы вычисляете цену 10 никаких вызовов 1 бермудский swaption.

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

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

Модель черного цвета часто используется, чтобы оценить и заключить в кавычки европейские опции процентной ставки осуществления, то есть, дно, этажи и swaptions. В случае swaptions модель Черного цвета используется, чтобы подразумевать энергозависимость, учитывая текущую наблюдаемую рыночную цену. Следующая матрица показывает Черную подразумеваемую волатильность для области значений дат осуществления 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));

Выбор калибровочных инструментов

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

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

Вычислите цены Swaption Используя модель черного цвета

Цены Swaption вычисляются с помощью Модели Черного цвета. Можно затем использовать swaption цены, чтобы сравнить ожидаемые значения модели. Вычислить swaption цены с помощью модели Черного цвета:

% 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

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

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

Линейная Гауссова 2D факторная модель (названный 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 вычислить аналитические значения swaption цены за параметры модели и калибровать модель. Калибровка состоит из минимизации различия между наблюдаемыми рыночными ценами и предсказанными ценами модели.

% 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=-μidt+σi(t)dWi

где

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

dWi(t)dWj(t)=ρij

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

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

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

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

где ϕ настраивает кривую, чтобы совпадать с энергозависимостью для ith форвардный курс. В данном примере весь Фи будет взят, чтобы быть 1.

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

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

Если функциональные формы заданы, параметры должны быть оценены с помощью данных о рынке. Одно полезное приближение, первоначально разработанное Rebonato, следующее, который вычисляет Черную энергозависимость для европейского swaption, учитывая 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 вычислить аналитические значения swaption цены за параметры модели и также калибровать модель. Калибровка состоит из минимизации различия между наблюдаемыми подразумеваемыми swaption Черными колебаниями и предсказанными Черными колебаниями.

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. Андерсен, L. и В. Питербарг. Моделирование процентной ставки. Атлантическое финансовое нажатие, 2010.

  2. Brigo, D. и Ф. Меркурио. Модели процентной ставки - теория и практика с улыбкой, инфляцией и кредитом. Springer Verlag, 2007.

  3. Глассермен, P. Методы Монте-Карло в финансовой разработке. Спрингер, 2003.

  4. Оболочка, J. Опции, фьючерсы и другие производные. Prentice Hall, 2008.

  5. Rebonato, R., К. Маккей и R. Белый. Модель Рынка 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

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

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

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

Больше о