【问题标题】:Plotly plot not showing in viewer绘图未在查看器中显示
【发布时间】:2018-02-11 21:34:55
【问题描述】:

我尝试运行这段代码,它似乎没有产生任何错误,但最后由于某种原因我没有得到情节。我对情节的变量有一些问题,但我认为现在应该修复。我无法在我的查看器中看到情节。代码有问题还是我应该重新安装?

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")
         ))

【问题讨论】:

    标签: r plotly


    【解决方案1】:

    add_trace() 函数语法有问题。如果您想在绘图上标记标记,则需要使eff.frontier 表的尺寸与您的feasible.sdfeasible.means 尺寸相对应,您将其设置为绘图的第一层。

    简单地说,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
    

    【讨论】:

    • 当我复制粘贴您的解决方案时,我得到错误:列 color 的长度必须为 1 或 435,而不是 434。我如何使用我的数据而不是示例边界?
    • 琼,我的回答更清楚了。请检查代码的结果。现在,情节应该出现了。 plotly 对象的主要问题是绘图层的不一致(在您的原始代码中)。第一层可视化对象 feasible.sdfeasible.means 长度为 435 或更多(长度根据您的代码每天都在变化),第二层尝试可视化具有不同长度的 eff.frontier 表的列。在一张图上是不可能的。您应该设置与第一层尺寸一致的线条坐标。
    • 我的代码引入了具有一致维度的示例 eff.frontier 数据,并显示出现了 plotly 对象。因此,您只需要根据您的研究目的正确设置您的 eff.frontier 对象。
    • 非常感谢伊琳娜,我仍然很迷茫,但我认为我正朝着正确的方向前进。我现在有点想得到一张图,但它是空的,在控制台中它说:GLError:gl-shader:编译未知名称的顶点着色器时出错(请参阅npm glsl-shader-name):错误:0:1:'highp':片段着色器不支持精度 编译未知名称的顶点着色器时出错(请参阅 npm glsl-shader-name):1:精度高浮点; ^^^ 'highp' : 片段着色器不支持精度
    • 你能像我的代码那样用eff.frontier_example数据框重现一个情节吗?
    【解决方案2】:

    我假设您完全按照发布的方式运行代码。您的最后一个代码块将情节图分配给 p。只需添加行p 即可调用情节。

    p <- plotly_ly(...) p

    【讨论】:

    • 当我添加 q 时,我收到警告消息:1:无法在同一轴上同时显示离散和非离散数据
    • 和一个空白的情节
    猜你喜欢
    • 2016-11-28
    • 2017-05-03
    • 2019-12-20
    • 1970-01-01
    • 2017-09-16
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    相关资源
    最近更新 更多