В этом примере показано, как смоделировать предоплату в MATLAB ® с помощью функциональности из Financial Instruments Toolbox™. В частности, изменение модели предоплаты Ричарда и Ролла реализована с использованием двухфакторной модели процентной ставки Халла-Уайта и рыночной модели LIBOR для моделирования будущих путей процентной ставки. Обеспеченность, поддерживаемая ипотекой, оценивается как с помощью пользовательских, так и с помощью моделей предоплаты по умолчанию.
Моделирование предоплаты имеет решающее значение для анализа ипотечных ценных бумаг (MBS). Предоплаты отдельными ипотечными держателями влияют как на размер, так и на сроки денежных потоков - а для залоговых ипотечных обязательств (для примера, только ценных бумаг с процентами) предоплата может сильно повлиять на значение ценных бумаг.
Наиболее базовой моделью предоплаты является модель Public Securities Association (PSA), которая принимает фазу увеличения и затем постоянную условную ставку предоплаты (CPR). Модель PSA может быть сгенерирована в MATLAB с помощью функции Financial Instruments Toolbox psaspeed2rate
.
G2PP_CPR = psaspeed2rate([100 200]); figure plot(G2PP_CPR) title('100 and 200 PSA Prepayment Speeds') xlabel('Months') ylabel('CPR') ylim([0 .14]) legend({'100 PSA','200 PSA'}, 'Location', 'Best')
MBS, анализируемый в этом примере, созревает в 2020 году и имеет свойства, описанные в этом разделе. Денежные потоки генерируются для скорости предоплаты PSA просто путем ввода скорости PSA в качестве входного параметра.
% Parameters for MBS passthrough to be priced Settle = datenum('15-Dec-2007'); Maturity = datenum('15-Dec-2020'); IssueDate = datenum('15-Dec-2000'); GrossRate = .0475; CouponRate = .045; Delay = 14; Period = 12; Basis = 4; % Generate cash flows and dates for baseline case using 100 PSA [CFlowAmounts, CFlowDates] = mbscfamounts(Settle,Maturity, IssueDate,... GrossRate, CouponRate, Delay,100); CFlowTimes = yearfrac(Settle,CFlowDates); NumCouponsRemaining = cpncount(Settle, Maturity, Period,Basis, 1, IssueDate);
Хотя моделирование предоплаты часто включает комплексное и сложное моделирование, часто на уровне кредита, этот пример использует слегка измененный подход, основанный на модели, предложенной Ричардом и Роллом в [6].
Модель предоплаты Richard and Roll включает следующие факторы:
Стимулирование рефинансирования
Сезонность (месяц года)
Приправа или возраст ипотеки
Перегорание
Ричард и Крен предлагают мультипликативную модель следующего:
Для пользовательской модели в этом примере мультипликатор Burnout, который описывает тенденцию предоплаты к замедлению, когда значительное число домовладельцев уже рефинансировали, игнорируется, и используются первые три условия.
Стимул рефинансирования является функцией отношения купонной ставки ипотеки к доступной ипотечной ставке в эту конкретную точку времени. Для примера Управление по надзору за безопасностью (OTS) предлагает следующую модель:
Стимул рефинансирования требует симуляции будущих процентных ставок. Это будет рассмотрено ниже в этом примере.
C_M = .1:.1:2; G2PP_Refi = .2406 - .1389 * atan(5.952*(1.089 - C_M)); figure plot(C_M,G2PP_Refi) xlabel('Coupon/Mortgage Rate') ylabel('CPR') title('Refinancing Incentive')
Приправа фиксирует тенденцию к увеличению предоплаты в начале ипотеки перед выравниванием. OTS моделирует множитель приправы следующим образом:
Seasoning = ones(360,1); Seasoning(1:29) = (1:29)/30; figure plot(Seasoning) xlim([1 360]) title('Seasoning Multiplier') xlabel('Months')
Множитель сезонности просто моделирует сезонное поведение предоплат - эти данные основаны на фигуре 3 [6], который относится к поведению Ginnie Mae 30-летнего, односемейного MBS.
Seasonality = [.94 .76 .73 .96 .98 .92 .99 1.1 1.18 1.21 1.23 .97]; figure plot(Seasonality) xlim([1 12]) ax = gca; ax.XTick = 1:12; ax.XTickLabel = {'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug', ... 'Sep','Oct','Nov','Dec'}; title('Seasonality Multiplier')
Поскольку стимул рефинансирования требует симуляции будущих процентных ставок, должна использоваться модель процентной ставки. Одним из вариантов является двухфакторная аддитивная Гауссова модель, называемая G2 + + Brigo и Mercurio [2].
Модель процентной ставки G2 + +:
где - двумерное броуновское движение с корреляцией
и является короткой скоростью, и являются средними константами реверсии и и являются константами волатильности, и является рыночной форвардной скоростью или форвардной скоростью, наблюдаемой на дату расчета.
Рыночная модель LIBOR (LMM) отличается от короткоскоростных моделей тем, что развивает набор дискретных форвардных скоростей. В частности, lognormal LMM задает следующее уравнение диффузии для каждой прямой скорости:
где
dW является N-мерным геометрическим броуновским движением со:
LMM связывает дрейфы форвардных скоростей на основе аргументов без арбитража. В частности, в соответствии с мерой Spot LIBOR дрейфы выражаются следующим образом:
где
- временная дробь, связанная с i-й прямой скоростью
и числитель Spot LIBOR определяется как следующее:
Учитывая вышесказанное, выбор с LMM заключается в том, как смоделировать волатильность и корреляцию.
Волатильность скоростей может быть смоделирована с стохастической волатильностью, но для этого примера используется детерминированная волатильность, и поэтому необходимо задать функциональную форму. Одной из наиболее популярных функциональных форм в литературе является следующая:
where корректирует кривую так, чтобы она совпадала с волатильностью для прямой скорости.
Точно так же должна быть задана корреляция между форвардными скоростями. Это может быть оценено из исторических данных или подобрано для опции цен. В данном примере будет использоваться следующая функциональная форма:
После определения волатильности и корреляции параметры должны быть откалиброваны - это можно сделать с помощью исторических или рыночных данных, обычно свопционов или крышек/перекрытий. В данном примере мы просто используем разумные оценки для параметров корреляции и волатильности.
% The volatility function to be used -- and one choice for the parameters LMMVolFunc = @(a,t) (a(1)*t + a(2)).*exp(-a(3)*t) + a(4); LMMVolParams = [.13 .04 .7 .08]; % Volatility specification fplot(@(t) LMMVolFunc(LMMVolParams,t),[0 10]) title(['Volatility Function with parameters ' mat2str(LMMVolParams)]) ylabel('Volatility (%)') xlabel('Tenor (years)')
Параметры в модели G2 + + могут быть калиброваны по рыночным данным. Как правило, параметры калибруются по наблюдаемым прописным буквам процентных ставок, полу и/или свопции. В настоящее время данные прописной буквы используются для калибровки.
Эти данные являются жесткими, но могут быть импортированы в MATLAB с помощью Toolbox™ Database Toolbox™ или Datafeed.
% Zero Curve -- this data is hardcoded for now, but could be bootstrapped % using the |bootstrap| method of |IRDataCurve|. ZeroTimes = [3/12 6/12 1 5 7 10 20 30]'; ZeroRates = [0.033 0.034 0.035 0.040 0.042 0.044 0.048 0.0475]'; ZeroDates = daysadd(Settle,360*ZeroTimes,1); DiscountRates = zero2disc(ZeroRates,ZeroDates,Settle); irdc = IRDataCurve('Zero',Settle,ZeroDates,ZeroRates); figure plot(ZeroDates,ZeroRates) datetick title(['US Zero Curve for ' datestr(Settle)]) % Cap Data Reset = 2; Notional = 100; CapMaturity = daysadd(Settle,360*[1:5 7 10 15 20 25 30],1); CapVolatility = [.28 .30 .32 .31 .30 .27 .23 .2 .18 .17 .165]'; % ATM strikes could be computed with swapbyzero Strike = [0.0353 0.0366 0.0378 0.0390 0.0402 0.0421 0.0439 ... 0.0456 0.0471 0.0471 0.0471]'; % This could be computed with capbyblk BlackCapPrices = [0.1532 0.6416 1.3366 2.0290 2.7366 4.2960 6.5992 ... 9.6787 12.2580 14.0969 15.7873]'; figure scatter(CapMaturity,CapVolatility) datetick title(['ATM Volatility for Caps on ' datestr(Settle)])
Для калибровки параметров модели будет найден набор параметров, который минимизирует сумму квадратов различий между предсказанными значениями Cap G2 + + и наблюдаемыми значениями Black Cap. Функция Optimization Toolbox™ lsqnonlin
используется в этом примере, хотя другие подходы (например, глобальная оптимизация) также могут быть применимы. Функция capbylg2f
вычисляет аналитические значения для прописных букв параметров.
Верхняя и нижняя границы для параметров модели заданы как относительно ограниченные. Как обсуждают Бриго и Меркурио, параметр корреляции,, может часто быть близок к -1
при подгонке модели G2 + + к ценам прописной буквы процентных ставок. Поэтому ограничено находиться между -.7
и .7
чтобы гарантировать, что параметры представляют действительно двухфакторную модель. Оставшиеся средние параметры реверсии и волатильности ограничены, чтобы быть между 0
и .5
. Калибровка остается сложной задачей, и хотя график ниже указывает, что параметры наилучшего соответствия, по-видимому, выполняют достаточно хорошую работу по воспроизведению цен прописная буква, следует отметить, что процедура, изложенная здесь, просто представляет собой один подход.
% Call to lsqnonlin to calibrate parameters objfun = @(x) BlackCapPrices - capbylg2f(irdc,x(1),x(2),x(3),x(4),x(5),Strike,CapMaturity); x0 = [.5 .05 .1 .01 -.1]; lb = [0 0 0 0 -.7]; ub = [.5 .5 .5 .5 .7]; G2PP_Params = lsqnonlin(objfun,x0,lb,ub); a = G2PP_Params(1); b = G2PP_Params(2); sigma = G2PP_Params(3); eta = G2PP_Params(4); rho = G2PP_Params(5); % Compare the results figure scatter(CapMaturity,BlackCapPrices) hold on scatter(CapMaturity,capbylg2f(irdc,a,b,sigma,eta,rho,Strike,CapMaturity),'rx') datetick title('Market and Model Implied Prices') ylabel('Price ($)')
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.
The LinearGaussian2F
модель может использоваться, чтобы задать модель G2 + + и симулировать будущие пути процентных ставок.
% G2++ model from Brigo and Mercurio with time homogeneous volatility % parameters G2PP = LinearGaussian2F(irdc,a,b,sigma,eta,rho);
После того, как волатильность и корреляция были калиброваны, симуляция Монте-Карло используется для развития скоростей вперед во времени. The LiborMarketModel
объект используется для моделирования форвардных скоростей.
Хотя уменьшение фактора часто используется с LMM для уменьшения вычислительной сложности, в этом примере нет сокращения фактора.
6M LIBOR выбраны, чтобы развиваться в этой симуляции. Поскольку ежемесячный вектор предоплаты должен быть вычислен, интерполяция используется, чтобы сгенерировать промежуточные ставки. Используется простая линейная интерполяция.
numForwardRates = 46; % Instead of being fit, VolPhi is simply hard-coded -- % representative of a declining volatility over time. VolPhi = linspace(1.2,.8,numForwardRates-1)'; Beta = .08; CorrFunc = @(i,j,Beta) exp(-Beta*abs(i-j)); CorrMat = CorrFunc(meshgrid(1:numForwardRates-1)',meshgrid(1:numForwardRates-1),Beta); VolFunc = cell(length(VolPhi),1); for jdx = 1:length(VolPhi) VolFunc(jdx) = {@(t) VolPhi(jdx)*ones(size(t)).*(LMMVolParams(1)*t + ... LMMVolParams(2)).*exp(-LMMVolParams(3)*t) + LMMVolParams(4)}; end LMM = LiborMarketModel(irdc,VolFunc,CorrMat);
Различные пути процентной ставки могут быть симулированы путем вызова simTermStructs
способ.
Одно ограничение для двухфакторных Гауссовых моделей, подобных этой, заключается в том, что это позволяет отрицательные процентные ставки. Это вызывает озабоченность, особенно в условиях низких процентных ставок. Чтобы решить эту возможность, любые пути процентной ставки с отрицательными ставками просто отклоняются.
nPeriods = NumCouponsRemaining; nTrials = 100; DeltaTime = 1/12; % Generate factors and short rates Tenor = [1/12 1 2 3 4 5 7 10 15 20 30]; G2PP_SimZeroRates = G2PP.simTermStructs(nPeriods,'NTRIALS',nTrials,... 'Tenor',Tenor,'DeltaTime',DeltaTime); SimDates = daysadd(Settle,360*DeltaTime*(0:nPeriods),1); % Tenors that will be recovered for each simulation date. The stepsize is % included here to facilitate computing a discount factor for each % simulation path. % Remove any paths that go negative NegIdx = squeeze(any(any(G2PP_SimZeroRates < 0,1),2)); G2PP_SimZeroRates(:,:,NegIdx) = []; nTrials = size(G2PP_SimZeroRates,3); % Plot evolution of one sample path trialIdx = 1; figure surf(Tenor,SimDates,G2PP_SimZeroRates(:,:,trialIdx)) datetick y keepticks keeplimits title(['Evolution of the Zero Curve for Trial:' num2str(trialIdx) ' of G2++ Model']) xlabel('Tenor (Years)')
Различные пути процентной ставки могут быть симулированы путем вызова simTermStructs
метод LiborMarketModel
объект.
LMMPeriod = 2; % Semi-annual rates LMMNumPeriods = NumCouponsRemaining/12*LMMPeriod; % Number of semi-annual periods LMMDeltaTime = 1/LMMPeriod; LMMNTRIALS = 100; % Simulate [LMMZeroRates, LMMForwardRates] = LMM.simTermStructs(LMMNumPeriods,'nTrials',LMMNTRIALS,'DeltaTime',LMMDeltaTime); ForwardTimes = 1/2:1/2:numForwardRates/2; LMMSimTimes = 0:1/LMMPeriod:LMMNumPeriods/LMMPeriod; % Plot evolution of one sample path trialIdx = 1; figure tmpPlotData = LMMZeroRates(:,:,trialIdx); tmpPlotData(tmpPlotData == 0) = NaN; surf(ForwardTimes,LMMSimTimes,tmpPlotData) title(['Evolution of the Zero Curve for Trial:' num2str(trialIdx) ' of LIBOR Market Model']) xlabel('Tenor (Years)')
После моделирования путей процентной ставки необходимо вычислить ипотечную ставку - один из подходов, обсуждаемый [7], заключается в вычислении ипотечной ставки из комбинации двухлетней и десятилетней ставок.
В данном примере используется следующее:
% Compute mortgage rates from interest rate paths TwoYearRates = squeeze(G2PP_SimZeroRates(:,Tenor == 2,:)); TenYearRates = squeeze(G2PP_SimZeroRates(:,Tenor == 7,:)); G2PP_MortgageRates = .024 + .2*TwoYearRates + .6*TenYearRates; LMMMortgageRates = squeeze(.024 + .2*LMMZeroRates(:,4,:) + .6*LMMZeroRates(:,20,:)); LMMDiscountFactors = squeeze(cumprod(1./(1 + LMMZeroRates(:,1,:)*.5))); % Interpolate to get monthly mortgage rates MonthlySimTimes = 0:1/12:LMMNumPeriods/LMMPeriod; LMMMonthlyMortgageRates = zeros(nPeriods+1,LMMNTRIALS); LMMMonthlyDF = zeros(nPeriods+1,LMMNTRIALS); for trialidx = 1:LMMNTRIALS LMMMonthlyMortgageRates(:,trialidx) = interp1(LMMSimTimes,LMMMortgageRates(:,trialidx),MonthlySimTimes,'linear','extrap'); LMMMonthlyDF(:,trialidx) = interp1(LMMSimTimes,LMMDiscountFactors(:,trialidx),MonthlySimTimes,'linear','extrap'); end
После моделирования ипотечных ставок CPR может быть вычислен из мультипликативной модели для каждого пути процентной ставки.
% Compute Seasoning and Refinancing Multipliers Seasoning = ones(nPeriods+1,1); Seasoning(1:30) = 1/30*(1:30); G2PP_Refi = .2406 - .1389 * atan(5.952*(1.089 - CouponRate./G2PP_MortgageRates)); LMM_Refi = .2406 - .1389 * atan(5.952*(1.089 - CouponRate./LMMMonthlyMortgageRates)); % CPR is simply computed by evaluating the multiplicative model G2PP_CPR = bsxfun(@times,G2PP_Refi,Seasoning.*(Seasonality(month(CFlowDates))')); LMM_CPR = bsxfun(@times,LMM_Refi,Seasoning.*(Seasonality(month(CFlowDates))')); % Compute single monthly mortality (SMM) from CPR G2PP_SMM = 1 - (1 - G2PP_CPR).^(1/12); LMM_SMM = 1 - (1 - LMM_CPR).^(1/12); % Plot CPR's against 100 PSA CPR_PSA100 = psaspeed2rate(100); figure PSA_handle = plot(CPR_PSA100(1:nPeriods),'rx'); hold on G2PP_handle = plot(G2PP_CPR,'b'); LMM_handle = plot(LMM_CPR,'g'); title('Prepayment Speeds') legend([PSA_handle(1) G2PP_handle(1) LMM_handle(1)],{'100 PSA','G2PP CPR','LMM CPR'},'Location', 'Best');
С вектором ежемесячной смертности (SMM), вычисленным для каждого пути процентной ставки, денежные потоки для MBS могут быть вычислены и дисконтированы.
% Compute the baseline zero rate at each cash flow time CFlowZero = interp1(ZeroTimes,ZeroRates,CFlowTimes,'linear','extrap'); % Compute DF for each cash flow time CFlowDF_Zero = zero2disc(CFlowZero,CFlowDates,Settle); % Compute the price of the MBS using the zero curve Price_Zero = CFlowAmounts*CFlowDF_Zero'; % Generate the cash flows for each IR Path G2PP_CFlowAmounts = mbscfamounts(Settle, ... repmat(Maturity,1,nTrials), IssueDate, GrossRate, CouponRate, Delay, [], G2PP_SMM(2:end,:)); % Compute the DF for each IR path G2PP_CFlowDFSim = cumprod(exp(squeeze(-G2PP_SimZeroRates(:,1,:).*DeltaTime))); % Present value the cash flows for each MBS G2PP_Price_Ind = sum(G2PP_CFlowAmounts.*G2PP_CFlowDFSim',2); G2PP_Price = mean(G2PP_Price_Ind); % Repeat for LMM LMM_CFlowAmounts = mbscfamounts(Settle, ... repmat(Maturity,1,LMMNTRIALS), IssueDate, GrossRate, CouponRate, Delay, [], LMM_SMM(2:end,:)); % Present value the cash flows for each MBS LMM_Price_Ind = sum(LMM_CFlowAmounts.*LMMMonthlyDF',2); LMM_Price = mean(LMM_Price_Ind);
Можно сравнить результаты различных подходов. Количество испытаний для модели G2 + + обычно будет меньше 100 из-за фильтрации любых путей, которые приводят к отрицательным процентным ставкам.
Кроме того, хотя количество испытаний для модели G2 + + в этом примере установлено, чтобы быть 100, часто случается, что для получения точной оценки необходимо запустить большее количество симуляций.
fprintf(' # of Monte Carlo Trials: %8d\n' , nTrials) fprintf(' # of Time Periods/Trial: %8d\n\n' , nPeriods) fprintf(' MBS Price with PSA 100: %8.4f\n' , Price_Zero) fprintf(' MBS Price with Custom G2PP Prepayment Model: %8.4f\n\n', G2PP_Price) fprintf(' MBS Price with Custom LMM Prepayment Model: %8.4f\n\n', LMM_Price)
# of Monte Carlo Trials: 72 # of Time Periods/Trial: 156 MBS Price with PSA 100: 1.0187 MBS Price with Custom G2PP Prepayment Model: 0.9884 MBS Price with Custom LMM Prepayment Model: 0.9993
В этом примере показано, как калибровать и симулировать модель процентной ставки G2 + + и как использовать сгенерированные пути процентной ставки в модели предоплаты свободно на основе модели Ричарда и Крена. Этот пример также предоставляет полезную начальную точку для использования моделей процентных ставок G2 + + и LMM в других финансовых приложениях.
Этот пример основан на следующих книгах, бумагах и журнальных статьях:
Андерсен, Л. и В. Питербарг (2010). Моделирование процентных ставок, Atlantic Financial Press.
Бриго, Д. и Ф. Меркурио (2001). Модели процентных ставок - теория и практика с улыбкой, инфляцией и кредитом (2-е изд. 2006 изд.). Springer Verlag. ISBN 978-3-540-22149-4.
Hayre, L, ed., Salomon Smith Barney Guide to Mortgage-Backed and Asset-Backed Securities. Нью-Йорк: John Wiley & Sons, 2001b
Karpishpan, Y., O. Turel, and A. Hasha, Введение модели структуры терминов Citi LMM для ипотеки, Журнал фиксированного дохода, том 20 (2010) 44-58.
Rebonato, R., K. McKay, and R. White (2010). Модель рынка Sabr/Libor: ценообразование, калибровка и хеджирование для сложных производных по процентным ставкам. Джон Уайли и сыновья.
Richard, S. F. and R. Roll, 1989, «Предоплата по ипотечным ценным бумагам с фиксированной ставкой», Journal of Portfolio Management.
Управление по надзору за коммерческой деятельностью, «Руководство по модели чистого портфельного значения», март 2000 года.
Stein, H. J., Belikoff, A. L., Levin, K. and Tian, X., Анализ ипотечных обеспеченных ценных бумаг: до и после кредитного кризиса (5 января 2007). Границы кредитного риска: кризис притока, ценообразование и хеджирование, CVA, MBS, рейтинги и ликвидность; Билецкий, Томаш,; Damiano Brigo and Frederic Patras, eds., February 2011. Доступно в SSRN: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=955358
mbscfamounts
| mbsconvp
| mbsconvy
| mbsdurp
| mbsdury
| mbsnoprepay
| mbsoas2price
| mbsoas2yield
| mbspassthrough
| mbsprice
| mbsprice2oas
| mbsprice2speed
| mbswal
| mbsyield
| mbsyield2oas
| mbsyield2speed
| psaspeed2default
| psaspeed2rate