4 практических метода установки стоп-лосса при алгоритмической торговле биткойнами

Вы часто слышите о важности установки стоп-лосса перед открытием сделок. И если вы квант, я думаю, вы уже знаете о важности этого.

Стоп-лосс используется в двух вариантах:

  • Установка стоп-лосса в начале сделки
  • Выход из открытой позиций со (своего рода) скользящим стопом

Примечание №1 : Стоп-лосс также может использоваться для открытия сделок, это расширенное использование стоп-лосса. В этом уроке про это не будет.

Примечание №2: Как и во всех руководствах, будет использоватьсяязык Python и среду JesseAI . Оба имеют открытый исходный код и бесплатны для начала работы. 

Используется ли в вашей стратегии какой-то трейлинг-стоп для выхода или она выходит на определёной цене, на данный момент это не имеет значения. Идея установить стоп-лосс ниже цены входа просто не подлежит обсуждению. Если стратегии не используют стоп-лоссы, то они ошибочны.

Почему так важна точная цена стоп-лосса?

Допустим, вы решили использовать стоп-лосс. Но какова будет ваша точная стоп-цена? Это действительно важно? Да! На самом деле это очень важно. 

Хотя увеличение маржи вашего стоп-лосса увеличит процент выигрыша вашей стратегии , это уменьшит размер вашей позиции . Меньшие размеры позиций означают меньшую прибыль в долгосрочной перспективе. И, конечно же, долгосрочная прибыль – суть алгоритмической торговли.

Я объясню это на примере: 

Представьте, что ваш общий капитал составляет 10 000 $, и вы собираетесь рисковать 3% от него на сделку. Допустим, ваши стратегии говорят вам входить в рынок по цене 100 $ и устанавливать стоп-лосс на уровне 80 $ (в этой статье рассказывается о способах определения точной цены). Каким должен быть размер вашей позиции?

Поскольку разговоры дешевы, я отвечу кодом:

entry_price = 100
stop_price = 80
risk_percentage = 0.03
capital_size = 10000
risk_per_qty = 100 - 80 # 20

position_size = ((risk_percentage * capital_size) / risk_per_qty) * entry_price

position_qty = position_size / entry_price # 15

Таким образом, количество позиций должно быть 15, так что я рискую только 3% своего капитала, который составляет 300 $. А теперь посмотрим, что будет, если я ужесточу стоп-лосс и все еще рискую 3% (300 $). Допустим, я вместо этого поставил стоп-лосс на 90 $:

entry_price = 100
stop_price = 90
risk_percentage = 0.03
capital_size = 10000
risk_per_qty = 100 - 90 # 10

position_size = ((risk_percentage * capital_size) / risk_per_qty) * entry_price

position_qty = position_size / entry_price # 30

Обратите внимание, что я все еще рискую 300 $ за каждую сделку, но размер моей позиции удваивается, как и возможная прибыль (если она окажется прибыльной). Но, конечно же, более жесткий стоп-лосс означает, что ваши сделки будут прекращены чаще, а это означает, что процент выигрышей будет снижен.

Вам нужен не слишком узкий и не слишкий низкий стоп-лосс

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

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

1. Индикатор ATR

Average True Range мой любимый индикатор для установки динамического стоп-лосс. То как это выглядит на графике сначала может показаться немного пугающим:

Индикатор ATR
Индикатор ATR на TradingView

Как видите, значение ATR изменяется вместе с волатильностью цены. Это ключевая причина, по которой я использую его для стоп-лосса. 

Цена стоп-лосса должна быть установлена ​​на уровне, чтобы не попасть под рыночный шум. Неустойчивость и шум идут рука об руку.

На самом деле использовать ATR при алгоритмической торговле проще, чем при торговле вручную. В приведенном ниже примере, который предназначен для длинной сделки, я установил стоп-лосс 3*ATRот цены входа:

# get the ATR indicator value for current candle
atr = ta.atr(self.candles)

# enter at current price with a market order
entry = self.price 

stop = entry - (atr * 3)

В зависимости от того, на каком таймфрейме вы торгуете, вам может потребоваться поменять множитель. Я использовал 3 для 4hтаймфрейма. Для меньших таймфреймов нужно уменьшить множитель. 

2. Скользящее среднее 

Скользящие средние похожи это как «hello, world» в технической торговле. Не все знают, что их можно использовать и для стоп-лоссов.

Например, мы могли бы использовать в нашей стратегии две EMA: одну с меньшим периодом для входа и одну с большим периодом для стоп-лосса. 

Скользящее & nbsp; среднее & nbsp;
3-часовой таймфрейм ETHUSD – синяя линия: EMA50 – фиолетовая линия: EMA100

В приведенном выше примере мы могли бы купить по EMA50, что было бы, когда на рынке была кровь, и использовать EMA100 в качестве стоп-лосса.

import jesse.indicators as ta

entry = ta.ema(self.candles, 50)
stop = ta.ema(self.candles, 100)

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

3. Самая низкая цена предыдущего N бара.

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

Невооруженным глазом виден нижний из N столбцов:

Скользящее & nbsp; среднее & nbsp;
Фиолетовая стрелка указывает цену входа – синяя линия указывает цену стоп-лосса)

А что в коде? Что ж, я используя фреймворк Джесси это легко сделать. Допустим, мы хотим использовать самую низкую цену за последние N = 20 баров:

# "4" is the index of low of the candle in Jesse's strategy API. 
# for more, read https://docs.jesse-ai.com/docs/strategies/api.html#current-candle
last_20_lows = self.candles[-20:, 4]

previous_low = np.min(last_20_lows)

Обратите внимание, что self.candlesвозвращает массив numpy, как описано в документации Джесси. 

4. Минимум предыдущего дня

Это самый простой и легкий для написания код; и все же иногда это работает довольно хорошо. Особенно, если вы дневной трейдер.

Во-первых, вам нужно сказать Джесси, чтобы он загружал свечи для 1Dтаймфрейма в список вашего routes.pyфайла extra_candle. Вот пример BTCUSD:

# My trading route is "4h". 
routes = [
    ('Bitfinex', 'BTCUSD', '4h', 'TrendFollowingStrategy'),
]

# I need to add an extra route to "extra_candles" below:
extra_candles = [
    ('Bitfinex', 'BTCUSD', '1D'),
]

Теперь в стратегии сначала я выбираю все дневные свечи, затем свечу предыдущего дня, а затем выбираю ее минимальную цену (индекс = 4):

# docs for self.get_candles: 
# https://docs.jesse-ai.com/docs/strategies/api.html#get-candles
all_daily_candles = self.get_candles(self.exchange, self.symbol, '1D')

# notice that "-1" would have have given me the current candle, 
# hence "-2" gives me the one before that which is yesterday's
previous_day_candle = all_daily_candles[-2]

previous_day_candle_low = previous_day_candle[4]

Заключение 

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

Вы удивитесь, насколько разнится результат. Каждый метод может хорошо работать на определенном рынке и таймфрейме. Например хорошо зарекомендовал себя метод ATR BTCUSDна 4hтаймфрейме; и скользящий средний метод хорошо работал ETHUSDна 3hтаймфрейме.

Так же хорошей идеей будет использовать режим оптимизации Джесси и позволить алгоритму самому решить, какой метод стоп-лосса использовать! Однако режим оптимизации еще не вышел. Не забудьте подписаться, чтобы получать уведомления о его выпуске.

Credits: Featured image by Chris Liverani on Unsplash

Original here: jesse.ai/blog

Translated by Google Translate and Aleksey Savin

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.