R - 用于进入/退出信号的财务反向测试功能

时间:2017-06-29 02:37:48

标签: r

好的,所以我回来使用R测试交易信号。这是我的代码片段,它显示了z-score创建,接近关闭返回(使用TTR包),长信号和Lag()放置第二天发出信号。

require(quantmod)
require(TTR)
require(zoo)

 # Calculate n period close price z-scores indicator using TTR package
    new.df$roll.mean.n3 <- runMean(new.df$Close, n=3, cumulative = FALSE)
    new.df$roll.sd.n3 <- runSD(new.df$Close, n=3, cumulative = FALSE)
    new.df$roll.z.score.n3 <- apply(new.df[,c('Close','roll.mean.n3', 'roll.sd.n3')], 1, function(x) { (x[1]-x[2])/x[3] } )

# Calculate Close-to-Close returns

    new.df$clret <- ROC(new.df$Close,1)
    new.df$clret[1] <- 0

# Create the long (up) signal 

    new.df$sigup <- ifelse(new.df$roll.z.score.n3 < -1, 1, 0) 

# Lag signals to align with days in market not days when signals were generated

    new.df$sigup <- Lag(new.df$sigup,1) # Note k=1 implies a move *forward*

上面的当前设置产生如下输出:

    roll.z.score.n3 sigup
1      NA           0
2      NA           0
3   -1.135974424    0
4   0.193311168     1
5   0.714285714     0
6   -1.148753543    0
7   -0.942160394    1
8   -0.695763683    0
9   1.140646864     0
10  0.985196899     0
11  -0.768766574    0
12  -1.011293858    0
13  -0.516703612    1
14  -1.120897077    0
15  1.091089451     1

当zscore值<&lt; -1时,输入信号将变长,如第3行所示。我们在第4行有+1,因为我们使用Lag()将输入信号转发到第二天。每当z得分值低于-1时,第二天就有+1。

如果我只交易1个持有日,这个设置完全没问题。

然后我可以将sigup乘以1 x%的每日回报以获得权益曲线。

我想进一步详细说明进入/退出信号。我希望当zscore为&lt; -1时长(sig long),当z-score为&gt; 1时退出。

输出看起来像这样:

    roll.z.score.n3 sig long    
1           NA          0          
2           NA          0          
3   -1.135974424        0          
4   0.193311168         1          
5   0.714285714         1          
6   -1.148753543        1          
7   -0.942160394        1          
8   -0.695763683        1          
9   1.140646864         1          
10  0.985196899         0          
11  -0.768766574        0          
12  -1.011293858        0          
13  -0.516703612        1          
14  -1.120897077        1          
15  1.091089451         1          
16  0.968364052         0          
17  0.872871561         0          
18  1.099524999         0          
19  0.918397948         0          

第3行显示zscore信号&lt; -1。第二天滞后使其成为+1(第4行)。并且当z分数信号> 1.0时,它一直保持+1直到第9行。因此,在第10行的第二天,信号为0。

我想提供一些关于当前编码的背景知识,它试图在FOSS交易博客上推进post

谢谢你看看这个。

1 个答案:

答案 0 :(得分:1)

查看以下内容是否有效:

zz = '
    roll.z.score.n3 sig_long    
1           NA          0          
2           NA          0          
3   -1.135974424        0          
4   0.193311168         1          
5   0.714285714         1          
6   -1.148753543        1          
7   -0.942160394        1          
8   -0.695763683        1          
9   1.140646864         1          
10  0.985196899         0          
11  -0.768766574        0          
12  -1.011293858        0          
13  -0.516703612        1          
14  -1.120897077        1          
15  1.091089451         1          
16  0.968364052         0          
17  0.872871561         0          
18  1.099524999         0          
19  0.918397948         0   
'

df <- read.table(text = zz, header = TRUE)
df = na.omit(df)

df$sig_long[[1]] = ifelse(df$roll.z.score.n3[[1]] < (-1), 1, 0)

for (i in 2:nrow(df)){
  df$sig_long[i] = ifelse(df$roll.z.score.n3[i] < (-1), 1,
                          ifelse(df$roll.z.score.n3[i] > 1, 0,
                                 df$sig_long[i-1]))
}

对此部分不确定:

df$sig_long <- Lag(df$sig_long, 1)