В данном блог-посте будет представлена простейшая стратегия статистического арбитража, основанная на торговле коинтегрированными парами акций, которые были выявлены на Московской бирже, а также результаты бэктестов по ней.
Торговая стратегия
Допустим, у нас есть коинтегрированная пара акций, X и Y, а также цены этих акций за некий период времени 0,...,T. Для примера возьмём пару акций с тикерами (MSNG,MRSB). Для неё у нас есть данные о ценах за 252 торговых дня.
Первую половину наблюдений мы будем использовать, чтобы определить параметры торговой стратегии. Затем, основываясь на найденных параметрах, мы возьмём вторую половину наблюдений и проведём бэктесты, то есть протестируем, принесёт ли нам такая стратегия деньги.
Для дальнейших рассуждений нам понадобится спред двух акций. В нашем примере с парой (MSNG,MRSB) мы уже находили спред в
блог-посте про коинтеграцию, так что здесь я просто продублирую картинку.
Все мы хотим покупать дёшево и продавать дорого. Если разность уходит ниже нуля, акция Y (MSNG) дешевле, чем акция X (MRSB). И, наоборот, если разность поднимается выше нуля, акция 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;
Для пары акций с тикерами (MSNG,MRSB) расчётное значение r=4,8548. Затем вычислим максимум абсолютного значения разности для первой половины наблюдений:
clear absspread
for i = 1 : half
absspread(i,1) = abs(testPrices(i,1) - r * testPrices(i,2));
end
m = max(absspread);
Для пары акций с тикерами (MSNG,MRSB) расчётное значение m=0,3975. Теперь мы можем определить значение G путём перебора: возьмём некоторый процент от m и попробуем поторговать на «истории» при различных значениях этого процента, а затем выберем то значение, которое даст наибольшую прибыль. Это и будет искомое значение для линии G.
Для данной пары получилось, что G=0,159 (при 40% от m) даёт наибольшую прибыль.
Тестирование стратегии
После определения G торговая стратегия применяется ко второй половине наблюдений. При G=0,159 прибыль извлекается 4 раза. Другими словами, разность 4 раза перемещается от 0 до G и обратно. Обратите внимание, что реализация такой стратегии включает 8 сделок, так как для того, чтобы встать в позицию и выйти из неё, требуется совершить две сделки.
На рисунке ниже показаны все 8 моментов торговли.
Прибыль, полученная здесь, составляет не менее 4G=0,636. Здесь используются цены закрытия вместо данных внутри дня, поэтому мы не «торгуем» в точках −G, 0 и G. Для данной пары доходность за 126 торговых дней составила 21,78% без учёта комиссий, объёма и пр. То есть это примерно 44,25% годовых по очень грубым прикидкам.
Всего на Московской бирже было протестировано 8287 пар. Там, если не считать нулевой прибыли, приблизительная годовая доходность при данной стратегии колебалась от 3% до 1226%.
Тестирование альтернативной стратегии
Вместо того, чтобы закрывать позицию, когда разность приближается к нулю, можно перевернуть позицию, когда разность достигает G на противоположной стороне от нуля. Предположим, что мы продали 1Y и купили 4,7796X, так как разность была больше G.
Теперь можно дождаться того момента, когда разность достигнет −G, купить 2Y и продать 2⋅4,7796X. В результате мы останемся с портфелем из длинной позиции размера 1Y и короткий позиции размера 4,7796X.
Такая стратегия в случае с рассматриваемой парой приводит к одной начальной сделке и трём сделкам, которые переворачивают позицию. Эти сделки представлены на рисунке.
Обратите внимание, что прибыль от перевертывания позиции равна 2G=0,318, поэтому общая прибыль в данном случае составляет не менее 3⋅2G=0,954. Доходность за 126 торговых дней составила 27,36% без учёта комиссий, объёма и пр. То есть это примерно 55,59% годовых по очень грубым прикидкам.
Данное изменение в торговой стратегии уменьшает количество сделок в среднем в 2 раза. При этом сокращаются торговые издержки. Так как в рассмотренном случае разность двигается вверх и вниз около нуля, альтернативная стратегия оказывается более прибыльной.
Всего на Московской бирже было протестировано 8287 пар. Там, если не считать нулевой прибыли, приблизительная годовая доходность при данной стратегии колебалась от 5,67% до 1739,71%.
По-хорошему, коэффициент коинтеграции нужно считать сначала за первые полгода, а потом пересчитывать его после каждого «торгового дня» для имитации реальной торговли. У меня в планах реализовать это.
Кстати, вопрос к исследователю. Какие получились средние сделки и по каким ценам они рассчитываются? Цены открытия?
И еще… бумагу MRSB в шорт вряд ли кто даст…
Не учтена присадка в принципе, а ведь работать надо будет с плечом
Также не оценена степень подгонки на контрольной выборке. Выбирая одну стратегию из тысяч, вы делаете довольно мощную оптимизацию т.е. фактически обучаетесь на контрольной выборке.
То есть сейчас на второй половине «ежедневно» проверяется наличие коинтеграции, и, если коинтеграция перестаёт наблюдаться, позиция закрывается.