2012-07-12 55 views
3

'我是R新手,甚至更多的對象。我嘗試從數據框(df)的矢量上使用PerformanceAnalytics包。錯誤:order.by需要適當的基於時間的對象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) 

它在對象分別返回錯誤和:

Error in checkData(R, method = "xts") : 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'

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

程序包的幫助說功能有效在向量上。我沒有任何NA,因此我不明白爲什麼它不起作用。

+0

這不是一個很好的使用'dput'。 dput的目的是以保留數據的結構和屬性等方式來共享數據,這些數據可能(在這種情況下)會影響數據的處理方式。您可以從錯誤中看到,您的對象不是函數期望的「xts」時間序列。 – A5C1D2H2I1M1N2O1R2T1 2012-07-12 10:09:43

回答

8

首先,您需要將數據幀轉換爲xts對象:

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

然後,你可以這樣做:

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

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

3

PerformanceAnalytics嘗試將您的數據轉換爲更易於在內部使用的表單。要使此工作與data.framedata.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嘗試這一行

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

但是,向量不能轉換爲xts把你的載體引入xts不添加時間指數。 (另外,下一行使用apply,這不是用於向量)

相關問題