2010-12-17 69 views
8

我試圖獲得在特定時間內持有特定資產的時間系列回報。計算一段時間內的回報

我的數據框看起來是這樣的:

Date   Price 
1998-01-01  20 
1998-01-02  22 
1998-01-03  21 
1998-01-04  25 
... 
1998-01-20  25 
1998-01-21  19 
1998-01-21  20 
.... 
1998-02-01  30 
1998-02-02  28 
1998-02-03  25 
1998-02-04  26 
etc. 

我有1個觀察每一天,我的時間序列從1998 - 1999年去。

我現在想要做的是計算20天內持有我的資產的回報(即在第一天買入並在第20天賣出),並且每天都這樣做。所以我想這個計算:

1.day:返回(20天)=日誌(價格(T = 20)/價格(T = 0)),

2.day:返回(20天) = LOG(價格(T = 21)/價格(T = 1)),

3.day:返回(20天)=日誌(價格(T = 22)/價格(T = 2))

等,即在我的樣本中每天都這樣做。

所以,我得到的數據幀應該是這樣的:

Date   Return 
1998-01-01  0.2 
1998-01-02  0.4 
1998-01-03  0.6 
1998-01-04  0.1 
... 
1998-01-20  0.1 
1998-01-21  0.2 
1998-01-21  0.5 
.... 
1998-02-01  0.1 
1998-02-02  0.2 
1998-02-03  0.5 
1998-02-04  0.01 
etc. 

是否有R A的方式來表達:取前20點的觀測,計算回報率。觀察2-21,計算回報。觀察3-22,計算回報等?

我完全卡住了,希望得到一些幫助。謝謝! Dani

回答

8

我建議切換到時間序列類,像xtszoo。但是如果你只是想完成它,並在以後學習更多,你可以很容易地將它作爲數據框架來完成。請注意,我不得不墊NA S中的向量迴歸,使其正確排隊和20的hold真的買1和銷售1 + 20:

> library(xts) 
> set.seed(2001) 
> n <- 50 
> hold <- 20 
> price <- rep(55, n) 
> walk <- rnorm(n) 
> for (i in 2:n) price[i] <- price[i-1] + walk[i] 
> data <- data.frame(date=as.Date("2001-05-25") + seq(n), price=price) 
> data <- transform(data, return=c(diff(log(price), lag=hold), rep(NA, hold))) 

如果你已經準備好xtszoo(這應該可以),然後我建議使用rollapply來獲得前瞻性看法(假設您希望前瞻性回報,這使得今天形成投資組合更容易,並且看看它如何在未來運作):

> data.xts <- xts(data[, -1], data[, 1]) 
> f <- function(x) log(tail(x, 1)) - log(head(x, 1)) 
> data.xts$returns.xts <- rollapply(data.xts$price, FUN=f, width=hold+1, align="left", na.pad=T) 

這兩種方法是一樣的:

> head(data.xts, hold+2) 
     price  return returns.xts 
[1,] 55.00000 0.026746496 0.026746496 
[2,] 54.22219 0.029114744 0.029114744 
[3,] 53.19811 0.047663206 0.047663206 
[4,] 53.50088 0.046470723 0.046470723 
[5,] 53.85202 0.041843116 0.041843116 
[6,] 54.75061 0.018464467 0.018464467 
[7,] 55.52704 -0.001105607 -0.001105607 
[8,] 56.15930 -0.024183803 -0.024183803 
[9,] 56.61779 -0.010757559 -0.010757559 
[10,] 55.51042 0.005494771 0.005494771 
[11,] 55.17217 0.044864991 0.044864991 
[12,] 56.07005 0.025411005 0.025411005 
[13,] 55.47287 0.052408720 0.052408720 
[14,] 56.10754 0.034089602 0.034089602 
[15,] 56.35584 0.075726190 0.075726190 
[16,] 56.40290 0.072824657 0.072824657 
[17,] 56.05761 0.070589032 0.070589032 
[18,] 55.93916 0.069936575 0.069936575 
[19,] 56.50367 0.081570964 0.081570964 
[20,] 56.12105 0.116041931 0.116041931 
[21,] 56.49091 0.095520517 0.095520517 
[22,] 55.82406 0.137245367 0.137245367 
4

您可以在TTR包中使用ROC函數,或者您可以創建自己的函數。

> library(quantmod) # loads TTR 
> getSymbols("SPY") 
> tail(ROC(Cl(SPY),20)) 
      SPY.Close 
2010-12-09 0.01350383 
2010-12-10 0.02307920 
2010-12-13 0.03563051 
2010-12-14 0.03792853 
2010-12-15 0.04904805 
2010-12-16 0.05432540 
> tail(log(Cl(SPY)/lag(Cl(SPY),20))) 
      SPY.Close 
2010-12-09 0.01350383 
2010-12-10 0.02307920 
2010-12-13 0.03563051 
2010-12-14 0.03792853 
2010-12-15 0.04904805 
2010-12-16 0.05432540 
1

您可以通過從一個範圍減去來使用偏移量索引。 (....但是請記住R不會使用0作爲有效索引。)假設您的價格是名爲prcs2的數據框中的第二列,前三個返回間隔爲19天,數據爲:

prcs2[ (20:22)-19, 2] <-c(20,22,21) 
prcs2[ (20:22), 2] <-c(25,19,20) 
log(prcs2[20:22, 2]/prcs2[ (20:22)-19, 2]) 
#[1] 0.22314355 -0.14660347 -0.04879016 
1

下面的函數應該這樣做:

getReturn <- function(data, n=20) { 

    #Assumes 'data' is a two-column data frame with date in the first column, price in the second 

    num.rows <- nrow(data) 

    output.range <- 1:(num.rows-20) 

    buy.price <- data[output.range,2] 
    sell.price <- data[output.range+20,2] 

    returns <- data.frame(log(sell.price) - log(buy.price)) 
    returns <- cbind(data[output.range,],returns) 
    names(returns) <- c("Date","Price","Return") 

    return(returns) 

} 

樣品的輸入和輸出:

> head(data) 
     Date Price 
1 2001-01-01 20 
2 2001-01-02 19 
3 2001-01-03 19 
4 2001-01-04 18 
5 2001-01-05 18 
6 2001-01-06 18 
> return<-getReturn(data) 
> head(return) 
     Date Price  Return 
1 2001-01-01 20 0.09531018 
2 2001-01-02 19 0.14660347 
3 2001-01-03 19 0.14660347 
4 2001-01-04 18 0.20067070 
5 2001-01-05 18 0.24512246 
6 2001-01-06 18 0.20067070 
7

另外,如果您使用的是包XTS,那麼生活是令人難以置信製造的S imple。這是一個功能我前一段時間寫我自己的直複製粘貼:

ret<-function(x,k=1){ 
    return(diff(log(x),k)) 
} 
+0

我想你想''k'作爲''lag'用於'diff'函數,而不是'log'函數的'base'。簡單的括號轉換將做到這一點。 – shabbychef 2011-08-27 22:53:34

+0

謝謝,現在修復 – 2011-08-29 00:05:18

-1

樣本數據

price <- matrix(c(20,22,21,25,25,19,20,30,28,25,26,27,30,32,31,30),ncol= 1); 

計算1天登錄返回

OneDayLogReturn <- c(diff(log(price))); 

計算10天登錄返回

TenDaysLogReturn <- c(diff(log(price),10)) 

結果:

0.2623643 0.2047944 0.3566749 0.2468601 0.2151114 0.4567584 

覈實:

for (i in 1:6) {print(log(price[10+i]/price[i]))} 

同樣,20天退換貨,可以使用更大的樣品之日起計算,並使用

c(diff(log(price),20)) 

或在您的情況

c(diff(log(price$Return),20))