如何在未来的索引号上应用函数 - xts 对象
How to apply function over future index numbers - xts object
我有一些股票数据,我想在其中应用某个布尔值,前提是在前面的 n
行中满足了某个先前的布尔值。
这个问题可以简单地用一个股票策略来说明:买入并持有30天,如何有效地做到这一点?
在下面的示例数据中,您可以在 Signal
列中看到多个 TRUE (1)
值,现在我想在已识别的 1
之后创建接下来的 30 行值也为 1
。请注意,在观察到 1
后不久,信号列可能 return TRUE (1)
,应忽略并覆盖这些值。
因此我需要类似于
的行为
- 在信号列中找到第一个 1
- 无论信号列的行值是 1 还是 0,都将 1 放入标识的第一个 1 之后的 n 行中。
- 重置行为,使其再次开始在 Signal 列中寻找 1。
示例数据
Open High Low Close Signal
2012-04-13 138.80 139.60 135.90 136.40 0
2012-04-16 136.00 141.30 135.20 139.70 1
2012-04-17 139.40 144.90 138.50 144.00 0
2012-04-18 139.90 140.10 135.60 136.30 0
2012-04-19 137.20 140.00 136.40 138.00 1
2012-04-20 137.60 141.00 136.10 141.00 0
2012-04-23 140.00 140.10 132.70 133.90 0
2012-04-24 133.90 138.40 133.40 138.20 0
2012-04-25 146.00 150.00 145.10 147.20 1
2012-04-26 149.80 149.80 144.20 146.00 0
2012-04-27 145.50 149.80 144.00 149.00 0
2012-04-30 148.50 150.60 147.60 150.10 0
2012-05-01 150.10 150.10 150.10 150.10 0
2012-05-02 151.10 151.10 147.80 148.80 0
2012-05-03 148.60 151.20 147.90 149.20 0
2012-05-04 148.40 149.20 140.50 143.00 0
2012-05-07 139.90 143.10 139.00 142.60 0
2012-05-08 142.30 142.30 137.80 138.60 0
2012-05-09 139.20 140.40 134.60 137.60 0
2012-05-10 139.00 141.30 136.10 140.00 0
2012-05-11 138.70 142.50 138.20 142.50 1
2012-05-14 140.60 141.70 135.30 136.20 0
2012-05-15 136.80 138.70 135.70 137.70 0
2012-05-16 135.60 136.50 132.00 135.60 0
2012-05-17 135.60 135.60 135.60 135.60 0
2012-05-18 132.10 134.30 129.50 130.90 0
2012-05-21 131.50 134.90 130.30 134.40 0
2012-05-22 135.20 139.70 133.50 138.60 0
2012-05-23 136.10 137.30 135.00 135.90 0
2012-05-24 137.40 140.10 135.60 137.60 0
2012-05-25 137.30 139.00 134.00 136.70 0
2012-05-28 137.80 141.30 137.30 139.20 0
2012-05-29 140.00 142.70 139.50 141.50 1
有几种方法可以做到这一点。这是一个(假定您的 xts 对象称为 x
):
n <- nrow(x)
i <- 1
x$Result <- x$Signal
while(i < n) {
if(x$Signal[i]==1) {
x$Result[(i+1):(min((i+30),n))] <- 1
i <- min((i+31),n)
} else i <- i+1
}
我有一些股票数据,我想在其中应用某个布尔值,前提是在前面的 n
行中满足了某个先前的布尔值。
这个问题可以简单地用一个股票策略来说明:买入并持有30天,如何有效地做到这一点?
在下面的示例数据中,您可以在 Signal
列中看到多个 TRUE (1)
值,现在我想在已识别的 1
之后创建接下来的 30 行值也为 1
。请注意,在观察到 1
后不久,信号列可能 return TRUE (1)
,应忽略并覆盖这些值。
因此我需要类似于
的行为- 在信号列中找到第一个 1
- 无论信号列的行值是 1 还是 0,都将 1 放入标识的第一个 1 之后的 n 行中。
- 重置行为,使其再次开始在 Signal 列中寻找 1。
示例数据
Open High Low Close Signal
2012-04-13 138.80 139.60 135.90 136.40 0
2012-04-16 136.00 141.30 135.20 139.70 1
2012-04-17 139.40 144.90 138.50 144.00 0
2012-04-18 139.90 140.10 135.60 136.30 0
2012-04-19 137.20 140.00 136.40 138.00 1
2012-04-20 137.60 141.00 136.10 141.00 0
2012-04-23 140.00 140.10 132.70 133.90 0
2012-04-24 133.90 138.40 133.40 138.20 0
2012-04-25 146.00 150.00 145.10 147.20 1
2012-04-26 149.80 149.80 144.20 146.00 0
2012-04-27 145.50 149.80 144.00 149.00 0
2012-04-30 148.50 150.60 147.60 150.10 0
2012-05-01 150.10 150.10 150.10 150.10 0
2012-05-02 151.10 151.10 147.80 148.80 0
2012-05-03 148.60 151.20 147.90 149.20 0
2012-05-04 148.40 149.20 140.50 143.00 0
2012-05-07 139.90 143.10 139.00 142.60 0
2012-05-08 142.30 142.30 137.80 138.60 0
2012-05-09 139.20 140.40 134.60 137.60 0
2012-05-10 139.00 141.30 136.10 140.00 0
2012-05-11 138.70 142.50 138.20 142.50 1
2012-05-14 140.60 141.70 135.30 136.20 0
2012-05-15 136.80 138.70 135.70 137.70 0
2012-05-16 135.60 136.50 132.00 135.60 0
2012-05-17 135.60 135.60 135.60 135.60 0
2012-05-18 132.10 134.30 129.50 130.90 0
2012-05-21 131.50 134.90 130.30 134.40 0
2012-05-22 135.20 139.70 133.50 138.60 0
2012-05-23 136.10 137.30 135.00 135.90 0
2012-05-24 137.40 140.10 135.60 137.60 0
2012-05-25 137.30 139.00 134.00 136.70 0
2012-05-28 137.80 141.30 137.30 139.20 0
2012-05-29 140.00 142.70 139.50 141.50 1
有几种方法可以做到这一点。这是一个(假定您的 xts 对象称为 x
):
n <- nrow(x)
i <- 1
x$Result <- x$Signal
while(i < n) {
if(x$Signal[i]==1) {
x$Result[(i+1):(min((i+30),n))] <- 1
i <- min((i+31),n)
} else i <- i+1
}