R:Guy Yollin的Quantstrat例子。指标有必要吗?那些金融工具中存储了什么?

时间:2013-10-21 08:05:23

标签: r quantstrat blotter

您好我正在使用此代码(这有效且可重现)

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表中已经创建的指标基本相同,以使信号正常工作?所以代码

    arguments = list(columns = c(“Close”,“SMA10”)

  3. 访问关闭(显然也存储?)作为SMA10,这是我的指标吗?如果不需要,有没有办法省略指标?或者指标是SPY表中的另一列,因为他使用columns命令访问它?

1 个答案:

答案 0 :(得分:7)

首先,直接回答这两点:

  1. 指标对于策略来说不是必需的,唯一的硬性和快速要求是您需要至少一个将创建订单的规则,或者至少需要一个将创建事务的order槽中的规则

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

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

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

    策略规范只是您以后如何应用策略的仓库。在您致电applyStrategy(...)之前,不会评估任何内容。这允许有用的属性,例如使用相同的策略对象来测试多个不同的参数集,或者应用不同的组合构造和组成部分,而不改变策略规范。

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

    默认情况下,mktdata对象是从.GlobalEnv或用户指定的某个其他环境中检索包含历史数据的对象。将为投资组合中的每个符号创建其中一个对象,并将其保留在applyStrategy的函数范围内。

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

    示例信号函数(例如sigCrossoversigThreshold)使用此模式来访问和比较mktdata中存在的列。 ruleSignal,一个示例规则,查找信号具有某些特定值的点,然后对该信息进行处理以创建订单。

    外部参考:

    Using quantstrat (R/Finance 2013)

    Introduction to quantstrat (FOSS trading blog)