Значительная часть квантстрата и сопровождающих его примеров, похоже, устанавливается вокруг ввода и выхода из торгов путем смены технического индикатора.Quantstrat in R: Установка сигнала выхода на основе даты
Однако предположим, что у вас есть произвольный индикатор, который вы используете, чтобы вызвать запись в сделку, но затем вы хотите просто развернуть торговлю на открытии или закрытии следующего дня. Как бы вы лучше всего использовали этот пример?
Давайте рассмотрим следующий пример:
- Два инструмента: XYZ и ABC
- запись сигнала: Может быть что угодно - мы просто хотим, чтобы войти в сделку в любое время наш «сигнал» оценивает в действительности. Для этого примера, допустим, в любое время отношение XYZ/ABC изменяется более чем на 1% в любом направлении от Open to Close на T + 0
- Выход Сигнал: событие на рынке, такое как Open или Close. Предположим, в этом примере мы хотим развернуть торговлю, которую мы установили выше, на следующий день.
Например, писать что-то вроде этого, используя blotter
было бы относительно легко:
Предположим XTS объект под названием ratio
с колонками:
- ABC OHLC,
- XYZ OHLC,
- отношение ABC/XYZ, выраженное как OHLC
- валюта OHLC «CCY» (это кросс)
- наш индикатор (OpC (ABC/XYZ)),
- "сигнал вверх?" который будет оцениваться до 1, если индикатор равен> 1%, иначе 0, если нет
- «сигнал dn?» который будет оценивать 1, если индикатор < -1%, иначе 0, если не
Наш код будет таким:
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
«ю.ш. просто расслабиться на пару на следующий день?
Я знаю, что это, вероятно, что-то делать с timestamp
аргументом в ruleSignal
, но я не могу понять, как я бы реализовать.
Здесь может быть очень простое решение, но я поймал себя на части, пытаясь решить эту проблему.
Как всегда, любая помощь очень ценится.
Примечание. Я также пытаюсь работать над решением, основанным на 'sigComparison', для оценки сопоставлений даты (то есть, если сегодняшняя дата - это вчерашняя дата плюс один рабочий день, и существует существующая позиция, выйдите из сделки» –
. Вы можете стать лучше удачи на http://quant.stackexchange.com/, хотя здесь есть здоровая R случайность финансовых людей. – Chase