R 创建回望窗口长度返回大于x%的变量

R 创建回望窗口长度返回大于x%的变量,r,time-series,xts,R,Time Series,Xts,我目前正在使用R进行一些研究,我想知道是否有人对如何创建以下变量有任何聪明的想法或任何预先打包的函数: 我有一个单变量的价格序列,比如说金融资产的每日收盘价,可以追溯到10年前。(它是一个xts对象) 我已选择我的x为2% 我每天的价格数据。我想知道为了创造(潜在的绝对)回报(假设你当时有交易的远见)大于x%,你需要回去的最少天数。该变量将返回生成x%回报所需的天数/月数/年数。如果需要返回到数据开始之后,以产生大于x%的回报,NAs将在早期阶段返回 我可以想出一些手动和笨拙的方法来实现这一点,

我目前正在使用R进行一些研究,我想知道是否有人对如何创建以下变量有任何聪明的想法或任何预先打包的函数:

我有一个单变量的价格序列,比如说金融资产的每日收盘价,可以追溯到10年前。(它是一个xts对象)

我已选择我的x为2%

我每天的价格数据。我想知道为了创造(潜在的绝对)回报(假设你当时有交易的远见)大于x%,你需要回去的最少天数。该变量将返回生成x%回报所需的天数/月数/年数。如果需要返回到数据开始之后,以产生大于x%的回报,NAs将在早期阶段返回


我可以想出一些手动和笨拙的方法来实现这一点,但它使用大量的循环来检查大量的日期/价格,以便为每天返回正确的值,然后在第二天重复这个过程……对于10年的数据或日内数据来说,这是非常有问题的,因此,将对更快的解决方案进行向上投票……

首先,您应该反转时间序列,以便具有最小正值的x值在时间上是最近的,而较远的过去点在右侧。然后,您可以获取当前值并说:

set.seed(123)
yval=cumsum(0.01*rnorm(100))
plot(1:100, yval, type="b")
which(rev(yval) < 0.95*yval[100])
which(rev(yval) < (1- 0.05)*yval[100])[1]
[1] 5
set.seed(123)
yval=累积值(0.01*r形式(100))
绘图(1:100,yval,type=“b”)
其中(修订版(yval)<0.95*yval[100])
其中(修订版(yval)<(1-0.05)*yval[100])[1]
[1] 5

如果您提供了带有日期-时间或日期分类变量的样本数据集,我们可以帮助您进行任何必要的转换。

如果没有for循环,我看不到任何方法可以做到这一点,但下面的解决方案相当快(在我的2.2Ghz笔记本电脑上,每10000行大约1秒)

注意,我正在获取xts对象的
coredata
,并删除
dim
属性(通过
drop
),该属性返回一个向量。我这样做是因为xts/zoo中的数学运算按索引对齐,所以在计算回报之前,需要从分子中删除索引

但是,这会导致分区调度调用
NextMethod
,因为分子是
numeric
类,分母是
xts
类。我通过对数值向量执行除法来避免这种开销

library(quantmod)
getSymbols("^GSPC",from="1900-01-01")

x <- Ad(GSPC)

lookback <- function(x, p) {
  # lookback() assumes x is xts
  # select first column, take coredata, drop dims
  dcx <- drop(coredata(x[,1]))
  # initialize result object
  f <- dcx*NA
  # loop over all rows in 'x'
  for(i in 1:nrow(x)) {
    # Calculate cumulative return through today
    r <- dcx[i]/dcx-1 # or log(dcx[i]/dcx)
    # This really slows things down:
    # r <- dcx[i]/x-1
    #
    # Find which returns are greater than 'p'
    w <- which(abs(r[1:i]) > p)
    # If any returns are greater than 'p', then
    # record the closest location to 'p'
    if(length(w)!=0)
      f[i] <- max(w)-i
  }
  # return an xts object
  xts(f, index(x))
}
nrow(x)
# [1] 15791
system.time(lookback(x,0.02))
#    user  system elapsed 
#  15.761   0.152  16.040 
库(quantmod)
getSymbols(“^GSPC”,from=“1900-01-01”)

你能提供一些数据的例子吗?当我们不知道您的输入数据是什么样子时,很难尝试生成解决方案。请使用
dput(head(data))
为我们提供一个子集,您可以使用它来更新您的答案。这与Joshua的答案是等价的(在CPU周期中),还是颠倒数据会带来一些好处(除了使用[1]的方便之外)获取最后一个条目)?反转只允许以我更容易想到的方式进行矢量化。我不知道它是否等效。Joshua Ulrich通过
quantmod
getSymbols
获取的示例数据代表了我的问题……在您的示例中,结果仅针对一个特定的天/点。即最后一点。你将如何对整个数据集进行矢量化?我将制作一个函数,用于处理一个日期,然后向它提交一个日期列表。。。可能使用
sapply
。我不知道你为什么要问。约书亚的回答在某种程度上有缺陷吗?我以为问题已经回答了。