【发布时间】:2018-01-23 09:37:54
【问题描述】:
这有点简单,但我真的找不到快速的 (1,2,3)-liner 来解决它。我有一个 10 天回报的滚动平均值向量 - 策略很简单:当滚动平均值从下方穿过零障碍时做多,当它从上方穿过障碍时卖出。 更准确地说,假设滚动平均收益存储在向量 Returns 中。
which(Returns > 0)
[1] 3 4 5 9 10 11 14 18 27 28 29 36 37 38 47 48
基于此,我会在 4、5、6 时做多(在 3 时我们只收到入口信号,在 6 时我们退出)、10、11、12、15、19 等等。 我怎样才能得到这个向量?我已经尝试过 diff,另一种和其他几种组合,但没有什么能真正解决问题。任何帮助将不胜感激。
编辑(基于第一个答案):
Initiate_Long_Position <- which(ifelse(goLong == TRUE, 1,0) == 1)
Terminate_Long_Position <- which(ifelse(goShort == TRUE, 1,0) == 1)
if (length(Terminate_Long_Position) > length(Initiate_Long_Position) ){
Terminate_Long_Position <- Terminate_Long_Position[-1]
}
Days_Long_Returns <- rep(0, dim(ticker)[1])
Daily_returns <- returns(Cl(ticker))
for (i in 1:length(Initiate_Long_Position)){
Days_Long_Returns[(Initiate_Long_Position[i]+1):(Terminate_Long_Position[i])] <-
Daily_returns[(Initiate_Long_Position[i]+1):(Terminate_Long_Position[i])]
}
我在 foor 循环中为 Initiate_Long_Position[i] 添加了 +1,因为我们只有在观察到做多信号后才能获得下一个周期的回报,而卖出是“实时”完成的。我是否遗漏了一些东西,即是否正确索引了回报,这样我们就不会考虑在时间 i 使用回报 i-1 的未来?
【问题讨论】:
-
which(ifelse(goLong == TRUE, 1,0) == 1) 与 which(goLong) 相同
-
在您的示例中,您不会迭代 Initiate_Long_Position。如果该向量是 c(4,5,6),则改为迭代 c(1,2,3)。您的 for 循环说“从 1 运行到向量的长度”(在本例中为 3。
标签: r finance quantmod trading algorithmic-trading