具有外部指标和quantstrat中多个股票的单变量误差
我们使用与OLHC对象合并的交易数据外部的指标。我们的目标是建立一个quantstrat模型来处理多个股票,但我们继续收到错误消息,表明我们没有正确地建立这样的模型。此外,即使我们没有显式使用EMA,错误也会指向EMA 我从#FXQuantTrader代码开始,这里的答案是:,我可以使用OHLC数据外部的指标和add.signal调用的自定义函数,但不能跳转到多个股票 此堆栈溢出条目旨在直接处理主题,但提供的示例为 “加载您将使用自己的测试策略” 这就引出了如何构建多元股权战略的问题。尝试使用我的策略实现本文中的applyStrategy调用会产生错误 “形式参数‘n’与多个实际参数匹配” 注释掉这个调用的参数部分会让我回到最初的错误 Quantstrat文档涉及以下内容,但每个示例仅使用一种权益:(a)Macros(文档主体),(b)DataCamp课程(我完整学习),(c)qauntstrat在R/Finance 2018会议上的演示使用一种EFT:EEM 其他资源包括Guy Yollin的笔记,但他的第一组(设置)幻灯片的第18、21和41页显示了与上面提到的SO帖子相同的标准偏差和回溯“n”,没有任何解释。我尝试了各种组合,但仍然有相同的错误 Ilna Kipnis的“螺母和螺栓…”博客文章展示了多种股票的使用,但他没有在applyStrategy调用中列出参数,因此这可能不是我的问题所在。Tim Trice的在线quantstrat书(quantstrat文档引用的另一个资源)证实了这一点,他在书中说——在多重股权申请的背景下——这是 “目前无需进入其他参数。”(第5.5节) 我还尝试了“应用”功能,但没有成功具有外部指标和quantstrat中多个股票的单变量误差,r,quantstrat,R,Quantstrat,我们使用与OLHC对象合并的交易数据外部的指标。我们的目标是建立一个quantstrat模型来处理多个股票,但我们继续收到错误消息,表明我们没有正确地建立这样的模型。此外,即使我们没有显式使用EMA,错误也会指向EMA 我从#FXQuantTrader代码开始,这里的答案是:,我可以使用OHLC数据外部的指标和add.signal调用的自定义函数,但不能跳转到多个股票 此堆栈溢出条目旨在直接处理主题,但提供的示例为 “加载您将使用自己的测试策略” 这就引出了如何构建多元股权战略的问题。尝试使用我
.blotter <- new.env()
.strategy <- new.env()
fastMA = 12
slowMA = 26
currency('USD')
startDate='2017-03-24'
endDate = "2017-08-05"
initEq=1000000
portfolio.st='macd'
account.st='macd'
symbols <- c("NOV", # National-Oilwell Varco, Inc.
"AERI", # Aerie Pharmaceuticals Inc
"AGN" # Allergan plc
)
Cx.AERI <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0)
Cx.AGN <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
Cx.NOV <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0)
getSymbols(symbols,from=startDate, to=endDate) # gets xts object
Tplus <- merge.xts(AERI, AGN, NOV, Cx.AERI,Cx.AGN,Cx.NOV)
stock.st='Tplus'
initPortf(portfolio.st,symbols=stock.st)
initAcct(account.st,portfolios=portfolio.st)
initOrders(portfolio=portfolio.st)
stock(symbols,currency="USD", multiplier =1)
strat.st<-portfolio.st
strategy(strat.st, store=TRUE)
add.indicator(strat.st, name = "MACD",
arguments = list(x=quote(Cl(mktdata)),
nFast=fastMA,
nSlow=slowMA),
label='_'
)
macdSMAsig2 <- function(data) {
sig <- data[, "Cx._"] >0 & data[, "macd._"] > 0
colnames(sig) <- "upSig"
sig
}
add.signal(strat.st,name="macdSMAsig2",
arguments = list(data = quote(mktdata)),
label="enterSig"
)
add.signal(strat.st,name="sigThreshold",
arguments = list(column="signal._",
relationship="lt",
threshold=0,
cross=TRUE),
label="signal.lt.zero"
)
add.rule(strat.st,name='ruleSignal',
# be careful to get the label of the signal column correct:
arguments = list(sigcol="upSig.enterSig",
sigval=TRUE,
orderqty=100,
ordertype='market',
orderside='long',
threshold=NULL),
type='enter',
label='enter',
storefun=FALSE
)
add.rule(strat.st,name='ruleSignal',
arguments = list(sigcol="signal.lt.zero",
sigval=TRUE,
orderqty='all',
ordertype='market',
orderside='long',
threshold=NULL,
orderset='exit2'),
type='exit',
label='exit'
)
out<-applyStrategy(strat.st , portfolios=portfolio.st,verbose=TRUE)
我认为您的问题一定是因为MACD必须调用EMA,并且数据的维度存在冲突(不像您所期望的那样一次只提供一个数据)。据我所知,quantstrat一次只能对多个股票进行单独的回溯测试,但不知道其他回溯测试中发生了什么。您可以做的一件事是单独运行每个回溯测试,存储结果/事务,然后在循环中使用这些结果来组合结果,创建一种“投资组合”回报。这意味着,这将为您提供关于您是否/何时会在另一个符号中有一个位置的详细信息,并相应地更新您的P/L,等等。
扩展现有答案,如果您这样做,您的错误将更有意义:
Cl(Tplus)
注意如何返回3列,而不是一个关闭列?(Cl
正在搜索包含“close/close”的列名,并返回所有列名(类似地,对于Hi
、Lo
等)
MACD
函数需要一个单变量(闭合)价格序列,否则会出现错误(MACD
调用需要单变量价格序列的EMA
函数)
最简单的解决方法是:
add.indicator(strat.st, name = "MACD",
arguments = list(x=quote(Cl(mktdata)[,1]),
nFast=fastMA,
nSlow=slowMA),
label='_'
)
out<-applyStrategy(strat.st , portfolios=portfolio.st,verbose=TRUE)
head(mktdata)
add.indicator(strat.st,name=“MACD”,
参数=list(x=quote(Cl(mktdata)[,1]),
nFast=fastMA,
nSlow=slowMA),
标签=“”“
)
out MACD(cl(AERI))
和MACD(cl(AERI)>MACD(cl(NOV))
,这就是为什么您在一个mktdata对象中存储多个价格系列)。希望这有意义
顺便说一句,虽然applyStrategy
是按符号独立查看的,但您可以使用applyStrategy允许不同价格系列上的交易之间进行一些交互。如果确实需要,可以使用重新平衡来代替。applyStrategy。重新平衡有效地运行一个双循环:在一批条形图上循环s/行,然后在该批条形图中的每个符号上重复,直到遍历数据集的整个时间范围。此双循环允许基于回溯测试中特定时间点不同市场数据上的交易做出一些交易决策(例如,rulePctEquity
)
为了大大加快大型数据集上的模拟速度,quantstrat的想法是在循环遍历市场数据行之前,尽可能提前预计算(理想情况下为矢量化),寻找可能发生交易行为的行
修改applyStrategy很容易。如果你真的愿意,可以重新平衡以在每个条上进行双循环,但是如果你要扫描数月/数年的条(或者更现实地勾选条),计算成本会非常高数据。我认为您的问题一定是因为MACD必须调用EMA,并且数据的维度存在冲突(不是像您预期的那样一次一个地提供)。您可以做的一件事是单独运行每个回溯测试,存储结果/事务,然后在循环中使用它来组合结果,创建一种“投资组合”返回。这意味着这将为您提供关于您是否/何时会在另一个符号中拥有职位的详细信息,并相应地更新您的P/L等。Quantstrat无法自行完成此操作。是的,Jared,我理解Quantstrat的目的不是为了解决采取任何给定职位取决于采取另一个职位的情况;这不是我的意图d、 正如您所建议的,我后来了解到,虽然quantstrat确实同时(独立)处理多个股票,但它希望将外部指标分别附加到每个证券对象上。因此,我需要合并.xts我的Cx
add.indicator(strat.st, name = "MACD",
arguments = list(x=quote(Cl(mktdata)[,1]),
nFast=fastMA,
nSlow=slowMA),
label='_'
)
out<-applyStrategy(strat.st , portfolios=portfolio.st,verbose=TRUE)
head(mktdata)