В этом примере показано, как загрузить прямую кривую, используя другую кривую для дисконтирования.
Данные необходимы как для форвардной, так и для дисконтной кривой. Для этого конкретного примера предполагается, что данные предоставляются для EONIA (кривая дисконтирования) и EURIBOR (прямая кривая). Однако этот подход может использоваться в любом случае, когда создаваемая кривая отличается от кривой, используемой для дисконтирования денежных потоков. Несмотря на то, что данные в этом примере жестко закодированы, они также могут быть импортированы в MATLAB ® с помощью Datafeed Toolbox™ или Database Toolbox™ .
Settle = datenum('20-Aug-2013'); % Deposit data EONIADepositRates = [.0007 .00067]'; EONIADepositMat = datenum({'3-Sep-2013','20-Sep-2013'}); EONIADepositBasis = 2; % act/360 EONIADepositPeriod = 0; % FRA EONIAFRARates = [.00025 .0003 .00043 .00054]'; EONIAFRAStartDate = datenum({'11-Sep-2013','9-Oct-2013','13-Nov-2013','11-Dec-2013'}); EONIAFRAEndDate = datenum({'9-Oct-2013','13-Nov-2013','11-Dec-2013','11-Jan-2014'}); EONIAFRABasis = 2; % act/360 EONIAFRAPeriod = 0; % Swap data EONIASwapRates = [.0003 .001 .002 .004 .008 .012 .0155 .018 .0193 .02]'; EONIASwapMat = datemnth(Settle,12*[2:5 7 10 15 20 25 30]'); EONIASwapBasis = 5; % 30/360 ISDA EONIASwapPeriod = 1; % EURIBOR Deposit data EURIBORDepositRates = [.0022 .0021 .002 .0019]'; EURIBORDepositMat = datenum({'3-Sep-2013','20-Sep-2013','21-Oct-2013','20-Nov-2013'}); EURIBORDepositBasis = 2; % act/360 EURIBORDepositPeriod = 0; % EURIBOR Futures EURIBORFRARates = [9982 9978 9976 9975]'; EURIBORFRAStartDate = datenum({'18-Dec-2013','19-Mar-2014','18-Jun-2014','17-Sep-2014'}); EURIBORFRAEndDate = datenum({'18-Mar-2014','19-Jun-2014','18-Sep-2014','17-Dec-2014'}); EURIBORFRABasis = 2; % act/360 EURIBORFRAPeriod = 4; % EURIBOR Swap data EURIBORSwapRates = [.0026 .0044 .0062 .0082 .012 .015 .018 .02 .021 .0215]'; EURIBORSwapMat = datemnth(Settle,12*[2:5 7 10 15 20 25 30]'); EURIBORSwapBasis = 5; % 30/360 ISDA EURIBORSwapPeriod = 1;
Создайте кривую EONIA. Это по существу то же самое, что и в случае одиночной кривой.
CurveType = 'zero'; CurveCompounding = 1; CurveBasis = 3; % act/365 nEONIADeposits = length(EONIADepositMat); nEONIAFRA = length(EONIAFRAEndDate); nEONIASwaps = length(EONIASwapMat); EONIAInstrumentTypes = [repmat({'deposit'},nEONIADeposits,1); repmat({'fra'},nEONIAFRA,1);repmat({'swap'},nEONIASwaps,1)]; EONIAPeriod = [repmat(EONIADepositPeriod,nEONIADeposits,1); repmat(EONIAFRAPeriod,nEONIAFRA,1);repmat(EONIASwapPeriod,nEONIASwaps,1)]; EONIABasis = [repmat(EONIADepositBasis,nEONIADeposits,1); repmat(EONIAFRABasis,nEONIAFRA,1);repmat(EONIASwapBasis,nEONIASwaps,1)]; EONIAInstrumentData = [[repmat(Settle,[nEONIADeposits 1]);EONIAFRAStartDate;repmat(Settle,[nEONIASwaps 1])] ... [EONIADepositMat;EONIAFRAEndDate;EONIASwapMat] ... [EONIADepositRates;EONIAFRARates;EONIASwapRates]]; EONIACurve = IRDataCurve.bootstrap(CurveType,Settle,EONIAInstrumentTypes,... EONIAInstrumentData,'Compounding',CurveCompounding,'Basis',CurveBasis,... 'InstrumentPeriod',EONIAPeriod,'InstrumentBasis',EONIABasis)
EONIACurve = Type: zero Settle: 735466 (20-Aug-2013) Compounding: 1 Basis: 3 (actual/365) InterpMethod: linear Dates: [16x1 double] Data: [16x1 double]
Прямая кривая EURIBOR строится сначала с использованием подхода одной кривой.
nEURIBORDeposits = length(EURIBORDepositMat);
nEURIBORFRA = length(EURIBORFRAEndDate);
nEURIBORSwaps = length(EURIBORSwapMat);
EURIBORInstrumentTypes = [repmat({'deposit'},nEURIBORDeposits,1);
repmat({'futures'},nEURIBORFRA,1);repmat({'swap'},nEURIBORSwaps,1)];
EURIBORPeriod = [repmat(EURIBORDepositPeriod,nEURIBORDeposits,1);
repmat(EURIBORFRAPeriod,nEURIBORFRA,1);repmat(EURIBORSwapPeriod,nEURIBORSwaps,1)];
EURIBORBasis = [repmat(EURIBORDepositBasis,nEURIBORDeposits,1);
repmat(EURIBORFRABasis,nEURIBORFRA,1);repmat(EURIBORSwapBasis,nEURIBORSwaps,1)];
EURIBORInstrumentData = [repmat(Settle,size(EURIBORInstrumentTypes)) ...
[EURIBORDepositMat;EURIBORFRAEndDate;EURIBORSwapMat] ...
[EURIBORDepositRates;EURIBORFRARates;EURIBORSwapRates]];
EURIBORCurve_Single = IRDataCurve.bootstrap(CurveType,Settle,EURIBORInstrumentTypes,...
EURIBORInstrumentData,'Compounding',CurveCompounding,'Basis',CurveBasis,...
'InstrumentPeriod',EURIBORPeriod,'InstrumentBasis',EURIBORBasis)EURIBORCurve_Single = Type: zero Settle: 735466 (20-Aug-2013) Compounding: 1 Basis: 3 (actual/365) InterpMethod: linear Dates: [18x1 double] Data: [18x1 double]
Затем создайте кривую, используя кривую EONIA в качестве кривой дисконтирования. Для этого задайте кривую EONIA в качестве необязательного входного аргумента.
EURIBORCurve = IRDataCurve.bootstrap(CurveType,Settle,EURIBORInstrumentTypes,... EURIBORInstrumentData,'DiscountCurve',EONIACurve,'Compounding',... CurveCompounding,'Basis',CurveBasis,'InstrumentPeriod',EURIBORPeriod,... 'InstrumentBasis',EURIBORBasis)
EURIBORCurve = Type: zero Settle: 735466 (20-Aug-2013) Compounding: 1 Basis: 3 (actual/365) InterpMethod: linear Dates: [18x1 double] Data: [18x1 double]
Постройте график результатов для сравнения кривых.
PlottingDates = (Settle+20:30:Settle+365*30)'; TimeToMaturity = yearfrac(Settle,PlottingDates); figure plot(TimeToMaturity, getZeroRates(EONIACurve, PlottingDates),'b') hold on plot(TimeToMaturity, getZeroRates(EURIBORCurve_Single, PlottingDates),'r') plot(TimeToMaturity, getZeroRates(EURIBORCurve, PlottingDates),'g') title('Comparison of Single Curve and Dual Curve Bootstrapping') legend({'EONIA','EURIBOR','EURIBOR w/ EONIA Discounting'},'location','southeast')

Как и ожидалось, разница между двумя различными кривыми EURIBOR невелика, но нетривиальна.
Этот пример основан на следующих статьях и статьях журнала:
[1] Ametrano, F и Bianchetti, M., Все, что вы всегда хотели знать о загрузке кривой нескольких процентных ставок, но боялись спросить (2 апреля 2013 г.), доступно по адресу: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2219548.
[2] Бьянкетти, М., Две кривые, Одна цена, Журнал рисков, стр. 74-80, август 2010.
[3] Fujii, M, Shimada, Y, Takahashi, A., Примечание о построении нескольких кривых замены с обеспечением и без него (2 января 2010 г.), CARF Working Paper Series No. CARF-F-154, доступно по адресу: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=1440633.
[4] Mercurio, Fabio, процентные ставки и кредитный кризис: новые формулы и рыночные модели (5 февраля 2009 г.), Bloomberg Portfolio Research Paper № 2010-01-FRONTIERS.
[5] Нашиккар, А., Понимание дисконтирования OIS, Стратегия процентных ставок Barclays Capital, 24 февраля 2011 г.
bootstrap | floatbyzero | getZeroRates | IRDataCurve | swapbyzero