--------------------------------------------------- # # # Chapter 3: Time Series Models with # # Return-Driven Volatilities: # # A Common Sense Approach # # # --------------------------------------------------- In chapter2 we took a closer look at the returns of liquidly tradable financial assets. Recall the definition ret(t_k) := (S_k - S_{k-1}) / S_{k-1} (1) We summarized our results in the following ----------------------------------------- # main conclusion chapter2: # ----------------------------------------- The normalized returns normret_d(t_k) = ret(t_k) / stddev_d(t_{k-1}) (2) may be approximated pretty well by a standard normal distri- bution, if the time horizon d is chosen not too large: d=15 days or d=20 days turned out to be quite reasonable choices. Thus we can write ret(t_k) / stddev_d(t_{k-1}) = phi_k (3) with phi_k being a standard normal random number. Equation (3) is equivalent to S_k = S_{k-1} * [ 1 + stddev_d(t_{k-1}) * phi_k ] (4) with the d-day standard deviation or volatility given by [stddev_d(t_{k-1})]^2 (5) = 1/d * [ret^2(t_{k-1})+...+ret^2(t_{k-d})] ----------------------------------------- # end main conclusion chapter2 # ----------------------------------------- Equation (4) allows the recursive calculation of the S_k's given the data on day t_{k-1} and by drawing one random number phi_k. Now, is this a reasonable stochastic model? Or more precisely, why should it be not? Let's simulate a couple of paths with the dynamics given by (4): # Start R-Session: # # We name the model (4,5) the `naive ARCH Model' (apparently then # there will be a non-naive ARCH-Model) and we code a function # which generates a price path according to (4) for N time steps # (for example N=2500 for 10 years = 2500 banking days): pathNaivArch = function( N , d , startvol ) { S = rep(0,N) ret = rep(0,N) phi = rnorm(N) S0 = 100 stddev = rep(startvol,N) summe = 0 for(k in 1:N) { if(k==1) { S[k] = S0*(1+startvol*phi[k]) ret[k] = (S[k]-S0)/S0 summe = summe + ret[k]*ret[k] } else { if(k<=d) { S[k] = S[k-1]*(1+startvol*phi[k]) ret[k] = (S[k]-S[k-1])/S[k-1] summe = summe + ret[k]*ret[k] if(k==d){stddev[k] = sqrt( summe/d )} } else { S[k] = S[k-1]*(1+stddev[k-1]*phi[k]) ret[k] = (S[k]-S[k-1])/S[k-1] summe = summe + ret[k]*ret[k] summe = summe - ret[k-d]*ret[k-d] stddev[k] = sqrt( abs(summe)/d ) } }#end if else }#next k plot(S,type="l",ylim=c(0,250)) return(S) } # If we put d = N, then for all time steps k only the constant # startvol will be taken, thus in that case we simulate the # model # # S_k = S_{k-1} * [ 1 + bsvol * phi_k ] (6) # # with bsvol = startvol a constant number which does not change # during the simulation. # # `bsvol' stands for `Black-Scholes volatility' and the model # (6) with a constant volatility is called the Black-Scholes # model (here in discrete time). In 1997, F.Black, M.Scholes # and R.Merton received the Nobel-prize for Economics: # from nobelprize.org: "Fischer Black, Robert Merton and Myron Scholes made a pioneering contribution to economic sciences by developing a new method of determining the value of derivatives. Their innovative work in the early 1970s, which solved a longstanding problem in financial economics, has provided us with completely new ways of dealing with financial risk, both in theory and in practice. Their method has contributed substantially to the rapid growth of markets for derivatives in the last two decades. Fischer Black died in his early fifties in August 1995." # Thus: the following command generates a Black-Scholes path # for a time horizon of 2500 days or 10 years: d = N = 2500: pathNaivArch(2500,2500,0.01) # looks ok so far.
# now let's take a non-constant volatility, we use the realized # volatility of the last, say, d = 20 days: pathNaivArch(2500,20,0.01)
pathNaivArch(2500,20,0.02)
pathNaivArch(2500,20,0.03)
# now with d = 5 day volatilities: pathNaivArch(2500,5,0.01)
pathNaivArch(2500,5,0.02)
pathNaivArch(2500,5,0.03)
# Apparently this is not a good model; somehow the volatility # goes to zero and then the price S_k stays fixed and does # not move any longer. # Let's make some theoretical considerations: We had ret(t_k) / stddev_d(t_{k-1}) = phi_k or ret^2(t_k) = phi_k^2 * [stddev_d(t_{k-1})]^2 with [stddev_d(t_{k-1})]^2 = 1/d * [ret^2(t_{k-1})+...+ret^2(t_{k-d})] Thus: ret^2(t_k) = phi_k^2 * 1/d * [ret^2(t_{k-1})+...+ret^2(t_{k-d})] (6) Let's consider d=1. In that case, we have: ret^2(t_k) = phi_k^2 * ret^2(t_{k-1}) = phi_k^2 * phi_{k-1}^2 * ret^2(t_{k-2}) = ... = phi_k^2 * phi_{k-1}^2 * ... * phi_1^2 (7) This expression is identical to the quantity pi_k which we discussed in detail in the first three exercise sheets and for which we found pi_k ~ exp(-1.27*k) Thus, for d = 1 the squared returns ret^2(t_k) converge quickly to zero; for d > 1 we do no longer get such a compact expression as in (7), but the mechanism, which leads to the vanishing volatilities is basically the same. Thus, we have to make some adjustments to our model given by (4,5) from above, S_k = S_{k-1} * [ 1 + stddev_d(t_{k-1}) * phi_k ] (4) with standard deviations or volatilities [stddev_d(t_{k-1})]^2 (5) = 1/d * [ret^2(t_{k-1})+...+ret^2(t_{k-d})] This we will do in the next chapter 4.