рекомендации

среда, 18 ноября 2020 г.

Тестирование торговых стратегий на исторических данных с помощью Quantstrat. Часть 5. Добавление правил.

Первая часть
Вторая часть
Третья часть
Четвертая часть

Итак, мы построили наши индикаторы  nFast  и  nSlow  и генерируемые на их базе сигналы. Далее мы должны добавить правила для этих сигналов. 

Всякий раз, когда значение нашей переменной long будет равно TRUE, мы хотим разместить рыночный ордер на открытие длинной позиции. Мы хотим купить 100 акций.

 

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

 

Наш код будет выглядеть следующим образом: 

 

# Добавление правил

# Правило открытия длинной позиции

add.rule(strategy = strategy.st,

  name = "ruleSignal",

  arguments = list(sigcol = "long",

    sigval = TRUE,

    orderqty = 100,

    ordertype = "market",

    orderside = "long"

    prefer = "Open"

    TxnFees = -20

    replace = FALSE),

  type = "enter",

  label = "EnterLONG"

# Правило закрытия длинной позиции

add.rule(strategy.st, 

  name = "ruleSignal"

  arguments = list(sigcol = "short"

    sigval = TRUE

    orderside = "long"

    ordertype = "market"

    orderqty = "all"

    TxnFees = -20

    prefer = "Open",

    replace = FALSE), 

  type = "exit"

  label = "Exit2SHORT")

 

Вызову add.rule передаются следующие аргументы:

1. Название нашей стратегии - strategy.st.

2. name - название функции, как правило, это всегда будет "ruleSignal", которая является функцией по умолчанию в Quantstrat  для генерации торговых ордеров на базе сигнала.

3. Аргументы функции "ruleSignal", которые мы рассмотрим ниже.

4. Аргумент type может принимает несколько значений, но основными и наиболее часто используемыми являются «enter» и «exit». Они делают именно то, что следует из их названия. То есть первый используется для правил, открывающих позиции, а второй - для закрывающих. Есть и другие типы правил, такие как «chain» (для стоп-лоссов), которые имеют свою собственную механику, но на данный момент «enter» и «exit» - это два основных правила, которые вам нужны, чтобы оторваться от земли.

5. Аргумент label - это просто метка, которая присваивается вашему правилу. Она будет важна, если вы захотите провести более глубокий анализ стратегии с использованием книги ордеров.

Теперь давайте подробно разберем значение аргументов функции "ruleSignal".

 

1. Аргумент sigCol - это строка с точным названием столбца сигнала, который вы хотите использовать для генерации ваших входов (или выходов). Это та же самая строка, которая хранится в аргументе label для вызовов функции add.signal. В quantstrat метки эффективно действуют в качестве логических связей между индикаторами, сигналами, правилами и многим другим.

2. Аргумент sigVal - это значение, которое следует использовать для запуска правила. Поскольку вывод сигнала (пока) состоит только из единиц (TRUE) или нулей (FALSE), я установил для своего sigVal значение TRUE. Однако можно создать правило sigSum и затем разрешить аргументу sigVal принимать другие значения.

3. Аргумент orderqty указывает, сколько именно ценных бумаг вы хотите купить или продать. Одной из отличительных его является то, что если аргумент type равен “exit”,  вы можете мгновенно уменьшить свою позицию до нуля, присвоив аргументу orderqty значение all.

4. Аргумент ordertype - это тип ордера. В большинстве несложных стратегий в основном используются рыночные ордера, которые являются самыми простыми. Рыночные ордера исполняются на следующем баре после получения сигнала. На дневном таймфрейме это может вызвать некоторые потери из-за гэпов, но для внутридневных данных открытие следующего бара должно быть очень похоже на закрытие текущего бара. Следует отметить, что при использовании ежемесячного таймфрейма Quantstrat использует исполнение на текущем баре.

Альтернативным типом ордеров является лимитный ордер, который указывает, что транзакция будет иметь место только при достижении определенной цены. Механика лимитных ордеров будет рассмотрена позже.

5. Аргумент orderside может принимать одно из двух значений - long или short. В quantstrat длинные и короткие сделки отделены друг от друга, так что quantstrat знает, является ли сделка длинной или короткой, поэтому правило закрытия длинной позиции не работает с короткими позициями и наоборот. Это также помогает добавить ясности и удобочитаемости спецификациям стратегии.

6. Аргумент prefer предназначен для указания, на каком компоненте бара будет выполнена сделка. Quantstrat по умолчанию исполняет ордер на закрытии следующего бара. Вместо этого я установил для этого аргумента значение «Open», чтобы минимизировать проскальзывание.

7. Аргумент TxnFees   - это операционные издержки, связанные с ордером. Это может быть любое значение, которое вы выберете, но оно должно точно отражать комиссию вашего брокера.  TxnFees  может быть добавлен в любой набор правил.

8. Аргумент replace работает следующим образом: если он равен TRUE, он отменяет любой другой сигнал того же типа на том же баре. То есть, вы можете задать, например, два правила для открытия длинной позиции, и установив значение TRUE для этого аргумента, вы будете уверены, что они не сработают оба сразу.

Необходимо помнить, что в Quantstrat для replace  по умолчанию установлено значение TRUE, поэтому обязательно устанавливайте значение FALSE, если это необходимо для вашей стратегии.

 

В quantstrat сумма транзакции актива не всегда может быть фиксированным количеством акций. Конструкции, которые позволяют quantstrat изменять количество купленных или проданных акций, называются функциями определения размера ордера (order sizing functions).

Использовать предварительно закодированную функцию определения размера ордера очень просто. Первое, что нужно помнить, это то, что при использовании функции определения размера ордера аргумент orderqty больше не актуален, поскольку размер ордера теперь определяется соответствующей функцией. Мы можем создать собственную функцию изменения размера ордера (что выходит за рамки текущей статьи), или воспользоваться одной из встроенных функций quantstrat. 

Вызов функции определения размера ордера довольно прост. Входные данные для функции определения размера заказа задаются вместе с остальными входными данными внутри аргументов, которые мы узнали в предыдущих разделах. Название функции передается аргументу osFUN.

Например, мы можем выбрать функцию osMaxDollar

Дополнительными аргументами этой функции являются tradeSize и maxSize, оба из которых должны принимать значение init_equity, которое вы определили ранее.

Это будет выглядеть примерно следующим образом:

 

osFUN = osMaxDollar,

tradeSize = tradesize,

maxSize = tradesize),

 

osMaxDollar - это функция определения размера ордера, которая ограничивает размер позиции на основе долларовой стоимости позиции, а не количества акций. Можно также использовать, например, osDollarATR, которая позволяет задать размер ордера в процентах по отношению к вашему депозиту, и т.д.

Комментариев нет:

Отправить комментарий