2017-09-26 116 views
2

我无法弄清楚如何基于来自从股票代码X和Y的组合创建的综合资产的信号来对策略交易股票行情X和股票行情Y进行回溯测试。Quantstrat:根据股票代码Y中的信号交易股票代码Y

数据背景是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

您还没有定义您的仪器,量子预期(尽管您的模拟可能仍然运行良好)。就像警告对你说的那样....在你运行策略之前(在你的代码中的rm.strat之前说)定义你的合成工具。

你也应该定义你的位置(如果不知道它是GBP,但默认情况下它是USD,我以为这里):

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

运行这些变化你的代码,并警告将会消失。

(同样,在你的代码后,你已经从任意改变strategy.ststratBBandsadd.rules