quantstrat в R: установка сигнала выхода на основе даты

Большая часть quantstrat и сопутствующих примеров, по-видимому, основана на входе и выходе из сделок путем пересечения какого-либо технического индикатора.

Однако предположим, что у вас есть произвольный индикатор, который вы используете для входа в сделку, но затем вы хотите просто раскрутить сделку на открытии или закрытии следующего дня. Как бы вы лучше всего реализовали этот пример?

Возьмем следующий пример:

  • Два инструмента: XYZ и ABC
  • Входной сигнал: может быть любым - мы просто хотим войти в сделку каждый раз, когда наш "сигнал" оценивается как истинный. Для этого примера предположим, что в любой момент отношение XYZ/ABC изменяется более чем на 1% в любом направлении от открытия до закрытия в момент Т+0.
  • Выходной сигнал: рыночное событие, такое как открытие или закрытие. Допустим, в этом примере мы хотим раскрутить сделку, которую мы установили выше, на открытии следующего дня.

Например, написать что-то подобное, используя blotter, было бы относительно легко:

Предположим, объект xts с именем ratio со столбцами для:

  1. АБК ОХЛК,
  2. XYZ OHLC,
  3. отношение ABC/XYZ, выраженное как OHLC
  4. валюта OHLC "CCY" (это кросс-валютная пара)
  5. наш индикатор (OpCl(ABC/XYZ)),
  6. "подать сигнал?" который будет оцениваться как 1, если индикатор> 1%, иначе 0, если нет
  7. "сигнал дн?" который будет оцениваться как 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, но я не могу понять, как это реализовать.

Здесь может быть очень простое решение, но я поймал себя на том, что пытаюсь решить это.

Как всегда, любая помощь очень ценится.


person n.e.w    schedule 04.05.2012    source источник
comment
Примечание. Я также пытаюсь работать над решением на основе sigComparison для оценки сравнений дат (т.е. если сегодняшняя дата является вчерашней датой плюс один рабочий день и есть существующая позиция, выйдите из сделки   -  person n.e.w    schedule 04.05.2012
comment
Возможно, вам повезет больше на quant.stackexchange.com, хотя здесь также есть здоровая непредвиденная ситуация R для финансовых специалистов.   -  person Chase    schedule 04.05.2012


Ответы (1)


quantstrat, как описано в руководстве, представляет собой структуру, основанную на сигналах. На самом деле он не предназначен для сделок на основе фильтров.

Вы можете делать то, что хотите, используя аргумент delay в правиле выхода. Установите задержку в один день и аргумент prefer, чтобы предпочесть другой столбец цен.

Я не собираюсь писать это для вас, но этой информации достаточно для решения вашей проблемы.

person Brian G. Peterson    schedule 04.05.2012
comment
Спасибо, Брайан. Цените подсказку. Я думаю, что возможность комбинировать сигналы вместе с фильтром — отличное направление для разработчиков. Хотелось бы внести свой вклад. Есть ли шанс, что вы, ребята, перенесете разработку из r-forge куда-нибудь вроде github? - person n.e.w; 04.05.2012
comment
@n.e.w: Это высокая фиксированная стоимость, поэтому шансы невелики. - person Joshua Ulrich; 04.05.2012
comment
@JoshuaUlrich с точки зрения стоимости в долларах или просто времени и хлопот, связанных с изменением кодовой базы / адаптацией ваших рабочих процессов и т. Д.? - person n.e.w; 04.05.2012
comment
@JoshuaUlrich понятно. спасибо всем вам за вашу большую работу над различными пакетами, которые вы произвели. первоклассная вещь. - person n.e.w; 04.05.2012
comment
@ Брайан Г. Петерсон, к сожалению, я обнаружил, что это решение вообще не работает. Чтобы привести простой пример, предположим, что у нас есть ежедневные данные. Мы входим в позицию в первый день, а затем используем delay = 2 для выхода в третий день. Затем quantstrat добавит обе эти транзакции. Но теперь предположим, что новая запись инициируется на 2-й день. Тогда, когда quantstrat вызывает addTxn, он выдает ошибку: Transactions must be added in order. Итак, есть ли другой способ создать правило выхода на основе даты? - person James Hirschorn; 10.08.2018