2012-05-04 5 views
7

Значительная часть квантстрата и сопровождающих его примеров, похоже, устанавливается вокруг ввода и выхода из торгов путем смены технического индикатора.Quantstrat in R: Установка сигнала выхода на основе даты

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

Давайте рассмотрим следующий пример:

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

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

Предположим XTS объект под названием ratio с колонками:

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

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

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

+0

Примечание. Я также пытаюсь работать над решением, основанным на 'sigComparison', для оценки сопоставлений даты (то есть, если сегодняшняя дата - это вчерашняя дата плюс один рабочий день, и существует существующая позиция, выйдите из сделки» –

+0

. Вы можете стать лучше удачи на http://quant.stackexchange.com/, хотя здесь есть здоровая R случайность финансовых людей. – Chase

ответ

5

В соответствии с инструкциями, приведенными в руководстве, квант-блок основан на основе сигналов. Он не предназначен для фильтров, основанных на.

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

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

+0

Спасибо, Брайан. Оцените подсказку. Я думаю, что способность комбинировать сигналы вместе с фильтром - отличное направление Хотелось бы иметь возможность внести свой вклад. Есть ли шанс, что вы, ребята, переместите развитие с r-forge куда-нибудь, как github? –

+0

@new: Это высокая фиксированная стоимость, поэтому шансы на успех. –

+0

@JoshuaUlrich с точки зрения доллара стоимость или просто время и хлопоты по переходу на кодовую базу/адаптацию рабочих процессов и т. д.? –