R:Guy Yollin的Quantstrat示例。有必要吗?这些金融工具储存了什么?
您好,我正在处理此代码(此代码有效且可复制)R:Guy Yollin的Quantstrat示例。有必要吗?这些金融工具储存了什么?,r,quantstrat,blotter,R,Quantstrat,Blotter,您好,我正在处理此代码(此代码有效且可复制) 如果(!exists('.blotter')).blotter首先,直接回答两点: 指标不是战略所必需的,唯一的硬性要求是您至少需要一条创建订单的规则,或者在订单槽中至少需要一条创建交易的规则 strategy对象仅包含策略的规范,仅此而已,请参见下文 接下来,解释发生了什么: quantstrat广泛使用延迟执行以允许代码重用。策略对象是策略规范的存储位置。它可以通过使用portfolions=参数应用于一个或多个公文包(由initPortf()创
如果(!exists('.blotter')).blotter首先,直接回答两点:
指标不是战略所必需的,唯一的硬性要求是您至少需要一条创建订单的规则,或者在订单
槽中至少需要一条创建交易的规则
strategy
对象仅包含策略的规范,仅此而已,请参见下文
接下来,解释发生了什么:
quantstrat
广泛使用延迟执行以允许代码重用。策略
对象是策略规范的存储位置。它可以通过使用portfolions=
参数应用于一个或多个公文包(由initPortf()
创建)
策略规范只是一个仓库,用来存放您以后如何应用策略。在调用applyStrategy(…)
之前,不会计算任何内容。这允许使用有用的属性,例如使用相同的策略对象来测试多个不同的参数集,或者在不改变策略规范的情况下应用不同的投资组合结构和成分
策略对象本身不会被applyStrategy
更改。在applyStrategy
内部,将创建一个名为mktdata
的特殊内部对象,该对象将通过执行策略规范中包含的指标、信号和规则进行修改
默认情况下,mktdata
对象是通过从.GlobalEnv
或用户指定的其他环境检索包含历史数据的对象来构造的。将为公文包中的每个符号创建其中一个对象,并在applyStrategy
的功能范围内进行维护
应用指示器和信号时,这些函数最常见的模式是返回与mktdata时间序列长度相同的向量,或返回与mktdata时间序列具有相同索引的时间序列对象。如果遵循此模式,这些列将添加到mktdata对象中,并可供以后的指示器、信号和规则函数使用。指示器和信号被假定为始终不依赖于路径,而规则在默认情况下依赖于路径
示例信号函数,如sigcrosover
和sigsthreshold
,利用此模式访问和比较mktdata中存在的列ruleSignal
,一个示例规则,查找信号具有特定值的点,然后根据该信息创建订单
外部参考:
嗨,Brian,我是否可以计算R之外的指标和信号并存储数据,以便quantstrat可以简单地使用该数据集并应用规则。这样,我就不依赖R TTR指标等。如果是,我的OHCLV数据中哪些列是计算策略所必需的?我在应用程序中使用nodejs调用OHCLV数据,添加必要的指示器和信号。我需要R应用规则并创建中可用的输出quantstrat@SushantaDeb:是的,可以完成,详情请参见下面的链接谢谢@usct01
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))