Presentation on theme: "Volatility. Downloads Today’s work is in: matlab_lec04.m Functions we need today: simsec.m, simsecJ.m, simsecSV.m Datasets we need today: data_msft.m."— Presentation transcript:
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
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)
Jumps R(t)=exp(µ+σ*X(t)+J(t)) J(t)=J 1 with p 1, J 2 with p 2, 0 with 1- p 1 -p 2 >>nlow=sum(msft(:,4)<-.1); >>nhigh=sum(msft(:,4)>.1); >>[T a]=size(msft); >>p1=nlow/T; p2=nhigh/T; >>J1=-.15; J2=.15;
Simulating Jumps function r=simsecJ(mu,sigma,J1,J2,p1,p2,T); x=randn(T,1); y=rand(T,1); for t=1:T; if y(t)<p1; J(t)=J1; elseif y(t)<p1+p2; J(t)=J2; else J(t)=0; end; r(t)=exp(mu+sigma*x(t)+J(t))-1; end;
Simulating Jumps >>r=simsecJ(mu,sigma,J1,J2,p1,p2,T); >>disp([mean(msft(:,4)) mean(r)]); >>disp([std(msft(:,4)) std(r)]); >>disp([skewness(msft(:,4)) skewness(r)]); >>disp([kurtosis(msft(:,4)) kurtosis(r)]); >>subplot(2,1,2); hist(r,[-.2:.01:.2]); %Note that kurtosis of simulated now matches actual
Stochastic Volatility Suppose volatility was not constant, but changed through time and was predictable This is very realistic, volatility tends to be much higher during recessions than expansions; high volatility tends to predict high volatility That is sigma is replaced by sigma(t)=f(Z(t)) where Z(t) is a random variable
Moving Average When we have a long time series of data we can calculate the local average a few points around each point in time, this is called a moving average We will write code to calculate a moving average and use it to analyze stochastic volatility (to be used later as well)
Moving Average >>T1=floor(T/7); ma=zeros(T1,2); >>for i=1:T1; in=(i-1)*7+1:(i-1)*7+7; ma(i,1)=std(msft(in,4)); ma(i,2)=mean(msft(in,4).^2); for j=1:7; t=(i-1)*7+j; ma(i,2)=ma(i,2)+(msft(t,4)^2)/7; end; >>disp(corrcoef(ma(:,1),ma(:,2)));
regress() regcoef=regress(Y,X) regresses vector time series Y on multiple time series in X regcoef contains the regression coefficients Y must be Tx1, X must be TxN where N is the number of regressors If you want a constant in your regression, first column of X must be all 1’s ie y(t)=A+B*x(t), than Y=[y(1); y(2); … y(T)], X=[1 x(1); 1 x(2); … 1 x(T)] [a1 a2]=regress(Y,X) gives coefficients in a1, and 95% bounds in a2 [a1 a2 a3 a4 a5]=regress(Y,X) gives coefficients in a1, 95% bounds in a2, R 2 in a5(1)
No predictability in WN >>X=[ones(T1-1,1) WN(1:T1-1,1)]; >>Y=WN(2:T1,1); >>[regcoef sterr a3 a4 rsq]=regress(Y,X); >>disp([regcoef sterr]); Note regcoef(2) is close to zero and sterr(2,:) is not significant disp(rsq(1)); Note, R 2 is close to zero
Predictability in Volatility >>X=[ones(T1-1,1) ma(1:T1-1,2)]; >>Y=ma(2:T1,2); >>[regcoef sterr a3 a4 rsq]=regress(Y,X); >>disp([regcoef sterr]); %Note regcoef(2) is positive and significant! >>disp(rsq(1)); %Note, R 2 is 14.86%! %Even with a simple linear model we get %predictability! Can you think of better models?
Discrete, Markov volatility sigma(t)=.015 or.025 (daily) When sigma(t)=.015, it will be.015 with probability.9 tomorrow, and will be.025 with probability.1 tomorrow When sigma(t)=.025, it will be.025 with probability.9 tomorrow, and will be.015 with probability.1 tomorrow Transition probability matrix: [.9.1;.1.9] This is a 2-state Markov process, it is predictable, when sigma(t) is high, it is likely to stay high
AR(1) Volatility Let Z(t) be a normal rv Let W(t)=ρ S W(t-1)+σ S Z(t) This is called an AR(1) process, as you can see it is predictable, W(t) is expected to be high when W(t-1) is high Let σ(t)=µ S +W(t) Do you see any problems with this process? If σ S =0 than σ(t)=µ S so constant vol If ρ S =0 than σ(t) is i.i.d. and there is no persistence in vol
Simulating Stochastic Vol function r=simsecSV(mu,muS,J1,J2,p1,p2,rho,sigmaS,T); x=randn(T,1); y=rand(T,1); z=randn(T+1,1); W(1)=0; J=zeros(T,1); r=zeros(T,1); for t=1:T; W(t+1)=rho*W(t)+sigmaS*z(t+1); sigma(t)=abs(muS+W(t)); if y(t)<p1; J(t)=J1; elseif y(t)<p1+p2; J(t)=J2; else J(t)=0; end; r(t)=exp(mu+sigma(t)*x(t)+J(t))-1; end;
Moving Average of Simulated sigmaS=.0025; rho=.96; r=simsecSV(mu,sigma,J1,J2,p1,p2,rho,sigmaS,T); T1=floor(T/7); masim=zeros(T1,2); for i=1:T1; in=(i-1)*7+1:(i-1)*7+7; masim(i,1)=std(r(in,1)); masim(i,2)=mean(r(in,1).^2); for j=1:7; t=(i-1)*7+j; masim(i,2)=masim(i,2)+(r(t,1)^2)/7; end;
Optional Homework (2) Use the function from Homework (1) to simulate Microsoft daily returns for a period of a year many times, over and over again Each time record the total return for the year This is called Monte-Carlo simulation How likely is it that Microsoft loses 30% in one year? How likely is it to lose 40%? Separate the worst 5% of years from the next 95%. What is the value lost at the 5% break? This is called Value at Risk, it is a commonly used risk measure How sensitive is Value at Risk to jump parameters? Jump events are quite rare, do you think they are easy to estimate?
Optional Homework (3) Extend the model by adding stochastic volatility, try both the discrete Markov and the AR(1) process (AR(1) case done in class in file simsecSV.m) How does this change kurtosis and likelyhood of tail events? Plot a time series of squared Microsoft returns and squared simulated returns (with and without stochastic volatility) Does it look like high times are followed by high times in the data? In the model with no stochastic vol? In the model with stochastic vol? Do you see any problems with the AR(1) formulation for volatility? Does Value at Risk change during high volatility and low volatility times?