2015-12-10 3 views
0

Je reçois l'erreur suivante du package d'analyse de portefeuille.PortfolioAnalytics Les noms de lignes d'erreur ne datent pas

Error in checkData(R) : 
    The data cannot be converted into a time series. If you are trying to pass in names from a data object with one column, you should use the form 'data[rows, columns, drop = FALSE]'. Rownames should have standard date formats, such as '1985-03-15'. 

L'ensemble de données J'utilise des données simulées est

> df 
     X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 
[1,] 0 1 0 1 0 0 0 1 1 0 
[2,] 0 1 0 0 1 1 1 1 1 1 
[3,] 1 0 0 0 0 0 0 1 1 0 
[4,] 1 0 1 1 1 0 0 1 0 1 
[5,] 0 0 1 0 1 0 1 1 1 0 
[6,] 0 1 0 1 0 1 1 0 1 1 
[7,] 1 0 0 0 0 1 1 1 1 0 
[8,] 0 0 1 1 0 0 1 1 0 1 
[9,] 1 0 0 0 0 1 1 1 1 0 
[10,] 0 1 1 0 0 1 0 1 0 0 

Je mets les contraintes de portefeuille pour être

returns = as.matrix(df) 
> funds = colnames(df) 
> init.portfolio <- portfolio.spec(assets = funds) 
> init.portfolio <- add.constraint(portfolio = init.portfolio, type = "full_investment") 
> init.portfolio <- add.constraint(portfolio = init.portfolio, type = "long_only") 
> minSD.portfolio <- add.objective(portfolio=init.portfolio, 
+         type="risk", 
+         name="StdDev") 
> minSD.opt <- optimize.portfolio(R = df, portfolio = minSD.portfolio, 
+  optimize_method = "ROI", trace = TRUE) 
Error in checkData(R) : 
    The data cannot be converted into a time series. If you are trying to pass in names from a data object with one column, you should use the form 'data[rows, columns, drop = FALSE]'. Rownames should have standard date formats, such as '1985-03-15'. 

Comment puis-je corriger cette erreur. DF est une simulation des rendements d'une période. Donc, ils sont tous à 100% ou 0%, et pour la même période. Je peux ajouter une variable de date si je dois en tant que noms de rangée, mais je ne sais pas comment. J'ai essayé

> rownames(df) = as.Date(c("Jan", rep(nrow(df)))) 
Error in charToDate(x) : 
    character string is not in a standard unambiguous format 

Quelqu'un peut-il m'aider avec cette erreur? Merci

Répondre

2

Vous aurez besoin d'ajouter des données de date à df. Si l'on suppose que les données sont des rendements mensuels commençant au début de cette année, vous pouvez ajouter rownames en utilisant

rownames(df) <- as.character(seq(as.Date("2015-01-01"), length.out=nrow(df), by = "month")) 

ou convertir df à une série chronologique XTS par

library(xts) 
df <- xts(df, order.by = seq(as.Date("2015-01-01"), 
            length.out=nrow(df), by = "month"), df) 

xts est un format couramment utilisé pour les séries chronologiques financières et fonctionne bien avec PortfolioAnalytics, donc vous pourriez envisager cela.

Une fois que vous l'aurez fait et que vous aurez lancé le fichier optimize.portfolio, vous n'obtiendrez pas de solution. Il semble que df n'est pas défini positif donc vous devrez ajuster les valeurs en df.

Aussi, je ne comprends pas votre commentaire que les retours de période unique exigent que les retours soient 0 ou 1. Ce n'est pas vrai en général.

+0

Ce sont des résultats de paris simulés, qui ont des corrélations sur les victoires. J'essaie d'obtenir un ratio de sharpe max (retours/SD) pour les paris. Était en difficulté avec l'optimisation. http://quant.stackexchange.com/questions/22208/portfolio-optimization-with-equal-weight-for-assets-selected – JB17

+0

Le problème semble être qu'en raison des contraintes sur les résultats de paris, 'cov (df) "aura tendance à être singulier ou presque singulier. Les contraintes sur df incluent des valeurs limites à 0 ou 1, exigeant que deux colonnes ne soient pas égales, et, apparemment, que le nombre de 0 soit à peu près le même que le nombre de 1. Vous pouvez essayer d'éviter cela en ayant un peu plus de lignes que de colonnes. A titre d'exemple, si vous utilisez uniquement les colonnes X2 à X9 en définissant 'df <- df [, 2: 9]', optimize.portfolio devrait vous donner un résultat. En général, plus le rapport entre le nombre de rangées et le nombre de colonnes est grand, mieux c'est. – WaltS

+0

Merci pour cette information. La base de données plus grande a 1000 colonnes et 500 lignes, donc je vais faire cet ajustement – JB17