Valuation: VC edition
Download
Report
Transcript Valuation: VC edition
Simulation
Downloads
Today’s work is in: matlab_lec03.m
Datasets we need today:
data_msft.m
Histograms: hist()
>>X=[2*ones(3,1); 3*ones(5,1); 7*ones(4,1)];
>>subplot(2,1,1);
>>hist(X); %draws histogram of X
>>subplot(2,1,2);
>>hist(X,[0:.25:10]); %draws histogram of X
%on the interval [0 10] with bins of size .25
Default is a histogram with 20 bins,
from min(X) to max(X)
hist(X,n) will keep default min and max
but make n bins
Uniform rv: rand()
A uniform random variable (rv) has
equal probability of occurring at any
point on its support
>>T=1000;
>>X=rand(T,1); %creates a matrix of size
%(Tx1) of uniform rv’s on (0,1)
>>a=5; b=50;
>>Y=a+b*rand(T,1); %creates a matrix of
%size (Tx1) of unifrom rv’s on (a,a+b)
Using hist()
and rand()
>>subplot(3,1,1);
>>hist(X,[-.25:.025:1.25]); %draws
%histogram of X
>>subplot(3,1,2);
>>hist(Y,[.9*a:(b/30):1.1*(a+b)]); %draw
>>T=100000; Z=a+b*rand(T,1);
>>subplot(3,1,3);
>>hist(Z,[.9*a:(b/30):1.1*(a+b)]);
subplot;
Law of Large
Numbers (LLN)
Note that E[X]=.5
>>X=rand(5,1); disp(mean(X));
>>X=rand(10,1); disp(mean(X));
>>clear Y;
for i=1:200;
Y(i)=mean(rand(i,1));
end;
>>plot(Y);
How quickly does Y tend to .5? CLT will tell
us
Discrete rv’s
Oftentimes you will need to simulate rv’s
with a small number of possible outcomes
You can use the uniform rv to create
discrete rv’s (ie coinflips)
%x=1 with probability p and 0 with (1-p)
>>p=.25; if rand(1,1)<p; x=1; else; x=0; end;
%x=3 with p=.25, 2 with p=.5, 1 with p=.25
>>y=rand(20,1);
>>x=3.*(y>.75)+2*(y<=.75 & y>.25)+1*(y<=.25);
>>hist(x,[0:.25:4]);
Central Limit
Theorem (CLT)
Tells us that means of many rv’s
converge to a normal rv
This is why normals are so common in
nature!
Let x=uniform rv
Let y=0 if x<.3 and 1 if x>=.3
Let z be the mean of j binomial rv’s
Note that z itself is a rv, in particular,
when j=1, y=z
CLT (cont’d)
Think of y as a biased coin flip
Think of z as the mean of j coinflips
>>A=[1 5 10 25 50 100];
for k=1:6;
j=A(k);
for i=1:5000;
x=rand(j,1);
y=(x<.3)*0+(x>=.3)*1;
z(i,k)=mean(y);
end;
end;
CLT (con’d)
>>for k=1:6;
subplot(3,2,k); hist(z(:,k),50);
end;
subplot;
We will now have 6 plots. Each will have a
histogram of rv z, which is a mean of j
binomial rv’s y.
What do distributions with high j look
like?
Ever wonder why distribution of human
heights looks like a normal rv?
Normal rv:
randn()
Works same as uniform, but produces
a normal of mean 0, standard
deviation 1
>>X=randn(10000,1);
>>subplot(2,1,1); hist(X,50);
To produce normal rv’s with different
mean or variance, just skew and shift
>>m=1.1; s=.16; X=m+s*randn(10000,1);
>>subplot(2,1,2); hist(X,50);
A simple
security process
R(t)=mu+sigma*x(t) (x is normal, R is
normal)
10% annual return and 30% annual
standard deviation are quite typical for
equity
>>T=10000; mu=1.1; sigma=.3;
>>x=randn(T,1);
>>R=mu+sigma*x;
>>subplot; hist(R,50);
Do you notice anything “strange” about
this process or the histogram?
A better process
R=exp(mu+sigma*X(t)) (R is lognormal)
exp(x) is approximately 1+x, so if
want mean of process approximately
1.1, you need x to be approximately
.1
Can this return be negative?
Calibration Issue:
Jensen’s Inequality
Jensen’s Inequality: E[f(X)] ≠ f(E[X])
Stein’s Lemma:
E[exp(X)]=exp(m+.5*s2) where X is
normal rv with mean m, standard
deviation s
If you want R to have mean exp(m),
than make sure rv X inside of exponent
has mean m-.5*s2
With non-normal processes (ie jumps),
things will be more complicated
Calibration Issue:
Interval length
The “right” way to simulate is:
R(t ) exp m * dt X (t ) * * dt
X(t) is N(0,1)
dt=1/T where T is the number simulations per period
m is the mean per period, σ is the standard deviation
per period
For example, if one period is one year and we are
simulating monthly, than T=12, m is the annual mean
(ie 10%), σ is the annual standard dev (ie 20%)
When the length of the period (over which we measure
parameters) is equal to the simulation period, than T=1
and this reduces to what we saw earlier
Calibrate Microsoft
Get daily microsoft data from CRSP or
course website
>>data_msft;
>>disp(mean(msft(:,4)));
>>disp(std(msft(:,4)));
%Microsoft returns have a daily mean of
%.097% and standard deviation of 2.21%
>>subplot(2,1,1); hist(msft(:,4),[-.2:.01:.2]);
>>axis([-.2 .2 0 800]); xlabel('Actual');
Simulate Microsoft
>>T=3022;
>>mu=.00097-.5*.0221^2; sigma=.0221;
>>x=randn(T,1);
>>r=exp(mu+sigma*x)-1;
>>subplot(2,1,2);
>>hist(r,[-.2:.01:.2]); axis([-.2 .2 0 800]);
>>disp(mean(r)); disp(std(r));
>>disp([skewness(r) skewness(msft(:,4))]);
>>disp([kurtosis(r) kurtosis(msft(:,4))]);
Compare
simulated to actual
Mean, standard deviation, skewness
match well
Kurtosis (extreme events) does not
match well
Actual has much more mass in the tails
(fat tails)
This is extremely important for option
pricing!
CLT fails when tails are “too” fat
Next Week:
Modelling Volatility
How to make tales fatter?
Add jumps to log normal distribution to
make tails fatter
Jumps also help with modeling default
Make volatility predictable:
Stochastic volatility, governed by state
variable
ARCH process (2003 Nobel prize, Rob
Engle)
Optional
Homework (1)
Create a function that will simulate
microsoft stock using a log-normal
process
The function should take in
arguments mu (mean), sigma
(standard deviation), and T (number
of days)
Its output should be a vector of daily
returns