4

'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,因此我不明白为什么它不起作用。

4

2 回答 2

8

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

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

然后你可以这样做:

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

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

于 2012-07-12T10:03:42.863 回答
3

PerformanceAnalytics 尝试将您的数据转换为更易于在内部使用的形式。要使其与 a 一起使用data.framedata.frame必须具有rownamesDates 一样的格式。所以,这会工作

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,例如将 a 传递vector给此函数。

我认为问题SharpeRatio.annualized在于它调用Return.excessReturn.excess尝试将您的向量变成xts带有这条线的向量

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

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

于 2012-07-12T13:12:58.053 回答