В этом примере показано, как оценить бермудские свопции с помощью моделей процентных ставок в 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)]);
RateSpec = intenvset('Rates',ZeroRates,'EndDates',CurveDates,'StartDate',Settle);
В данном примере вы вычисляете цену бермудского свопциона 10-нет вызова -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);
Цены свопциона вычисляются с помощью Модель. Затем можно использовать цены свопциона для сравнения прогнозируемых значений модели. Чтобы вычислить цены свопциона с помощью модели 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));
Однофакторная модель Халла-Уайта описывает эволюцию короткой скорости и определяется следующим:
Модель Халла-Уайта калибруется с помощью функции 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)')
% Price the swaption using the helper function hBermudanSwaption HW1FBermPrice = hBermudanSwaption(HW1FSimPaths,SimDates,Tenor,BermudanStrike,... BermudanExerciseDates,BermudanMaturity);
Линейная Гауссова двухфакторная модель (называемая Brigo и Mercurio G2 + +) также является короткой моделью скорости, но включает два фактора. В частности:
где является двумерным броуновским движением с корреляцией
и - функция, выбранная таким образом, чтобы соответствовать начальной нулевой кривой.
Можно использовать функцию 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)')
% Price the swaption using the helper function hBermudanSwaption
LG2FBermPrice = hBermudanSwaption(G2PPSimPaths,SimDates,Tenor,BermudanStrike,BermudanExerciseDates,BermudanMaturity);
Модель рынка LIBOR (LMM) отличается от моделей с короткой ставкой тем, что она развивает набор дискретных форвардных ставок. В частности, lognormal LMM задает следующее диффузионное уравнение для каждой прямой скорости
где
- функция волатильности для каждой скорости и является N
размерная геометрия броуновского движения с:
LMM связывает дрейфы форвардных скоростей на основе аргументов без арбитража.
Выбор с LMM - это как смоделировать волатильность и корреляцию и как оценить параметры этих моделей для волатильности и корреляции. На практике можно использовать комбинацию исторических данных (для примера, наблюдаемой корреляции между форвардными ставками) и текущих рыночных данных. В данном примере используются только данные свопциона. Кроме того, существует много различных параметризаций волатильности и корреляции. Этот пример использует две относительно простые параметризации.
Одна из самых популярных функциональных форм в литературе по волатильности:
где корректирует кривую, чтобы соответствовать волатильности для скорость переадресации. В данном примере все Phi's будут приняты, чтобы быть 1
.
Для корреляции используется следующая функциональная форма:
После определения функциональных форм параметры необходимо оценить с помощью рыночных данных. Одним из полезных приближений, первоначально разработанных Ребонато, является следующее, которое вычисляет Чёрную волатильность для европейского свопции, учитывая LMM с набором функций волатильности и матрицей корреляции.
где
Это вычисление выполняется с помощью 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')
% 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)')
% 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
Этот пример основан на следующих книгах, бумагах и журнальных статьях:
Андерсена, Л. и В. Питербарга. Моделирование процентных ставок. Atlantic Financial Press, 2010.
Бриго, Д. и Ф. Меркурио. Модели процентной ставки - теория и практика с улыбкой, инфляцией и кредитом. Springer Verlag, 2007.
Glasserman, P. Monte Carlo Методы в финансовой инженерии. Спрингер, 2003.
Hull, J. Options, Futures и другие производные. Prentice Hall, 2008.
Ребонато, Р., К. Маккей и Р. Уайт. Модель рынка 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
agencyoas
| agencyprice
| blackvolbyrebonato
| blackvolbysabr
| bndfutimprepo
| bndfutprice
| capbyblk
| capbylg2f
| convfactor
| floorbyblk
| floorbylg2f
| hwcalbycap
| hwcalbyfloor
| optsensbysabr
| swaptionbyblk
| swaptionbylg2f
| tfutbyprice
| tfutbyyield
| tfutimprepo
| tfutpricebyrepo
| tfutyieldbyrepo