我有以下 xts 对象(代表长/短条目(第 1 列和第 2 列)和退出(第 3 列和第 4 列)触发器,其中“聚合”信号列应该是 1(系统很长),-1(系统很短)或 0(系统是平坦的)。我无法为“聚合”信号列 5 进行这项工作...
数据:
LongEntrySignal ShortEntrySignal LongExitSignal ShortExitSignal Signal
18.02.93 0 0 1 0 0
19.02.93 0 0 0 1 0
22.02.93 1 0 0 0 1
23.02.93 0 0 0 0 0
24.02.93 0 0 0 0 0
25.02.93 0 0 0 0 0
26.02.93 0 0 1 0 0
01.03.93 0 0 1 0 0
04.03.93 0 1 0 0 -1
05.03.93 0 0 0 0 0
11.03.93 0 0 0 1 0
12.03.93 0 0 1 0 0
我想以这种形式转换数据:
LongEntrySignal ShortEntrySignal LongExitSignal ShortExitSignal Signal
18.02.93 0 0 1 0 0
19.02.93 0 0 0 1 0
22.02.93 1 0 0 0 1
23.02.93 0 0 0 0 1
24.02.93 0 0 0 0 1
25.02.93 0 0 0 0 1
26.02.93 0 0 1 0 1
01.03.93 0 0 1 0 0
04.03.93 0 1 0 0 -1
05.03.93 0 0 0 0 -1
11.03.93 0 0 0 1 -1
12.03.93 0 0 1 0 0
我尝试对如下函数进行编程(但 id 不起作用;注释掉的部分也不起作用并且非常慢 - 我知道在 R 中使用循环很慢,但这是我唯一的想法):
padMinusPlusOnes<-function(signals, longEntryColumn=1, shortEntryColumn=2, signalsColumn=5) {
ret<-signals
#get all indexes between long entry equals 1 to long exit equals 1 and set signalsColumn for these rows to 1
ret[(lag(ret)[, longEntryColumn] == 1) & (ret[, signalsColumn] == 0), signalsColumn]<-1
#get all indexes between short entry equals 1 to short exit equals 1 and set signalsColumn for these rows to -1
ret[(lag(ret)[, shortEntryColumn] == -1) & (ret[, signalsColumn] == 0), signalsColumn]<--1
return(ret)
# ret<-signals
# for (i in 2:NROW(ret)) {
# if ((ret[i - 1, longEntryColumn] == 1) & (ret[, signalsColumn] == 0)) {
# ret[i, signalsColumn]<-1
# }
# if ((ret[i - 1, shortEntryColumn] == -1) & (ret[, signalsColumn] == 0)) {
# ret[i, signalsColumn]<--1
# }
# }
#
# return(ret)
}
感谢您在如何转换数据方面提供的帮助。
亲切的问候,萨摩。
编辑说明:在收到 Prasad Chalasani 和 J. Winchester 的两个非常有用且有见地的回答后,我意识到我遗漏了数据结构的重要信息。因此,我更改了上面的数据以更好地反映我的数据,并在下面复制了原始数据(基于这两个答案):
数据:
LongEntrySignal ShortEntrySignal LongExitSignal ShortExitSignal Signal
18.02.93 0 0 0 0 0
19.02.93 0 0 0 0 0
22.02.93 1 0 0 0 1
23.02.93 0 0 0 0 0
24.02.93 0 0 0 0 0
25.02.93 0 0 0 0 0
26.02.93 0 0 1 0 0
01.03.93 0 0 0 0 0
04.03.93 0 1 0 0 -1
05.03.93 0 0 0 0 0
11.03.93 0 0 0 1 0
12.03.93 0 0 0 0 0
我想以这种形式转换数据:
LongEntrySignal ShortEntrySignal LongExitSignal ShortExitSignal Signal
18.02.93 0 0 0 0 0
19.02.93 0 0 0 0 0
22.02.93 1 0 0 0 1
23.02.93 0 0 0 0 1
24.02.93 0 0 0 0 1
25.02.93 0 0 0 0 1
26.02.93 0 0 1 0 1
01.03.93 0 0 0 0 0
04.03.93 0 1 0 0 -1
05.03.93 0 0 0 0 -1
11.03.93 0 0 0 1 -1
12.03.93 0 0 0 0 0