В данном блог-посте будут представлены результаты бэктестов простейшей стратегии статистического арбитража, основанной на торговле коинтегрированными парами активов, которые были выявлены на Poloniex.
Как проводились бэктесты
- Сбор данных: список тикеров был взят с сайта Poloniex через публичный API-метод returnTicker. Нашлось 99 тикеров, для которых есть данные о ценах криптовалютных пар за 2017 год. Цены за 2017 год были также выкачаны с Полоникса через публичный API-метод returnChartData.
- Проверка на стационарность с помощью теста Дики-Фуллера: в результате тестирования на стационарность получилось 89 нестационарных криптовалютных пар со стационарными приращениями.
- Проверка на коинтеграцию с помощью теста Энгла-Грэнджера: в результате тестирования для прямой регрессии было получено 539 коинтегрированных пар в случае регрессии со свободным членом и 716 коинтегрированных пар в случае регрессии без свободного члена. Для обратной регрессии было получено 527 коинтегрированных пар в случае регрессии со свободным членом и 737 коинтегрированных пар в случае регрессии без свободного члена.
- Непосредственно бэктесты для двух торговых стратегий. О них речь пойдёт ниже.
Торговая стратегия
Допустим, у нас есть коинтегрированная пара криптовалютных пар, X и Y, а также цены этих криптовалютных пар за некий период времени 0,...,T. Для примера возьмём пару криптовалютных пар с тикерами (BTC_XCP,BTC_XVC). Для неё у нас есть данные о ценах за 365 торговых дней.
Первую половину наблюдений мы будем использовать, чтобы определить параметры торговой стратегии. Затем, основываясь на найденных параметрах, мы возьмём вторую половину наблюдений и проведём бэктесты, то есть протестируем, принесёт ли нам такая стратегия деньги.
Для дальнейших рассуждений нам понадобится спред двух коинтегрированных пар: BTC_XCP — 36,6871 * BTC_XVC.
Если спред уходит ниже нуля, криптовалютная пара Y (BTC_XCP) дешевле, чем криптовалютная пара X (BTC_XVC). И, наоборот, если спред поднимается выше нуля, криптовалютная пара Y дороже, чем криптовалютная пара X (ну или X дешевле по сравнению с Y).
По сути, торговая стратегия состоит в том, чтобы купить криптовалютную пару Y и продать криптовалютную пару X в соотношении 1:β, если спред находится несколько ниже нуля (ниже линии G на рисунке ниже). Когда же спред возвращается обратно к нулю, нам нужно закрыть позицию, продав Y и купив X в том же соотношении. В этом случае мы получаем прибыль размера G.
Здесь важно понимать, что у нас должна быть возможность продавать криптовалютные пары, которыми мы не владеем, то есть осуществлять короткую продажу (шорт). Также необходимо отметить, что не все биржи предоставляют возможность маржинальной торговли, так что, возможно, вам придётся зарегистрироваться на соответствующей бирже для расширения своих спекулятивных возможностей.
В общем, мы составляем портфель, который содержит одну длинную позицию (лонг) и одну короткую позицию (шорт), если спред пересекает некоторую линию 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 моментов торговли.
Прибыль, полученная здесь, составляет не менее 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.
Такая стратегия в случае с рассматриваемой парой приводит к одной начальной сделке, двум сделкам, которые переворачивают позицию, и ещё одной сделке, которая закрывает открытые позиции. Эти сделки представлены на рисунке.
Обратите внимание, что прибыль от перевертывания позиции равна 2G=0,0017, поэтому общая прибыль в данном случае составляет не менее 2⋅2G=0,0035. Доходность за 182 торговых дня составила 116,33% без учёта комиссий, объёма и пр. То есть это примерно 233,3% годовых по очень грубым прикидкам.
Данное изменение в торговой стратегии уменьшает количество сделок в среднем в 2 раза. При этом сокращаются торговые издержки. Если бы разность двигалась вверх и вниз около 0, альтернативная стратегия была бы более прибыльной. Однако в рассмотренном случае, когда у пары есть тенденция двигаться между 0 и -G, позиция переворачивается всего 1 раз, тогда как основная стратегия создаёт и ликвидирует позицию снова и снова… и делает деньги.
Всего на Полониксе было протестировано 518 пар. Там, если не считать нулевой прибыли, приблизительная годовая доходность при данной стратегии колебалась от -93,71% до 233,3%.
Структура рынка
Из-за того, что на Полониксе для маржинальной торговли на данный момент доступно всего 11 криптовалютных пар, практическое применение описанных выше торговых стратегий значительно ограничено.
в резалте у тя останется всего 5-10 бумаг...
2 тестить надо по клосам
В случае с маржинальными требованиями на шорты и другим уровнем комиссий в этом случае… ваш парный трейдинг должен давать 1000% годовых, а этого даже байэндхолд крипты делать не умеет:)
Поэтому неудивительно, что проще крипту тупо купить и держать:)