bdttree - Tree building failed to converge for level 5 of BDT Tree

조회 수: 1 (최근 30일)
walle
walle 2017년 6월 22일
댓글: ww 2018년 6월 7일
I am trying to build a 5-year BDT tree (monthly step) using bdttree function. The risk free rate and volatility assumptions are in the attached file. I am getting a warning saying "Tree building failed to converge for level 5 of BDT Tree". If I use quarterly step, there is no problem. However, I have to use monthly step to capture optionality of the instrument I am trying to value, but it does not work. I have pasted my code below. Could anyone help me understand what the problem is and how to fix it? Thanks!
if true
% code
%%Contractual Terms
valDate = datenum('4/13/2017');
IssueDate = datenum('4/13/2017');
FirstCouponDate = datenum('5/5/2017');
MaturityDate = datenum('4/13/2022');
freq = 12;
%%Risk-free rates & Vols
data = csvread('bdttree inputs.csv',1,0);
data_rates = data(:,2)/100;
data_vols = data(:,3)/100;
data_term = data(:,1);
data_rates = freq*((1+data_rates).^(1/freq)-1);
%%Construct BDT tree
bdtDates = cfdates(valDate, MaturityDate, freq, 1,1,IssueDate,FirstCouponDate)';
t = yearfrac(valDate,bdtDates,1);
Rates = interp1(data_term, data_rates, t,'linear');
Vols = spline(data_term, data_vols, t);
BDTVolSpec = bdtvolspec(valDate, bdtDates, Vols);
RateSpec = intenvset('Compounding', freq,...
'ValuationDate', valDate,...
'StartDates', valDate,...
'EndDates', bdtDates,...
'Rates', Rates);
BDTTimeSpec = bdttimespec(valDate, bdtDates, freq);
BDTTree = bdttree(BDTVolSpec, RateSpec, BDTTimeSpec);
end

채택된 답변

Kawee Numpacharoen
Kawee Numpacharoen 2017년 8월 8일
I have looked at your code. First, it is important to know that we may not be able to have a feasible solution all the time. The error you got is "Tree building failed to converge". After looking at the data, my initial guess is volatility might cause the problems as it ranges from >200% to 40%. I try replace volatility with smaller number after csvread.
data(:,3) = [5:0.5:10.5]';
Then you code can run.
  댓글 수: 2
ww
ww 2018년 6월 7일
I always have the same issue when I'm trying to build the BDT tree in matlab, too.
dToday = '30-Dec-2015';
% conventions
bdc = 'follow';
dc = 3; % Actual/365
Compounding = 1; % Annual compounding
% holidays
H = []
% ---------------------------------------
% generate the settlement dates
% ---------------------------------------
dnToday = datenum(dToday);
dnSpot = busdate( addtodate(dnToday, 2, 'day'), bdc, H );
dn1m = busdate( addtodate(dnSpot, 1, 'month'), bdc, H );
dn3m = busdate( addtodate(dnSpot, 3, 'month'), bdc, H );
dn6m = busdate( addtodate(dnSpot, 6, 'month'), bdc, H );
dn9m = busdate( addtodate(dnSpot, 9, 'month'), bdc, H );
dn1y = busdate( addtodate(dnSpot, 1, 'year' ), bdc, H );
dn2y = busdate( addtodate(dnSpot, 2, 'year' ), bdc, H );
dn3y = busdate( addtodate(dnSpot, 3, 'year' ), bdc, H );
dn4y = busdate( addtodate(dnSpot, 4, 'year' ), bdc, H );
dn5y = busdate( addtodate(dnSpot, 5, 'year' ), bdc, H );
dn6y = busdate( addtodate(dnSpot, 6, 'year' ), bdc, H );
dn7y = busdate( addtodate(dnSpot, 7, 'year' ), bdc, H );
dn8y = busdate( addtodate(dnSpot, 8, 'year' ), bdc, H );
dn9y = busdate( addtodate(dnSpot, 9, 'year' ), bdc, H );
dn10y = busdate( addtodate(dnSpot, 10, 'year' ), bdc, H );
dn11y = busdate( addtodate(dnSpot, 11, 'year' ), bdc, H );
dn12y = busdate( addtodate(dnSpot, 12, 'year' ), bdc, H );
dn13y = busdate( addtodate(dnSpot, 13, 'year' ), bdc, H );
dn14y = busdate( addtodate(dnSpot, 14, 'year' ), bdc, H );
dn15y = busdate( addtodate(dnSpot, 15, 'year' ), bdc, H );
dn16y = busdate( addtodate(dnSpot, 16, 'year' ), bdc, H );
dn17y = busdate( addtodate(dnSpot, 17, 'year' ), bdc, H );
dn18y = busdate( addtodate(dnSpot, 18, 'year' ), bdc, H );
dn19y = busdate( addtodate(dnSpot, 19, 'year' ), bdc, H );
dn20y = busdate( addtodate(dnSpot, 20, 'year' ), bdc, H );
d1m = datestr(dn1m);
d3m = datestr(dn3m);
d6m = datestr(dn6m);
d9m = datestr(dn9m);
d1y = datestr(dn1y);
d2y = datestr(dn2y);
d3y = datestr(dn3y);
d4y = datestr(dn4y);
d5y = datestr(dn5y);
d6y = datestr(dn6y);
d7y = datestr(dn7y);
d8y = datestr(dn8y);
d9y = datestr(dn9y);
d10y = datestr(dn10y);
d11y = datestr(dn11y);
d12y = datestr(dn12y);
d13y = datestr(dn13y);
d14y = datestr(dn14y);
d15y = datestr(dn15y);
d16y = datestr(dn16y);
d17y = datestr(dn17y);
d18y = datestr(dn18y);
d19y = datestr(dn19y);
d20y = datestr(dn20y);
% ---------------------------------------
% yield curves
% ---------------------------------------
% 'InstrumentPeriod', 2, 'InstrumentBasis', dc
TenorTypes = { ...
'Deposit';'Deposit';'Deposit';'Deposit'; ...
'Swap';'Swap';'Swap';'Swap';'Swap';'Swap';'Swap';'Swap';'Swap'};
TenorRates = [
dn1m, 0.0150;
dn3m, 0.0150;
dn6m, 0.0151;
dn1y, 0.0150;
dn2y, 0.0159;
dn3y, 0.0174;
dn4y, 0.0183;
dn5y, 0.0224;
dn7y, 0.0240;
dn10y, 0.0257;
dn12y, 0.0287;
dn15y, 0.0307;
dn20y, 0.0362;
];
ZeroRates = IRBootstrap(dnToday, TenorRates, TenorTypes, dc);
ZeroRates = TenorRates(:,2);
% ---------------------------------------
% volatilities
% ---------------------------------------
vol = [
dn1m, 0.0418;
dn3m, 0.0418;
dn6m, 0.0418;
dn1y, 0.0418;
dn2y, 0.0418;
dn3y, 0.0418;
dn4y, 0.0418;
dn5y, 0.0418;
dn7y, 0.0418;
dn10y, 0.0418;
dn12y, 0.0418;
dn15y, 0.0418;
dn20y, 0.0418;
];
% ---------------------------------------
% build the BDT trees
% ---------------------------------------
BDTdt = 1; % days
BDTEndDate = dn160;
timespec = (dnToday+BDTdt:BDTdt:BDTEndDate);
BDTTS = bdttimespec(dnToday, timespec, 1);
BDTVS = bdtvolspec(dnToday, vol(:,1), vol(:,2));
RS = intenvset( ...
'ValuationDate', dnToday, 'StartDates', dnToday, ...
'EndDates', TenorRates(:,1), 'Rates', ZeroRates, ...
'Compounding', -1 ...
);
BDTT = bdttree(BDTVS, RS, BDTTS);
For this simple case with flat volatility term structure, it still fail. Anyways, it seems to be ok when BDTdt is greater than 20. But I still have no idea how to fix it systematically and how to get exact BDT tree I want. What are the criteria to successfully build the BDT tree? What volatility convention is used in bdtvolspec? Annualized vol? Forward vol?
ww
ww 2018년 6월 7일
sorry for the missing code:
dn160 = busdate( addtodate(dnSpot, 6*32, 'month'), bdc, H );

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by