在 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"))
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"))