R:Guy Yollin的量化例子.必要的指标吗?以及这些金融工具中存储的内容



嗨,我正在研究这段代码(这有效并且是可重现的)

if (!exists('.blotter')) .blotter <- new.env()
if (!exists('.strategy')) .strategy <- new.env()
if (!exists('.instrument')) .instrument <- new.env()
currency("USD")
stock("SPY",currency="USD",multiplier=1)
ls(envir=FinancialInstrument:::.instrument)

initDate <- '1997-12-31'
startDate <- '1998-01-01'
endDate <- '2013-07-31'
initEq <- 1e6
Sys.setenv(TZ="UTC")
getSymbols('SPY', from=startDate, to=endDate, adjust=T)
SPY=to.monthly(SPY, indexAt='endof')
SPY$SMA10m <- SMA(Cl(SPY), 10)
# inz portfolio, account
qs.strategy <- "qsFaber"
rm.strat(qs.strategy) # remove strategy etc. if this is a re-run
initPortf(qs.strategy,'SPY', initDate=initDate)
initAcct(qs.strategy,portfolios=qs.strategy, initDate=initDate, initEq=initEq)

initOrders(portfolio=qs.strategy,initDate=initDate)
# instantiate a new strategy object
strategy(qs.strategy,store=TRUE)
add.indicator(strategy = qs.strategy, name = "SMA",
              arguments = list(x = quote(Cl(mktdata)), n=10), label="SMA10")
add.signal(qs.strategy,name="sigCrossover",
           arguments = list(columns=c("Close","SMA10"),relationship="gt"),
           label="Cl.gt.SMA")
add.signal(qs.strategy,name="sigCrossover",
           arguments = list(columns=c("Close","SMA10"),relationship="lt"),
           label="Cl.lt.SMA")
add.rule(qs.strategy, name='ruleSignal',
         arguments = list(sigcol="Cl.gt.SMA", sigval=TRUE, orderqty=900,
                          ordertype='market', orderside='long', pricemethod='market'),
         type='enter', path.dep=TRUE)
add.rule(qs.strategy, name='ruleSignal',
         arguments = list(sigcol="Cl.lt.SMA", sigval=TRUE, orderqty='all',
                          ordertype='market', orderside='long', pricemethod='market'),
         type='exit', path.dep=TRUE)

out <- applyStrategy(strategy=qs.strategy , portfolios=qs.strategy)
updatePortf(qs.strategy)
updateAcct(qs.strategy)
updateEndEq(qs.strategy)
myTheme<-chart_theme()
myTheme$col$dn.col<-'lightblue'
myTheme$col$dn.border <- 'lightgray'
myTheme$col$up.border <- 'lightgray'
# plot performance
chart.Posn(qs.strategy, Symbol = 'SPY', Dates = '1998::',theme=myTheme)
plot(add_SMA(n=10,col=4, on=1, lwd=2))

由于我想在更复杂的策略上使用它,我有几个问题:

  1. 指标是否必要?

  2. 与 1 相关:这些策略对象等实际存储了什么?首先,他直接在 SPY 表中创建一个列 SMA10m。据我了解,他随后构建了与SPY表中已经创建的指标基本相同的指标,以使信号正常工作?所以代码

    参数 = 列表(列=c("关闭","SMA10")

访问收盘价(显然也存储了?)作为 SMA10 哪个指标是对的?如果不需要,有没有办法省略指标?还是指标只是 SPY 表中的另一列,因为他使用列命令访问它?

首先,直接回答两点:

  1. 指标对于策略不是必需的,唯一硬性要求是您需要至少一个将创建订单的规则,或者至少一个将创建交易的order槽中的规则。

  2. strategy对象仅包含策略的规范,仅此而已,请参见下文。

接下来,解释一下发生了什么:

quantstrat广泛使用延迟执行来允许代码重用。 strategy对象是策略规范的存储位置。 它可以通过使用 portfolios= 参数应用于一个或多个投资组合(由 initPortf() 创建)。

策略

规范只是您希望以后如何应用策略的仓库。在您调用applyStrategy(...)之前,不会评估任何内容。这允许有用的属性,例如使用相同的策略对象来测试多个不同的参数集,或应用于不同的投资组合结构和成分,而无需更改策略规范。

策略对象本身不会因applyStrategy而更改。 在 applyStrategy 内部,创建了一个名为 mktdata 的特殊内部对象,该对象将通过执行策略规范中包含的指标、信号和规则进行修改。

默认情况下,mktdata对象是通过从.GlobalEnv或用户指定的某个其他环境中检索包含历史数据的对象来构造的。 将为投资组合中的每个交易品种创建一个这些对象,并在 applyStrategy 的功能范围内维护。

当应用指标和信号时,这些函数最常见的模式是返回与 mktdata 时间序列长度相同的向量,或返回与 mktdata 时间序列具有相同索引的时间序列对象。 如果遵循此模式,这些列将被添加到 mktdata 对象中,并可供以后的指标、信号和规则函数使用。假定指标和信号始终不依赖于路径,默认情况下,规则是路径相关的。

示例信号函数(如 sigCrossoversigThreshold )利用此模式来访问和比较 mktdata 中存在的列。 ruleSignal ,一个示例规则,寻找信号具有特定值的点,然后根据该信息采取行动以创建订单。

外部参考:

使用 quantstrat (R/Finance 2013)

定量战略简介(FOSS交易博客)

最新更新