Создание объекта 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 Papers, Банк международных расчетов, № 25, октябрь 2005 г.

Пример

Этот пример использует IRFunctionCurve моделирование свободной от дефолта структуры процентных ставок в Соединенном Королевстве.

Загрузите данные:

load ukdata20080430

Конвертируйте ставки репо в эквивалентные нулевые купонные облигации:

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

The IRFunctionCurve объект предоставляет возможность подгонки кривой Нельсона-Зигеля к наблюдаемым рыночным данным с помощью fitNelsonSiegel способ. Подбор кривой выполняется вызовом функции lsqnonlin. Этот метод имеет необходимые входы 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для модели Свенссона, чтобы улучшить гибкость кривых и подгонку для модели Нельсона-Зигеля. В 1994 году Свенссон продлил функции Нельсона и Сигела, добавив ещё один термин, который позволяет второй «горб». Дополнительная точность достигается за счет добавления еще двух параметров, β3 и τ2, которые необходимо оценить.

Пример

В этом примере использования fitSvensson метод, IRFitOptions структура, ранее заданная с помощью IRFitOptions конструктор, используется. Таким образом, вы должны задать FitType, InitialGuess, UpperBound, LowerBound, и OptOptions параметры оптимизации для lsqnonlin.

Загрузите данные:

load ukdata20080430

Конвертируйте ставки репо в эквивалентные нулевые купонные облигации:

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, чтобы смоделировать структуру термина с помощью сплайна, в частности, структура термина представляет собой прямую кривую с кубическим сплайном.

Примечание

Для использования Toolbox™ необходимо иметь лицензию на программное обеспечение Curve Fitting fitSmoothingSpline способ.

Пример

The IRFunctionCurve объект используется для аппроксимации сглаживающего сплайна передней кривой с функцией штрафа. Требуемые входы Type, Settle, матрица Instruments, и Lambdafun, указатель на функцию, содержащий штрафную функцию

Загрузите данные:

load ukdata20080430

Конвертируйте ставки репо в эквивалентные нулевые купонные облигации:

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

Используйте fitSmoothinSpline метод для подгонки кривой процентной ставки и моделирования 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 для определения IRFitOptionsObj для поддержки InitialGuess для параметров функции кривой.

Пример

Следующий пример демонстрирует использование fitFunction с FunctionHandle и IRFitOptionsObj:

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

Определите 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')

См. также

| | |

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

Подробнее о

Внешние веб-сайты