install.packages("fBasics")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.2'
## (as 'lib' is unspecified)
install.packages("timetk")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.2'
## (as 'lib' is unspecified)
install.packages("tidyverse")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.2'
## (as 'lib' is unspecified)
install.packages("lubridate")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.2'
## (as 'lib' is unspecified)
install.packages("dplyr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.2'
## (as 'lib' is unspecified)
install.packages("tidyquant")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.2'
## (as 'lib' is unspecified)
install.packages("readxl")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.2'
## (as 'lib' is unspecified)
install.packages("writexl")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.2'
## (as 'lib' is unspecified)
install.packages("kableExtra")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.2'
## (as 'lib' is unspecified)
library(readxl)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(timetk)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.2 ✔ tibble 3.2.1
## ✔ purrr 1.0.1 ✔ tidyr 1.3.0
## ✔ readr 2.1.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(tidyquant)
## Loading required package: PerformanceAnalytics
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
##
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
##
## ################################### WARNING ###################################
## # We noticed you have dplyr installed. The dplyr lag() function breaks how #
## # base R's lag() function is supposed to work, which breaks lag(my_xts). #
## # #
## # Calls to lag(my_xts) that you enter or source() into this session won't #
## # work correctly. #
## # #
## # All package code is unaffected because it is protected by the R namespace #
## # mechanism. #
## # #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning. #
## # #
## # You can use stats::lag() to make sure you're not using dplyr::lag(), or you #
## # can add conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop #
## # dplyr from breaking base R's lag() function. #
## ################################### WARNING ###################################
##
## Attaching package: 'xts'
##
## The following objects are masked from 'package:dplyr':
##
## first, last
##
##
## Attaching package: 'PerformanceAnalytics'
##
## The following object is masked from 'package:graphics':
##
## legend
##
## Loading required package: quantmod
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(fBasics)
##
## Attaching package: 'fBasics'
##
## The following object is masked from 'package:TTR':
##
## volatility
##
## The following objects are masked from 'package:PerformanceAnalytics':
##
## kurtosis, skewness
library(kableExtra)
##
## Attaching package: 'kableExtra'
##
## The following object is masked from 'package:dplyr':
##
## group_rows
Extract data
#Define the symbols we want to take
symbols <- c("SPY", "QQQ", "EEM", "IWM", "EFA", "TLT", "IYR", "GLD")
#Create a portfolio variable named portfolioPrices with undefined value
portfolioPrices <- NULL
#Extract data from yahoo finance and feed the data in portfolioPrices
for (symbol in symbols){
portfolioPrices <- cbind(portfolioPrices,
getSymbols.yahoo(symbol, from = '2018-01-01', to = '2022-12-31', auto.assign = FALSE)[, 6])
}
#rename the data according to symbols
colnames(portfolioPrices) <- symbols
weekly and monthly returns
#Change data from daily to weekly
prices_weekly <- to.weekly(portfolioPrices, indexAt = "last", OHLC = FALSE)
#Change data from daily to monthly
prices_monthly <- to.monthly(portfolioPrices, indexAt = "last", OHLC = FALSE)
#Calculate daily return
asset_returns_day_xts <- na.omit(Return.calculate(portfolioPrices))
#Calculate weekly retun
asset_returns_wk_xts <- na.omit(Return.calculate(prices_weekly))
#Calculate monthly return
asset_returns_mon_xts <- na.omit(Return.calculate(prices_monthly))
head(asset_returns_day_xts)
## SPY QQQ EEM IWM EFA
## 2018-01-03 0.006325459 0.0097167668 0.009581670 0.0010398241 0.0048002740
## 2018-01-04 0.004214583 0.0017497375 0.004951340 0.0026614043 0.0109595244
## 2018-01-05 0.006664273 0.0100428747 0.008622655 0.0020712344 0.0055596132
## 2018-01-08 0.001828566 0.0038908100 0.000000000 0.0015505048 -0.0002764834
## 2018-01-09 0.002263310 0.0000615983 -0.001628506 -0.0013544730 0.0011061784
## 2018-01-10 -0.001529854 -0.0023377695 -0.006319897 0.0001292978 -0.0019336579
## TLT IYR GLD
## 2018-01-03 0.0047811888 -0.001613208 -0.0026368504
## 2018-01-04 -0.0001586078 -0.015657898 0.0051273786
## 2018-01-05 -0.0028559348 0.001009924 -0.0010361649
## 2018-01-08 -0.0006362137 0.005675368 -0.0001596128
## 2018-01-09 -0.0133724542 -0.011537483 -0.0046284751
## 2018-01-10 -0.0012100278 -0.012179723 0.0024051585
head(asset_returns_wk_xts)
## SPY QQQ EEM IWM EFA
## 2018-01-12 0.016457948 0.01587243 0.007734471 0.021771886 0.015894928
## 2018-01-19 0.008959378 0.01124676 0.018784049 0.002781902 0.008571459
## 2018-01-26 0.022003606 0.02759365 0.032513916 0.006305049 0.015108554
## 2018-02-02 -0.038837409 -0.03697398 -0.058179785 -0.036152763 -0.035880535
## 2018-02-09 -0.050644466 -0.05169774 -0.053618740 -0.045894926 -0.054582953
## 2018-02-16 0.044397860 0.05675839 0.067212584 0.044763882 0.041259570
## TLT IYR GLD
## 2018-01-12 -0.009465832 -0.029385634 0.013005643
## 2018-01-19 -0.011725178 0.006496675 -0.004253315
## 2018-01-26 0.004306805 0.016911979 0.013051805
## 2018-02-02 -0.030431310 -0.029325958 -0.013117887
## 2018-02-09 -0.013714845 -0.041590354 -0.012817492
## 2018-02-16 0.006528874 0.024290587 0.025567064
head(asset_returns_mon_xts)
## SPY QQQ EEM IWM EFA
## 2018-02-28 -0.036360381 -0.012928098 -0.058984875 -0.038436838 -0.048347750
## 2018-03-29 -0.027410446 -0.040788269 0.005414432 0.012175378 -0.008396179
## 2018-04-30 0.005168179 0.005058438 -0.028168922 0.009813426 0.015212267
## 2018-05-31 0.024308800 0.056729371 -0.026214862 0.061635820 -0.018942624
## 2018-06-29 0.005751230 0.011450436 -0.045456771 0.006143869 -0.015840834
## 2018-07-31 0.037046482 0.027963939 0.035310232 0.016490500 0.028520075
## TLT IYR GLD
## 2018-02-28 -0.030414568 -0.066573520 -0.020759902
## 2018-03-29 0.028596762 0.037719365 0.006320007
## 2018-04-30 -0.020881361 0.002252384 -0.009539745
## 2018-05-31 0.020043983 0.033712503 -0.011959209
## 2018-06-29 0.006457944 0.040594379 -0.036149448
## 2018-07-31 -0.014368946 0.008314825 -0.022418910
##Question 1:
#Find the covariance matrix
cov_w <- cov(asset_returns_wk_xts)
#Create the 8x1 matrix with value = 1
one <- rep(1,8)
one_81 <- matrix(one,ncol=1) #8x1
#According to the formula to calculate GMVP, we denote a_w as the numerator and b_w as the denominator
a_w <- inv(cov_w)%*%one_81 # 8x8 x 8x1 = 8x1
b_w <- t(one_81)%*%inv(cov_w)%*%one_81 # 1x8 x 8x8 x 8x1 = 1x1
#Calculate GMVP
mvp_w <- a_w/as.vector(b_w)
#Format the table
colnames(mvp_w) <- "Weight"
mvp_w <- data.frame(mvp_w) %>%
kbl(format = "html", caption = "Global Minimum Variance Portfolio (weekly return)") %>%
row_spec(row = 0, bold = TRUE, color = "black", background = "#C0C0C0") %>%
kable_styling(bootstrap_options = "striped", full_width = F, position = "center")
mvp_w
Global Minimum Variance Portfolio (weekly return)
|
|
Weight
|
|
SPY
|
0.9920171
|
|
QQQ
|
-0.4595014
|
|
EEM
|
0.1668412
|
|
IWM
|
-0.0741907
|
|
EFA
|
-0.1213629
|
|
TLT
|
0.4855623
|
|
IYR
|
-0.2326813
|
|
GLD
|
0.2433157
|
#Find the covariance matrix
cov_m <- cov(asset_returns_mon_xts)
#According to the formula to calculate GMVP, we denote a_w as the numerator and b_w as the denominator
a_m <- inv(cov_m)%*%one_81 # 8x8 x 8x1 = 8x1
b_m <- t(one_81)%*%inv(cov_m)%*%one_81 # 1x8 x 8x8 x 8x1 = 1x1
#Calculate GMVP
mvp_m <- a_m/as.vector(b_m)
#Format the table
colnames(mvp_m) <- "Weight"
mvp_m <- data.frame(mvp_m) %>%
kbl(format = "html", caption = "Global Minimum Variance Portfolio (monthly return)") %>%
row_spec(row = 0, bold = TRUE, color = "black", background = "#C0C0C0") %>%
kable_styling(bootstrap_options = "striped", full_width = F, position = "center")
mvp_m
Global Minimum Variance Portfolio (monthly return)
|
|
Weight
|
|
SPY
|
1.1924615
|
|
QQQ
|
-0.7673289
|
|
EEM
|
0.0189784
|
|
IWM
|
0.1903901
|
|
EFA
|
-0.1510445
|
|
TLT
|
0.5703841
|
|
IYR
|
-0.3099020
|
|
GLD
|
0.2560612
|
#Question 2:
#Calculate the mean return according to symbol
mean_w <-colMeans(asset_returns_wk_xts) #1x8
#We use Lagrangian function to solve the problem. Finally, we have the function A*x=b0, with x is the portfolio weight, A and b0 is denoted as:
A_w <-rbind(2*cov_w,mean_w,t(one_81))
A_w <- cbind(A_w, rbind(t(tail(A_w, 2)), matrix(0, 2, 2))) #8x8
b0_w <- c(rep(0, ncol(asset_returns_wk_xts)), 0.045/52, 1) #1x8
#0.045/52 is the weekly return
#Calculate the portfolio weight
x_w <- solve(A_w,b0_w)
port_w <- as.matrix(x_w[1:8])
#Format the table
colnames(port_w) <- "Weight"
port_w <- data.frame(port_w) %>%
kbl(format = "html", caption = "portfolio return is specified as 0.045 annual rate. (weekly)") %>%
row_spec(row = 0, bold = TRUE, color = "black", background = "#C0C0C0") %>%
kable_styling(bootstrap_options = "striped", full_width = F, position = "center")
port_w
portfolio return is specified as 0.045 annual rate. (weekly)
|
|
Weight
|
|
SPY
|
1.0758991
|
|
QQQ
|
-0.4015899
|
|
EEM
|
0.0884015
|
|
IWM
|
-0.0962368
|
|
EFA
|
-0.1668197
|
|
TLT
|
0.4265152
|
|
IYR
|
-0.2435864
|
|
GLD
|
0.3174169
|
#Calculate the mean return according to symbol
mean_m <-colMeans(asset_returns_mon_xts) #1x8
#We use Lagrangian function to solve the problem. Finally, we have the function A*x=b0, with x is the portfolio weight, A and b0 is denoted as:
A_m <-rbind(2*cov_m,mean_m,t(one_81))
A_m <- cbind(A_m, rbind(t(tail(A_m, 2)), matrix(0, 2, 2))) #8x8
b0_m <- c(rep(0, ncol(asset_returns_mon_xts)), 0.045/12, 1) #1x8
#0.045/12 is the monthly return
#Calculate the portfolio weight
x_m <- solve(A_m,b0_m)
port_m <- as.matrix(x_m[1:8])
#Format the table
colnames(port_m) <- "Weight"
port_m <- data.frame(port_m) %>%
kbl(format = "html", caption = "portfolio return is specified as 0.045 annual rate. (monthly return)") %>%
row_spec(row = 0, bold = TRUE, color = "black", background = "#C0C0C0") %>%
kable_styling(bootstrap_options = "striped", full_width = F, position = "center")
port_m
portfolio return is specified as 0.045 annual rate. (monthly return)
|
|
Weight
|
|
SPY
|
1.3335788
|
|
QQQ
|
-0.7064559
|
|
EEM
|
-0.0448992
|
|
IWM
|
0.1495402
|
|
EFA
|
-0.2471853
|
|
TLT
|
0.4885682
|
|
IYR
|
-0.3156025
|
|
GLD
|
0.3424557
|
#Question 3:
#The tangency portfolio is the portfolio that has largest sharpe ratio, by using Lagrangian function we have the formula following:
nume_t_w <- inv(cov_w)%*%mean_w # 8x8 x 8x1 = 8x1
deno_t_w <- t(one_81)%*%nume_t_w # 1x8 x 8x1
#Calculate the tangency portfolio
tangency_w <- nume_t_w/as.vector(deno_t_w)
#Format the table
colnames(tangency_w) <- "Weight"
tangency_w <- data.frame(tangency_w) %>%
kbl(format = "html", caption = "Tangency Portfolio with weekly data") %>%
row_spec(row = 0, bold = TRUE, color = "black", background = "#C0C0C0") %>%
kable_styling(bootstrap_options = "striped", full_width = F, position = "center")
tangency_w
Tangency Portfolio with weekly data
|
|
Weight
|
|
SPY
|
2.8906118
|
|
QQQ
|
0.8512736
|
|
EEM
|
-1.6085710
|
|
IWM
|
-0.5731849
|
|
EFA
|
-1.1502381
|
|
TLT
|
-0.8509148
|
|
IYR
|
-0.4795090
|
|
GLD
|
1.9205325
|
#The tangency portfolio is the portfolio that has largest sharpe ratio, by using Lagrangian function we have the formula following:
nume_t_m <- inv(cov_m)%*%mean_m # 8x8 x 8x1 = 8x1
deno_t_m <- t(one_81)%*%nume_t_m # 1x8 x 8x1
#Calculate the tangency portfolio
tangency_m <- nume_t_m/as.vector(deno_t_m)
#Format the table
colnames(tangency_m) <- "Weight"
tangency_m <- data.frame(tangency_m) %>%
kbl(format = "html", caption = "Tangency Portfolio with weekly data") %>%
row_spec(row = 0, bold = TRUE, color = "black", background = "#C0C0C0") %>%
kable_styling(bootstrap_options = "striped", full_width = F, position = "center")
tangency_m
Tangency Portfolio with weekly data
|
|
Weight
|
|
SPY
|
4.2186478
|
|
QQQ
|
0.5380592
|
|
EEM
|
-1.3508449
|
|
IWM
|
-0.6856145
|
|
EFA
|
-2.2127331
|
|
TLT
|
-1.1841141
|
|
IYR
|
-0.4321463
|
|
GLD
|
2.1087459
|
#Question 4:
berndt <- read_excel("berndt.xlsx")
ber_port <- berndt %>% select(, -MARKET, -RKFREE)
ber_market <- berndt %>% select(MARKET, RKFREE) %>% mutate(Market = MARKET - RKFREE)
ber_market <- ber_market%>% select(Market)
#According to the formula in the class, we define Y= BX while Y is the portfolio_return matrix (120x15 - 15 assets in 120 months), B is the matrix that consists of a in the first column and B in the second column:
one_120 <- rep(1,120)
X <- as.matrix(cbind(one_120, ber_market)) # 120x2
Y <- as.matrix(ber_port) # 120x15
#We calculate the b_hat:
b_hat = solve(t(X)%*%X)%*%t(X) %*% Y #2x15 : first row- alpha, second row - beta
#The e_hat is equal the difference between actual return and return derived from the formula:
E_hat = Y - X %*% b_hat #120x15
head(E_hat,6)
## CITCRP CONED CONTIL DATGEN DEC DELTA
## [1,] -0.08906182 -0.0924325479 -0.08644938 -0.03294113 -0.07166573 -0.01200381
## [2,] -0.02947098 -0.0213220221 0.03962148 -0.10233449 -0.08098502 -0.04367536
## [3,] 0.02222799 0.0001459493 -0.02322229 0.01692842 -0.04144488 0.04005781
## [4,] 0.08137923 -0.0280423719 0.14407347 0.11922277 0.10229784 0.11357564
## [5,] -0.04312626 -0.0373788404 0.02232575 -0.01165793 -0.02788962 -0.06925976
## [6,] -0.00126376 0.0159743906 -0.05395791 -0.02491578 -0.03617703 0.01394154
## GENMIL GERBER IBM MOBIL PANAM
## [1,] -0.100413553 -0.028965238 -0.01280576 -0.021675972 0.06312884
## [2,] 0.001973487 0.144900665 -0.05166925 -0.031704502 -0.07498803
## [3,] -0.049582534 -0.075756917 -0.08963000 0.006102306 0.15303258
## [4,] 0.015865982 -0.044052752 0.09732727 0.024616945 0.04828272
## [5,] 0.031860393 -0.004401685 -0.05238371 -0.066068798 0.03852208
## [6,] -0.007140637 0.014969963 -0.01116196 -0.055338490 0.01944396
## PSNH TANDY TEXACO WEYER
## [1,] 0.008151819 -0.04037246 -0.03121181 -0.0790751380
## [2,] -0.020345243 -0.02681935 -0.02066688 -0.1429243732
## [3,] 0.022349580 0.05968252 -0.01983395 0.0436777086
## [4,] -0.014444627 -0.02327918 -0.04296475 0.0927777034
## [5,] 0.011764204 0.09376762 -0.07426696 -0.0853085904
## [6,] 0.037351739 -0.03333676 -0.03363874 -0.0002054953
# Excluding constant term and keep only beta in b_hat
b_hat = as.matrix(b_hat[-1,])
#Calculate the covariance of ei and put them in diagonal matrix
diagD_hat = diag(t(E_hat) %*% E_hat)/(120-2)
diag(diagD_hat)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 0.004526617 0.000000000 0.00000000 0.00000000 0.000000000 0.000000000
## [2,] 0.000000000 0.002511069 0.00000000 0.00000000 0.000000000 0.000000000
## [3,] 0.000000000 0.000000000 0.02039461 0.00000000 0.000000000 0.000000000
## [4,] 0.000000000 0.000000000 0.00000000 0.01140139 0.000000000 0.000000000
## [5,] 0.000000000 0.000000000 0.00000000 0.00000000 0.006537662 0.000000000
## [6,] 0.000000000 0.000000000 0.00000000 0.00000000 0.000000000 0.008161795
## [7,] 0.000000000 0.000000000 0.00000000 0.00000000 0.000000000 0.000000000
## [8,] 0.000000000 0.000000000 0.00000000 0.00000000 0.000000000 0.000000000
## [9,] 0.000000000 0.000000000 0.00000000 0.00000000 0.000000000 0.000000000
## [10,] 0.000000000 0.000000000 0.00000000 0.00000000 0.000000000 0.000000000
## [11,] 0.000000000 0.000000000 0.00000000 0.00000000 0.000000000 0.000000000
## [12,] 0.000000000 0.000000000 0.00000000 0.00000000 0.000000000 0.000000000
## [13,] 0.000000000 0.000000000 0.00000000 0.00000000 0.000000000 0.000000000
## [14,] 0.000000000 0.000000000 0.00000000 0.00000000 0.000000000 0.000000000
## [15,] 0.000000000 0.000000000 0.00000000 0.00000000 0.000000000 0.000000000
## [,7] [,8] [,9] [,10] [,11] [,12]
## [1,] 0.00000000 0.000000000 0.000000000 0.000000000 0.00000000 0.00000000
## [2,] 0.00000000 0.000000000 0.000000000 0.000000000 0.00000000 0.00000000
## [3,] 0.00000000 0.000000000 0.000000000 0.000000000 0.00000000 0.00000000
## [4,] 0.00000000 0.000000000 0.000000000 0.000000000 0.00000000 0.00000000
## [5,] 0.00000000 0.000000000 0.000000000 0.000000000 0.00000000 0.00000000
## [6,] 0.00000000 0.000000000 0.000000000 0.000000000 0.00000000 0.00000000
## [7,] 0.00393017 0.000000000 0.000000000 0.000000000 0.00000000 0.00000000
## [8,] 0.00000000 0.005930261 0.000000000 0.000000000 0.00000000 0.00000000
## [9,] 0.00000000 0.000000000 0.002540858 0.000000000 0.00000000 0.00000000
## [10,] 0.00000000 0.000000000 0.000000000 0.004107716 0.00000000 0.00000000
## [11,] 0.00000000 0.000000000 0.000000000 0.000000000 0.01498815 0.00000000
## [12,] 0.00000000 0.000000000 0.000000000 0.000000000 0.00000000 0.01187757
## [13,] 0.00000000 0.000000000 0.000000000 0.000000000 0.00000000 0.00000000
## [14,] 0.00000000 0.000000000 0.000000000 0.000000000 0.00000000 0.00000000
## [15,] 0.00000000 0.000000000 0.000000000 0.000000000 0.00000000 0.00000000
## [,13] [,14] [,15]
## [1,] 0.00000000 0.00000000 0.000000000
## [2,] 0.00000000 0.00000000 0.000000000
## [3,] 0.00000000 0.00000000 0.000000000
## [4,] 0.00000000 0.00000000 0.000000000
## [5,] 0.00000000 0.00000000 0.000000000
## [6,] 0.00000000 0.00000000 0.000000000
## [7,] 0.00000000 0.00000000 0.000000000
## [8,] 0.00000000 0.00000000 0.000000000
## [9,] 0.00000000 0.00000000 0.000000000
## [10,] 0.00000000 0.00000000 0.000000000
## [11,] 0.00000000 0.00000000 0.000000000
## [12,] 0.00000000 0.00000000 0.000000000
## [13,] 0.01121942 0.00000000 0.000000000
## [14,] 0.00000000 0.00464578 0.000000000
## [15,] 0.00000000 0.00000000 0.004133323
# Covariance matrix by single factor model
cov_sfm <- as.numeric(var(ber_market))*b_hat%*%t(b_hat) + diag(diagD_hat) #15x15
#Create the 15x1 matrix with value = 1
one_15 <- rep(1,15)
one_15_1 <- matrix(one_15,ncol=1)
#According to the formula to calculate GMVP, we denote a_sfm as the numerator and b_sfm as the denominator
a_sfm <- inv(cov_sfm)%*%one_15_1 # 15x15 x 15x1 = 15x1
b_sfm <- t(one_15_1)%*%inv(cov_sfm)%*%one_15_1 # 1x1 5x 15x15 x 15x1 = 1x1
#Calculate the GMVP
mvp_sfm <- a_sfm/as.vector(b_sfm)
#Format the table
colnames(mvp_sfm) <- "Weight"
mvp_sfm <- data.frame(mvp_sfm) %>%
kbl(format = "html", caption = "GMVP from single index model") %>%
row_spec(row = 0, bold = TRUE, color = "black", background = "#C0C0C0") %>%
kable_styling(bootstrap_options = "striped", full_width = F, position = "center")
mvp_sfm
GMVP from single index model
|
|
Weight
|
|
CITCRP
|
0.0443133
|
|
CONED
|
0.3755073
|
|
CONTIL
|
0.0057706
|
|
DATGEN
|
-0.0236873
|
|
DEC
|
-0.0050185
|
|
DELTA
|
0.0526752
|
|
GENMIL
|
0.1816517
|
|
GERBER
|
0.0428599
|
|
IBM
|
0.1859635
|
|
MOBIL
|
0.0338142
|
|
PANAM
|
0.0075571
|
|
PSNH
|
0.0662851
|
|
TANDY
|
-0.0262830
|
|
TEXACO
|
0.0581522
|
|
WEYER
|
0.0004386
|