您好我正在使用此代码(这有效且可重现)
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:这些策略对象等实际存储了什么?首先,他直接在SPY表中创建了一个SMA10m列。据我了解,他然后构建指标,该指标与SPY表中已经创建的指标基本相同,以使信号正常工作?所以代码
arguments = list(columns = c(“Close”,“SMA10”)
访问关闭(显然也存储?)作为SMA10,这是我的指标吗?如果不需要,有没有办法省略指标?或者指标是SPY表中的另一列,因为他使用columns命令访问它?
答案 0 :(得分:7)
首先,直接回答这两点:
指标对于策略来说不是必需的,唯一的硬性和快速要求是您需要至少一个将创建订单的规则,或者至少需要一个将创建事务的order
槽中的规则
strategy
对象仅包含策略的规范,仅此而已,请参阅下文。
接下来,解释发生了什么:
quantstrat
广泛使用延迟执行以允许代码重用。 strategy
对象是策略的规范的存储位置。它可以通过使用initPortf()
参数应用于一个或多个投资组合(由portfolios=
创建)。
策略规范只是您以后如何应用策略的仓库。在您致电applyStrategy(...)
之前,不会评估任何内容。这允许有用的属性,例如使用相同的策略对象来测试多个不同的参数集,或者应用不同的组合构造和组成部分,而不改变策略规范。
applyStrategy
不会更改策略对象本身。在applyStrategy
内,创建了一个名为mktdata
的特殊内部对象,该对象将由策略规范中包含的指标,信号和规则的执行修改。
默认情况下,mktdata
对象是从.GlobalEnv
或用户指定的某个其他环境中检索包含历史数据的对象。将为投资组合中的每个符号创建其中一个对象,并将其保留在applyStrategy
的函数范围内。
当应用指标和信号时,这些函数最常见的模式是返回与mktdata时间序列长度相同的向量,或者返回与mktdata时间序列具有相同索引的时间序列对象。如果遵循此模式,则这些列将添加到mktdata对象中,以供以后使用的指示符,信号和规则函数使用。假定指标和信号始终不依赖于路径,默认情况下,规则与路径有关。
示例信号函数(例如sigCrossover
和sigThreshold
)使用此模式来访问和比较mktdata中存在的列。 ruleSignal
,一个示例规则,查找信号具有某些特定值的点,然后对该信息进行处理以创建订单。
外部参考: