在 r 中计算不规则滚动 windows 的 sd()

Computing sd() with irregular rolling windows in r

df <- structure(list(investor = c("INV_1", "INV_1", "INV_1", "INV_1", "INV_1"), 
                     asset = c("x", "x", "x", "x", "x"), 
                     datetime = c("2010-01-01", "2010-01-02", "2010-01-03", 
                                  "2010-01-08", "2010-01-19"), 
                     portfolio = c(10, 0, 5, 2, 0)), 
                     operation = c(10, -10, 5, -3, -2), 
                     marketprice = c(10, 11, 12, 25, 5),
                class = "data.frame", row.names = c(NA, -5L))

你好,我有这种类型的数据集,我想为其计算市场价格的 sd(),但我希望它以不规则的间隔计算,这将是每个头寸的持有时间。

例如,这里的第一个位置是前两行计算的 sd(),然后 portfolio 数量变为零,因此 sd() 必须停止,所以我会sd(row1) , sd(row2),其中第 1 行是按等于 10 的价格计算的 sd,而第 2 行是按 10 和 11 计算的 sd。然后对于第 3/4/5 行,我需要相同的计算。

我有一个包含 4000 名投资者和 6000 种不同资产的数据集,因此计算必须基于所有这些组合。 我已经计算出一些东西并粘贴在这里:

mutate(datetime = as.Date(datetime, "%Y-%m-%d")) %>% 
  group_by(investor, asset) %>% 
  arrange(datetime) %>% 
  mutate(grp.pos = cumsum(lag(portfolio, default = 1) == 0)) %>%
  group_by(investor, asset, grp.pos) %>% 
  mutate(holding = datetime - datetime[1])

如果投资组合保持正值并且如果投资组合为零则该值变为零。

我不知道如何为 R 做同样的事情,我看到了一些关于滚动的东西 windows 但这不是我要找的。 我对 R 不是很聪明,所以我被困在这里。

你能帮忙吗?

题目中生成df的代码有错误,所以我们将使用最后注释中的输入。我们还创建了第二个提供 df2 的投资者,以便我们可以对此进行测试。 按投资者和资产分组,创建一个分组变量,每次投资组合为 0 时创建一个新组,并为每个这样的组使用 rollapplyr 计算从组开始到当前行的 sd。无法计算 1 个点的 sd,因此每组的第一行的 sd 为 NA。

library(dplyr)
library(zoo)

df2 %>%
  group_by(investor, asset) %>%
  group_by(group = rev(cumsum(rev(portfolio == 0))), .add = TRUE) %>%
  mutate(sd = rollapplyr(marketprice, 1:n(), sd)) %>%
  ungroup %>%
  select(-group)

给予

# A tibble: 10 x 7
   investor asset datetime   portfolio operation marketprice     sd
   <chr>    <chr> <chr>          <dbl>     <dbl>       <dbl>  <dbl>
 1 INV_1    x     2010-01-01        10        10          10 NA    
 2 INV_1    x     2010-01-02         0       -10          11  0.707
 3 INV_1    x     2010-01-03         5         5          12 NA    
 4 INV_1    x     2010-01-08         2        -3          25  9.19 
 5 INV_1    x     2010-01-19         0        -2           5 10.1  
 6 INV_2    x     2010-01-01        10        10          10 NA    
 7 INV_2    x     2010-01-02         0       -10          11  0.707
 8 INV_2    x     2010-01-03         5         5          12 NA    
 9 INV_2    x     2010-01-08         2        -3          25  9.19 
10 INV_2    x     2010-01-19         0        -2           5 10.1  

我们可以仔细检查 sd 列中的值。

sd(df2$marketprice[1])
## [1] NA

sd(df2$marketprice[1:2])
## [1] 0.7071068

sd(df2$makeprice[3])
## [1] NA

sd(df2$marketprice[3:4])
## [1] 9.192388

sd(df2$marketprice[3:5])
## [1] 10.14889

最后 5 行的 sd 值与前 5 行相同。

备注

df <- structure(list(investor = c("INV_1", "INV_1", "INV_1", "INV_1", "INV_1"), 
                     asset = c("x", "x", "x", "x", "x"), 
                     datetime = c("2010-01-01", "2010-01-02", "2010-01-03", 
                                  "2010-01-08", "2010-01-19"), 
                     portfolio = c(10, 0, 5, 2, 0), 
                     operation = c(10, -10, 5, -3, -2), 
                     marketprice = c(10, 11, 12, 25, 5)),
                class = "data.frame", row.names = c(NA, -5L))
df2 <- rbind(df, transform(df, investor = "INV_2"))