Ксения Кузнецова
Ксения Кузнецова личный блог
17 апреля 2018, 15:03

Торговая стратегия для коинтегрированных пар: результаты бэктестов за 2017 год на Poloniex

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

Как проводились бэктесты

  1. Сбор данных: список тикеров был взят с сайта Poloniex через публичный API-метод returnTicker. Нашлось 99 тикеров, для которых есть данные о ценах криптовалютных пар за 2017 год. Цены за 2017 год были также выкачаны с Полоникса через публичный API-метод returnChartData.
  2. Проверка на стационарность с помощью теста Дики-Фуллера: в результате тестирования на стационарность получилось 89 нестационарных криптовалютных пар со стационарными приращениями.
  3. Проверка на коинтеграцию с помощью теста Энгла-Грэнджера: в результате тестирования для прямой регрессии было получено 539 коинтегрированных пар в случае регрессии со свободным членом и 716 коинтегрированных пар в случае регрессии без свободного члена. Для обратной регрессии было получено 527 коинтегрированных пар в случае регрессии со свободным членом и 737 коинтегрированных пар в случае регрессии без свободного члена.
  4. Непосредственно бэктесты для двух торговых стратегий. О них речь пойдёт ниже.

Торговая стратегия

Допустим, у нас есть коинтегрированная пара криптовалютных пар, X и Y, а также цены этих криптовалютных пар за некий период времени 0,...,T. Для примера возьмём пару криптовалютных пар с тикерами (BTC_XCP,BTC_XVC). Для неё у нас есть данные о ценах за 365 торговых дней.

Первую половину наблюдений мы будем использовать, чтобы определить параметры торговой стратегии. Затем, основываясь на найденных параметрах, мы возьмём вторую половину наблюдений и проведём бэктесты, то есть протестируем, принесёт ли нам такая стратегия деньги.

Для дальнейших рассуждений нам понадобится спред двух коинтегрированных пар: BTC_XCP — 36,6871 * BTC_XVC.
Торговая стратегия для коинтегрированных пар: результаты бэктестов за 2017 год на Poloniex
Если спред уходит ниже нуля, криптовалютная пара Y (BTC_XCP) дешевле, чем криптовалютная пара X (BTC_XVC). И, наоборот, если спред поднимается выше нуля, криптовалютная пара Y дороже, чем криптовалютная пара X (ну или X дешевле по сравнению с Y).

По сути, торговая стратегия состоит в том, чтобы купить криптовалютную пару Y и продать криптовалютную пару X в соотношении 1:β, если спред находится несколько ниже нуля (ниже линии G на рисунке ниже). Когда же спред возвращается обратно к нулю, нам нужно закрыть позицию, продав Y и купив X в том же соотношении. В этом случае мы получаем прибыль размера G.
Торговая стратегия для коинтегрированных пар: результаты бэктестов за 2017 год на Poloniex
Здесь важно понимать, что у нас должна быть возможность продавать криптовалютные пары, которыми мы не владеем, то есть осуществлять короткую продажу (шорт). Также необходимо отметить, что не все биржи предоставляют возможность маржинальной торговли, так что, возможно, вам придётся зарегистрироваться на соответствующей бирже для расширения своих спекулятивных возможностей.

В общем, мы составляем портфель, который содержит одну длинную позицию (лонг) и одну короткую позицию (шорт), если спред пересекает некоторую линию G или уходит за неё в противоположную от нуля сторону. И мы закрываем все позиции, когда спред возвращается обратно к нулю.

Следующий вопрос, который возникает, — это «как найти значение G»?

Как найти значение G?

Нам понадобится первая половина наблюдений, которую мы будем рассматривать как «историю».

T = length(testPrices);
half = round(T/2);
Для начала найдём среднее отношение Y и X для первой половины наблюдений:

sumRatio = 0;
for i = 1 : half
    sumRatio = sumRatio + testPrices(i,1) / testPrices(i,2);
end
r = sumRatio / half;
Для пары криптовалютных пар с тикерами (BTC_XCP,BTC_XVC) расчётное значение r=46,1849. Затем вычислим максимум абсолютного значения разности для первой половины наблюдений:

clear absspread
for i = 1 : half
    absspread(i,1) = abs(testPrices(i,1) - r * testPrices(i,2));
end
m = max(absspread);
Для пары акций с тикерами (BTC_XCP,BTC_XVC) расчётное значение m=0,0035. Теперь мы можем определить значение G путём перебора: возьмём некоторый процент от m и попробуем поторговать на «истории» при различных значениях этого процента, а затем выберем то значение, которое даст наибольшую прибыль. Это и будет искомое значение для линии G.

Для данной пары получилось, что G=0,00086576 (при 25% от m) даёт наибольшую прибыль.

Тестирование стратегии

После определения G торговая стратегия применяется ко второй половине наблюдений. Далее алгоритм «ежедневно» (на каждой итерации) пересчитывает коинтеграцию. Когда коинтеграция перестаёт наблюдаться, позиции закрываются. Также происходит закрытие открытых позиций в конце тестового периода. При G=0,00086576 прибыль извлекается 6 раза. Другими словами, разность 6 раз перемещается от 0 до G и обратно. Обратите внимание, что реализация такой стратегии включает 12 сделок, так как для того, чтобы встать в позицию и выйти из неё, требуется совершить две сделки.

На рисунке ниже показаны все 12 моментов торговли.
Торговая стратегия для коинтегрированных пар: результаты бэктестов за 2017 год на Poloniex
Прибыль, полученная здесь, составляет не менее 6G=0,0052. Здесь используются цены закрытия вместо данных внутри дня, поэтому мы не «торгуем» в точках −G, 0 и G. Для данной пары доходность за 182 торговых дня составила 119,99% без учёта комиссий, объёма и пр. То есть это примерно 240,63% годовых по очень грубым прикидкам.

Всего на Полониксе было протестировано 518 пар. Там приблизительная годовая доходность при данной стратегии колебалась от -93,71% до 240,63%.

Тестирование альтернативной стратегии

Вместо того, чтобы закрывать позицию, когда разность приближается к нулю, можно перевернуть позицию, когда разность достигает G на противоположной стороне от нуля. Предположим, что мы продали 1Y и купили 36,6871X, так как разность была больше G.

Теперь можно дождаться того момента, когда разность достигнет −G, купить 2Y и продать 2⋅36,6871X. В результате мы останемся с портфелем из длинной позиции размера 1Y и короткий позиции размера 36,6871X.

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

Торговая стратегия для коинтегрированных пар: результаты бэктестов за 2017 год на Poloniex
Обратите внимание, что прибыль от перевертывания позиции равна 2G=0,0017, поэтому общая прибыль в данном случае составляет не менее 2⋅2G=0,0035. Доходность за 182 торговых дня составила 116,33% без учёта комиссий, объёма и пр. То есть это примерно 233,3% годовых по очень грубым прикидкам.

Данное изменение в торговой стратегии уменьшает количество сделок в среднем в 2 раза. При этом сокращаются торговые издержки. Если бы разность двигалась вверх и вниз около 0, альтернативная стратегия была бы более прибыльной. Однако в рассмотренном случае, когда у пары есть тенденция двигаться между 0 и -G, позиция переворачивается всего 1 раз, тогда как основная стратегия создаёт и ликвидирует позицию снова и снова… и делает деньги.

Всего на Полониксе было протестировано 518 пар. Там, если не считать нулевой прибыли, приблизительная годовая доходность при данной стратегии колебалась от -93,71% до 233,3%.

Структура рынка

Из-за того, что на Полониксе для маржинальной торговли на данный момент доступно всего 11 криптовалютных пар, практическое применение описанных выше торговых стратегий значительно ограничено.
4 Комментария
  • как много девушек хороших ©
  • ves2010
    17 апреля 2018, 15:29
    1 изначально надо смотреть мнгновенный объем… т.е. смотрим минутки… они должны быть без дырок
    в резалте у тя останется всего 5-10 бумаг... 
    2 тестить надо по клосам

  • Sergey Pavlov
    18 апреля 2018, 08:44
    Даже простая алгостратегия на крипте под вопросом. Возьмём спекуляцию раз в день. Имеем 365 сделок. Издержку на одну сделку надо закладывать в 1%. Получаем годовой убыток в -365%. Т.е. наша алгостратегия должна быть со средней сделкой не менее 1% и годовой доходностью не менее 300%, чтобы только в ноль проторговать год. Явно мы не за нулём приходим в крипту. Значит сама стратегия должна содержать профит в 500% годовых хотя бы при средней сделке в 2% хотя бы. А это весьма непросто… это почти как выжать из росрынка на долгосроке 40% годовых. Не получается ни у кого:))

    В случае с маржинальными требованиями на шорты и другим уровнем комиссий в этом случае… ваш парный трейдинг должен давать 1000% годовых, а этого даже байэндхолд крипты делать не умеет:)

    Поэтому неудивительно, что проще крипту тупо купить и держать:)
    • Вячеслав Груздев
      20 апреля 2018, 19:21
      Sergey Pavlov, 
      Издержку на одну сделку надо закладывать в 1%
      На полониксе комиссия сделки по рынку 0.25%. Тот кто создает заказ платит еще меньше 0.15%. Займ биткоинов обходится (на момент написания комментария) 0.01% в сутки. Т.е. максимальная издержка на одну сделку будет 0.25% + 0.01%*d, где d это количество дней которое держится открытая позиция.
      Значит сама стратегия должна содержать профит в 500% годовых хотя бы при средней сделке в 2% хотя бы
      Неправильно считаете годовой процент. Профит в 1% в день соответствует 3700% в год: 1.01^365.
      Поэтому неудивительно, что проще крипту тупо купить и держать:)
      Удивительно, но большинство холдеров так и считает ни разу не попробовав поторговать ботом на криптобирже :)

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн