【问题标题】:R - Finance back test function for entry / exit signalR - 进入/退出信号的财务回测功能
【发布时间】:2017-06-29 02:37:48
【问题描述】:

好的,所以我正在使用 R 重新测试交易信号。这是我的代码的 sn-p,它显示了 z 分数的创建、接近收盘的回报(使用 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 值

如果我只交易 1 个持有日,这种设置非常好。

然后,我可以乘以 sigup 1 x % 的每日回报率来获得一条权益曲线。

我想进一步详细说明进入/退出信号。我希望在 zscore 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 行显示了一个

我想提供一些有关当前编码的背景信息,这是为了进一步推动 FOSS 交易博客上的 post

感谢您查看此内容。

【问题讨论】:

  • row 91.140646864 时,为什么你的信号不为零?
  • 感谢您在我的输出示例中指出这一点
  • 你从哪里得到你的Lag函数?
  • quantmod / TTR / zoo 是必需的包。

标签: r


【解决方案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)

【讨论】:

  • 是的,如果我们可以将整个输出提高 1 天,那将是完美的。这就是 Lag() 最初所做的。
  • 这部分你试过了吗:df$sig_long &lt;- Lag(df$sig_long, 1)
  • 嗨 AK88 - 你认为我可以编辑出口,以便循环在设定的 n 行数后停止。我可以制作一个 nline 变量。然后一旦循环开始,它在满足 nline number 后退出。这样,如果我设置 nlines
  • 嘿,我想你可以做到。让我看看。
  • 嗯,有点复杂。如果在n日你的分数小于-1,但n的总天数是n,你是要平仓还是做多?
猜你喜欢
  • 2018-05-07
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 2018-04-07
  • 1970-01-01
  • 2012-01-30
相关资源
最近更新 更多