关于Quantstrat的一些问题:为什么在添加指标后mktdata中的库存数据消失了?

问题描述 投票:0回答:1

[使用quantstrat运行到applySinals时出现一些错误。这是我的代码:

#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")

[我在运行applySignals时遇到错误:

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中的TEST消失了。这是问题吗?这是添加指标后的我的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

非常感谢您的帮助!!!

r quantstrat
1个回答
0
投票

我通过在PerformenceAnalysis软件包中使用ROC()代替了我定义的PS()和PM()解决了这个问题。但是我仍然不明白为什么会发生此错误。

© www.soinside.com 2019 - 2024. All rights reserved.