#-----------------------------------------------------# # # # Week7: Das zeitdiskrete Black-Scholes Modell # # und Modelle mit variabler Volatilitaet # # # #-----------------------------------------------------# In dem week6.txt und auch auf dem Uebungsblatt 6 hatten wir uns die returns von Finanzzeitreihen angeschaut. Die returns waren definiert durch ret(t_k) := (S_k - S_{k-1}) / S_{k-1} (1) Die Ergebnisse koennen wir in folgender main conclusion zusammen- fassen: ---------------------------------------------------------------- #### main conclusion week6.txt #### Die normierten returns normret_d(t_k) = ret(t_k) / stddev_d(t_{k-1}) (2) lassen sich recht gut durch eine Normalverteilung approximieren, wenn man das d hinreichend klein waehlt, etwa d=15 oder d=20. Wir koennen also schreiben: ret(t_k) / stddev_d(t_{k-1}) = phi_k (3) wobei phi_k eine standard-normalverteilte Zufallszahl ist. Gleichung (3) ist aequivalent zu: S_k = S_{k-1} * [ 1 + stddev_d(t_{k-1}) * phi_k ] (4) mit den Standardabweichungen oder Volatilitaeten [stddev_d(t_{k-1})]^2 (5) = 1/d * [ret^2(t_{k-1})+...+ret^2(t_{k-d})] #### end main conclusion week6.txt #### ---------------------------------------------------------------- Mit Hilfe von Gleichung (4) kann man aus den Daten, die zum Zeit- punkt t_{k-1} bekannt sind und dem Ziehen einer normalverteilten Zufallszahl den Preis bei Zeit t_k berechnen. Dazu muessen wir uns einen Zeithorizont d vorgeben, ueber den wir die Standard- abweichung der returns stddev_d(t_{k-1}) berechnen wollen. Die einfachste Wahl (in terms of implementation) fuer d, aber nicht die realistischste, ist d = all data und stddev_d(t_{k-1}) ist dann einfach eine Konstante: stddev_d(t_{k-1}) = constant =: bsvol (6) Dabei steht bsvol fuer Black-Scholes Volatilitaet, und das ent- sprechende Modell S_k = S_{k-1} * [ 1 + bsvol * phi_k ] (7) mit phi_k standard-normalverteile Zufallszahlen wird auch als das zeitdiskrete Black-Scholes Modell bezeichnet. 1997 gab es fuer F. Black, M. Scholes und R. Merton den Nobelpreis fuer Wirtschaftswissenschaften, im Wesentlichen fuer eine Pricing- Formel fuer Derivate (oder Optionen, ist dasselbe), deren Basis- werte oder Underlyings durch das Modell (7) modelliert werden. Quotation 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." Simulieren wir mal ein paar Black-Scholes Pfade: ### Start R-Session ### N = 2500 # etwa 10-jahres Zeitreihe, # 250 Handelstage pro Jahr S = rep(0,N) ret = rep(0,N) S0 = 100 # Startpreis bsvol = 1/100 # taegliche Vol von 1% phi = rnorm(N) # N standard-normalverteile # Zufallszahlen # k=1 is special: S[1] = S0 * (1 + bsvol * phi[1] ) ret[1] = (S[1]-S0)/S0 for(k in 2:N) { S[k] = S[k-1] * ( 1 + bsvol * phi[k] ) ret[k] = (S[k]-S[k-1])/S[k-1] } # Ok, schauen wir uns das an: # S und ret nebeneinander in einem Plot-Fenster: par(mfrow=c(1,2)) plot(S, type="l" ,ylim=c(0,300)) plot(ret, type="l") # Packen wir den Code vielleicht in eine Funktion, dann # brauchen wir nur eine Code-Zeile auszufuehren, um neue # Pfade zu generieren: pathBlackScholes = function( N , S0 , bsvol ) { S = rep(0,N) ret = rep(0,N) phi = rnorm(N) # N standard-normalverteile # Zufallszahlen # k=1 is special: S[1] = S0 * (1 + bsvol * phi[1] ) ret[1] = (S[1]-S0)/S0 for(k in 2:N) { S[k] = S[k-1] * ( 1 + bsvol * phi[k] ) ret[k] = (S[k]-S[k-1])/S[k-1] } # plot: par(mfrow=c(1,2)) plot(S, type="l" ,ylim=c(0,300)) plot(ret, type="l") } pathBlackScholes(2500,100,1/100) # Die Pfade sehen ganz ok aus, schon ziemlich "Aktienpreis- # maessig"; die returns sind allerdings sehr homogen, ziemlich # gleichverteilt, bei den realen Zeitreihendaten hatten wir ja # letztes Mal dieses "volatility-clustering" festgestellt, die # Volatilitaet ist eben nicht konstant. # Versuchen wir das also zu beruecksichtigen. Wir waehlen jetzt # also nicht mehr d = all data und stddev_d(t_{k-1}) = constant, # sondern wollen ein beliebiges d als Input-Parameter zulassen # und dann die Pfade fuer das Modell (4,5) von oben simulieren. # Wir nennen das Modell (4,5) das 'naive ARCH Modell' (offensicht- # lich wird es dann wohl ein nicht-naives ARCH-Modell geben) und # schreiben eine Funktion, die einen Preispfad gemaess (4) fuer N # Zeitschritte (etwa N=2500 fuer 10 Jahre = 2500 Tage) generiert: pathNaivArch = function( N , d , startvol ) { S = rep(0,N) ret = rep(0,N) phi = rnorm(N) S0 = 100 stddev = rep(startvol,N) # stddev[k] wird erst ab k = d berechnet werden, # die ersten d-1 stddev[1],...,stddev[d-1] setzen # wir gleich der startvol; sinnvolle Werte fuer # startvol sind etwa startvol = bsvol = 1% = 0.01 summe = 0 # fuer die Berechnung von # stddev_d(t_{k-1}) 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 par(mfrow=c(1,2)) plot(S,type="l",ylim=c(0,300)) plot(ret,type="l") } # Setzen wir das d = N, dann wird fuer die gesamte Simulation # fuer saemtliche Zeitschritte nur die konstante startvol ge- # nommen, wir simulieren dann also # # S_k = S_{k-1} * [ 1 + bsvol * phi_k ] (8) # # wobei bsvol = startvol eine konstante Zahl ist, die sich # waehrend der Simulation nicht aendert. # Also: Mit dem folgenden Befehl koennen wir einen Black-Scholes # path generieren: d = N = 2500: pathNaivArch(2500,2500,0.01) # sieht soweit alles ok aus. # Lassen wir jetzt die Volatilitaet variieren, wir nehmen jeweils # immer die realisierte vol der letzten d = 20 Tage: pathNaivArch(2500,20,0.01) pathNaivArch(2500,20,0.02) pathNaivArch(2500,20,0.03) # hmm.. # jetzt mit d = 5-Tages-Volatilitaet: pathNaivArch(2500,5,0.01) pathNaivArch(2500,5,0.02) pathNaivArch(2500,5,0.03) # oder fuer d = 1: pathNaivArch(2500,1,0.01) pathNaivArch(2500,1,0.02) pathNaivArch(2500,1,0.03) # das sieht doch sehr komisch aus... # die Volatilitaet scheint immer nach Null zu gehen # und die Preise S_k aendern sich dann nicht mehr.. # wir muessen das etwas genauer analysieren, # das machen wir auf dem neuen Uebungsblatt.