library(PerformanceAnalytics) library(quantmod) library(xts) library(dygraphs)#画图 library(tibble) library(tidyr) library(ggplot2) #画图 library(highcharter) library(tidyquant) library(plotly) library(timetk) # To manipulate the data series library(forcats)
price <-read.csv("E:/portfolio/ Final Report/data1.csv")
price[,1] = as.POSIXct(price[,1]) price[,1]
price = xts(price[,-1], order.by=price[,1])
price = price[,1:5] names(price)<-c("WBYY","JGJM","SXYY","GSSP","KLT") dygraph(price) #动态图 plot太low了不要用 dy可以实时显示数字
head(price)#打印前五行 prdaily <- to.daily(price, indexAt = "lastof", OHLC = FALSE) head(prdaily)
rtdaily <- na.omit(Return.calculate(prdaily, method = "log")) #去掉空白值 na就是空值
head(rtdaily) dygraph(rtdaily)
meanret <- colMeans(rtdaily)#计算回报率的均值 print(round(mean_ret, 5))#收益能力
covmat <- cov(rtdaily) * 252 #计算协方差 【为什么成252??全年吗?】 print(round(cov_mat,5)) #风险情况
tick <- c("WBYY","JGJM","SXYY","GSSP","KLT") wts <- runif(n = length(tick))#tick是四个数 给四个数赋予权重
wts <- wts/sum(wts) print(wts)
portreturns <- (sum(wts * meanret) + 1)^252 - 1#四个整体收益
port_risk <- sqrt(t(wts) %*% (cov_mat %*% wts))#转置 再相乘 sharperatio <- portreturns/port_risk
num_port <- 1000
allwts <- matrix(nrow = numport, ncol = length(tick))
portreturns <- vector('numeric', length = numport)
portrisk <- vector('numeric', length = numport)
sharperatio <- vector('numeric', length = numport)
for (i in seqalong(portreturns)) {
wts <- runif(length(tick)) wts <- wts/sum(wts)
# Storing weight in the matrix all_wts[i,] <- wts
# Portfolio returns
portret <- sum(wts * meanret) portret <- ((portret + 1)^252) - 1
# Storing Portfolio Returns values portreturns[i] <- portret
# Creating and storing portfolio risk port_sd <- sqrt(t(wts) %*% (cov_mat %*% wts)) portrisk[i] <- portsd
# Creating and storing Portfolio Sharpe Ratios # Assuming 0% Risk free rate
sr <- portret/portsd sharpe_ratio[i] <- sr }
portfoliovalues <- tibble(Return = portreturns, Risk = portrisk, SharpeRatio = sharperatio)
allwts <- tktbl(all_wts)
colnames(allwts) <- colnames(prdaily)
portfoliovalues <- tktbl(cbind(allwts, portfoliovalues))
minvar <- portfoliovalues[which.min(portfolio_values$Risk),] maxsr <- portfoliovalues[which.max(portfolio_values$SharpeRatio),]
p <- minvar %>% gather(WBYY:KLT, key = Asset, value = Weights) %>% mutate(Asset = as.factor(Asset)) %>% ggplot(aes(x = fctreorder(Asset,Weights), y = Weights, fill = Asset)) + geombar(stat = 'identity') + thememinimal() + labs(x = 'Assets', y = 'Weights', title = "Minimum Variance Portfolio Weights") + scaleycontinuous(labels = scales::percent)
ggplotly(p)
p <- maxsr %>% gather(WBYY:KLT, key = Asset, value = Weights) %>% mutate(Asset = as.factor(Asset)) %>% ggplot(aes(x = fctreorder(Asset,Weights), y = Weights, fill = Asset)) + geombar(stat = 'identity') + thememinimal() + labs(x = 'Assets', y = 'Weights', title = "Tangency Portfolio Weights") + scaleycontinuous(labels = scales::percent)
ggplotly(p)
p <- portfoliovalues %>% ggplot(aes(x = Risk, y = Return, color = SharpeRatio)) + geompoint() + themeclassic() + scaleycontinuous(labels = scales::percent) + scalexcontinuous(labels = scales::percent) + labs(x = 'Annualized Risk', y = 'Annualized Returns', title = "Portfolio Optimization & Efficient Frontier") + geompoint(aes(x = Risk, y = Return), data = minvar, color = 'orange') + geompoint(aes(x = Risk, y = Return), data = maxsr, color = 'orange') + scalecolor_gradient(low = "skyblue", high = "pink") #+
ggplotly(p)