## IBTdk (MatLab R2007b)

starting program to calculate the stock price on the nodes in the implied tree, the transition probability tree, the Arrow-Debreu tree and local volatility using Derman and Kani's method. Required by XFGIBT01.m and XFGIBT02.m.

Click the button to demonstrate a graph view.
Notice: This content requires Java Runtime Environment.
Java Applet and JavaScript should be allowed on your browser.

Fri, July 27 2012 by Dedy Dwi Prastyo

`[S,AD,p,LV] = IBTdk(S0, r, t, n, func)`

- Price of underlying asset, Interest rate, Time to expiration, Number of steps, Type of function for implied volatility

Description: [S, AD ,p ,LV] = IBTdk(100, 0.05, 3, 3, 2); Stree = IBTresort(S) ADtree = IBTresort(AD) Ptree = IBTresort(p) LVtree = IBTresort(LV)

```function [Smat,ADmat,pmat,LVmat] = IBTdk(s0, r, t, n, func);
if s0<=0
disp('IBTdk: Price of Underlying Asset should be positive! Please input again')
s0=input('s0=');
end
if (r<0 || r>1)
disp('IBTdk: Interest rate need to be between 0 and 1! Please input again')
sig=input('r=');
end
if t<=0
disp('IBTdk: Time to expiration should be positive! Please input again')
t=input('t=');
end
if n<1
disp('IBTdk: Number of steps should be at least equal to 1! Please input again')
n=input('n=');
end
if (n>150)	   % Constraint of n, otherwise it will take too much time
n=input('n=');
end
dt=t/n;
Smat=zeros(n+1,n+1);        % Stock price at nodes
Smat(1,1)=s0;               % First node equals the underlying price
ADmat(1,1)=1;               % First Arrow-Debreu price equals 1
pmat=zeros(n,n);            % Transition probabilites
infl = exp(r*dt);
for i=1:n;
%******   Step 1 : Find central nodes of stock tree *************************
if mod(i,2)==0;         %(i+1) is odd
mi=(i/2+1);
Smat(mi,i+1)=s0;    %center point price set to spot
if (s0 < infl*Smat(mi-1,i)|| s0>infl*Smat(mi,i))
Smat(mi, i+1) = infl*(Smat(mi-1,i)+Smat(mi,i))/2;
end
lnode=mi;
llnode=mi;
else                    % (i+1) is even
%%%%% find the upper and the lower node
mi=round((i+1)/2);
Call_Put_Flag=1;    % 1 for call/0 for put
S=Smat(mi,i);      % S_n^i
sigma = IBTimpliedvola(s0,S,i*dt,func);             % func=1 for interpolation, else a parabola
C=IBTcrr(s0,S,r,sigma,i*dt,i,Call_Put_Flag);        % Call price from BS model
rho_u=0;
if (mi+1)<=i;
end
Sl=S^2/Su;                                                              % Lower node
%%%%%%% Compensation %%%%%%%%
if ((mi==1)&& (Su<infl*S || Sl>infl*S))
disp('IBTdk: Sorry that in the condition of interest rate being higher than volatility, this method cannot give definite output and will terminate automatically')
r=input('r=');
end
%%%%%%% Compensation %%%%%%%%%
if ((mi>1) && (Su<infl*S || Sl<infl*S))
Su = sqrt(S^3/Smat(mi-1,i));
Sl = S^2/Su;
end
if (mi<i) && (mi>1);
if (Su>infl*Smat(mi+1,i)||Sl<infl*Smat(mi-1,i));
Su = sqrt(S^3/Smat(mi-1,i));
Sl = S^2/Su;
end
if (Su>infl*Smat(mi+1,i)||Su<infl*S);
Su = infl*(S+Smat(mi+1,i))/2;
end
if (Sl > infl*S||Sl<infl*Smat(mi-1,i));
Sl = infl*(S+Smat(mi-1,i))/2;
end
end
Smat(mi+1,i+1) = Su;
Smat(mi,i+1) = Sl;
lnode=mi+1;
llnode=mi;
end
%******   Step 2 : Find upper nodes of stock tree *************************
for j=(lnode+1):1:(i+1);
Call_Put_Flag=1;            % Call price
S=Smat(j-1,i);              % S_n^i, i=j-1, i^1 = j
sigma = IBTimpliedvola(s0,S,i*dt,func);              % func=1 for interpolation, else a parabola
C=IBTcrr(s0,S,r,sigma,i*dt,i,Call_Put_Flag);    % Call price from BS model
rho_u=0;
if j<=i
end
F=S*infl;
%%%% Compensation %%%%%%%
if j<=i
if (Su > infl*Smat(j,i) || Su< infl*S);
Su = Smat(j,i)* Smat(j-1,i+1)/Smat(j-1,i);
end
if (Su > infl*Smat(j,i) || Su< infl*S);
Su = infl*(Smat(j,i)+S)/2;
end
else
if Su > S*exp(2*sigma*sqrt(dt))|| Su< infl*S;
disp('compensation j>=i')
Su = S*Smat(j-1,i+1)/Smat(j-2,i);
end
end
Smat(j,i+1) = Su;
end
%******   Step 3 : Find lower nodes of stock tree *************************
for j=(llnode-1):-1:1
Call_Put_Flag=0;            % Put price
S=Smat(j,i);                % S_n^i
sigma= IBTimpliedvola(s0,S,i*dt,func);               % func=1 for interpolation, else a parabola
P=IBTcrr(s0,S,r,sigma,i*dt,i,Call_Put_Flag);    % Put price from BS model
rho_l=0;
if j>1
end
F=S*infl;
%%%%%% Compensation %%%%%%%%%
if (j>1)
if (Sl < infl* Smat(j-1,i) || Sl > infl * S);
Sl = Smat(j-1,i)*Smat(j+1,i+1)/S;
end
if (Sl < infl* Smat(j-1,i) || Sl > infl * S);
Sl = infl* (Smat(j-1,i)+S)/2;
end
else
if(Sl>infl*S || Sl< S*exp(-2*sigma*sqrt(dt)));
Sl = S* Smat(j+1,i+1)/Smat(j+1,i);
end
end
Smat(j,i+1) = Sl;
end
%******   Step 4 : Find nodes of probability and Arrow Debreu tree *************************
%%%%%%% Transition probabilities %%%%%
pmat(1,1) = (infl*Smat(1,1)-Smat(1,2))/(Smat(2,2)-Smat(1,2));
if i > 1
pmat(1:i,i)= (infl.*Smat(1:i,i)-Smat(1:i,i+1))./(Smat(2:i+1,i+1)-Smat(1:i,i+1));
end
%%%%%%% Arrow-Debreu Prices %%%%%
if i>1