Хувьцааны дундаж өгөөж, болон вариацыг \(R_i\sim (\mu_i,\sigma_i^2)\) гэж тэмдэглэе.
library(quantmod) # for downloading financial data
library(dplyr) # for data manipulation
library(tidyr)
library(ggplot2) # for visualization# Бирж дээрхи хувьцааны кодууд
tickers <- c('^GSPC','MSFT','GOOGL','AAPL')
getSymbols(tickers,
from = '2015-01-01',
to = "2015-12-31",
auto.assign = TRUE)## [1] "GSPC" "MSFT" "GOOGL" "AAPL"
Дээрхи кодыг ажиллуулахад тухайн хувьцааны үнийн мэдээлэл ажиллах орчинд нь xts хэлбэрээр орно. Үүнээс Adjusted.Close үнүүдийг ялган авч өгөдлүүдийг нэгтгэн assets нэртэй data.frame үүсгэе.
assets <- data.frame(index(AAPL), AAPL[, 6], GOOGL[,6], MSFT[, 6])
names(assets) <- c("date", "apple", "google", "microsoft")
head(assets) # хамгийн эхний 5 мөрийг харуулна.## date apple google microsoft
## 2015-01-02 2015-01-02 106.9182 529.55 45.19625
## 2015-01-05 2015-01-05 103.9062 519.46 44.78063
## 2015-01-06 2015-01-06 103.9160 506.64 44.12337
## 2015-01-07 2015-01-07 105.3731 505.15 44.68397
## 2015-01-08 2015-01-08 109.4218 506.91 45.99849
## 2015-01-09 2015-01-09 109.5391 500.72 45.61187
Өгөөжийг \[R_t=\frac{P_{t+1}-P_t}{P_t}=\frac{P_{t+1}}{P_t}-1\] томьёогоор олох тул дараах функцыг бэлдэе.
ret <- function(x) 100 * ( x / dplyr::lag(x) - 1)Энд dplyr-ийн lag функцыг ашиглаж байна. quantmod-ийн lag функцтай андуурахгүйн тулд dplyr::lag гэж бичив. Зөвхөн x / lag(x) - 1 гэж бичвэл хамгийн сүүлд ачаалагдсан пакежийн lag функцыг дууддаг.
ogooj <- assets %>%
mutate_each(funs(ret), -date) %>%
na.omit()Дээрхи кодыг “ogooj датаг үүсгэхдээ assets өгөгдлийг аваад бүх баганын хувьд ret функцаар үйлчлэн (mutate_each), NA утгуудыг хасна (na.omit). Тэгэхдээ date мөрөнд үйлчлэхгүй (-date).” гэж уншина. dplyr package ашиглалгүйгээр адилхан үйлдлийг do.call(cbind, lapply(assets, ret)) гэж бичиж болох боловч уншигдац муутай.
head(ogooj)## date apple google microsoft
## 2 2015-01-05 -2.817161117 -1.9053850 -0.9195829
## 3 2015-01-06 0.009414262 -2.4679487 -1.4677327
## 4 2015-01-07 1.402218677 -0.2940986 1.2705330
## 5 2015-01-08 3.842226738 0.3484133 2.9418130
## 6 2015-01-09 0.107250146 -1.2211246 -0.8405145
## 7 2015-01-12 -2.464066786 -0.7309480 -1.2502667
ogooj %>%
gather(stock, return, -date) %>%
ggplot(aes(x=date, y=return, colour=stock)) + geom_line()Эдгээр хувьцааны өгөөжөөс дундаж өгөөжүүд \(\mu_i\), болон рискийг \(\sigma_i\) тооцвол
R <- ogooj[, -1] #drop date column
mu <- sapply(R, mean)
sig <- sapply(R, sd)
mu## apple google microsoft
## 0.005789536 0.169342816 0.094502402
sig## apple google microsoft
## 1.686575 1.821263 1.779998
Ковариац нь
V <- var(R)
V## apple google microsoft
## apple 2.844537 1.152637 1.571820
## google 1.152637 3.317001 1.588806
## microsoft 1.571820 1.588806 3.168393
\(R_p=w_1R_1+\cdots+w_nR_n\) портфолийн хувьд вариац нь \(\sigma^2_p=\boldsymbol{w}'V \boldsymbol{w}\) байна. Иймд оптимизацийн бодлого нь \[w_1\mu_1+\cdots+w_1\mu_n=\boldsymbol{w}'\boldsymbol{\mu}=\mu_p\] захын нөхцлийг хангахаар \[\min_{\boldsymbol{w}}\boldsymbol{w}'V \boldsymbol{w}\] шийдийг олох шаардлагатай.
Лагранжийн аргаар \[\mathcal{L} = \boldsymbol{w}'V \boldsymbol{w} -\lambda_1(\boldsymbol{w}'\boldsymbol{\mu}-\mu_p) - \lambda_2(\boldsymbol{w}'\boldsymbol{1}-1) \] Үүнээс нэгдүгээр эрэмбийн нөхцлийг аваад шийдийг олбол доорхи шугаман тэгшитгэлийн систем гарна. \begin{equation} \begin{bmatrix} V & \boldsymbol{1} & \boldsymbol{\mu} \\ \boldsymbol{1} & 0 & 0 \\ \boldsymbol{\mu}& 0 & 0 \end{bmatrix} \begin{bmatrix}\boldsymbol{w}\\ \lambda_1\\ \lambda_2 \end{bmatrix} = \begin{bmatrix}0\\ 1\\ \mu_p \end{bmatrix} \end{equation}Q <- rbind(V, 1, mu)
Q <- cbind(Q, rbind(t(tail(Q, 2)), matrix(0, 2, 2)))
round(Q, 5)## apple google microsoft mu
## apple 2.84454 1.15264 1.57182 1 0.00579
## google 1.15264 3.31700 1.58881 1 0.16934
## microsoft 1.57182 1.58881 3.16839 1 0.09450
## 1.00000 1.00000 1.00000 0 0.00000
## mu 0.00579 0.16934 0.09450 0 0.00000
frontier = function(mu, V, mu_p){
n <- nrow(V)
Q <- rbind(V, 1, mu)
Q <- cbind(Q, rbind(t(tail(Q, 2)), matrix(0, 2, 2)))
x <- c(rep(0, n), 1, mu_p)
w1 <- solve(Q, x)
w <- w1[1:n]
c(crossprod(w, V %*% w))
}df <- data.frame(er = seq(0, 0.3, len=1000)) %>%
rowwise %>%
mutate(risk = sqrt(frontier(mu, V, er)))
ggplot(df, aes(x=risk, y=er)) + geom_path()R программд портфолийн анализ хийх пакежууд хэд хэд бий. Хамгийн их ашиглагддаг нь fPortfolio, PortfolioAnalytics юм. Ялангуяа PortfolioAnalytics-г томоохон hedge fund-ууд хүртэл түгээмэл ашигладаг.