r语言 - 关于 Quantstrat 的一些问题:为什么添加指标后 mktdata 中的股票数据消失了?



我在使用 quantstrat 运行以应用Sinals时遇到了一些错误。这是我的代码:

#Initialization
qs.strategy="qsFaber"
initPortf(qs.strategy,"TEST",initDate=initDate,currency="RMB")
initAcct(qs.strategy,portfolios=qs.strategy,initDate=initDate,initEq=100000,currency="RMB")
initOrders(portfolio=qs.strategy,symbols="TEST",initDate=initDate)
strategy(qs.strategy,store=T)
#Define the function to find the return of a stock in the past 30 days(PS) and the past 60 days(PM)
PS=function(data){
d=dailyReturn(data,type="log")
paststock=vector()
pastmarket=vector()
for(i in 61:(nrow(d)-1)){
paststock[i]=((prod((1+d[i-30,]):(1+d[i-1,])))^(1/2))
pastmarket[i]=((prod((1+d[i-60,]):(1+d[i-31,])))^(1/2))
}
PSS=xts(paststock,order.by=as.Date(index(d[1:(nrow(data)-1)])))
return(PSS)
}
PM=function(data){
d=dailyReturn(data,type="log")
paststock=vector()
pastmarket=vector()
for(i in 61:(nrow(d)-1)){
paststock[i]=((prod((1+d[i-30,]):(1+d[i-1,])))^(1/2))
pastmarket[i]=((prod((1+d[i-60,]):(1+d[i-31,])))^(1/2))
}
PMM=xts(pastmarket,order.by=as.Date(index(d[1:(nrow(data)-1)])))
return(PMM)
}
#Add indicators and signals
add.indicator(strategy=qs.strategy,name="PS",arguments=list(data=quote(Cl(mktdata))),label="pss")
add.indicator(strategy=qs.strategy,name="PM",arguments=list(data=quote(Cl(mktdata))),label="pmm")
applyIndicators(qs.strategy,mktdata)
add.signal(strategy=qs.strategy,name="sigComparison",arguments=list(columns=c("pss","pmm"),relationship="gt"),label="PS.gt.PM")
add.signal(strategy=qs.strategy,name="sigComparison",arguments=list(columns=c("pss","pmm"),relationship="lt"),label="PS.lt.PM")
applySignals(qs.strategy,mktdata)
#Add rules and run strategies
add.rule(strategy=qs.strategy,name="ruleSignal",
arguments=list(sigcol="PS.gt.PM",sigval=TRUE,orderqty=100,ordertype="market",
orderside="long",osFUN = "osPercentEquity"),type="enter")
add.rule(strategy=qs.strategy,name="ruleSignal",
arguments=list(sigcol="PS.lt.PM",sigval=TRUE,orderqty="all",ordertype="market",
orderside="long"),type="exit")
applyStrategy(strategy=qs.strategy,portfolios=qs.strategy,symbols="TEST")

当我运行应用信号时出现错误:

Error in if (length(j) == 0 || (length(j) == 1 && j == 0)) { : 
missing value where TRUE/FALSE needed
In addition: Warning messages:
1: In match.names(columns, colnames(data)) :
all columns not located in 1.pss 1.pmm for X603711.SS.Open X603711.SS.High X603711.SS.Low X603711.SS.Close X603711.SS.Volume X603711.SS.Adjusted SMA.SMA10 SMA.SMA9
2: In min(j, na.rm = TRUE) :
no non-missing arguments to min; returning Inf
3: In max(j, na.rm = TRUE) :
no non-missing arguments to max; returning -Inf

当我检查时,我发现添加指标后 mktdata 中的测试消失了。这是问题所在吗?这是我添加指标后的 mktdata(因为它太长,所以只列出了其中的一部分(:

> applyIndicators(qs.strategy,mktdata)
$PS
1.pss
2019-06-04        NA
2019-06-05        NA
2019-06-06        NA
2019-06-10        NA
2019-06-11        NA
2019-06-12        NA
2019-06-13        NA
2019-06-14        NA
$PM
1.pmm
2019-06-04        NA
2019-06-05        NA
2019-06-06        NA
2019-06-10        NA
2019-06-11        NA
2019-06-12        NA
2019-06-13        NA
2019-06-14        NA

非常感谢您的帮助!!!!!

我通过在性能分析包中使用ROC((而不是我定义的PS((和PM((来解决这个问题。 但我仍然不明白为什么会发生此错误。

最新更新