用偏移量计算 rollsum 和 Delt

问题描述

我有 df a,它有两列,即;电脑和价格如下

dput(a)

structure(list(PC = c(0,-0.009,-0.008,0.003,0.008,-0.017,0.032,0.062,-0.02),Price = c(111.449554,110.495506,110.476242,109.560745,109.859482,110.68824,108.780159,112.239769,119.216805,116.826897)),class = "data.frame",row.names = c(NA,-10L))

我有 lookbackPeriod = 2,这意味着我必须为每第 n 个 rollsum 计算 a$PC 列的 lookbackPeriod

这个我可以计算

 b <- data.frame(Mscore = rollsum(a$PC,k=lookbackPeriod ))

我也有 holdPeriod = 2,这意味着我必须计算每第 n 个 holdPeriod 的价格百分比,但第 n 个 holdPeriod 周期从第 n 个 lookbackPeriod 结束处开始

例如,如果这是 a,那么对于 rollsum,它将考虑黄色的值,但要计算百分比变化,它将考虑橙色和绿色的值。

enter image description here

因此,对于给定的输入,B 中的最终输出看起来是这样的

输出将有 nrow(a) - lookbackPeriod + 1 - holdPeriod 次观察

enter image description here

这种给了我结果但它强迫LHS在最后一行列出并且Delt函数结果的前两条记录有NA

b <- data.frame(Mscore = rollsum(a$PC,k=lookbackPeriod ))
b <- b[1:(nrow(b)-holdPeriod+1),]
a <- a[lookbackPeriod:nrow(a),]
b$PChg <- as.data.frame( Delt(a$Price,k=holdPeriod))

解决方法

使用 rollapply 的宽度等于左对齐使用适当函数的结果的总和:

library(zoo)

k1 <- lookbackPeriod
k <- k1 + holdPeriod
roll <- function(...) rollapply(...,fill = NA,align = "left")
transform(a,MScore = roll(PC,k,function(x) sum(x[1:k1])),PChg = roll(Price,function(x) x[k]/x[k1]-1))

给予:

       PC    Price MScore         PChg
1   0.000 111.4496 -0.009 -0.008459720
2  -0.009 110.4955 -0.009 -0.005582739
3   0.000 110.4762 -0.008  0.010291049
4  -0.008 109.5607 -0.005 -0.009824578
5   0.003 109.8595  0.011  0.014017108
6   0.008 110.6882 -0.009  0.095942551
7  -0.017 108.7802  0.015  0.040869008
8   0.032 112.2398     NA           NA
9   0.062 119.2168     NA           NA
10 -0.020 116.8269     NA           NA

这种变体也适用:

f <- function(x) c(MScore = sum(x[1:k1,1]),PChg = x[k,2]/x[k1,2] - 1)
cbind(a,rollapply(a,f,align = "left",by.column = FALSE))