2017-09-03 51 views
0

我試着運行這段代碼,它似乎沒有產生任何錯誤,但最後我沒有得到出於某種原因的情節。我有一些與情節變量有關的問題,但我認爲現在應該修復。我無法在觀看者中看到情節。代碼有問題還是應該重新安裝?Plotly plot not viewing in viewer

library(PortfolioAnalytics) 
library(quantmod) 
library(PerformanceAnalytics) 
library(zoo) 
library(plotly) 
library(foreach) 
library(DEoptim) 
library(iterators) 
library(fGarch) 
library(Rglpk) 
library(quadprog) 
library(ROI) 
library(ROI.plugin.glpk) 
library(ROI.plugin.quadprog) 
library(ROI.plugin.symphony) 
library(pso) 
library(GenSA) 
library(corpcor) 
library(testthat) 
library(nloptr) 
library(MASS) 
library(robustbase) 

# Get data 
getSymbols(c("MSFT", "SBUX", "IBM", "AAPL", "^GSPC", "AMZN")) 

# Assign to dataframe 
# Get adjusted prices 
prices.data <- merge.zoo(MSFT[,6], SBUX[,6], IBM[,6], AAPL[,6], GSPC[,6], AMZN[,6]) 

# Calculate returns 
returns.data <- CalculateReturns(prices.data) 
returns.data <- na.omit(returns.data) 

# Set names 
colnames(returns.data) <- c("MSFT", "SBUX", "IBM", "AAPL", "^GSPC", "AMZN") 

# Save mean return vector and sample covariance matrix 
meanReturns <- colMeans(returns.data) 
covMat <- cov(returns.data) 

# Start with the names of the assets 
port <- portfolio.spec(assets = c("MSFT", "SBUX", "IBM", "AAPL", "^GSPC", "AMZN")) 

# Box 
port <- add.constraint(port, type = "box", min = 0.05, max = 0.8) 

# Leverage 
port <- add.constraint(portfolio = port, type = "full_investment") 

# Generate random portfolios 
rportfolios <- random_portfolios(port, permutations = 5000, rp_method = "sample") 

# Get minimum variance portfolio 
minvar.port <- add.objective(port, type = "Risk", name = "var") 

# Optimize 
minvar.opt <- optimize.portfolio(returns.data, minvar.port, optimize_method = "random", 
           rp = rportfolios) 

# Generate maximum return portfolio 
maxret.port <- add.objective(port, type = "Return", name = "mean") 

# Optimize 
maxret.opt <- optimize.portfolio(returns.data, maxret.port, optimize_method = "random", 
           rp = rportfolios) 

# Generate vector of returns 
minret <- 0.06/100 
maxret <- maxret.opt$weights %*% meanReturns 

vec <- seq(minret, maxret, length.out = 100) 

eff.frontier <- data.frame(Risk = rep(NA, length(vec)), 
          Return = rep(NA, length(vec)), 
          SharpeRatio = rep(NA, length(vec))) 

frontier.weights <- mat.or.vec(nr = length(vec), nc = ncol(returns.data)) 
colnames(frontier.weights) <- colnames(returns.data) 

for(i in 1:length(vec)){ 
    eff.port <- add.constraint(port, type = "Return", name = "mean", return_target = vec[i]) 
    eff.port <- add.objective(eff.port, type = "Risk", name = "var") 
    # eff.port <- add.objective(eff.port, type = "weight_concentration", name = "HHI", 
    #       conc_aversion = 0.001) 

    eff.port <- optimize.portfolio(returns.data, eff.port, optimize_method = "ROI") 

    eff.frontier$Risk[i] <- sqrt(t(eff.port$weights) %*% covMat %*% eff.port$weights) 

    eff.frontier$Return[i] <- eff.port$weights %*% meanReturns 

    eff.frontier$Sharperatio[i] <- eff.port$Return[i]/eff.port$Risk[i] 

    frontier.weights[i,] = eff.port$weights 

    print(paste(round(i/length(vec) * 100, 0), "% done...")) 
} 

feasible.sd <- apply(rportfolios, 1, function(x){ 
    return(sqrt(matrix(x, nrow = 1) %*% covMat %*% matrix(x, ncol = 1))) 
}) 

feasible.means <- apply(rportfolios, 1, function(x){ 
    return(x %*% meanReturns) 
}) 

feasible.sr <- feasible.means/feasible.sd 

p <- plot_ly(x = feasible.sd, y = feasible.means, color = feasible.sr, 
      mode = "markers", type = "scattergl", showlegend = F, 

      marker = list(size = 3, opacity = 0.5, 
          colorbar = list(title = "Sharpe Ratio"))) %>% 

    add_trace(data = eff.frontier, x = 'Risk', y = 'Return', mode = "markers", 
      type = "scattergl", showlegend = F, 
      marker = list(color = "#F7C873", size = 5)) %>% 

    layout(title = "Random Portfolios with Plotly", 
     yaxis = list(title = "Mean Returns", tickformat = ".2%"), 
     xaxis = list(title = "Standard Deviation", tickformat = ".2%"), 
     plot_bgcolor = "#434343", 
     paper_bgcolor = "#F8F8F8", 
     annotations = list(
      list(x = 0.4, y = 0.75, 
       ax = -30, ay = -30, 
       text = "Efficient frontier", 
       font = list(color = "#F6E7C1", size = 15), 
       arrowcolor = "white") 
     )) 

回答

0

我假定您按照發布的方式運行代碼。您的最後一個代碼塊將圖表分配給p。只需添加行p來調用情節。

p <- plotly_ly(...) p

+0

當我剛剛加氣得到警告消息: 1:可以'同時顯示同一軸上的離散和非離散數據 –

+0

和空白圖 –

0

您有add_trace()函數的語法有問題。如果要在圖上標記,則需要製作與您的feasible.sdfeasible.means尺寸對應的eff.frontier表的尺寸,您將其設置爲圖的第一層。

簡單地說,eff.frontier列長度應該與feasible.sdfeasible.means載體的相同。

所以,如果我們創建了一個例子eff.frontier表右側的尺寸,我們可以plotly構建對象沒有任何問題:

# create eff.frontier example object 
eff.frontier_example <- data.frame(Risk = seq(0.01373, 0.01557, length.out = length(feasible.sd)), 
            Return = seq(0.0006444, 0.0008915, length.out = length(feasible.sd))) 

# create plotly object 
p <- plot_ly(x = feasible.sd, y = feasible.means, color = feasible.sr, 
      mode = "markers", type = "scattergl", showlegend = F, 

      marker = list(size = 3, opacity = 0.5, 
          colorbar = list(title = "Sharpe Ratio"))) %>% 

    add_trace(x = eff.frontier_example$Risk, y = eff.frontier_example$Return, mode = "markers", 
      type = "scattergl", showlegend = F, 
      marker = list(color = "#F7C873", size = 5)) %>% 

    layout(title = "Random Portfolios with Plotly", 
     yaxis = list(title = "Mean Returns", tickformat = ".2%"), 
     xaxis = list(title = "Standard Deviation", tickformat = ".2%"), 
     plot_bgcolor = "#434343", 
     paper_bgcolor = "#F8F8F8", 
     annotations = list(
      list(x = 0.4, y = 0.75, 
       ax = -30, ay = -30, 
       text = "Efficient frontier", 
       font = list(color = "#F6E7C1", size = 15), 
       arrowcolor = "white") 
     )) 

# show plotly object 
p 

plot with eff.frontier_example

+0

當我複製粘貼你的解決方案時,我得到錯誤:列'顏色'必須是長度1或435,而不是434.而且我該如何使用我的數據,而不是示例前沿? –

+0

瓊,我讓我的答案更加清晰。請檢查代碼的結果。現在,情節應該出現。 繪圖對象的主要問題是繪圖層的不一致(在您的原始代碼中)。第一層可視化長度爲435或更長的對象「可行性.s」和「可行性.means」(根據您的代碼,長度每天都在變化),第二層嘗試顯示「eff.frontier」表的列有不同的長度。在一張圖上是不可能的。您應該爲與第一層的尺寸一致的線設置座標。 – IrinaGoloshchapova

+0

我的代碼引入了具有一致維度的示例eff.frontier數據,並顯示出圖形對象出現。 所以,你只需要在你的研究目的下正確設置你的eff.frontier對象。 – IrinaGoloshchapova