错误:order.by需要适当的基于时间的对象PerformanceAnalytics

时间:2012-07-12 09:40:53

标签: r time-series xts

我是R的新手,对ts对象更是新手。我尝试在数据框(df)的矢量上使用PerformanceAnalytics包。

我有以下数据框:

    row.names   Date    PnL
1   22  1992-01-02  -1.751133e-02
2   23  1992-01-03  -1.586737e-02
3   24  1992-01-06  -2.898982e-02

我试过了:

  TestS=SharpeRatio.annualized(df[,"PnL"],Rf=0,scale=252)
  TestS=SharpeRatio.annualized(as.ts(df[,"PnL"]),Rf=0,scale=252)

它分别返回对象中的错误:

  

checkData(R,method =“xts”)出错:     数据无法转换为时间序列。如果您尝试从具有一列的数据对象传入名称,则应使用“data [rows,columns,drop = FALSE]”形式。 Rownames应具有标准日期格式,例如'1985-03-15'

dput(df[,"PnL")=0.00994504296273811, 0.00156467225423175, 0.00976137048829638, etc.
dputdf[,"Date")=8036, 8037, 8040, 8041,etc.

包的帮助说该函数适用于vector。我没有任何NA,因此我不明白为什么它不起作用。

2 个答案:

答案 0 :(得分:8)

首先,您需要将数据框转换为xts对象:

dfx = xts(df$PnL, order.by=as.Date(df$Date))

然后你可以这样做:

TestS = SharpeRatio.annualized(dfx, Rf=0, scale=252)

或者你需要做的其他事情。

答案 1 :(得分:3)

PerformanceAnalytics尝试将您的数据转换为更易于在内部使用的表单。要使用data.frame进行此操作,data.frame必须rownames格式为Date s。所以,这会起作用

rownames(df) <- df[, 2]
(TestS=SharpeRatio.annualized(df[, "PnL", drop=FALSE], Rf=0, scale=252))
#                                      PnL
#Annualized Sharpe Ratio (Rf=0%) -8.767439

虽然PerformanceAnalytics声称可以处理许多数据类型,但作者广泛使用xts。因此,如果不使用xts,他们可能错过了代码无法正常工作的几个地方,例如将vector传递给此函数。

我认为SharpeRatio.annualized中的问题是它调用Return.excessReturn.excess尝试将此向量转换为xts此行

xR = coredata(as.xts(R) - as.xts(Rf))

但是,如果不添加时间索引,则无法将矢量转换为xts。 (另外,下一行使用apply,这不适用于矢量)