[英]R Extracting the High and Low based on purchase and sale dates on a portfolio of stocks
[英]extracting weighs of relalanced portfolio
我正在對一系列股票進行投資組合優化,並試圖提取重新平衡的投資組合的權重。
我遇到的問題:我沒有得到重新平衡的投資組合的權重,而是得到 3 個日期。 該項目的代碼在下面。
library(ROI)
install.packages("DEoptim")
library(ggplot2)
install.packages("quantmod")
library(quantmod)
library(quantmod)
install.packages("PerfomanceAnalytics")
library(PerformanceAnalytics)
library(PortfolioAnalytics)
library(random)
install.packages("random")
library(random)
library(DEoptim)
install.packages("fPortfolio")
library(fPortfolio)
install.packages("foreach")
install.packages("doParallel")
library(PortfolioAnalytics)
#vector of stocks in my portfolio of
tickers <- c("FB", "AAPL", "AMZN", "GM", "GOOGL", "SQ", "NVDA","RYAM", "AMAT", "IMMR","SOI","PETS")
#bind porfolio prices
portfolioPrices <- NULL
for(ticker in tickers) {
portfolioPrices <- cbind(portfolioPrices,
getSymbols.yahoo(ticker, from='2003-01-03', periodicity = 'daily', auto.assign=FALSE)[,4])
}
#portfolio returns
portfolioReturns <- na.omit(ROC(portfolioPrices))
print(portfolioReturns)
portf <- portfolio.spec(colnames(portfolioReturns))
portf <- add.constraint(portf, type="weight_sum", min_sum=.99, max_sum=1,01)
portf <- add.constraint(portf, type="box", min=.02, max=.60)
portf<-add.constraint(portf,type="transation_cost", ptc=.001)
portf <- add.objective(portf, type="return", name="mean")
portf <- add.objective(portf, type="risk", name="StdDev",target=.005)
rp<-random_portfolios(portf, 10000, "sample")
#optimize portfolio using the "DEoptim solver"
optPort <- optimize.portfolio(portfolioReturns, portf, optimize_method = "DEoptim", trace=TRUE)
#chart weights of optimized portfolio
chart.Weights(optPort)
summary(optPort)
chart.RiskReward(optPort, risk.col = "StDev", return.col = "mean", chart.assets = TRUE)
rp<-random_portfolios(portf, 10000, "sample")
#rebalance portfolo
opt_rebal <- optimize.portfolio.rebalancing(portfolioReturns,
portf,
optimize_method="ROI",
rp=rp,
rebalance_on="years",
training_period=60,
rolling_window=60)
extractWeights(optPort)
chart.Weights(optPort)
#extract weights of rebalanced portfolio
extractWeights(opt_rebal))
我怎樣才能解決這個問題?
對你的幫助表示感謝。
謝謝你。
首先,你的代碼很亂!
因此,在給你解決方案的同時,我也清理了它。
以下是涵蓋您問題所有方面的要點:
由於您不僅使用DEoptim
求解器,還使用ROI
,因此您需要下載推薦的ROI
支持插件:
install.packages(c("fGarch",
"Rglpk",
"ROI.plugin.glpk",
"ROI.plugin.quadprog",
"ROI.plugin.symphony",
"pso",
"GenSA",
"corpcor",
"testthat",
"nloptr",
"MASS",
"robustbase")
)
您應該以正確的順序加載庫一次,因為某些庫可以相互屏蔽某些功能。 這是推薦的順序:
library(ROI)
library(ggplot2)
library(quantmod)
library(PerformanceAnalytics)
library(random)
library(DEoptim)
library(fPortfolio)
library(PortfolioAnalytics)
library(dplyr)
請注意,還加載了一個額外的dplyr
庫,這是管道( %>%
)所需的,即使您的代碼更高效和可讀:
#vector of stocks in my portfolio of
tickers <- c("FB", "AAPL", "AMZN", "GM", "GOOGL", "SQ", "NVDA","RYAM", "AMAT", "IMMR","SOI","PETS")
#bind porfolio prices
portfolioPrices <- NULL
for(ticker in tickers) {
portfolioPrices <- cbind(portfolioPrices,
getSymbols.yahoo(ticker, from='2003-01-03', periodicity = 'daily', auto.assign=FALSE)[,4])
}
#portfolio returns
portfolioReturns <- na.omit(ROC(portfolioPrices))
print(portfolioReturns)
portf <- portfolio.spec(colnames(portfolioReturns)) %>%
add.constraint(type="weight_sum", min_sum=1, max_sum=1) %>%
add.constraint(type="box", min=.02, max=.60) %>%
add.constraint(type="transation_cost", ptc=.001) %>%
add.objective(type="return", name="mean") %>%
add.objective(type="risk", name="StdDev",target=.005)
不知道為什么你不能使用之前輸入到optPort
的隨機投資組合rp
作為opt_rebal
的輸入。
rp<-random_portfolios(portf, 10000, "sample")
#optimize portfolio using the "DEoptim solver"
optPort <- optimize.portfolio(portfolioReturns, portf, optimize_method = "DEoptim", trace=TRUE,
rp=rp)
#chart weights of optimized portfolio
chart.Weights(optPort)
summary(optPort)
# chart.RiskReward(optPort, risk.col = "StDev", return.col = "mean", chart.assets = TRUE)
#not sure why you cannot use the previous random portfolio!!
rp<-random_portfolios(portf, 10000, "sample")
這個 function 調用中有一個錯誤,我認為這是由於您的portf
中的雙重目標,因為它可能會阻止您獲得有效的邊界。 不確定; 這不是必需的,而是您探索的任務:-)
# chart.RiskReward(optPort, risk.col = "StDev", return.col = "mean", chart.assets = TRUE)
ROI
與其他后端不同,因此需要單獨的投資組合規范portfolio.spec
和投資組合優化optimize.portfolio
或optimize.portfolio.rebalancing
。
這是實現它的一種方法(注意內部沒有add.objective
的投資組合規范):
portf2 <- portfolio.spec(colnames(portfolioReturns)) %>%
add.constraint(type="weight_sum", min_sum=1, max_sum=1) %>%
add.constraint(type="box", min=.02, max=.60) %>%
add.constraint(type="transation_cost", ptc=.001)
#this optimises based on Sharpe Ratio
optPort2 <- optimize.portfolio(portfolioReturns, portf2, optimize_method = "ROI", trace=TRUE,
maxSR=TRUE)
#rebalance portfolo
opt_rebal <- optimize.portfolio.rebalancing(portfolioReturns,
portf2,
optimize_method="ROI",
rp=rp,
rebalance_on="years",
training_period=60,
rolling_window=60)
extractWeights(optPort)
chart.Weights(optPort)
#extract weights of rebalanced portfolio
extractWeights(opt_rebal)
Output:
> extractWeights(opt_rebal)
FB.Close AAPL.Close AMZN.Close GM.Close GOOGL.Close SQ.Close NVDA.Close RYAM.Close AMAT.Close
2017-12-29 0.6 0.2 0.02 0.02 0.02 0.02 0.02 0.02 0.02
2018-12-31 0.6 0.2 0.02 0.02 0.02 0.02 0.02 0.02 0.02
2019-09-20 0.6 0.2 0.02 0.02 0.02 0.02 0.02 0.02 0.02
IMMR.Close SOI.Close PETS.Close
2017-12-29 0.02 0.02 0.02
2018-12-31 0.02 0.02 0.02
2019-09-20 0.02 0.02 0.02
您可以閱讀有關optimize.portfolio
的文檔,了解它可以解決哪些有限類型的凸優化問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.