IRFunctionCurve
ОбъектСоздать IRFunctionCurve
возразите, см. следующие опции:
Подбор кривой IRFunctionCurve
Объект Используя указатель на функцию
Подбор кривой IRFunctionCurve
Объект Используя метод Нельсона-Сигеля
Подбор кривой IRFunctionCurve
Объект Используя метод Свенсона
Подбор кривой IRFunctionCurve
Объект Используя сглаживание метода сплайна
IRFunctionCurve
Объект Используя указатель на функциюМожно использовать IRFunctionCurve
с MATLAB® указатель на функцию, чтобы задать кривую процентной ставки. Для получения дополнительной информации об определении указателя на функцию см. документацию Основ программирования MATLAB.
Этот пример использует FunctionHandle
аргумент со значением @(t) t.^2
создать кривую процентной ставки.
rr = IRFunctionCurve('Zero',today,@(t) t.^2)
rr = Properties: FunctionHandle: @(t)t.^2 Type: 'Zero' Settle: 733600 Compounding: 2 Basis: 0
IRFunctionCurve
Объект Используя метод Нельсона-СигеляИспользуйте функцию, fitNelsonSiegel
, для модели Нельсона-Сигеля, которая соответствует эмпирической форме кривой доходности с предварительно заданной функциональной формой точечных уровней, которая является функцией времени к зрелости связей.
Модель Нельсона-Сигеля представляет динамическую три факторных модели: уровень, наклон и искривление. Однако факторы Нельсона-Сигеля не наблюдаются или скрытые, который допускает погрешность измерения, и связанные загрузки имеют экономические ограничения (форвардные курсы всегда положительны, и нуль подходов коэффициента дисконтирования, когда зрелость увеличивается). Для получения дополнительной информации см. “Кривые доходности Нулевого купона: техническая документация”, Бумаги BIS, Банк международных расчетов, Номер 25, октябрь 2005.
Этот пример использует IRFunctionCurve
смоделировать структуру термина без значений по умолчанию процентных ставок в Соединенном Королевстве.
Загрузите данные.
load ukdata20080430
Преобразуйте repo уровни, чтобы быть эквивалентными облигациями с нулевым купоном.
RepoCouponRate = repmat(0,size(RepoRates)); RepoPrice = bndprice(RepoRates, RepoCouponRate, RepoSettle, RepoMaturity);
Агрегируйте данные.
Settle = [RepoSettle;BondSettle];
Maturity = [RepoMaturity;BondMaturity];
CleanPrice = [RepoPrice;BondCleanPrice];
CouponRate = [RepoCouponRate;BondCouponRate];
Instruments = [Settle Maturity CleanPrice CouponRate];
InstrumentPeriod = [repmat(0,6,1);repmat(2,31,1)];
CurveSettle = datenum('30-Apr-2008');
IRFunctionCurve
объект предусматривает возможность соответствовать кривой Нельсона-Сигеля к наблюдаемым данным о рынке с fitNelsonSiegel
функция. Подбор кривой сделан путем вызывания функции lsqnonlin
. fitNelsonSiegel
функция потребовала входных параметров Type
, Settle
, и матрица инструментальных данных.
NSModel = IRFunctionCurve.fitNelsonSiegel('Zero',CurveSettle,... Instruments,'Compounding',-1,'InstrumentPeriod',InstrumentPeriod);
Постройте кривую процентной ставки Нельсона-Сигеля для форвардных курсов.
PlottingDates = CurveSettle+20:30:CurveSettle+365*25;
TimeToMaturity = yearfrac(CurveSettle,PlottingDates);
NSForwardRates = getForwardRates(NSModel, PlottingDates);
plot(TimeToMaturity,NSForwardRates)
title('Nelson Siegel model of UK instantaneous nominal forward curve')
IRFunctionCurve
Объект Используя метод СвенсонаИспользуйте функцию, fitSvensson
, для модели Свенсона, чтобы улучшить гибкость кривых и пригодного для модели Нельсона-Сигеля. В 1 994, Свенсон расширил Нельсона и функцию Зигеля путем добавления дальнейшего термина, который допускает второй “горб”. Дополнительная точность достигается за счет добавления еще двух параметров, β3 и τ2, которые должны быть оценены.
В этом примере использования fitSvensson
функция, IRFitOptions
структура, ранее заданное использование IRFitOptions
, используется. Таким образом необходимо задать FitType
, InitialGuess
, UpperBound
, LowerBound
, и OptOptions
параметры оптимизации для lsqnonlin
.
Загрузите данные.
load ukdata20080430
Преобразуйте repo уровни, чтобы быть эквивалентными облигациями с нулевым купоном.
RepoCouponRate = repmat(0,size(RepoRates)); RepoPrice = bndprice(RepoRates, RepoCouponRate, RepoSettle, RepoMaturity);
Агрегируйте данные.
Settle = [RepoSettle;BondSettle];
Maturity = [RepoMaturity;BondMaturity];
CleanPrice = [RepoPrice;BondCleanPrice];
CouponRate = [RepoCouponRate;BondCouponRate];
Instruments = [Settle Maturity CleanPrice CouponRate];
InstrumentPeriod = [repmat(0,6,1);repmat(2,31,1)];
CurveSettle = datenum('30-Apr-2008');
Задайте OptOptions
для IRFitOptions
.
OptOptions = optimoptions('lsqnonlin','MaxFunEvals',1000); fIRFitOptions = IRFitOptions([5.82 -2.55 -.87 0.45 3.9 0.44],... 'FitType','durationweightedprice','OptOptions',OptOptions,... 'LowerBound',[0 -Inf -Inf -Inf 0 0],'UpperBound',[Inf Inf Inf Inf Inf Inf]);
Соответствуйте кривой процентной ставки с помощью модели Свенсона.
SvenssonModel = IRFunctionCurve.fitSvensson('Zero',CurveSettle,... Instruments,'IRFitOptions', fIRFitOptions, 'Compounding',-1,... 'InstrumentPeriod',InstrumentPeriod)
Local minimum possible. lsqnonlin stopped because the final change in the sum of squares relative to its initial value is less than the default value of the function tolerance. SvenssonModel = Type: Zero Settle: 733528 (30-Apr-2008) Compounding: -1 Basis: 0 (actual/actual)
Сообщение о состоянии, выведенное от lsqnonlin
, указывает что оптимизация, чтобы найти параметры для уравнения Свенсона отключенными успешно.
Постройте кривую процентной ставки Свенсона для форвардных курсов.
PlottingDates = CurveSettle+20:30:CurveSettle+365*25;
TimeToMaturity = yearfrac(CurveSettle,PlottingDates);
SvenssonForwardRates = getForwardRates(SvenssonModel, PlottingDates);
plot(TimeToMaturity,SvenssonForwardRates)
title('Svensson model of UK instantaneous nominal forward curve')
IRFunctionCurve
Объект Используя сглаживание метода сплайнаИспользуйте функцию, fitSmoothingSpline
, чтобы смоделировать термин структура со сплайном, а именно, термин структура представляет прямую кривую кубическим сплайном.
Примечание
У вас должна быть лицензия на программное обеспечение Curve Fitting Toolbox™, чтобы использовать fitSmoothingSpline
функция.
IRFunctionCurve
объект используется, чтобы соответствовать представлению сплайна сглаживания прямой кривой с функцией штрафа. Необходимые входные параметры для fitSmoothingSpline
Type
, Settle
, матрица Instruments
, и Lambdafun
, указатель на функцию, содержащий функцию штрафа
Загрузите данные.
load ukdata20080430
Преобразуйте repo уровни, чтобы быть эквивалентными облигациями с нулевым купоном.
RepoCouponRate = repmat(0,size(RepoRates)); RepoPrice = bndprice(RepoRates, RepoCouponRate, RepoSettle, RepoMaturity);
Агрегируйте данные.
Settle = [RepoSettle;BondSettle];
Maturity = [RepoMaturity;BondMaturity];
CleanPrice = [RepoPrice;BondCleanPrice];
CouponRate = [RepoCouponRate;BondCouponRate];
Instruments = [Settle Maturity CleanPrice CouponRate];
InstrumentPeriod = [repmat(0,6,1);repmat(2,31,1)];
CurveSettle = datenum('30-Apr-2008');
Выберите параметры для Lambdafun
.
L = 9.2; S = -1; mu = 1;
Задайте Lambdafun
функция штрафа.
lambdafun = @(t) exp(L - (L-S)*exp(-t/mu)); t = 0:.1:25; y = lambdafun(t); figure semilogy(t,y); title('Penalty Function for VRP Approach') ylabel('Penalty') xlabel('Time')
Используйте fitSmoothingSpline
функционируйте, чтобы соответствовать кривой процентной ставки и смоделировать Lambdafun
функция штрафа.
VRPModel = IRFunctionCurve.fitSmoothingSpline('Forward',CurveSettle,... Instruments,lambdafun,'Compounding',-1, 'InstrumentPeriod',InstrumentPeriod);
Постройте кривую процентной ставки сплайна сглаживания для форвардных курсов.
PlottingDates = CurveSettle+20:30:CurveSettle+365*25;
TimeToMaturity = yearfrac(CurveSettle,PlottingDates);
VRPForwardRates = getForwardRates(VRPModel, PlottingDates);
plot(TimeToMaturity,VRPForwardRates)
title('Smoothing Spline model of UK instantaneous nominal forward curve')
fitFunction
создать подбирающую на заказ функциюПри использовании IRFunctionCurve
объект, можно создать подбирающую на заказ функцию с fitFunction
функция. Использовать fitFunction
, необходимо задать FunctionHandle
. Кроме того, необходимо также использовать IRFitOptions
задавать IRFitOptions
возразите, чтобы поддержать InitialGuess
для параметров функции кривой.
Следующий пример демонстрирует использование fitFunction
с FunctionHandle
и IRFitOptions
объект.
Settle = repmat(datenum('30-Apr-2008'),[6 1]); Maturity = [datenum('07-Mar-2009');datenum('07-Mar-2011');... datenum('07-Mar-2013');datenum('07-Sep-2016');... datenum('07-Mar-2025');datenum('07-Mar-2036')]; CleanPrice = [100.1;100.1;100.8;96.6;103.3;96.3]; CouponRate = [0.0400;0.0425;0.0450;0.0400;0.0500;0.0425]; Instruments = [Settle Maturity CleanPrice CouponRate]; CurveSettle = datenum('30-Apr-2008');
Задайте FunctionHandle
.
functionHandle = @(t,theta) polyval(theta,t);
Задайте OptOptions
для IRFitOptions
.
OptOptions = optimoptions('lsqnonlin','display','iter');
Define fitFunction
.
CustomModel = IRFunctionCurve.fitFunction('Zero', CurveSettle, ... functionHandle,Instruments, IRFitOptions([.05 .05 .05],'FitType','price',... 'OptOptions',OptOptions));
Norm of First-order Iteration Func-count f(x) step optimality CG-iterations 0 4 38036.7 4.92e+04 1 8 38036.7 10 4.92e+04 0 2 12 38036.7 2.5 4.92e+04 0 3 16 38036.7 0.625 4.92e+04 0 4 20 38036.7 0.15625 4.92e+04 0 5 24 30741.5 0.0390625 1.72e+05 0 6 28 30741.5 0.078125 1.72e+05 0 7 32 30741.5 0.0195312 1.72e+05 0 8 36 28713.6 0.00488281 2.33e+05 0 9 40 20323.3 0.00976562 9.47e+05 0 10 44 20323.3 0.0195312 9.47e+05 0 11 48 20323.3 0.00488281 9.47e+05 0 12 52 20323.3 0.0012207 9.47e+05 0 13 56 19698.8 0.000305176 1.08e+06 0 14 60 17493 0.000610352 7e+06 0 15 64 17493 0.0012207 7e+06 0 16 68 17493 0.000305176 7e+06 0 17 72 15455.1 7.62939e-05 2.25e+07 0 18 76 15455.1 0.000177499 2.25e+07 0 19 80 13317.1 3.8147e-05 3.18e+07 0 20 84 12865.3 7.62939e-05 7.83e+07 0 21 88 11779.8 7.62939e-05 7.58e+06 0 22 92 11747.6 0.000152588 1.45e+05 0 23 96 11720.9 0.000305176 2.33e+05 0 24 100 11667.2 0.000610352 1.48e+05 0 25 104 11558.6 0.0012207 3.55e+05 0 26 108 11335.5 0.00244141 1.57e+05 0 27 112 10863.8 0.00488281 6.36e+05 0 28 116 9797.14 0.00976562 2.53e+05 0 29 120 6882.83 0.0195312 9.18e+05 0 30 124 6882.83 0.0373993 9.18e+05 0 31 128 3218.45 0.00934981 1.96e+06 0 32 132 612.703 0.0186996 3.01e+06 0 33 136 13.0998 0.0253882 3.05e+06 0 34 140 0.0762922 0.00154002 5.05e+04 0 35 144 0.0731652 3.61102e-06 29.9 0 36 148 0.0731652 6.32335e-08 0.063 0 Local minimum possible. lsqnonlin stopped because the final change in the sum of squares relative to its initial value is less than the default value of the function tolerance.
Постройте пользовательскую функцию, которая задана с помощью fitFunction
.
Yields = bndyield(CleanPrice,CouponRate,Settle(1),Maturity); scatter(Maturity,Yields); PlottingPoints = min(Maturity):30:max(Maturity); hold on; plot(PlottingPoints, getParYields(CustomModel, PlottingPoints),'r'); datetick legend('Market Yields','Fitted Yield Curve') title('Custom Function fit to Market Data')
IRBootStrapOptions
| IRDataCurve
| IRFunctionCurve
| IRFitOptions