0

嗨,我正在处理这段代码(这有效且可重现)

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 相关:这些 Strategy 对象等实际存储了什么?首先,他直接在 SPY 表中创建列 SMA10m。据我了解,他随后构建了与 SPY 表中已经创建的指标基本相同的指标,以使信号正常工作?所以代码

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

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

4

1 回答 1

7

首先,直接回答两点:

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

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

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

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

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

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

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

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

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

外部参考:

使用 quantstrat (R/Finance 2013)

quantstrat 简介(FOSS 交易博客)

于 2013-10-24T11:55:15.830 回答