这有点简单,但我找不到快速(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的未来?
答案 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,]
答案 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;)