我正在尝试找到基于向量 a 的值更新向量 b 值的向量化解决方案。我遇到的问题是:
> # Vector a is the "driver" meaning if there is 1 or -1 in vector a
> # -1 or 1 needs to follow in vector b. The challenge I have is when
> # I have 1 or -1 in a and in b I have two or more -1 or 1
> # then all but first same values in b should be set to 0 if values
> # in a does not change
> a <- c(0, 1, 0, 0, 0, 0, 0,-1, 0, 0, 1, 1,-1,-1, 0, 0, 1, 0, 0,-1, 0, 1, 0, 0, 0, 0, 0)
> b <- c(0, 0,-1, 0,-1, 0, 0, 0, 0, 1, 1,-1,-1, 1, 1, 0, 0,-1, 0, 0, 1, 0,-1,-1, 0,-1, 0)
> a
[1] 0 1 0 0 0 0 0 -1 0 0 1 1 -1 -1 0 0 1 0 0 -1 0 1 0 0 0 0 0
> b
[1] 0 0 -1 0 -1 0 0 0 0 1 1 -1 -1 1 1 0 0 -1 0 0 1 0 -1 -1 0 -1 0
>
> # I need a vectorized function(a, b), if possible, that changes b
> # based on a like below (removing some repeated values in b)
> # like below
> b[5] <- 0
> b[11] <- 0
> b[24] <- 0
> b[26] <- 0
> a
[1] 0 1 0 0 0 0 0 -1 0 0 1 1 -1 -1 0 0 1 0 0 -1 0 1 0 0 0 0 0
> b
[1] 0 0 -1 0 0 0 0 0 0 1 0 -1 -1 1 1 0 0 -1 0 0 1 0 -1 0 0 0 0
任何有关如何以矢量化方式执行此操作的帮助/提示都非常感谢。
我尝试了使用 rle、cumsum、diff、...的“标准”方法
# I tried to play around with
test <- data.frame(
a=a,
b=b,
a.plus.b=a + b,
diff.a.plus.b=c(0, diff(a + b)),
cumsum.a.plus.b=cumsum(a + b),
diff.cumsum.a.plus.b=c(0, diff(cumsum(a + b)))
)
test
rle(b)
rle(b)$values
rle(b)$lengths
编辑:根据大卫要求更清楚地了解我想要做什么,我将详细解释这个问题。
我正在构建简化的交易回测功能(因为 quantstrat 对于我的需要来说太复杂且速度太慢了)。
当我在上面得到一个值为 1(做多)或 -1(做空)的进入信号向量 a 时,就会出现上面的问题(在消息的顶部)。在进入信号之后,可能会发生三件事(保存在向量 b 中):
- 达到时间止损(在一天结束时退出,如果多头,则 b==-1,如果空头,则 b==1),
- 达到利润目标(再次 b==-1, b==1) 或
- 触发止损 (再次 b==-1, b==1)。
所以向量 b 代表每次入场后可能的事件/退出(没有重叠的交易 - 一个在进入另一个之前关闭)。有时交易直接对我有利,我们立即达到了利润目标。伟大的。有时我们在达到利润目标之前就停止了。有时既没有达到止损,我们也没有在一天结束时达到利润目标,所以,我们只剩下一天结束。
我需要在进入后删除除第一个退出事件之外的所有事件(a==1 或 a==-1)。由于并非所有都可以/将会发生,所以只有第一个(从时间角度来看)应该保留,我应该删除后续的。
让我举个例子。我们在 9:31 进入多头交易(在第一分钟常规交易时间栏收盘时)。所以 a 变成:
a <- c(1, 0, 0, 0, 0, ..., 0)
我们总是在最后一分钟柱(时间停止)结束时退出,因此我们将最后可能的退出添加到 b:
b <- c(0, 0, 0, 0, 0, ...,-1)
我们还知道(在回测中)我们的利润目标在 9:35 柱收盘时已经达到,所以我们将此事实添加到 b (b[5] <- -1):
b <- c(0, 0, 0, 0,-1, ...,-1)
而且,我们还知道(在回测中)停止将在 9:33 触发,因此我们将其添加到 b (b[3] <- -1) 现在变为:
b <- c(0, 0,-1, 0,-1, ...,-1)
因此,由于我的利润目标永远不会达到(之前已达到止损)并且我们不会在收市时进行交易,我应该设置 b[5] <- 0 和 b[length(b)] <- 0 。因此,在进入 (a==1) 后删除 b 中除第一个退出触发器之外的所有触发器。b 应该变成:
b <- c(0, 0,-1, 0, 0, ..., 0)
我需要在过去的几千天里处理这个......
我希望这能澄清我正在尝试做的事情。