2017-09-26 6 views
2

시세 X와 Y의 조합으로 작성된 합성 자산의 신호를 바탕으로 전략 거래 시세표 X 및 시세표 Y를 백 테스팅 할 수있는 방법을 알 수 없습니다.Quantstrat : 시세 표시기 Y의 신호를 기반으로하는 거래 시세표 X

데이터 배경은 XTS 시세 계열 목록입니다. 그렇게 할 때

initDate = "1990-01-01" 
from = "2010-07-22" 
to = "2016-12-31" 
initeq = 1000000 
NBDG <- lXTS[[1]] 
UKPSPIR <- lXTS[[2]] 
CoIntV <- list(1, -9.90) 
Diff <- NBDG - as.numeric(CoIntV[2])*UKPSPIR 
colnames(Diff) <- "Close" 

strategy.st <- portfolio.st <- account.st <- "test" 
rm.strat(strategy.st) 
initPortf(portfolio.st, symbols = list("Diff"), initDate=initDate) 
initAcct(account.st, portfolios=portfolio.st) 
initOrders(portfolio.st) 
strategy(strategy.st, store = TRUE) 

Diff <- cbind(Diff, BBands(Diff, maType="SMA", n=12, sd=2)) 

add.signal(strategy=strategy.st, name="sigCrossover", 
      arguments = list(columns=c("Close", "up"), 
          relationship="gt"), 
      label="cl.gt.up") 

add.signal(strategy=strategy.st, name="sigCrossover", 
      arguments = list(columns=c("Close", "dn"), 
          relationship="lt"), 
      label="cl.lt.dn") 

add.signal(strategy=strategy.st, name="sigCrossover", 
      arguments = list(columns=c("Close", "mavg"), 
          relationship="gte"), 
      label="mid.cross.frombelow") 

add.signal(strategy=strategy.st, name="sigCrossover", 
      arguments = list(columns=c("Close", "mavg"), 
          relationship="lte"), 
      label="mid.cross.fromabove") 

tmp <- applySignals(strategy = strategy.st, mktdata=Diff) 

add.rule(stratBBands,name='ruleSignal', 
     arguments = list(sigcol="cl.gt.up", 
          sigval=TRUE, 
          orderqty=-1, 
          ordertype='market', 
          orderside=NULL, 
          threshold=NULL), 
     type='enter') 

add.rule(stratBBands,name='ruleSignal', 
     arguments = list(sigcol="cl.lt.dn", 
          sigval=TRUE, 
          orderqty=1, 
          ordertype='market', 
          orderside=NULL, 
          threshold=NULL), 
     type='enter') 

add.rule(stratBBands,name='ruleSignal', 
     arguments = list(sigcol="mid.cross.frombelow", 
          sigval=TRUE, 
          orderqty='all', 
          ordertype='market', 
          orderside=NULL, 
          threshold=NULL), 
     type='exit') 

add.rule(stratBBands,name='ruleSignal', 
     arguments = list(sigcol="mid.cross.fromabove", 
          sigval=TRUE, 
          orderqty='all', 
          ordertype='market', 
          orderside=NULL, 
          threshold=NULL), 
     type='exit') 

out <- applyStrategy(strategy=strategy.st,portfolios=portfolio.st) 

updatePortf(portfolio.st) 
dateRange <- time(getPortfolio(portfolio.st)$summary)[-1] 
updateAcct(portfolio.st,dateRange) 
updateEndEq(account.st) 

나는 다음과 같은 경고를 얻을 :

1: In getInstrument(symbol) : 
    instrument Diff not found, please create it first. 
2: In getInstrument(Symbol) : 
    instrument Diff not found, please create it first. 
3: In .updatePosPL(Portfolio = pname, Symbol = as.character(symbol), : 
    Instrument Diff not found, things may break 

을하지만 난 밖으로 결과를 얻고 지금은 아닌 개별 자산을 합성 자산을 거래하여 해결하고있다.

아무도 알고 있나요?

답변

1

quantstrat에서 예상하는 계측기를 정의하지 않았습니다 (시뮬레이션은 여전히 ​​정상적으로 실행되지만). 경고가 당신에게 말하는 것처럼 ... 전략을 실행하기 전에 합성 도구를 정의하십시오 (위의 코드에서 rm.strat 전).

또한 통화를 정의해야합니다 (이 GBP이지만, 기본적으로 내가 여기 생각하는 USD 있는지 확인되지 않은 경우) :

currency(c("USD")) 
spread(primary_id = 'Diff', currency = "USD", members = c('NBDG','UKPSPIR'), memberratio = c(1, -9.90)) 

는 이러한 변화에 코드를 실행하고 경고가 사라집니다.

은 (또한, 당신이 게시 코드에서, 당신은 임의의 add.rules에서 stratBBandsstrategy.st에서 변경되었습니다.)