错误: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
必须具有格式类似于Date
s 的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.excess
和Return.excess
试图将你的向量变成xts
用这条线
xR = coredata(as.xts(R) - as.xts(Rf))
但是,如果不添加时间索引,则无法将矢量转换为 xts
。 (另外,下一行使用apply
,这不适用于向量)
【讨论】:
以上是关于错误:order.by 需要适当的基于时间的对象 PerformanceAnalytics的主要内容,如果未能解决你的问题,请参考以下文章
UNION ALL、TEXT 字段和 ORDER BY 错误
MySQL实验 内连接优化order by+limit 以及添加索引再次改进