1 Efficient Portfolio Frontier

Хувьцааны дундаж өгөөж, болон вариацыг \(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

1.1 Portfolio optimization problem

\(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()

1.2  PortfolioAnalytics package (to be added)

R программд портфолийн анализ хийх пакежууд хэд хэд бий. Хамгийн их ашиглагддаг нь fPortfolio, PortfolioAnalytics юм. Ялангуяа PortfolioAnalytics-г томоохон hedge fund-ууд хүртэл түгээмэл ашигладаг.

Ашигласан жишээ