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

时间:2018-01-23 09:37:54

标签: r finance quantmod trading algorithmic-trading

这有点简单,但我找不到快速(1,2,3)-liner来解决它。我有一个滚动平均值为10天回报的向量 - 策略很简单:当滚动平均值从下方穿过零屏障并且从上方穿过屏障时卖出。 更确切地说,让我们说滚动平均回报存储在向量返回中。

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的未来?

3 个答案:

答案 0 :(得分:1)

您需要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

答案 1 :(得分:0)

您可以在返回的rle上使用sign来获得大于0或小于0的序列。在那之后,这是一个确定何时做多或做空的情况。如果需要删除输入信号,您可以在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

答案 2 :(得分:0)

我试图做一个回报的例子,因为我不熟悉交易

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"

在我的理解中,当零没有交叉时你不采取任何立场(&#34; 0&#34;)当从负面的回报变为正面时你采取位置长(&#34;长&#34;)和从正面负面你采取仓位出售(&#34;卖出#34;)