【问题标题】:Quantstrat: Trading ticker X based on signal in ticker YQuantstrat:根据代码 Y 中的信号交易代码 X
【发布时间】:2017-09-26 07:30:24
【问题描述】:

我不知道如何根据由代码 X 和 Y 组合创建的合成资产的信号来回测策略交易代码 X 和代码 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

但我得到了结果。

有人知道吗?

【问题讨论】:

    标签: r quantmod quantstrat


    【解决方案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 处任意将strategy.st 更改为stratBBands。)

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 2016-01-19
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2017-02-10
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多