【问题标题】:PortfolioAnalytics Error row names not DatesPortfolioAnalytics 错误行名称不是日期
【发布时间】:2015-12-12 07:42:14
【问题描述】:

我从投资组合分析包中收到以下错误。

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'. 

我使用的数据集是模拟数据

> 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

我将投资组合约束设置为

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'. 

如何解决此错误。 DF 是单期收益的模拟。所以它们都是 100% 或 0%,并且在同一时期。如果需要,我可以添加一个日期变量作为行名,但我不知道如何。我试过了

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

有人可以帮我解决这个错误吗?谢谢

【问题讨论】:

    标签: r optimization portfolio


    【解决方案1】:

    您需要将日期数据添加到 df.假设数据是从今年年初开始的月度回报,您可以使用

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

    或将df转换为xts时间序列

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

    xts 是金融时间序列的常用格式,并且与 PortfolioAnalytics 配合得很好,因此您可能会考虑这一点。

    完成此操作并运行 optimize.portfolio 后,您将无法获得解决方案。看来 df 不是正定的,因此您必须调整 df 中的值。

    另外,我不太明白您关于单期回报要求回报为 0 或 1 的评论。一般情况下并非如此。

    【讨论】:

    • 这些是模拟投注结果,与获胜有相关性。我正在尝试为投注获得最大锐化比率(回报/SD)。正在努力优化。 quant.stackexchange.com/questions/22208/…
    • 问题似乎是因为对投注结果的限制,'cov(df)' 会趋向于单数或几乎单数。对 df 的约束包括将值限制为 0 或 1,要求没有两列相等,并且显然,0 的数量应该与 1 的数量大致相同。您可以尝试通过使行多于列来避免这种情况。例如,如果通过设置 df &lt;- df[,2:9] 仅使用 X2 到 X9 列,则 optimize.portfolio 应该会给您一个结果。一般来说,行数与列数的比值越大越好。
    • 感谢您提供此信息。更大的数据框有 1000 列和 500 行,所以我会进行调整
    • 我看不出01 是如何正确返回值的。 1 意味着您的回报等于您的赌注,因此您的投资将翻倍。好的。但是,0 意味着没有回报,但您下注后的投资将与进入相同。换句话说,您永远不会赔钱,因此任何策略都会是赢家。似乎更适用的一组回报是1-1,其中-1 表示您将输掉您的赌注。
    • 好点。生病使编码更改。感谢您的建议
    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2016-11-19
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2021-08-21
    相关资源
    最近更新 更多