【发布时间】:2012-05-13 13:43:59
【问题描述】:
许多 quantstrat 和随附的示例似乎都是围绕通过某种技术指标进入和退出交易而设置的。
但是,假设您有一个任意指标用于触发交易入场,但您只想在第二天的开盘或收盘时平仓。您将如何最好地实现这个示例?
我们来看下面的例子:
- 两种工具:XYZ 和 ABC
- 进场信号:可以是任何东西——我们只想在我们的“信号”评估为真时进场。对于这个例子,假设任何时候 XYZ/ABC 的比率在 T+0 从开盘到收盘的任一方向变化超过 1%
- 退出信号:市场事件,例如开盘或收盘。假设在这个例子中,我们想在第二天的开盘时平仓我们上面设置的交易。
例如,使用blotter 编写这样的内容会相对容易:
假设名为 ratio 的 xts 对象包含以下列:
- ABC OHLC,
- XYZ OHLC,
- ABC/XYZ 的比率表示为 OHLC
- 货币 OHLC “CCY”(这是一个交叉货币对)
- 我们的指标(OpCl(ABC/XYZ)),
- “注册?”如果指标 > 1%,则为 1,否则为 0
- “信号 dn?”如果指标
我们的代码将是:
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)}
}
这很好用。
但是假设我们想在quantstrat 中实现它——它变得有点棘手。假设所有投资组合、账户、指标和信号等都设置正确,然后我将添加这些交易规则以进入交易:
> 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')
我的问题是:我如何输入接下来的两个 ruleSignal 以便在第二天的开盘时轻松平仓?
我知道这可能与 ruleSignal 中的 timestamp 参数有关,但我不知道如何实现它。
这里可能有一个非常简单的解决方案,但我陷入了一个试图解决这个问题的循环中。
一如既往,非常感谢任何帮助。
【问题讨论】:
-
注意 - 我也在尝试使用基于
sigComparison的解决方案来评估日期比较(即,如果今天的日期是昨天的日期加上一个工作日并且存在现有头寸,则退出交易” -
您可能会在quant.stackexchange.com 获得更好的运气,尽管这里的财务人员也有健康的 R 意外事件。
标签: r xts quantmod quantitative-finance quantstrat