2017-09-03 1 views
0

J'ai essayé d'exécuter ce code et il semble ne produire aucune erreur mais à la fin je n'obtiens pas l'intrigue pour une raison quelconque. J'ai eu quelques problèmes avec les variables pour l'intrigue, mais je pense que cela devrait être résolu maintenant. Je ne peux pas obtenir l'intrigue dans mon spectateur. Y a-t-il un problème avec le code ou devrais-je le réinstaller?L'intrigue n'apparaît pas dans la visionneuse

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épondre

0

Je suppose que vous avez exécuté le code tel qu'il a été publié. Votre dernier bloc de code attribue le graphe complot à p. Il suffit d'ajouter la ligne p pour appeler l'intrigue.

p <- plotly_ly(...) p

+0

quand je viens d'ajouter le qi des messages d'avertissement: 1: Peut ne pas afficher les données discrètes et non discrètes sur le même axe –

+0

et une parcelle vide –

0

Vous avez un problème avec add_trace() syntaxe de la fonction. Si vous voulez des marqueurs sur la parcelle, vous devrez faire les dimensions du tableau eff.frontier correspondant à vos dimensions feasible.sd et feasible.means, que vous définissez comme la première couche de votre parcelle. Simplement, la longueur des colonnes eff.frontier devrait être la même que celle des vecteurs feasible.sd et feasible.means.

Donc, si nous créons un exemple eff.frontier table avec bonnes dimensions que nous pourrions construire objet plotly sans aucun problème:

# 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

lorsque je copie coller votre solution je reçois l'erreur: Colonne 'color' doit être longueur 1 ou 435, pas 434. Et aussi comment puis-je utiliser mes données au lieu de l'exemple frontière? –

+0

Joan, j'ai rendu ma réponse un peu plus claire. S'il vous plaît, vérifiez le résultat du code. Maintenant, l'intrigue devrait apparaître. Le principal problème de l'objet d'intrigue est l'incohérence des couches de tracé (dans votre code d'origine). La première couche visualise les objets 'feasible.sd' et' feasible.means' avec une longueur de 435 ou plus (la longueur change au jour le jour selon votre code) et la deuxième couche essaie de visualiser les colonnes de la table 'eff.frontier' qui avoir une longueur différente. C'est impossible sur un graphique. Vous devez définir des coordonnées pour les lignes cohérentes avec les dimensions de votre première couche. – IrinaGoloshchapova

+0

Mon code introduit des exemples de données eff. Avec des dimensions cohérentes et montre que l'objet intrigue apparaît. Donc, vous avez juste besoin de définir correctement votre objet eff.frontier dans votre recherche. – IrinaGoloshchapova