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

Posted

技术标签:

【中文标题】错误:order.by 需要适当的基于时间的对象 PerformanceAnalytics【英文标题】:Error: order.by requires an appropriate time-based object PerformanceAnalytics 【发布时间】:2012-07-12 00:56:13 【问题描述】:

's我是 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]”形式。行名应该有标准的日期格式,例如 '1985-03-15'

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

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

【问题讨论】:

dput 的用法不是很好。 dput 的目的是以保留数据结构和属性等内容的方式共享数据,这可能(如在本例中)对数据的处理方式产生影响。您可以从错误中看到您的对象不是函数所期望的xts 时间序列。 【参考方案1】:

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

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

那么你可以这样做:

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

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

【讨论】:

【参考方案2】:

PerformanceAnalytics 尝试将您的数据转换为更易于在内部使用的形式。要使用data.frame 进行这项工作,data.frame 必须具有格式类似于Dates 的rownames。所以,这会工作

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,这不适用于向量)

【讨论】:

以上是关于错误:order.by 需要适当的基于时间的对象 PerformanceAnalytics的主要内容,如果未能解决你的问题,请参考以下文章

UNION ALL、TEXT 字段和 ORDER BY 错误

使用 ORDER BY 时出现数据类型不匹配错误

MySQL实验 内连接优化order by+limit 以及添加索引再次改进

mysql order by基于时间的盲注

查询失败并出现错误 RESOURCE_EXHAUSTED (ORDER BY without ORDER BY)

ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 是不是保留订单?