Некоторые вопросы о Quantstrat: почему данные о запасах в mktdata исчезли после того, как я добавил индикатор? - PullRequest
0 голосов
/ 26 января 2020

У меня возникли некоторые ошибки при запуске для applySinals с использованием quantstrat. Это мой код:

#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 исчез после того, как я добавил индикатор. Это проблема здесь? Вот мои 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

Очень признателен за вашу помощь !!! !!!

1 Ответ

0 голосов
/ 27 января 2020

Я решил эту проблему, используя RO C () в пакете PerformenceAnalysis вместо PS () и PM (), которые я определил. Но я до сих пор не могу понять, почему эта ошибка возникает.

...