Transcript Valuation: VC edition
Functions
Downloads
Today’s work is in: matlab_lec02.m
Functions we need today: myfunction.m, windsorise.m, npv.m
Overview
Logic Control Structures (if, for) Functions Financial Example: NPV and Gordon Growth Model
Logic
1 means True, 0 means False == is used for logic, = to assign values >>1==1 ans = 1 >>1==2 ans = 0 >>x=5; %assigns value 5 to x >>x==5; %checks if x is equal to 5, returns either 1 %or 0 >>x=(x==5); %checks if x is equal to 5, then %assigns True (1) or False (0) to x
Logical Operators
== % equal to ~= % not equal to > % greater than >= % greater than or equal to < % less than <= % less than or equal to & % and | % or (top left of keyboard)
Examples
>> A=[zeros(3,1); ones(3,1); 2*ones(3,1); 3*ones(3,1)]; >>in1=(A>0); >>A(A>0); % is same as A(in1) >>in2=(A<1 | A>2); >>in3=(A>1 & A<3); >>in4=(A~=2);
Examples
In the matlab prompt
if statements
>>if A(1)==0; x=5; y=x; end; All function names are lower case >>if (logical statement); (command to be executed); end;
if-else statements
>>if A(3)==A(4); x=A(5); y=A(4); elseif A(3)==0; x=5; y=0; elseif A(3)==1; x=4; y=5; else; x=3; y=8; end; Just like if statement but adds a elseif and else
for statements and loops
>>T=100; s=0; x=0; >>for i=1:T; s=s+i; x=x+i*i; end; This loop calculates a sum and a sum of squares s=1+2+3+… 100 x=1 2 +2 2 +3 2 +… 100 2 Be careful with variables having same name as index, or making changes to index while inside loop Make sure variables are initialized
Nested Loops
>>for i=1:5; for j=1:5; B(i,j)=min(i,j); end; end;
Loop without using for
>>i=0; >>while i<10; i=i+1; disp(i); end; Beware of infinite loops!
Alternatives to Loops
Loops are slow, matrix operations are fast Avoid using loops if you can!
>>x=0; >>for i=1:5; x=x+i*i; end; Alternative: >>A=[1:5]; x=sum(A.*A);
Example: Mean and StDev
>>[T L]=size(bp); >>s=0; s2=0; >>for i=1:T; s=s+bp(i,4); s2=s2+(bp(i,4)^2); end; >>M=s/T; StD=sqrt((s2/T)-M*M); >>disp([mean(bp(:,4)) M]); >>disp([std(bp(:,4)) StD]);
Functions
Functions created in .m files Unlike scripts, you can call on functions, and functions can return values For example f(x,y)=5*x+3*y is a function that takes in arguments x and y, returns f(x,y) Matlab has many intrinsic functions (i.e. log(.), corrcoef(. , .), mean(.) Functions can take in zero, one or many arguments Functions can return zero or one argument, but that argument can be a matrix
A simple function
function z=myfunction(x,y); z=(x.^2)+2*x.*y+(y.^2); %-This function can take in scalars or vectors %-Functions do not change the values of the % arguments that are passed to them, that % is, they are independent of the external % environment
Windsorization
function W=windsorise(x,lowcut,highcut); [T L]=size(x); z=x; y=sort(x); for i=1:T; if z(i)
Using windsorise
In matlab prompt plot regular series and windsorised series >>data_bp; >>X=windsorise(bp(:,4),.05,.95); >>plot(bp(:,4)); >>hold on; >>plot(X(:,1), 'r');
NPV: The Model
Model:
NPV
t
1 ,
T D
(
t
) ( 1
r
)
t
When D(t+1)=D(t)*(1+g) and the sum is infinite, this reduces to Gordon Growth Model:
NPV
D r
( 0 )
g
When g=0, this reduces to:
NPV
1 1
r T
What if growth stops after Ts?
How else can you modify this model? Value firms vs. Growth firms?
NPV: The function
function y=npv(d,r,g,T,Ts); y=0; cf=zeros(T,1); cf(1)=d; for t=1:T; if t<=Ts; cf(t+1)=cf(t)*(1+g); else; cf(t+1)=cf(t); end; y=y+cf(t)/((1+r)^t); end;
Using the NPV function
>>d=1; r=.05; g=.02; T=20; Ts=10; >>p=npv(d,r,g,T,Ts); >>T=200; p=zeros(T,1); >>for t=1:T; p(t)=npv(d,r,g,t,t); end; >>hold off; plot([1:T],p, 'b'); >>hold on; >>plot([1:T],ones(1,T)*(d/(r-g)), ' r- ' );
NPV function: extensions
Growth firms: little cash flow now, lots of cash flow later Value firms: lots of cash flow now Cash flows that vary arbitrarily? ie input an arbitrary cash flow stream Cash flows that vary randomly? Use rand() and randn() functions Time varying returns?
Next week
Randomization Simulation Real finance!
Functions we learned
Logic: ==, ~=, <, <=, >, >=, &, | Control Structures: if, else, for Math: sort Ours: windsorize, npv