好的,所以我回来使用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。
谢谢你看看这个。
答案 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)