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)
mu = c(0.05, 0.01)
sigma = matrix( c(1/4 , 1/10 ,
1/10, 4/25),
nrow=2, ncol=2)
Fuer den spaeteren Gebrauch bestimmen wir die Inverse der Kovarianzmatrix.
sigmainv = solve(sigma)
sigmainv
## [,1] [,2]
## [1,] 5.333333 -3.333333
## [2,] -3.333333 8.333333
sigmainv_inQ = matrix( c(16/3 , -10/3,
-10/3, 25/3),
nrow=2, ncol=2)
sigmainv_inQ
## [,1] [,2]
## [1,] 5.333333 -3.333333
## [2,] -3.333333 8.333333
Die Kovarianzmatrix \(\Sigma\) ist also
round(sigma,5)
## [,1] [,2]
## [1,] 0.25 0.10
## [2,] 0.10 0.16
und die erwarteten Renditen \(\boldsymbol{\mu}\) der Basiswertepapiere betragen 0.05, 0.01.
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]
## [1,] 0.286 0.714
Der Anteilsvektor des Portfolio aus riskanten Wertpapieren mit minimaler Varianz ist also 0.286, 0.714.
Leicht kann man dann auch die erwartete Rendite und die Standardabweichung/Varianz bestimmen:
muwgmv = t(wgmv)%*%mu
round(muwgmv,4)
## [,1]
## [1,] 0.0214
t(wgmv)%*%sigma%*%wgmv
## [,1]
## [1,] 0.1428571
sdwgmv = sqrt(t(wgmv)%*%sigma%*%wgmv)
round(sdwgmv,4)
## [,1]
## [1,] 0.378
Die erwartete Rendite ist also 0.0214 und die Standardabweichung betraegt 0.378.
Das Grenzportfolio aus riskanten Wertpapieren mit einer vorgegebenen Zielrendite \(\mu^*\) von
mustern = 0.04
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)
t(M)%*%sigmainv
## [,1] [,2]
## [1,] 0.2333333 -0.08333333
## [2,] 2.0000000 5.00000000
t(M)%*%sigmainv%*%M
## [,1] [,2]
## [1,] 0.01083333 0.15
## [2,] 0.15000000 7.00
w3 = sigmainv%*%M%*%Binv%*%c(mustern, 1)
t(round(w3,4))
## [,1] [,2]
## [1,] 0.75 0.25
muw3 = t(w3)%*%mu # Probe
round(muw3,4)
## [,1]
## [1,] 0.04
t(w3)%*%sigma%*%w3 # Varianz
## [,1]
## [1,] 0.188125
sdw3 = sqrt(t(w3)%*%sigma%*%w3)
round(sdw3,4) # Standardabweichung
## [,1]
## [1,] 0.4337
Der Anteilsvektor des Portfolio aus riskanten Wertpapieren mit einer erwarteten Rendite von 0.04 ist 0.75, 0.25. Die erwartete Rendite wurde mit der entsprechenden Formel (nur zur Probe) nachgerechnet. Die erwartete Rendite wurde vorgeben. Die Standardabweichung betraegt 0.4337.
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 = "steelblue",
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 schwarzer Stern). Der balue Punkt zeigt die Charakteristika des Grenzportolio mit Zielrendite von 0.04.
Fuer die risikolose Anlageform geben wir die sichere Rendite vor:
rf = 0.005
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]
## [1,] 1.942 -0.942
Die erwartete Rendite ist
muwta = t(wta)%*%mu
round(muwta,4)
## [,1]
## [1,] 0.0877
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.04 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]
## [1,] 0.8221 -0.3988
wgs = c(wg,1-sum(wg))
round(t(wgs),4)
## [,1] [,2] [,3]
## [1,] 0.8221 -0.3988 0.5767
Zur Probe berechnen wir die erwartete Rendite.
mus = c(mu, rf)
round(sum(wgs*mus) ,4)
## [1] 0.04
Zur Illustration moeglicher Varianten bestimmen wir \(\alpha\) auf zwei Wegen:
sum(wg)
## [1] 0.4233129
alpha = (mustern-rf)/(muwta-rf)
round(alpha,4)
## [,1]
## [1,] 0.4233
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]
## [1,] 0.8220859 -0.398773
t(wg)
## [,1] [,2]
## [1,] 0.8220859 -0.398773
und verifizieren (nochmal) die erwartete Rendite
rwg = alpha*muwta + (1-alpha)*rf
rwg
## [,1]
## [1,] 0.04
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.3589
round(alpha*sdwta,4)
## [,1]
## [1,] 0.3589
round(sqrt(t(wg)%*%sigma%*%wg),4)
## [,1]
## [1,] 0.3589
Schliesslich beobachten wir noch, dass wir aus dem Grenzportfolio das Tangentialportfolio zurueckgewinnen koennen:
round(t(wg/c(alpha)),4)
## [,1] [,2]
## [1,] 1.942 -0.942
round(t(wta),4)
## [,1] [,2]
## [1,] 1.942 -0.942
Wie oben stellen wir die Ergebnisse grafisch dar:
weite = max(abs(c(muwgmv)-mu),rf)*3
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")