R中的quantstrat:设置基于日期的退出信号
quantstrat及其附带的许多例子似乎都是围绕着进入和退出交易,通过跨越某种技术指标 然而,假设你有一个任意的指标,你用它来触发交易的进入,但是你只想在第二天的开盘或收盘时平仓交易。您如何最好地实现这个示例 让我们以下面的例子为例:R中的quantstrat:设置基于日期的退出信号,r,xts,quantmod,quantitative-finance,quantstrat,R,Xts,Quantmod,Quantitative Finance,Quantstrat,quantstrat及其附带的许多例子似乎都是围绕着进入和退出交易,通过跨越某种技术指标 然而,假设你有一个任意的指标,你用它来触发交易的进入,但是你只想在第二天的开盘或收盘时平仓交易。您如何最好地实现这个示例 让我们以下面的例子为例: 两种仪器:XYZ和ABC 进入信号:可以是任何东西-我们只想在“信号”评估为真时进入交易。对于本例,假设在T+0时,XYZ/ABC的比率在任一方向从打开到关闭的变化超过1% 退出信号:市场事件,如开盘或收盘。比方说,在这个例子中,我们希望在第二天的开盘交易中平
- 两种仪器:XYZ和ABC
- 进入信号:可以是任何东西-我们只想在“信号”评估为真时进入交易。对于本例,假设在T+0时,XYZ/ABC的比率在任一方向从打开到关闭的变化超过1%
- 退出信号:市场事件,如开盘或收盘。比方说,在这个例子中,我们希望在第二天的开盘交易中平仓我们在上面设定的交易
blotter
编写类似的内容相对容易:
假设名为ratio
的xts对象具有以下列:
for( i in 1:nrow(ratio) ) {
## Define the dates:
CurrentDate <- index(ratio[i,])
NextDate <- index(ratio[i+1,])
## Define the prices:
XYZClosePrice <- as.numeric(ratio$XYZ.Close[i,])
ABCClosePrice <- as.numeric(ratio$ABC.Close[i,])
XYZOpenPrice <- as.numeric(ratio$XYZ.Open[i+1,])
ABCOpenPrice <- as.numeric(ratio$ABC.Open[i+1,])
CCYClosePrice <- as.numeric(ratio$CCY.Close[i,])
CCYOpenPrice <- as.numeric(ratio$CCY.Open[i+1,])
## Define the spread:
SpreadOp <- ABCOpenPrice/XYZOpenPrice
SpreadCl <- ABCClosePrice/XYZClosePrice
## Define the hedge ratio (let's say XYZ has a multiplier of 25 and ABC of 50)
HedgeOp <- 25 * ((CCYOpenPrice/50)/SpreadOp)
HedgeCl <- 25 * ((CCYClosePrice/50)/SpreadCl)
# We want to trade 20 lots of XYZ each time with the corresponding hedge amount of ABC
Posn <- round(20 * HedgeCl,0)
## Add the trading rules (if move > 1% / else move <-1%):
# >= +1 % move
if(ratio[i,'signal up?']==1){
## enter position on today's close
addTxn(strat.name, Symbol='XYZ', TxnDate=CurrentDate,
TxnPrice=XYZClosePrice, TxnQty = 20 , TxnFees=0)
addTxn(strat.name, Symbol='ABC', TxnDate=CurrentDate,
TxnPrice=ABCClosePrice, TxnQty = - Posn , TxnFees=0)
## exit position tomorrow's open
addTxn(strat.name, Symbol='XYZ', TxnDate=NextDate,
TxnPrice=XYZOpenPrice, TxnQty = - 20, TxnFeABC=0)
addTxn(strat.name, Symbol='ABC', TxnDate=NextDate,
TxnPrice=ABCOpenPrice, TxnQty = Posn , TxnFeABC=0)}
else {
# <= -1% move
if(ratio[i,'signal dn?']==1){
## enter position on today's close
addTxn(strat.name, Symbol='XYZ', TxnDate=CurrentDate,
TxnPrice=XYZClosePrice, TxnQty = -20 , TxnFees=0)
addTxn(strat.name, Symbol='ABC', TxnDate=CurrentDate,
TxnPrice=ABCClosePrice, TxnQty = Posn , TxnFees=0)
# exit position on tomorrow's open
addTxn(strat.name, Symbol='XYZ', TxnDate=NextDate,
TxnPrice=XYZOpenPrice, TxnQty = 20, TxnFees=0)
addTxn(strat.name, Symbol='ABC', TxnDate=NextDate,
TxnPrice=ABCOpenPrice, TxnQty = - Posn , TxnFees=0)}
}
我的问题是:如何输入接下来的两个ruleSignal
,以便在第二天的开放日轻松解开这对
我知道它可能与ruleSignal
中的timestamp
参数有关,但我不知道如何实现它
这里可能有一个非常简单的解决方案,但我陷入了一个试图解决这个问题的循环中
一如既往,非常感谢您的帮助。quantstrat,如手册所述,是一个基于信号的框架。它不是为基于过滤器的交易而设计的 您可以通过在退出规则中使用delay参数来执行您想要的操作。将延迟设置为一天,并将首选参数设置为首选不同的价格列
我不打算为你写,但这些信息足以解决你的问题 注意-我还试图开发一个基于
sigcomparation
的解决方案来评估日期比较(即如果今天的日期是昨天的日期加上一个工作日,并且存在现有头寸,则退出交易)"虽然这里也有健康的R-forge财务人员,但你可能会更幸运。谢谢,Brian。感谢你的提示。我认为将信号与过滤器相结合的能力是一个伟大的发展方向。我希望能够做出贡献。你们有机会将R-forge的开发转移到像github这样的地方吗?@n.e.w:这是一个很高的固定成本,所以机会很小。@JoshuaUlrich的成本是美元还是仅仅是改变代码库/调整工作流程等的时间和麻烦?@JoshuaUlrich是可以理解的。感谢你们所有人对所制作的各种软件包所做的出色工作。一流的东西。@Brian G.Peterson,不幸的是我发现了这一点s的解决方案通常不起作用。举一个简单的例子,假设我们有每日数据。我们在第1天输入一个头寸,然后在第3天使用delay=2
退出。quantstrat随后将添加这两个交易。但现在假设在第2天触发一个新的条目。然后,当quantstrat调用addTxn
时,它将给出错误:交易必须按顺序添加。
那么有没有其他方法来制定基于日期的退出规则?
> strat <- add.rule(strat, name='ruleSignal',
+ arguments = list(sigcol="Cl.gt.1pct", sigval=TRUE, orderqty=20,
+ ordertype='market', orderside='long', pricemethod='market'),
+ type='enter', path.dep=TRUE,symbol='XYZ')
> strat <- add.rule(strat, name='ruleSignal',
+ arguments = list(sigcol="Cl.lt.1pct", sigval=TRUE, orderqty=Posn,
+ ordertype='market', orderside='short', pricemethod='market'),
+ type='enter', path.dep=TRUE,symbol='ABC')