2016-12-01 6 views
1

私はRで始まり、私が最適なポートフォリオを作成するためにオンラインで見つけたコードに従おうとしています。私はgetPortfolioを使用して、引数を指定すると、未使用の引数についてのエラーメッセージが表示されます。何が間違っていますか?以下は、私が立ち往生する部分まで続くコードです。-itは、getPortfolio関数で指定された引数が使用されていないと言っていますか?Rを使用してgetPortfolioで使用されていない引数があります。

> asset.names <- c("MSFT", "NORD", "SBUX") 
> er <- c(0.0427, 0.0015, 0.0285) 
> names(er) <- asset.names 
> covmat <- matrix(c(0.0 
100, 0.0018, 0.0011, 
+ 0.0018, 0.0109, 0.0026, 
+ 0.0011, 0.0026, 0.0199), 
+ nrow=3, ncol=3) 
> rk.free <- 0.005 
> dimnames(covmat)<- list(asset.names, asset.names) 
> ew = rep(1,3)/3 
> equalWeight.portfolio = getPortfolio(er=er,cov.mat=covmat,weights=ew) 

と、エラーメッセージ:

Error in getPortfolio(er = er, cov.mat = covmat, weights = ew) : 
    unused arguments (er = er, cov.mat = covmat, weights = ew) 
+0

「getPortfolio」の定義を確認できますか?具体的には、その引数は次のように識別できます: 'formals(" getPortfolio ")' –

+0

編集してくれてありがとう、Eric。私は正式版( "getPortolio")を使いました.Rの出力は単純に$ objectですか? – Zbec

+0

これは、使用しようとしている 'getPortfolio'が、あなたが共有しているドキュメンテーションで詳述されているものと同じではないことを意味します。前述のファイル 'portfolio.r'の内容を参照してその定義を確認する必要があります。あなたは同じ名前の関数をロードしたパッケージを持っていますか?あなたは '.r'ファイルのすべての内容をソースしましたか? (あなたはそれをここで見つけることができます:http://faculty.washington.edu/ezivot/econ424/portfolio.r) –

答えて

0

これはわずかに異なる方法論ですが、私はそれが何をしたいあなたを与えるだろうと思います。

library(stockPortfolio) # Base package for retrieving returns 
library(ggplot2) # Used to graph efficient frontier 
library(reshape2) # Used to melt the data 
library(quadprog) #Needed for solve.QP 

# Create the portfolio using ETFs, incl. hypothetical non-efficient allocation 
stocks <- c(
"VTSMX" = .0, 
"SPY" = .20, 
"EFA" = .10, 
"IWM" = .10, 
"VWO" = .30, 
"LQD" = .20, 
"HYG" = .10) 

# Retrieve returns, from earliest start date possible (where all stocks have 
# data) through most recent date 
returns <- getReturns(names(stocks[-1]), freq="week") #Currently, drop index 

#### Efficient Frontier function #### 
eff.frontier <- function (returns, short="no", max.allocation=NULL, 
risk.premium.up=.5, risk.increment=.005){ 
# return argument should be a m x n matrix with one column per security 
# short argument is whether short-selling is allowed; default is no (short 
# selling prohibited)max.allocation is the maximum % allowed for any one 
# security (reduces concentration) risk.premium.up is the upper limit of the 
# risk premium modeled (see for loop below) and risk.increment is the 
# increment (by) value used in the for loop 

covariance <- cov(returns) 
print(covariance) 
n <- ncol(covariance) 

# Create initial Amat and bvec assuming only equality constraint 
# (short-selling is allowed, no allocation constraints) 
Amat <- matrix (1, nrow=n) 
bvec <- 1 
meq <- 1 

# Then modify the Amat and bvec if short-selling is prohibited 
if(short=="no"){ 
Amat <- cbind(1, diag(n)) 
bvec <- c(bvec, rep(0, n)) 
} 

# And modify Amat and bvec if a max allocation (concentration) is specified 
if(!is.null(max.allocation)){ 
if(max.allocation > 1 | max.allocation <0){ 
stop("max.allocation must be greater than 0 and less than 1") 
} 
if(max.allocation * n < 1){ 
stop("Need to set max.allocation higher; not enough assets to add to 1") 
} 
Amat <- cbind(Amat, -diag(n)) 
bvec <- c(bvec, rep(-max.allocation, n)) 
} 

# Calculate the number of loops 
loops <- risk.premium.up/risk.increment + 1 
loop <- 1 

# Initialize a matrix to contain allocation and statistics 
# This is not necessary, but speeds up processing and uses less memory 
eff <- matrix(nrow=loops, ncol=n+3) 
# Now I need to give the matrix column names 
colnames(eff) <- c(colnames(returns), "Std.Dev", "Exp.Return", "sharpe") 

# Loop through the quadratic program solver 
for (i in seq(from=0, to=risk.premium.up, by=risk.increment)){ 
dvec <- colMeans(returns) * i # This moves the solution along the EF 
sol <- solve.QP(covariance, dvec=dvec, Amat=Amat, bvec=bvec, meq=meq) 
eff[loop,"Std.Dev"] <- sqrt(sum(sol$solution*colSums((covariance*sol$solution)))) 
eff[loop,"Exp.Return"] <- as.numeric(sol$solution %*% colMeans(returns)) 
eff[loop,"sharpe"] <- eff[loop,"Exp.Return"]/eff[loop,"Std.Dev"] 
eff[loop,1:n] <- sol$solution 
loop <- loop+1 
} 

return(as.data.frame(eff)) 
} 

# Run the eff.frontier function based on no short and 50% alloc. restrictions 
eff <- eff.frontier(returns=returns$R, short="no", max.allocation=.50, 
risk.premium.up=1, risk.increment=.001) 

# Find the optimal portfolio 
eff.optimal.point <- eff[eff$sharpe==max(eff$sharpe),] 

# graph efficient frontier 
# Start with color scheme 
ealred <- "#7D110C" 
ealtan <- "#CDC4B6" 
eallighttan <- "#F7F6F0" 
ealdark <- "#423C30" 

ggplot(eff, aes(x=Std.Dev, y=Exp.Return)) + geom_point(alpha=.1, color=ealdark) + 
geom_point(data=eff.optimal.point, aes(x=Std.Dev, y=Exp.Return, label=sharpe), 
color=ealred, size=5) + 
annotate(geom="text", x=eff.optimal.point$Std.Dev, 
y=eff.optimal.point$Exp.Return, 
label=paste("Risk: ", 
round(eff.optimal.point$Std.Dev*100, digits=3),"\nReturn: ", 
round(eff.optimal.point$Exp.Return*100, digits=4),"%\nSharpe: ", 
round(eff.optimal.point$sharpe*100, digits=2), "%", sep=""), 
hjust=0, vjust=1.2) + 
ggtitle("Efficient Frontier\nand Optimal Portfolio") + 
labs(x="Risk (standard deviation of portfolio)", y="Return") + 
theme(panel.background=element_rect(fill=eallighttan), 
text=element_text(color=ealdark), 
plot.title=element_text(size=24, color=ealred)) 
ggsave("Efficient Frontier.png") 

追加情報については、このリンクをご覧ください。

http://economistatlarge.com/portfolio-theory/r-optimized-portfolio

関連する問題