我正在尝试实现 Gekko Quant 的移动平均规则程序 - http://gekkoquant.com/2012/08/29/parameter-optimization-backtesting-part-2/
但是我不断收到相同的错误 - 错误:“}”中出现意外的“}”
我稍微修改了代码以匹配我的数据,如下;
TradingStrategy <- function(mktdata,mavga_period,mavgb_period){
runName <- paste("MAVGa",mavga_period,".b",mavgb_period,sep="")
print(paste("Running Strategy: ",runName))
returns <- diff(log(ES$Close))
mavga <- SMA(ES$Close),1=mavga_period)
mavgb <- SMA(ES$Close),5=mavgb_period)
signal <- mavga / mavgb
signal <- apply(signal,1,function (x) { if(is.na(x)){ return (0) } else { if(x>1){return (1)} else {return (-1)}}})
tradingreturns <- signal * returns
colnames(tradingreturns) <- runName
return (tradingreturns)
}
我的数据位于“关闭”列中的数据框“ES”中。一些示例数据是;
50
51
52
59
54
49
50
50
40
45
46
50
51
52
59
54
49
50
50
40
45
46
您应该查看第一个错误,修复它并转到下一个第一个错误,而不是查看最后一个错误:
mavga <- SMA(ES$Close),1=mavga_period)
Error: unexpected ',' in:
您用第一个结束括号完成了对
SMA
的函数调用:
mavga <- SMA(ES$Close),1=mavga_period)
here^
下一行有相同的语法错误。如果将它们取出,当您尝试将某些内容分配给数字
1
时,就会出现语义错误。我猜原来是字母"l"
,但使用的字体并没有说明这一点。但是查看您没有忠实复制的原始内容会显示有效的代码:
#Calculate the moving averages
mavga <- SMA(Op(mktdata),n=mavga_period)
mavgb <- SMA(Op(mktdata),n=mavgb_period)
引用的博客文章不再可用。但是,我推断您想要这样的东西:
library(tidyquant)
TradingStrategy <- function(mktdata, mavga_period, mavgb_period) {
returns <- c(NA, diff(log(mktdata$Close)))
mavga <- SMA(mktdata$Close, mavga_period)
mavgb <- SMA(mktdata$Close, mavgb_period)
signal <- mavga / mavgb
signal <- ifelse(is.na(signal), 0, ifelse(signal > 1, 1, -1))
data.frame(return = signal * returns)
}
创建一些虚拟数据并进行测试。
data <- tribble(
~Close,
50,
51,
52,
59,
54,
49,
50,
50,
40,
45,
46,
50,
51,
52,
59,
54,
49,
50,
50,
40,
45,
46
)
TradingStrategy(data, 1, 5)
输出:
return
1 NA
2 0.00000000
3 0.00000000
4 0.00000000
5 -0.08855340
6 0.09716375
7 -0.02020271
8 0.00000000
9 0.22314355
10 -0.11778304
11 -0.02197891
12 0.08338161
13 0.01980263
14 0.01941809
15 0.12629373
16 -0.08855340
17 0.09716375
18 -0.02020271
19 0.00000000
20 0.22314355
21 -0.11778304
22 -0.02197891
您可能想要调整列名称。