In diesem Dokument (das mit R Markdown erstellt wurde) werden die in der Vorlesung Finanzmathematik 2 besprochenen Formeln in R umgesetzt.
Zunaechst definieren wir den Vektor \(\boldsymbol{\mu}\) der erwarteten Renditen und die Kovarianzmatrix \(\boldsymbol{\Sigma}\).
ones = c(1,1,1)
mu = c(0.05, 0.01, 0.025)
sigma = matrix( c(0.0120059140, 0.001916566, 0.0009217767,
0.0019165655, 0.009998083, 0.0024276497,
0.0009217767, 0.002427650, 0.0202152029) ,
nrow=3, ncol=3)
Fuer den spaeteren Gebrauch bestimmen wir die Inverse der Kovarianzmatrix.
sigmainv = solve(sigma)
Die Kovarianzmatrix \(\Sigma\) ist also
round(sigma,5)
## [,1] [,2] [,3]
## [1,] 0.01201 0.00192 0.00092
## [2,] 0.00192 0.01000 0.00243
## [3,] 0.00092 0.00243 0.02022
und die erwarteten Renditen \(\boldsymbol{\mu}\) der Basiswertepapiere betragen 0.05, 0.01, 0.025.
Das Portfolio aus riskanten Wertpapieren mit minimaler Varianz ermitteln wir mit der entsprechenden Formel \[\mathbf{w}^{\text{gmv}} = \frac{\boldsymbol{\Sigma}^{-1} \mathbf{1}}{ \mathbf{1}^T \boldsymbol{\Sigma}^{-1} \mathbf{1} }\]
aux1 = 1/as.numeric(t(ones)%*%sigmainv%*%ones)
wgmv = aux1*sigmainv%*%ones
round(t(wgmv),3)
## [,1] [,2] [,3]
## [1,] 0.372 0.426 0.202
Der Anteilsvektor des Portfolio aus riskanten Wertpapieren mit minimaler Varianz ist also 0.372, 0.426, 0.202.
Leicht kann man dann auch die erwartete Rendite und die Standardabweichung/Varianz bestimmen:
muwgmv = t(wgmv)%*%mu
round(muwgmv,4)
## [,1]
## [1,] 0.0279
sdwgmv = sqrt(t(wgmv)%*%sigma%*%wgmv)
round(sdwgmv,4)
## [,1]
## [1,] 0.0739
Die erwartete Rendite ist also 0.0279 und die Standardabweichung betraegt 0.0739.
Das Grenzportfolio aus riskanten Wertpapieren mit einer vorgegebenen Zielrendite \(\mu^*\) von
mustern = 0.0427
kann man ebenfalls leicht mit den entsprechenden Formel \(\mathbf{w}^* = \boldsymbol{\Sigma^{-1}} \mathbf{M} \mathbf{B}^{-1} \tilde{\boldsymbol{\mu}}^*\)
\[ \mathbf{M} = ( \boldsymbol{\mu} \, \vdots \, \mathbf{1} ) \in M(N,2,\mathbb{R}), \\ \tilde{\boldsymbol{\mu}}^* = (\mu^*, \,\, 1)^T \in M(2,1,\mathbb{R}), \\ \mathbf{B} = \boldsymbol{M}^T \boldsymbol{\Sigma^{-1}} \boldsymbol{M} \in M(2,2,\mathbb{R}) \] bestimmen:
M = matrix(c(t(mu), t(ones)), ncol = 2 )
B = t(M)%*%sigmainv%*%M
Binv = solve(B)
w3 = sigmainv%*%M%*%Binv%*%c(mustern, 1)
t(round(w3,4))
## [,1] [,2] [,3]
## [1,] 0.7402 0.0537 0.206
muw3 = t(w3)%*%mu
round(muw3,4)
## [,1]
## [1,] 0.0427
sdw3 = sqrt(t(w3)%*%sigma%*%w3)
round(sdw3,4)
## [,1]
## [1,] 0.0892
Der Anteilsvektor des Portfolio aus riskanten Wertpapieren mit einer erwarteten Rendite von 0.0427 ist 0.74, 0.054, 0.206. Die erwartete Rendite wurde mit der entsprechenden Formel (nur zur Probe) nachgerechnet. Die Standardabweichung betraegt 0.0892.
Die Analyse kann durch die folgende Abbildung komplettiert werden.
Wir definieren zunaechst mit den entsprechenden Parametern \(A = \boldsymbol{\mu}^T \boldsymbol{\Sigma}^{-1}
\boldsymbol{\mu},
B = \boldsymbol{\mu}^T \boldsymbol{\Sigma}^{-1} \boldsymbol{1},
C = \boldsymbol{1}^T \boldsymbol{\Sigma}^{-1}
\boldsymbol{1}\)
die Grenzhyperbel
\[\sigma^2_{R^\mathbf{w}} = \frac{A - 2 B \mu_{R^\mathbf{w}} + C \mu_{R^\mathbf{w}}^2}{AC - B^2}\]
A = as.numeric(t(mu)%*%sigmainv%*%mu)
B = as.numeric(t(mu)%*%sigmainv%*%ones)
C = as.numeric(t(ones)%*%sigmainv%*%ones)
hyperbel = function(x){
out = sqrt((A-2*B*x+C*x^2)/(A*C-B^2))
}
Das folgende Code Fragment dient lediglich der Gestaltung der Abbildung. Fuer die geeignete Wahl der Achsenbereiche definieren wir die folgenden Paramter. Ferner wird die Schrittweite definiert:
weite = max(abs(c(muwgmv)-mu))*2
schritte = 2*weite/100
Rendite1 = seq(from = c(muwgmv) - weite, to = muwgmv, by = schritte )
Standardabweichungen1 = hyperbel(Rendite1)
Rendite2 = seq(from = c(muwgmv), to = muwgmv + weite, by = schritte )
Standardabweichungen2 = hyperbel(Rendite2)
weite2 = 1.3*max(Standardabweichungen1,Standardabweichungen2)
Schliesslich koennen die Abbildung leicht erstellen:
par(mai = c(1.2,1.2,0.5,1.2))
plot(Standardabweichungen1,Rendite1,
xlim = c(0,weite2),
ylim = c(muwgmv-weite, muwgmv + weite),
bty = "L",
type = "l",
xlab = "Standardabweichung",
ylab = "erw. Rendite",
cex.lab = 1.3,
col = "red",
lwd = 3)
points(Standardabweichungen2,Rendite2,
type = "l",
col = "green",
lwd = 3)
points(sdwgmv,muwgmv,
col = "black",
cex = 2,
pch = 8)
points(sqrt(diag(sigma)),mu,
col = "orange",
cex = 2,
pch = 16)
points(sdw3,muw3,
col = "black",
cex = 2,
pch = 16)
abline(0,0,col="grey")
Die Abbildung zeigt die Charakteristika (also \(\mu\) und \(\sigma\)) der Grenzportfolio; in gruen die effizienten und in rot die ineffizienten. Ferner sind in orange die Characteristika der Basiswertpapiere sowie die Charakteristika des Portfolio riskanter Wertpapiere mit minimaler Varianz (ein blauer Stern). Der schwarze Punkt zeigt die Charakteristika des Grenzportolio mit Zielrendite von 0.0427.
Fuer die risikolose Anlageform geben wir die sichere Rendite vor:
rf = 0.015
Das Tangentialportfolio bestimmen wir mit der ensprechenden Formel \[\mathbf{w}^{\text{ta}} = \frac{1}{\boldsymbol{1}^T \boldsymbol{\Sigma}^{-1} ( \boldsymbol{\mu} - R^f\boldsymbol{1} ) } \boldsymbol{\Sigma}^{-1} ( \boldsymbol{\mu} - R^f\boldsymbol{1} )\]
aux2 = as.numeric(1/(t(ones)%*%sigmainv%*%(mu-rf*ones)))
wta = aux2*sigmainv%*%(mu-rf*ones)
round(t(wta),3)
## [,1] [,2] [,3]
## [1,] 1.301 -0.513 0.212
Die erwartete Rendite ist
muwta = t(wta)%*%mu
round(muwta,4)
## [,1]
## [1,] 0.0652
Man kann die erwarete Rendite nur deshalb mit der von oben uebernommenen Formel ausrechnen, weil \(\sum_{i=1}^n w_i^{ta} =1\) ist. Das gilt, da das Tangentialportfolio nur aus Engagements in riskanten Wertpapieren besteht.
Die Standardabweichung ist
sdwta = sqrt(t(wta)%*%sigma%*%wta)
Fuer den spaeteren Gebrauch definieren wir noch eine Indikatorvariable, die erfasst, ob das Tangentialportfolio effizient ist.
effwta = as.numeric(ifelse(muwta - rf > 0, 1, -1))
srwta = (muwta-rf)/sdwta
Das Grenzportfolio mit der vorgegebener Zielrendite 0.0427 bestimmen wir mit der Formel \[\mathbf{w}^* = \frac{\mu^* - R^f}{ (\boldsymbol{\mu} - R^f\mathbf{1})^T \boldsymbol{\Sigma}^{-1} (\boldsymbol{\mu} - R^f\mathbf{1}) } \boldsymbol{\Sigma}^{-1} (\boldsymbol{\mu} - R^f\mathbf{1})\].
aux3 = as.numeric( (mustern-rf)/( t(mu-rf*ones)%*%sigmainv%*%(mu-rf*ones) ) )
wg = aux3*sigmainv%*%(mu-rf*ones)
round(t(wg),4)
## [,1] [,2] [,3]
## [1,] 0.7176 -0.2828 0.1169
wgs = c(wg,1-sum(wg))
round(t(wgs),4)
## [,1] [,2] [,3] [,4]
## [1,] 0.7176 -0.2828 0.1169 0.4483
Zur Probe berechnen wir die erwartete Rendite.
mus = c(mu, rf)
round(sum(wgs*mus) ,4)
## [1] 0.0427
Zur Illustration moeglicher Varianten bestimmen wir \(\alpha\) auf zwei Wegen:
sum(wg)
## [1] 0.5516624
alpha = (mustern-rf)/(muwta-rf)
round(alpha,4)
## [,1]
## [1,] 0.5517
Wenn \(\alpha\) gegeben ist, dann koennen wir zwischen dem Tangentialportfolio und Grenzportfolio einen direkten Zusammenhang erstellen.
wgalternativ = as.numeric(alpha)*wta
t(wgalternativ)
## [,1] [,2] [,3]
## [1,] 0.7176287 -0.2828439 0.1168776
t(wg)
## [,1] [,2] [,3]
## [1,] 0.7176287 -0.2828439 0.1168776
und verifizieren (nochmal) die erwartete Rendite
rwg = alpha*muwta + (1-alpha)*rf
rwg
## [,1]
## [1,] 0.0427
Auch fuer die Bestimmung der Standardabweichung des Grenzportfolio mit vorgegebener Rendite haben wir alternative Rechenwege
sdwg = sqrt(alpha^2*sdwta^2)
round(sdwg,4)
## [,1]
## [1,] 0.0805
round(alpha*sdwta,4)
## [,1]
## [1,] 0.0805
round(sqrt(t(wg)%*%sigma%*%wg),4)
## [,1]
## [1,] 0.0805
Schliesslich beobachten wir noch, dass wir aus dem Grenzportfolio das Tangentialportfolio zurueckgewinnen koennen:
round(t(wg/c(alpha)),4)
## [,1] [,2] [,3]
## [1,] 1.3008 -0.5127 0.2119
round(t(wta),4)
## [,1] [,2] [,3]
## [1,] 1.3008 -0.5127 0.2119
Wie oben stellen wir die Ergebnisse grafisch dar:
weite = max(abs(c(muwgmv)-mu),rf)*2
schritte = 2*weite/100
Rendite1 = seq(from = c(muwgmv) - weite, to = muwgmv, by = schritte )
Standardabweichungen1 = hyperbel(Rendite1)
Rendite2 = seq(from = c(muwgmv), to = muwgmv + weite, by = schritte )
Standardabweichungen2 = hyperbel(Rendite2)
weite2 = 1.3*max(Standardabweichungen1,Standardabweichungen2)
par(mai = c(1.2,1.2,0.5,1.2))
plot(Standardabweichungen1,Rendite1,
xlim = c(0,weite2),
ylim = c(muwgmv-weite,muwgmv+weite),
bty = "L",
type = "l",
xlab = "Standardabweichung",
ylab = "erw. Rendite",
cex.lab = 1.3,
col = "red",
lwd = 3)
points(Standardabweichungen2,Rendite2,
type = "l",
col = "green",
lwd = 3)
points(sdwgmv,muwgmv,
col = "black",
cex = 2,
pch = 8)
points(sqrt(diag(sigma)),mu,
col = "orange",
cex = 2,
pch = 16)
points(sdwta,muwta,
col = "black",
cex = 2,
pch = 8)
points(sdw3,muw3,
col = "black",
cex = 2,
pch = 16)
points(0,rf,
col = "blue",
cex = 2,
pch = 16)
lines(c(0,Standardabweichungen1),
c(rf,rf+effwta*c(srwta)*Standardabweichungen1),lwd=2,lty=1,
col = "green")
lines(c(0,Standardabweichungen1),
c(rf,rf-effwta*c(srwta)*Standardabweichungen1),lwd=2,lty=2,
col = "red")
points(sdwg,rwg,
col = "red",
cex = 2,
pch = 16)
abline(0,0,col="grey")