R 计算一段时间内的回报率

R 计算一段时间内的回报率,r,return,time-series,R,Return,Time Series,我试图获得持有特定资产一段时间的收益时间序列 我的数据框如下所示: 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

我试图获得持有特定资产一段时间的收益时间序列

我的数据框如下所示:

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.
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.
我每天观察一次,我的时间序列是从1998年到1999年

我现在想做的是计算持有资产20天的回报率(即第一天买入,第20天卖出),每天都这样做。所以我想计算一下:

1.1天:返回(20天)=日志(价格(t=20)/价格(t=0))

2.day:返回(20天)=日志(价格(t=21)/价格(t=1))

3.1天:返回(20天)=日志(价格(t=22)/价格(t=2))

等等,即在我的样本中每天都这样做

因此,我得到的数据帧如下所示:

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.
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中有没有一种说法:取前20个观测值,计算回报率。观察2-21,计算回报率。进行观察3-22,计算回报等

我完全被卡住了,希望能得到一些帮助。谢谢
Dani

您可以使用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

您可以通过从范围中减去来使用偏移索引。(……但请记住,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

prcs2[(20:22)-19,2]以下函数应能完成此操作:

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)

}

getReturn或者,如果您使用的是xts包,那么生活就会变得非常简单。这是我不久前自己编写的函数的直接复制粘贴:

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

ret我建议切换到时间序列类,如
xts
zoo
。但是,如果您只是想完成它,并在以后了解更多信息,那么您可以很容易地将其作为一个数据帧来完成。请注意,我必须用
NA
s填充返回向量,以使其正确排列,并且
持有
为20的值实际上是1买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)))
这两种方法是相同的:

> 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
样本数据

price <- matrix(c(20,22,21,25,25,19,20,30,28,25,26,27,30,32,31,30),ncol= 1);
通过以下方式验证:

for (i in 1:6) {print(log(price[10+i]/price[i]))}
同样,可以使用较大的样本日期和使用

c(diff(log(price),20))
还是你的情况

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

我想您希望
k
应用为
diff
函数的
lag
,而不是
log
函数的
base
。简单的括号移位就可以了。
for (i in 1:6) {print(log(price[10+i]/price[i]))}
c(diff(log(price),20))
c(diff(log(price$Return),20))