Ucitavamo potrebne pakete
library(FinCal)
library(financial)
library(YieldCurve)
library(NMOF)
Unutrasnja stopa dobiti je
irr(c(-1e5, 0, 52e3, 0, 54e3))
[1] 0.01955234
na sta cemo se vratiti za koji trenutak.
Pri stopi 10%, investitor biti na gubitku, sto pokazuje sledece…
pv(0.1, 4, -54e3) + pv(0.1, 2, -52e3)
[1] 79857.93
tj. sadasnja vrednost dobitaka je manja od uloga, pri stopi 10%.
drugi nacin…
npv(r = 0.1, c(-1e5, 0, 52e3, 0, 54e3))
[1] -20142.07
Ovaj broj je direktno povezan sa prethodim jer je -20142.07 + 100000 = 79857.93.
Net sadasnja vrednost (Net present value,
npv) je u sustini suma sadasnjih vrednosti svih clanova toka novca (zvanicna definicija je malo drugacija, ali funkcijanpvu principu radi ovo).
Stoga ovo uopste ne cudi, jer smo prethodno izracunali zbir sadasnjih vrednosti dobitaka.
Da je investitor na gubitku mogli smo da zakljucimo bez racuna, ako se vratimo na definiciju unutrasnje stope dobiti
Unutrasnja stopa dobiti je ona stopa po kojoj je NPV toka novca jednaka 0.
Ovo se da videti na primeru…
npv(irr(c(-1e5, 0, 52e3, 0, 54e3)), c(-1e5, 0, 52e3, 0, 54e3))
[1] 0.005423599
vrednost je 0.005 sto nije bas nula, ali buduci da je skala na kojoj radimo rede valicine sto hiljada, ovo je zanemarljiva razlika pa cemo reci da je 0.
Posto je stopa 10% veca od 2% koja je unutrasnja stopa dobiti, mogli smo da zaklucimo da je investitor na gubitku pri 10%, jer pri toj stopi sadasnja vrednost buducih dobitaka mora da bude manja nego pri stopi 2%, jednostavno jer delimo sa \((1+r)^n\), pa ako je \(r\) vece, sadasnja vrednost je manja, sto smo videli na pocetku.
Nema sta da se prica…
cash_flow <- rep(5e5, 20) # 20 godina po 500k
npv(0.1, cash_flow)
[1] 4682460
Naravno, upola manje od 10M koje treba da dobije nagradjeni :)
Obuhvaticemo oba slucaja tako sto radimo sa n meseci, pa cemo uzeti 6 ili 12 za potrebe zadatka.
Ako ne menjaju odluku, tok novca ce biti \((\underbrace{1000+1000}_{\text{ depozit + 1. kirija}}, \underbrace{1000,\dots,1000}_{n-1\text{ kirija}}, \underbrace{-1000}_{\text{ vracen depozit}})\)
Ako menjaju odluku, tok novca je \((\underbrace{1000 + 900}_{\text{ depozit + prva kirija}},\underbrace{900,\dots,900}_{n-1\text{ kirija}})\) (U knjizi i na vezbama je drugacije radjeno, ali ja mislim da je ovo tacno, jer kiriju na drugom stanu placamo na pocetku meseca, pa nece proci ceo period kamacenja dok uplatimo kiriju).
Funkcija koja racuna sadasnju vrednost toka novca za obe odluke:
compare_npvs <- function(n) {
stick_with_it_cashflow <- -c(2e3, rep(1e3, n-1), -1e3)
change_of_mind_cashflow <- -c(1900, rep(900, n-1))
c("stick with it" = npv(0.12, stick_with_it_cashflow),
"change of mind" = npv(0.12, change_of_mind_cashflow))
}
Ako uzmemo 6 meseci, rezultat je
compare_npvs(6)
stick with it change of mind
-5098.145 -5144.299
U slucaju da ne menjamo odluku, potrosimo manje para na stan.
Ako uzimamo na godinu dana…
compare_npvs(12)
stick with it change of mind
-7681.024 -7243.929
…isplati se da promenimo misljenje.
Mozemo da prvo vidimo koliko po kamatnoj stopi 7% investitor dobije nakon 10 godina, pa da to umanjimo za inflaciju
no_inflation <- 5e4 * (1+0.7)^10
with_inflation <- no_inflation / (1+0.3)^10
c(no_inflation, with_inflation)
[1] 10079969.5 731182.3
Dakle, vrednost nakon uzimanja u obzir inflacije je 731,182.3
Ovde je bitna prica o Krivi dobiti (glava 2.6 u knjizi). Ukratko, imamo sledece pojmove:
Tada je, pri slozenom kamacenju, \[B(0,t) = \frac1{(1+R(0,t))^t},\] tj. nominalna cena (= 1), diskontovana za kamatnu stopu \(R(0,t)\) nakon \(t\) vremena.
Ako bismo uveli \(B_N(0,t)\) da je isto sto i \(B(0,t)\), ali za naznacenu cenu \(N\), bilo bi \[B_N(0,t) = \frac{N}{(1+R(0,t))^t},\] iz istog razloga kao malopre. Odatle jednostavnim sredjivanjem dobijamo da je \[R(0,t) = \left(\frac{N}{B_N(0,t)}\right)^{\frac1t} - 1.\] Izvedimo pre resenja zadatka i sadasnju vrednost nekog projekta \(a = (a_0, a_1, \dots, a_n)\), sa trenucima transakcija \((0, t_1, \dots, t_n)\)
Projekat \(a\) mozemo da posmatramo kao kolekciju beskuponskih obveznica, sa trenucima dospeca \(0, t_1, \dots, t_n\), i nominalnim vrednostima \(a_0, a_1, \dots, a_n\), redom. Stoga je sadasnja vrednost projekta suma sadasnjih vrednosti tih obveznica \[\begin{align}&B_{a_0}(0,0) + B_{a_1}(0, t_1) + B_{a_2}(0,t_2) + \dots + B_{a_n}(0, t_n)\\ &=a_0 + a_1B(0, t_1) + a_2B(0,t_2) + \dots + a_nB(0, t_n)\\ &= a_0 + \sum_{k=1}^n \frac{a_k}{(1+R(0,t_k))^{t_k}}.\end{align}\]
Tu formulu cemo koristiti i kasnije.
Dakle da se vratimo zadatku…
Beskuponske stope su…
N <- 10
BN <- c(9.75, 9.5, 9.1, 8.5, 8.3, 8, 7.58, 7.2, 7, 6.8)
t <- c(0.5, 1, 1.5, 1.75, 2, 2.5, 3.1, 4, 5, 6)
R <- (N/BN)^(1/t) - 1
paste(round(R*100, 2), collapse = "% ")
[1] "5.19% 5.26% 6.49% 9.73% 9.76% 9.34% 9.35% 8.56% 7.39% 6.64"
Polinomijalni model je prosto linearni model sto znamo iz LSM-a, prediktori su nam stepeni vremena \(t\), a zavisna promenljiva stopa \(R(0,t)\).
model <- lm(R ~ 1 + t + I(t^2) + I(t^3))
summary(model)
Call:
lm(formula = R ~ 1 + t + I(t^2) + I(t^3))
Residuals:
Min 1Q Median 3Q Max
-0.0147524 -0.0016656 -0.0001884 0.0065019 0.0124136
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0151311 0.0176166 0.859 0.4234
t 0.0648462 0.0224535 2.888 0.0278 *
I(t^2) -0.0162727 0.0080644 -2.018 0.0902 .
I(t^3) 0.0011432 0.0008323 1.374 0.2187
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01059 on 6 degrees of freedom
Multiple R-squared: 0.7708, Adjusted R-squared: 0.6562
F-statistic: 6.726 on 3 and 6 DF, p-value: 0.02396
Treci stepen nam izgleda nebitan, pa cemo da ga izbacimo…
model2 <- lm(R ~ 1 + t + I(t^2))
summary(model2)
Call:
lm(formula = R ~ 1 + t + I(t^2))
Residuals:
Min 1Q Median 3Q Max
-0.0119602 -0.0078372 0.0000566 0.0058775 0.0165075
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.033631 0.012052 2.791 0.02689 *
t 0.036296 0.009012 4.028 0.00501 **
I(t^2) -0.005335 0.001353 -3.944 0.00557 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01124 on 7 degrees of freedom
Multiple R-squared: 0.6987, Adjusted R-squared: 0.6127
F-statistic: 8.118 on 2 and 7 DF, p-value: 0.01501
Sad je sve znacajno, i anova nam potvrdjuje da je bolji kvadratni polinom:
anova(model2, model)
Analysis of Variance Table
Model 1: R ~ 1 + t + I(t^2)
Model 2: R ~ 1 + t + I(t^2) + I(t^3)
Res.Df RSS Df Sum of Sq F Pr(>F)
1 7 0.00088504
2 6 0.00067333 1 0.00021171 1.8865 0.2187
P-vrednost je velika, pa ne odbacujemo nultu hipotezu da su modeli u sustini isti.
Napravicemo i Nelson-Zajgelov model:
modelNS <- drop(Nelson.Siegel(R, t))
# za potrebe funkcije NS u nastavku, treba da reparametrizujemo lambda sa 1/lambda
modelNS[4] <- 1/modelNS[4]
Hajde da ispratimo knjigu, pa i da nacrtamo grafike
plot(t, R)
t_axis <- seq(0.5, 6, length.out = 100)
lines(t_axis, predict(model, data.frame(t = t_axis)), col = "blue")
lines(t_axis, predict(model2, data.frame(t = t_axis)), col = "green")
lines(t_axis, NS(modelNS, t_axis), col = "red")
U prethodnom delu smo postavili model zavisnosti kamatne stope od vremena koristeci cene odredjenih obveznica sa trzista. Sada cemo da iskoristimo taj model kamatnih stopa da izracunamo sadasnje vrednosi projekata \(P_1\) i \(P_2\).
Formula po kojoj cemo racunati sadasnju vrednost projekta \((a_0, a_1, \dots, a_n)\), gde su trenuci \((0, t_1, \dots, t_n)\) je izvedena u prici na pocetku zadatka i aproksimiramo je sa: \[a_0 + \sum_{k=1}^n \frac{a_k}{(1+R(0,t_k))^{t_k}}\approx \sum_{k=0}^n \frac{a_k}{(1+\hat R(0,t_k))^{t_k}},\] gde je \(\hat R\) nas model.
p1_t <- 0:4 * 8/12 # 8 meseci je razmak izmedju transakcija
p2_t <- 0:3 * 8/12
p1_R <- predict(model2, data.frame(t = p1_t))
p2_R <- predict(model2, data.frame(t = p2_t))
p1_cf <- c(100, -20, 50, 10, 20)
p2_cf <- c(-20, 100, 10, 30)
# sadasnja vrednost direktno po formuli
p1_pv <- sum(p1_cf / (1 + p1_R)^p1_t)
p2_pv <- sum(p2_cf / (1 + p2_R)^p2_t)
c("P1" = p1_pv, "P2" = p2_pv)
P1 P2
150.5437 111.0635
Dakle, bolji je prvi projekat.
U knjizi pise da bismo mozda hteli da uracunamo i to sto su ova dva projekta na razlicitim vremenskim periodima, pa bismo mogli da koristimo cikluse. To bi podrazumevalo da svedemo oba projekta na jednake vremenske periode, tako sto svaki od njih ponavljamo onoliko puta koliko je potrebno da se dobije jednak vremenski period. Kokretno, ovde je \(P1\) na 4 perioda, a \(P2\) na 3 (ne racuna se nulta transakcija), pa treba da \(P1\) ponovimo 3 puta, a \(P2\) 4 puta. Kod je sledeci, a detalji su objasnjeni u istom.
# ponovimo projekat k puta. cf je tok novca projekta
repeat_project <- function(cf, k) {
# ako jendom ponavljamo, nemamo sta da radimo
if(k == 1)
return(cf)
# definisemo kombinovani tok novca koji ce da sadrzi ciklus
combined <- cf
for(i in 2:k) {
# vrednost kombinovanog toka je kombinovan tok + tok novca koji ponavljamo, pri cemu se
# poslednja vrednost u toku novca sabira sa nultom vrednoscu toka koji ponavljamo. Na primer,
# ako ponavljamo (-1, 2, 3) 2 puta, imamo (-1, 2, 3 - 1, 2, 3) = (-1, 2, 2, 2, 3)
combined <- c(combined, rep(0, length(cf) - 1)) + c(rep(0, length(combined) - 1), cf)
}
combined
}
Dakle, ciklicni projekti su
p1c_cf <- repeat_project(p1_cf, 3)
p2c_cf <- repeat_project(p2_cf, 4)
p1c_cf
[1] 100 -20 50 10 120 -20 50 10 120 -20 50 10 20
p2c_cf
[1] -20 100 10 10 100 10 10 100 10 10 100 10 30
Vidimo da su na istim vremenskim periodima. Sada je poredjenje sadasnjih vrednosti:
p1c_t <- 0:12 * 8/12 # 8 meseci je razmak izmedju transakcija
p2c_t <- 0:12 * 8/12
p1c_R <- predict(model2, data.frame(t = p1c_t))
p2c_R <- predict(model2, data.frame(t = p2c_t))
# sadasnja vrednost direktno po formuli
p1c_pv <- sum(p1c_cf / (1 + p1c_R)^p1c_t)
p2c_pv <- sum(p2c_cf / (1 + p2c_R)^p2c_t)
c("P1" = p1c_pv, "P2" = p2c_pv)
P1 P2
394.7969 390.5011
Opet je bolji prvi projekat.
Dobit do dospeca je unutrasnja stopa dobiti toka novca odredjenog obveznicom.
Taj tok je (- cena obveznice (to placamo), kupon, …, kupon, naznacena vrednost + kupon).
cf <- c(-10100, 1000, 1000, 10100)
irr(cf)
[1] 0.0681619
Fer cena je sadasnja vrednost toka novca odredjenog obveznicom. To mozemo izracunati korsteci funkciju npv, ako stavimo da je pocentni ulog 0.
cf <- c(0, 5, 5, 5, 5, 105)
npv(0.0495, cf)
[1] 100.2168
Za ovo samo menjamo kamatu i racunamo isto kao prethodno. Uzecemo granice za stopu (0, 0.3) jer je tako odabrano u knjizi
# srecom, npv je vektorizovana funkcija, pa mozemo da radimo samo curve.
# npv(vec, cf) ce vratiti vektor sadasnjih vrednosti toka cf za svaku od stopa u vec
curve(npv(x, cf), xlim = c(0, 0.3))
points(0.0495,100.2168)
Ovde koristimo formulu od ranije za sadasnju vrednost toka sa promenljivom stopom, \(\sum_\limits{k=0}^n \frac{a_k}{(1+R(0,t_k))^{t_k}}.\) Platili bismo:
t <- 1:10 / 2
R <- 0.05 - 0.03 * (1 - exp(-t)) / t
N <- 1e4
cf <- c(rep(250, 9), 10250) # 9 kupona i zadnji kupon + glavnica
# sadasnja vrednost iliti fer cena
sum(cf / (1 + R)^t)
[1] 10306.18
Ovde koristimo pojam
Forvardna kriva \(F(0, t, t + \Delta_t)\) nam daje vazecu kamatnu stopu koju ocekujemo da vazi u trenutku \(t\) za period \(\Delta_t\) impliciranu beskuponskom krivom dobiti.
Ovo znaci sledece: Ako imamo beskuponsku krivu dobiti \(R(0,t)\) i imamo jedinicnu sumu novca, buduca vrednost tog novca, tj. faktor kojim umnozavamo vrednost, u trenutku \(t+\Delta_t\) je \((1+R(0, t+\Delta_t))^{t+\Delta_t}\). S druge strane, mozemo i da prvo uzmemo buducu vrednost u trenutku \(t\), tj. \((1+R(0, t))^{t}\), pa nju umnozimo sa odredjenom kamatom za period \(\Delta_t\), da dobijemo buducu vrednost u trenutku \(t+\Delta_t\). Ta odredjena kamatna stopa je \(F(0, t, t + \Delta_t)\). Time dobijamo jednakost \[(1+R(0, t+\Delta_t))^{t+\Delta_t} = (1+R(0, t))^{t}(1+F(0, t, t + \Delta_t))^{\Delta_t},\] odakle je forvardna kriva \[F(0, t, t + \Delta_t) = \left(\frac{(1+R(0, t+\Delta_t))^{t+\Delta_t}}{(1+R(0, t))^{t}}\right)^{1/\Delta_t} - 1.\]
Pa da resimo zadatak…
Kamatne stope kroz pola godine su:
t <- 0.5
M <- seq(0.5, 3, 0.5) # M as in maturities
R <- c(3, 3.5, 3.75, 4, 5.1, 5.25) / 100
delta_t <- M - t # => M = t + delta_t
# forvardna kriva, tj. buduce kamate kroz pola godine
# u ovom slucaju prolazi indeksiranje R[2*M] jer su vremena dospeca razmaknuti
# na pola godine, a t je isto 1/2 pa se sve slozi. Isto, R[1] = R(0, 1/2)
((1 + R[2*M])^M / (1 + R[1])^t)^(1/delta_t) - 1
[1] 0.00000000 0.04002427 0.04127045 0.04335486 0.05631656 0.05705864
Formula kao pre sa pormenljivom kamatom. Fer cena je
cf <- c(4, 4, 4, 4, 4, 104)
sum(cf / (1 + R)^M)
[1] 108.0221
Za fer cenu za godinu dana treba da izracunamo forvardnu krivu za \(t = 1\). Sada racunamo bez prvog elementa \(M\), jer nam ne treba \(R(0, 1/2)\).
t1 <- 1
delta_t1 <- M[-1] - t1
f <- ((1 + R[2*M[-1]])^M[-1] / (1 + R[2])^t1)^(1/delta_t1) - 1
paste(round(f*100, 2), collapse = "% ")
[1] "0% 4.25% 4.5% 6.18% 6.14"
Sa ovim kamatama racunamo fer cenu za godinu dana. I tok novca se menja.
cf <- c(4, 4, 4, 104)
sum(cf / (1 + f[-1])^M[-(1:2)])
[1] 97.84866
Ako je \(\omega\) vektor koeficijenata linearne kombinacije instrumenata, da bismo nasli portfolio sa najmanjom disperzijom, treba da resimo optimizacioni problem \[\min_{\omega}\omega^\top \Sigma \omega,\quad \pmb e^\top \omega = 1,\] gde je \(\Sigma\) kovarijaciona matrica, a \(\pmb e = (1, 1, \dots, 1)^\top\).
Resenje ovog optimizacionog problema je \[\omega = \frac{\Sigma^{-1}\pmb e}{\pmb e^\top\Sigma^{-1}\pmb e},\] sto zapravo predstavlja sumu po redovima inverza matrice \(\Sigma\) i sumu svih elemenata tog inverza.
Stoga je optimalni portfolio
Sigma <- matrix(c(1, 0, 0.5, 0, 2, 0.5, 0.5, 0.5, 1), 3, 3)
invSigma <- solve(Sigma)
(omega <- rowSums(invSigma) / sum(invSigma))
[1] 0.50 0.25 0.25
Ocekivani intenzitet dobiti i disperzija ovakvog portfolia su, redom:
t(c(0.1, 0.15, 0.1)) %*% omega
[,1]
[1,] 0.1125
t(omega) %*% Sigma %*% omega
[,1]
[1,] 0.625
Portfolio sa najmanjom disperzijom odredujemo optimizacijom kao u prethodnom zadatku.
Sigma <- matrix(c(0.07, -0.005, -0.005, 0.013), 2, 2)
invSigma <- solve(Sigma)
(omega <- rowSums(invSigma)/sum(invSigma))
[1] 0.1935484 0.8064516
Karakteristike ovog portfolia su
r <- c(0.175, 0.055)
(rp <- drop(t(omega) %*% r)) # drop svede na vektor
[1] 0.07822581
(sigmap2 <- drop(t(omega) %*% Sigma %*% omega))
[1] 0.009516129
VaR (Value at Risk, vrednost pri riziku) na nivou poverenja 99% je najmanje \(x\) koje zadovoljava \(P(L\geq x)\leq 0.01\), gde je \(L\) gubitak portfolia za naredni dan.
Ako sa \(X(t)\) oznacimo vrednost portfolia u trenutku \(t\), dobit \(R\) mozemo da predstavimo kao \(R = \frac{X(1) - X(0)}{X(0)}\). Odatle je gubitak \[L = -(X(1) - X(0)) = -R\cdot X(0).\]
Ako pretpostavimo da je intenzitet dobiti \(R\) normalno raspodeljen, sa ocekivanjem \(r_p\) i disperzijom \(\sigma_p^2\), racunanje VaR-a se svodi na odredjivanje \(x\) koje zadovoljava \(P(L\geq x) = 0.01\), odakle, jednostavnim transformacijama, dobijamo da je \[\frac{\frac{-x}{X(0)} - r_p}{\sigma_p} = \Phi^{-1}(0.01) = -2.33,\] odnosno, \[VaR = x = X(0)(2.33\sigma_p - r_p).\]
U nasem zadatku, \(X(0) = 100000\), \(r_p \approx 0.0782\), \(\sigma_p^2 \approx 0.0095\), pa je VaR:
1e5 * (2.33*sqrt(sigmap2) - rp)
[1] 14906.72
Graficki cemo predstaviti efikasan portfolio kroz pricu.
Prvo cemo nacrtati grafik zavisnosti ocekivane dobiti od rizika (std. devijacije). To radimo tako sto uzmemo razne vrednosti koeficijenata \(\omega_i\) konveksne kombinacije nasih akcija i racunamo rizik i ocekivani prinos za tu kombinaciju. Ovaj grafik se ispostavlja da je parabola. Da bismo imali celu parabolu na grafiku, dopusticemo kratku prodaju, tj. da neki parametri \(\omega_i\) budu negativni.
# gomila koeficijenata linearne kobinacije akcija
omg1 <- seq(-0.5, 1.5, length.out = 100)
# 2x100 matrica, svaka kolona je vektor koeficijenata
omega_mat <- sapply(omg1, function(om1) c(om1, 1-om1))
rps <- apply(omega_mat, 2, function(omega) t(omega) %*% r)
sps <- apply(omega_mat, 2, function(omega) sqrt(t(omega) %*% Sigma %*% omega))
plot(sps, rps, type = "l", xlim = c(0, 0.3), ylim = c(0, 0.25), lty = 2)
points(sqrt(sigmap2), rp, col = "green", pch = 19)
points(sqrt(Sigma[1]), r[1], pch = 19)
points(sqrt(Sigma[4]), r[2], pch = 19)
Zelenom tackom smo oznacili nas portfolio sa minimalnom disperzijom, a crnim tackama dve akcije od kojih pravimo portfolio konveksnim kombinacijama. Da nismo dozvolili kratku prodaju, imali bismo samo deo parabole izmedju te dve tacke. Portfolio sa najmanjom disperzijom je, prirodno, na temenu te parabole.
Optimalni portfolio je onaj koji za odredjen rizik daje najveci prinos, sto ovde zapravo znaci da optimalni portfoliji jednostavno cine gornju polovinu parabole, sto cemo i nacrtati.
## grafik od malopre da bismo dobili novu sliku
plot(sps, rps, type = "l", xlim = c(0, 0.3), ylim = c(0, 0.25), lty = 2)
points(sqrt(sigmap2), rp, col = "green", pch = 19)
points(sqrt(Sigma[1]), r[1], pch = 19)
points(sqrt(Sigma[4]), r[2], pch = 19)
## optimalni portfolio je gornja polovina parabole, tj. onaj deo pocevsi od temena
lines(sps[rps >= rp], rps[rps >= rp],
col = "blue", lwd = 2)
Sada pretpostavimo da imamo i obveznicu sa stopom prinosa \(r_f\), tj bezrizican vrednosni papir. Zelimo da napravimo portfolio koji se sastoji od obveznice i rizicnog portfolia (jednog od onih sa parabole npr.). Neka je udeo rizicnog portfolia u tom kombinovanom portfoliju jednak \(\pi\). Tada, ako sa \(r_m\) oznacimo ocekivanu dobit rizicnog portfolija, a sa \(\sigma_m\) standardnu devijaciju rizicnog portfolija, ocekivanje i disperzija kombinovanog portfolija su: \[\begin{align} r_p &= (1-\pi)r_f + \pi r_m\\ \sigma_p^2 &= \pi^2 \sigma_m^2 \end{align}\] odakle se izvodi da je \[r_p = r_f + \frac{r_m - r_f}{\sigma_m}\sigma_p,\] sto je prava koja spaja tacke \((0, r_f)\) i \((\sigma_m, r_m)\), a koeficijent pravca joj je \(\frac{r_m - r_f}{\sigma_m}\). Ova prava se naziva CAL (Capital Allocation Line), a njen koeficijent pravce Sarpov kolicnik (Sharpe ratio). Prava koja ima najveci Sarpov kolicnik se naziva CML (Capital Market Line). CML ce ujedno biti i tangenta na parabolu odredjenu portfolijima. Tacka u kojoj CML sece parabolu je tangentni portfolio.
Pokazuje se da je tangentni portfolio, kao resenje optimizacionog problema \(\max\limits_\omega\frac{r_m - r_f}{\sigma_m} = \max\limits_\omega\frac{\omega^\top r - r_f}{\sqrt{\omega^\top \Sigma \omega}}\), jednak \[\omega = \frac{\Sigma^{-1}(r-r_f\pmb e)}{\pmb e^\top\Sigma^{-1}(r-r_f\pmb e)},\] gde je \(r\) vektor ocekivanih dobiti akcija u rizicnom portfoliju.
Nacrtajmo CML i tangentni portfolio u nasem slucaju.
## grafik od malopre da bismo dobili novu sliku
plot(sps, rps, type = "l", xlim = c(0, 0.3), ylim = c(0, 0.25), lty = 2)
points(sqrt(sigmap2), rp, col = "green", pch = 19)
points(sqrt(Sigma[1]), r[1], pch = 19)
points(sqrt(Sigma[4]), r[2], pch = 19)
lines(sps[rps >= rp], rps[rps >= rp],
col = "blue", lwd = 2)
### Trazimo CML i tangentni portfolio
rf <- 0.005
tan_omega <- (invSigma %*% (r - rf)) / sum(invSigma %*% (r - rf))
tan_r <- t(r) %*% tan_omega
tan_s <- sqrt(t(tan_omega) %*% Sigma %*% tan_omega)
points(tan_s, tan_r, col = "red", pch = 19)
points(0, rf, col = "darkgray", pch = 19)
abline(rf, (tan_r - rf)/tan_s, lty = 3)
segments(0, rf, tan_s, tan_r)
Siva tacka je bezrizican vrednosni papir \(r_f\), crvena je tangentni portfolio, tackasta linija je tangenta na parabolu, a crna duz je skup svih kombinovanih portfolija, za razne vrednosti udela rizicnog portfolija \(\pi\).
Primetimo da je, za svako fiksno \(r_p\), kombinovani portfolio sa ove duzi optimalan, tj. bolji od portfolija sa parabole. Samim tim, i tangentni portfolio je optimalan portfolio za ocekivanu dobit koja mu odgovara.
Ocekivana dobit i disperzija optimalnog kombinovanog portfolija sa istom stopom prinosa kao druga firma je tacka u kojoj CML prava (duz) sece pravu \(y = r_2\). Njen rizik je:
(s_opt <- (r[2] - rf) / ((tan_r - rf)/tan_s))
[,1]
[1,] 0.05899504
Za ovaj izbor portfolija, udeo rizicnog portfolija \(\pi\) je jednak:
s_opt / tan_s
[,1]
[1,] 0.53563
Ovde primenjujemo pricu iz prethodnog zadatka.
Date akcije su zadate sa:
r <- c(0.0427, 0.0016, 0.0285)
Sigma <- matrix(c(0.0100, 0.0018, 0.0011, # prva kolona
0.0018, 0.0109, 0.0026,
0.0011, 0.0026, 0.0199), 3, 3)
Tangentni portfolio je odredjen kombinacijom:
invSigma <- solve(Sigma)
rf <- 0.005
(tan_omg <- (invSigma %*% (r - rf)) / sum(invSigma %*% (r - rf)))
[,1]
[1,] 1.0245096
[2,] -0.3230754
[3,] 0.2985658
Njegova disperzija je
t(tan_omg) %*% Sigma %*% tan_omg
[,1]
[1,] 0.01238761
Disperzija portfolija sa jednakim udelima svih akcija je
omg <- rep(1/3, 3)
t(omg) %*% Sigma %*% omg
[,1]
[1,] 0.005755556
Ocekivano, manja je disperzija tangentnog portfolija.
Graficki prikaz svih mogucih portfolija je u slucaju tri akcije interesantniji
omg1 <- runif(5e4, -0.5, 1.5) # dozvoljavamo short selling pa cudni omega
omg2 <- runif(5e4, -0.5, 1.5)
omg3 <- 1 - omg1 - omg2
omega_mat <- rbind(omg1, omg2, omg3)
rps <- apply(omega_mat, 2, function(omega) t(omega) %*% r)
sps <- apply(omega_mat, 2, function(omega) sqrt(t(omega) %*% Sigma %*% omega))
plot(sps, rps, pch = ".", xlim = c(0, 0.2), ylim = c(0, 0.06), col = "navy")
points(sqrt(Sigma[1,1]), r[1], pch = 19, col = "red")
points(sqrt(Sigma[2,2]), r[2], pch = 19, col = "red")
points(sqrt(Sigma[3,3]), r[3], pch = 19, col = "red")
Crvene tacke su akcije nase tri firme, a skup sbih konveksnih kombinacija vise nije parabola nego konveksna oblast, oivicena parabolom. Optimalni portfoliji su gornja polovina te parabole, koju ne znam da nacrtam.
Tangentni portfolio i CML se crtaju kao pre
### Prosli grafik
plot(sps, rps, pch = ".", xlim = c(0, 0.2), ylim = c(0, 0.06), col = "navy")
points(sqrt(Sigma[1,1]), r[1], pch = 19, col = "red")
points(sqrt(Sigma[2,2]), r[2], pch = 19, col = "red")
points(sqrt(Sigma[3,3]), r[3], pch = 19, col = "red")
### Trazimo CML i tangentni portfolio
tan_r <- t(r) %*% tan_omg
tan_s <- sqrt(t(tan_omg) %*% Sigma %*% tan_omg)
abline(rf, (tan_r - rf)/tan_s, lty = 3, lwd = 2)
segments(0, rf, tan_s, tan_r, lwd = 2)
points(tan_s, tan_r, col = "green", pch = 19)
points(0, rf, col = "darkgray", pch = 19)
Zelena tacka je tangentni portfolio.
Ovo postaje sablon…
r <- c(0.05, 0.12)
Sigma <- matrix(c(0.0064, -0.3*0.08*0.1, -0.3*0.08*0.1, 0.01), 2, 2)
invSigma <- solve(Sigma)
omega <- rowSums(invSigma) / sum(invSigma) # min var
rf <- 0.01
tan_omg <- (invSigma %*% (r - rf)) / sum(invSigma %*% (r - rf))
# ne znam sta je trzisna cena rizika
Ovde je bitno da umanjimo trenutnu vrednost akcije za sadasnju vrednost dividendi, pa primenjujemo Black-Scholes-Merton formulu
r <- 0.1
d <- rep(1, 3) # dividende
d_T <- c(1/12, 2/12, 4/12) # vremena dividendi
d_pv <- sum(exp(-r*d_T)*d)
S0 <- 50 - d_pv
K <- 50
vol <- 0.3
# BSM model
callCF(cfBSM, S = S0, X = K, tau = 1/2, r = r, v = vol^2) # v je disperzija, =vol^2
[1] 3.749325
# Drugi nacin
vanillaOptionEuropean(S0, K, 1/2, r, 0, vol^2)$value
[1] 3.749325
Ovde treba da odredimo onu volatilnost za koju je Black-Scholes cena opcije jednaka trenutnoj ceni na trzistu. Ako je \(BS(\sigma)\) Black-Scholes cena za volatilnost \(\sigma\), a \(P\) cena opcije na trzistu, resavamo nelinearnu jednacinu \(BS(\sigma) = P\), odnosno trazimo nulu funkcije \(f(\sigma) = BS(\sigma) - P\).
f <- function(vol) {
callCF(cfBSM, S = 100, X = 110, tau = 1/2, r = 0.05, v = vol^2) - 10
# ili:
# vanillaOptionEuropean(100, 110, 1/2, 0.05, 0, vol^2)$value - 10
}
uniroot(f, c(0.001, 1))$root # ako ne radi, probamo da menjamo interval na kom trazimo
[1] 0.4579692
# Drugi nacin (default interval za uniroot je ovde (1e-5, 2))
vanillaOptionImpliedVol("european", 10, 100, 110, 1/2, 0.05)
[1] 0.4580205
# Kad vratimo interval kao pre...
vanillaOptionImpliedVol("european", 10, 100, 110, 1/2, 0.05,
uniroot.control = list(interval = c(0.001, 1)))
[1] 0.4579692