基于越过阈值获取多头头寸的交易策略向量

Get trading strategy vector of long positions based on crossing a threshold

这有点简单,但我真的找不到快速的 (1,2,3)-liner 来解决它。我有一个 10 天 returns 的滚动均值向量 - 策略很简单:当滚动均值从下方穿过零障碍时做多,当它从上方穿过障碍时卖出。 更准确地说,假设滚动平均值 return 存储在向量 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、另一个 which 和其他几个组合,但没有真正解决问题。任何帮助将不胜感激。

编辑(基于第一个答案):

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,因为我们只会在观察到做多信号后得到下一个周期 return,而卖出是在 "real time"。我是否遗漏了一些东西,即 returns 是否正确索引,以便我们不考虑在时间 i 使用 returns i-1 的未来?

您可以在 Returns 的 sign 上使用 rle 以获得大于 0 或小于 0 returns 的序列。之后,就是判断何时做多或做空的情况。如果需要去除进场信号,可以在TIME上使用diff,去除大于2的。

set.seed(23L)
(Returns <- rnorm(50))

#generate sequence of positive and or negative returns
runs <- rle(sign(Returns))

#identify the time to go long or short
trades <- data.frame(
    TIME=seq_along(Returns),
    RETURN=Returns,
    DIRN=rep(runs$values, runs$lengths),
    RUNS=rep(runs$lengths, runs$lengths))
longs <- trades[trades$DIRN==1 & trades$RUNS >= 2,]
shorts <- trades[trades$DIRN==-1 & trades$RUNS >= 2,]

参考: Find consecutive sequence of zeros in R

我尝试做一个例子 returns 因为我不熟悉交易

Returns<-c(-1,-2,-1,1,2,4,1,-2,-3,-2,-1,1,2,4,5,3,2,-1)
LagReturns<-lag(Returns,1)
position=rep("0",length(Returns))
mask1=Returns*LagReturns<0&Returns<0
mask2=Returns*LagReturns<0&Returns>0
position[mask1]="sell"
position[mask2]="long"

根据我的理解,当零未交叉时,您不持仓(“0”)当 Returns 从负数变为正数时,您持多头头寸("long"),当从正数变为负数时,您持仓头寸卖出 ("sell")

您需要 zoo-package 和 dplyr-package

library(zoo) # to compute rolling means
library(dplyr) # to compute lagged vectors

a <- c(-5:5, 5:-5) # create a sample vector

# rolling mean over the last 3 observations
myRollmeans <- rollmean(a, 3, fill = NA, align = "right")
goLong <- lag(myRollmeans) < 0 & myRollmeans >= 0
goShort <- lag(myRollmeans) > 0 & myRollmeans <= 0

data.frame(myRollmeans, goLong, goShort)

结果

       myRollmeans goLong goShort
1           NA     NA      NA
2           NA     NA      NA
3    -4.000000  FALSE      NA
4    -3.000000  FALSE   FALSE
5    -2.000000  FALSE   FALSE
6    -1.000000  FALSE   FALSE
7     0.000000   TRUE   FALSE
8     1.000000  FALSE   FALSE
9     2.000000  FALSE   FALSE
10    3.000000  FALSE   FALSE
11    4.000000  FALSE   FALSE
12    4.666667  FALSE   FALSE
13    4.666667  FALSE   FALSE
14    4.000000  FALSE   FALSE
15    3.000000  FALSE   FALSE
16    2.000000  FALSE   FALSE
17    1.000000  FALSE   FALSE
18    0.000000  FALSE    TRUE
19   -1.000000  FALSE   FALSE
20   -2.000000  FALSE   FALSE
21   -3.000000  FALSE   FALSE
22   -4.000000  FALSE   FALSE