В этом примере показана оценка европейских свопционов с использованием моделей процентных ставок в Toolbox™ финансовых инструментов. В частности, однофакторная модель Халла-Уайта, линейная гауссова двухфакторная модель и рыночная модель LIBOR калибруются по рыночным данным, а затем используются для генерации путей процентных ставок с использованием моделирования Монте-Карло.
В следующих разделах устанавливаются данные, которые затем используются с примерами для моделирования путей процентных ставок с использованием однофакторной модели корпуса белого, моделирования путей процентных ставок с использованием линейной гауссовской двухфакторной модели и моделирования путей процентных ставок с использованием рыночной модели 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)]);

Построение IRCurve объект.
irdc = IRDataCurve('Zero',Settle,CurveDates,ZeroRates);Создать RateSpec.
RateSpec = intenvset('Rates',ZeroRates,'EndDates',CurveDates,'StartDate',Settle)
RateSpec = struct with fields:
FinObj: 'RateSpec'
Compounding: 2
Disc: [6x1 double]
Rates: [6x1 double]
EndTimes: [6x1 double]
StartTimes: [6x1 double]
EndDates: [6x1 double]
StartDates: 733610
ValuationDate: 733610
Basis: 0
EndMonthRule: 1
В то время как моделирование Монте-Карло обычно используется для оценки более сложных деривативов (например, бермудских свопционов), в этом примере цена европейского свопциона рассчитывается с датой исполнения пять лет и базовым свопом пять лет.
InstrumentExerciseDate = datenum('21-Jul-2013'); InstrumentMaturity = datenum('21-Jul-2018'); InstrumentStrike = .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));Выбор приборов для калибровки модели является одной из задач калибровки. Для бермудских свопционов типично откалибровать к европейским свопционам, которые являются совместимыми с бермудским свопционом, который должен быть оценен. В этом случае при калибровке используются все свопционы, имеющие основной тенор, который созревает до наступления срока свопциона, который должен быть оценен (21-Jul-2018).
% Find the swaptions that expire on or before the maturity date of the % sample swaption relidx = find(EurMatFull <= InstrumentMaturity);
В этом примере показано, как вычислять цены свопциона с использованием модели черного. Затем цены свопциона используются для сравнения прогнозируемых значений модели, полученных в процессе калибровки.
Для расчета цен свопциона с использованием модели Блэка:
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
В этом примере показано, как использовать simTermStructs метод с HullWhite1F, LinearGaussian2F, и LiborMarketModel объекты.
Демонстрация с использованием simTermStructs метод с HullWhite1F, LinearGaussian2F, и LiborMarketModel используйте следующие параметры моделирования:
nPeriods = 5; DeltaTime = 1; nTrials = 1000; Tenor = (1:10)'; SimDates = daysadd(Settle,360*DeltaTime*(0:nPeriods),1) SimTimes = diff(yearfrac(SimDates(1),SimDates)) % For 1 year periods and an evenly spaced tenor, the exercise row will be % the 5th row and the swaption maturity will be the 5th column exRow = 5; endCol = 5;
SimDates =
733610
733975
734340
734705
735071
735436
SimTimes =
1.0000
1.0000
1.0000
1.0027
1.0000В этом примере показано, как моделировать пути процентных ставок с использованием однофакторной модели Халл-Уайт. Перед началом этого примера, в котором используется HullWhite1F убедитесь, что данные настроены, как описано в:
Однофакторная модель Халл-Уайт описывает эволюцию короткой скорости и задается с использованием нулевой кривой, параметров альфа и сигма для уравнения
dt + (t) dW
где:
dr - изменение краткосрочной процентной ставки за небольшой интервал, dt.
r - краткосрочная процентная ставка.
Λ (t) - это функция времени, определяющая среднее направление, в котором движется r, выбранное таким образом, что движения в r согласуются с сегодняшней кривой нулевой купонной доходности.
α - средняя скорость реверсии.
dt - небольшое изменение во времени.
λ - ежегодное стандартное отклонение короткой скорости.
W - броуновское движение.
Модель Халл-Уайт калибруется с помощью функции swaptionbyhw, который создает триномиальное дерево для оценки свопционов. Калибровка состоит из минимизации разницы между наблюдаемыми рыночными ценами (рассчитанными выше с использованием матрицы предполагаемой волатильности свопциона Black, см. Расчет модели черного и матрицы волатильности свопциона) и прогнозируемыми ценами модели.
В этом примере функция Optimization Toolbox™ lsqnonlin используется для поиска набора параметров, который минимизирует разницу между наблюдаемыми и прогнозируемыми значениями. Однако могут быть подходящими другие подходы (например, смоделированный отжиг). В переменных задаются начальные параметры и ограничения для α и λ x0, lb, и ub; они также могут варьироваться в зависимости от конкретного подхода к калибровке.
Калибровка набора параметров, минимизирующих разницу между наблюдаемыми и прогнозируемыми значениями с помощью swaptionbyhw и lsqnonlin.
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); HW_alpha = HW1Fparams(1) HW_sigma = HW1Fparams(2)
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.00409
Local minimum possible.
lsqnonlin stopped because the final change in the sum of squares relative to
its initial value is less than the selected value of the function tolerance.
HW_alpha =
0.0967
HW_sigma =
0.0088Создайте HullWhite1F модель с использованием HullWhite1F конструктор.
HW1F = HullWhite1F(RateSpec,HW_alpha,HW_sigma)
HW1F =
HullWhite1F with properties:
ZeroCurve: [1x1 IRDataCurve]
Alpha: @(t,V)inAlpha
Sigma: @(t,V)inSigmaИспользуйте моделирование Monte Carlo для создания путей процентных ставок с помощью HullWhite1F.simTermStructs.
HW1FSimPaths = HW1F.simTermStructs(nPeriods,'NTRIALS',nTrials,... 'DeltaTime',DeltaTime,'Tenor',Tenor,'antithetic',true); 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)')

Цена европейского свопциона.
DF = exp(bsxfun(@times,-HW1FSimPaths,repmat(Tenor',[nPeriods+1 1]))); SwapRate = (1 - DF(exRow,endCol,:))./sum(bsxfun(@times,1,DF(exRow,1:endCol,:))); PayoffValue = 100*max(SwapRate-InstrumentStrike,0).*sum(bsxfun(@times,1,DF(exRow,1:endCol,:))); RealizedDF = prod(exp(bsxfun(@times,-HW1FSimPaths(1:exRow,1,:),SimTimes(1:exRow))),1); HW1F_SwaptionPrice = mean(RealizedDF.*PayoffValue)
HW1F_SwaptionPrice =
2.1839 В этом примере показано, как моделировать пути процентных ставок с использованием линейной гауссовой двухфакторной модели. Перед началом этого примера, в котором используется LinearGaussian2F убедитесь, что данные настроены, как описано в:
Линейная гауссовская двухфакторная модель (называемая G2 + + Бриго и Меркурио, см. Моделирование процентных ставок с использованием моделирования Монте-Карло) также является моделью с короткими ставками, но включает два фактора. В частности:
t) + (t)
dW1 (t), x (0) = 0
dW2 (t), y (0) = 0
где = startdt - двумерное броуновское движение с корреляцией,, а "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "
Функция swaptionbylg2f используется для вычисления аналитических значений цены свопциона для параметров модели и, следовательно, может использоваться для калибровки модели. Калибровка состоит из минимизации разницы между наблюдаемыми рыночными ценами (рассчитанными выше с использованием матрицы предполагаемой волатильности свопциона Black, см. Расчет модели черного и матрицы волатильности свопциона) и прогнозируемыми ценами модели.
В этом примере подход аналогичен моделированию путей процентных ставок с использованием однофакторной модели «корпус-белый» и функции «Панель инструментов оптимизации». lsqnonlin используется для минимизации разницы между наблюдаемыми ценами свопциона и прогнозируемыми ценами свопциона. Однако другие подходы (например, смоделированный отжиг) также могут быть подходящими. В переменных задаются начальные параметры и ограничения для a, b, x0, lb, и ub; они также могут варьироваться в зависимости от конкретного подхода к калибровке.
Калибровка набора параметров, минимизирующих разницу между наблюдаемыми и прогнозируемыми значениями с помощью swaptionbylg2f и lsqnonlin.
G2PPobjfun = @(x) SwaptionBlackPrices(relidx) - swaptionbylg2f(irdc,x(1),x(2),x(3),x(4),x(5),SwaptionStrike(relidx),... EurExDatesFull(relidx),EurMatFull(relidx),'Reset',1); options = optimset('disp','iter','MaxFunEvals',1000,'TolFun',1e-5); 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 12.3547 67.6
1 12 1.37984 0.0979743 8.59
2 18 1.37984 0.112847 8.59
3 24 0.445202 0.0282118 1.31
4 30 0.236746 0.0564236 3.02
5 36 0.134678 0.0843366 7.78
6 42 0.0398816 0.015084 6.34
7 48 0.0287731 0.038967 0.732
8 54 0.0273025 0.112847 0.881
9 60 0.0241689 0.213033 1.06
10 66 0.0241689 0.125602 1.06
11 72 0.0239103 0.0314005 9.78
12 78 0.0234246 0.0286685 1.21
13 84 0.0234246 0.0491135 1.21
14 90 0.023304 0.0122784 1.67
15 96 0.0231931 0.0245568 5.92
16 102 0.0230898 0.00785421 0.434
17 108 0.0230898 0.0245568 0.434
18 114 0.023083 0.00613919 0.255
Local minimum possible.
lsqnonlin stopped because the final change in the sum of squares relative to
its initial value is less than the selected value of the function tolerance.
LG2Fparams =
0.5752 0.1181 0.0146 0.0119 -0.7895Создать G2PP объект и используйте моделирование Monte Carlo для генерации путей процентных ставок с LinearGaussian2F.simTermStructs.
LG2f_a = LG2Fparams(1); LG2f_b = LG2Fparams(2); LG2f_sigma = LG2Fparams(3); LG2f_eta = LG2Fparams(4); LG2f_rho = LG2Fparams(5); 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); 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)')

Цена европейского свопциона.
DF = exp(bsxfun(@times,-G2PPSimPaths,repmat(Tenor',[nPeriods+1 1]))); SwapRate = (1 - DF(exRow,endCol,:))./sum(bsxfun(@times,1,DF(exRow,1:endCol,:))); PayoffValue = 100*max(SwapRate-InstrumentStrike,0).*sum(bsxfun(@times,1,DF(exRow,1:endCol,:))); RealizedDF = prod(exp(bsxfun(@times,-G2PPSimPaths(1:exRow,1,:),SimTimes(1:exRow))),1); G2PP_SwaptionPrice = mean(RealizedDF.*PayoffValue)
G2PP_SwaptionPrice =
2.0988В этом примере показано, как моделировать пути процентных ставок с использованием рыночной модели LIBOR. Перед началом этого примера, в котором используется LiborMarketModel, убедитесь, что вы настроили данные, как описано в:
Рыночная модель LIBOR (LMM) отличается от моделей с короткими ставками тем, что она развивает набор дискретных форвардных ставок. В частности, логнормальный LMM задает следующее уравнение диффузии для каждой прямой скорости
где:
W - N-мерное геометрическое броуновское движение с
= αij
LMM связывает дрейфы форвардных ставок на основе аргументов отсутствия арбитража. В частности, в рамках меры Spot LIBOR дрейфы выражаются как
(t) 1 + startjFj (t)
где:
- временная дробь, связанная с i-ой прямой скоростью
q (t) - индекс, определяемый соотношением
< Tq (t)
и номер Spot LIBOR определяется как
1 +
Выбор с LMM заключается в том, как моделировать волатильность и корреляцию и как оценивать параметры этих моделей для волатильности и корреляции. На практике можно использовать комбинацию исторических данных (например, наблюдаемую корреляцию между форвардными ставками) и текущих рыночных данных. В этом примере используются только данные свопциона. Кроме того, существует много различных параметризаций волатильности и корреляции. В этом примере используются две относительно простые параметризации.
Одной из наиболее популярных функциональных форм в литературе для волатильности является:
ec (Ti − t) + d
где startкорректирует кривую в соответствии с волатильностью для i-ой форвардной ставки. Для этого примера все 1. Для корреляции используется следующая функциональная форма:
β 'i − j |
После определения функциональных форм эти параметры должны оцениваться с использованием рыночных данных. Одним из полезных приближений, первоначально разработанных Ребонато, является следующее, которое связывает волатильность черного для европейского свопциона, учитывая набор функций волатильности и корреляционную матрицу
2∫0Tασi (t)
где:
(t, t)
Этот расчет выполняется с использованием функции blackvolbyrebonato для вычисления аналитических значений цены свопциона для параметров модели и, следовательно, затем используется для калибровки модели. Калибровка состоит из минимизации разницы между наблюдаемой подразумеваемой волатильностью черного и прогнозируемой волатильностью черного.
В этом примере подход аналогичен моделированию путей процентных ставок с использованием однофакторной модели корпус-белый и моделированию путей процентных ставок с использованием линейной гауссовской двухфакторной модели, в которой используется панель инструментов оптимизации. lsqnonlin используется для минимизации разницы между наблюдаемыми ценами свопциона и прогнозируемыми ценами свопциона. Однако другие подходы (например, смоделированный отжиг) также могут быть подходящими. Начальные параметры и ограничения для a, b, d и β задаются в переменных x0, lb, и ub; они также могут варьироваться в зависимости от конкретного подхода к калибровке.
Калибровка набора параметров, минимизирующих разницу между наблюдаемыми и прогнозируемыми значениями с помощью blackvolbyrebonato и lsqnonlin.
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); options = optimset('disp','iter','MaxFunEvals',1000,'TolFun',1e-5); 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.0892617 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.115042 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 selected value of the function tolerance.
LMMparams =
0.0781 0.1656 0.5121 0.0617 0.0100
Вычислить VolFunc для LMM объект.
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);
Постройте график функции волатильности.
figure
fplot(VolFunc{1},[0 20])
title('Volatility Function')
CorrelationMatrix = CorrFunc(meshgrid(1:nRates-1)',meshgrid(1:nRates-1),Beta);
Проверьте корреляционную матрицу.
disp('Correlation Matrix') fprintf([repmat('%1.3f ',1,length(CorrelationMatrix)) ' \n'],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
Создать LMM объект и используйте моделирование Monte Carlo для генерации путей процентных ставок с LiborMarketModel.simTermStructs.
LMM = LiborMarketModel(irdc,VolFunc,CorrelationMatrix,'Period',1); [LMMZeroRates, ForwardRates] = LMM.simTermStructs(nPeriods,'nTrials',nTrials); 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)')

Цена европейского свопциона.
DF = exp(bsxfun(@times,-LMMZeroRates,repmat(Tenor',[nPeriods+1 1]))); SwapRate = (1 - DF(exRow,endCol,:))./sum(bsxfun(@times,1,DF(exRow,1:endCol,:))); PayoffValue = 100*max(SwapRate-InstrumentStrike,0).*sum(bsxfun(@times,1,DF(exRow,1:endCol,:))); RealizedDF = prod(exp(bsxfun(@times,-LMMZeroRates(2:exRow+1,1,:),SimTimes(1:exRow))),1); LMM_SwaptionPrice = mean(RealizedDF.*PayoffValue)
LMM_SwaptionPrice =
1.9915В этом примере показано, как сравнить результаты расчета цены европейского свопциона с различными моделями процентных ставок.
Сравните результаты расчета цены европейского свопциона с моделями процентных ставок с использованием моделирования Монте-Карло.
disp(' ') fprintf(' # of Monte Carlo Trials: %8d\n' , nTrials) fprintf(' # of Time Periods/Trial: %8d\n\n' , nPeriods) fprintf('HW1F European Swaption Price: %8.4f\n', HW1F_SwaptionPrice) fprintf('LG2F Europesn Swaption Price: %8.4f\n', G2PP_SwaptionPrice) fprintf(' LMM European Swaption Price: %8.4f\n', LMM_SwaptionPrice)
# of Monte Carlo Trials: 1000
# of Time Periods/Trial: 5
HW1F European Swaption Price: 2.1839
LG2F Europesn Swaption Price: 2.0988
LMM European Swaption Price: 1.9915Бриго, Д. и Ф. Меркурио, Модели процентных ставок - теория и практика с улыбкой, инфляция и кредит, Springer Finance, 2006.
Андерсен, Л. и В. Питербарг, моделирование процентных ставок, Atlantic Financial Press. 2010.
Hull, J, опционы, фьючерсы и другие деривативы, Springer Finance, 2003.
Glasserman, P, Monte Carlo Methods in Financial Engineering, Prentice Hall, 2008.
Rebonato, R., K. McKay и R. White, модель рынка Sabr/Libor: ценообразование, калибровка и хеджирование для комплексных процентных деривативов, John Wiley & Sons, 2010.
blackvolbyrebonato | capbylg2f | floorbylg2f | HullWhite1F | LiborMarketModel | LinearGaussian2F | lsqnonlin | simTermStructs | simTermStructs | simTermStructs | swaptionbyhw | swaptionbylg2f