Блог им. HsergeyF
Наверное, многим, кто всерьез занимается парным трейдингом, хочется обрабатывать множество котировок одновременно, находить взаимосвязи между ними и визуализировать это все как можно нагляднее. Ниже описан инструмент, которым я пользуюсь, чтобы находить связи между широким спектром тикеров.
Когда речь идет о корреляции на финансовом рынке, в первую очередь думаешь об арбитраже или диверсификации портфеля. Для построения арбитражной стратегии нет ничего проще, чем посмотреть корреляцию в Excel, но результат, увы, ограничится 2-3 инструментами. Что делать, если у нас портфель роботов или акций? Тут есть два известных мне способа:
1.Посмотреть корреляцию в Wealth-e или TSLab-е
2. Воспользоваться Rstudio
В первом случае задача решается как кодом, так и кубиками. Проблема в том, что визуализация именно корреляции получается ужасная, особенно если выводить еще и графики баров на отдельную панель. Если искать зависимость 3 и более инструментов, то интерпретировать получившийся хаос невозможно – режет глаз, да и просто неудобно. Единственный плюс такого подхода в том, что программа приводит к общему виду неровные финамовские данные и их не придется подгонять вручную.
Второй способ, на мой взгляд самый лучший, хотя требует немного времени для того, чтобы стандартизировать датасеты, скачанные с Финама. При загрузке данных в Rstudio, оказалось, что все инструменты имеют разное количество строк. С тиковыми данными разброс переваливает за тысячу. Логично предположить, что чем выше таймфрейм, тем более однородные данные мы получим. Это связано с тем, что некоторые свечи на нижних таймфреймах просто не записываются в csv файл.
Для того, чтобы посмотреть связь инструментов в динамике, находим разность между ценами открытия и закрытия. После этого с помощью функции log() находим логарифмы полученной разницы. Эта операция позволяет уменьшить их разброс и убрать возможные смещения в наблюдениях.
Осталось только построить матрицу корреляций и нарисовать имеющиеся связи:
1.загружаем пакеты:
library(igraph) library(dplyr) library(ggplot2)
2. при помощи функции mutate добавляем в наши датасеты колонку с разностью цен.
RTS = mutate(RTS, Rts = log(X.CLOSE.)-log(X.OPEN.)) ...
3. Убираем остальные ненужные нам колонки, используя команду select.
RTS = select(RTS,Rts ) ...
4. группируем разность цен всех наших тикеров в один датасет (cbind).
Common =cbind(RTS,SI,SBRF,GOLD,EU,BR,GAZP)<br>...
5. Считаем корреляцию(corr) и превращаем матрицу корреляции в датафрейм (as.data.frame).
CMX=cor(Common) CMX= as.data.frame(CMX) ...
6. Далее для каждого инструмента ищем модуль числа корреляции. Это делается для корректной визуализации (отрицательные значения не считаются за связь).
CMX$Rts = abs(CMX$Rts)<br>...
7. Последним шагом будет отсеивание связей, которые ниже уровня корреляции, заданного нами (n). Если корреляция есть, то присваиваем значение 1, если ее нет – 0.
CMX$Rts[CMX$Rts==1 ]=0 CMX$Rts[CMX$Rts<n ]=0 CMX$Rts[CMX$Rts>n]=1 ...
Дальше остается только нарисовать графы (пакет igraph), связи выделяются автоматически. Сначала превратим наш датасет обратно в матрицу(as.matrix.data.frame), а затем получившуюся матрицу преобразуем в граф (graph.adjacency). Следующим шагом будет выделение сообществ(fastgreedy.community) и, наконец, отображение получившихся связей(plot).
Кстати, вид графика можно менять произвольно. Параметров там куча, поэтому разобравшись, можно нарисовать и красивее.
После нахождения корреляционных пар следует выяснить, реально ли значима корреляция. Для этого воспользуемся следующей командой: summary(lm(RTS~SI). Это команда выдает статистику по построенной регрессионной модели между двумя тикерами.
Здесь нас волнует только одно значение – это p -value(вероятность ошибиться в утверждении, что связь между инструментами есть). Звездочки – наглядное представление p-value. Если наше значение меньше критического (0.05), то модель рабочая и в паре инструментов наблюдается связь.
Этот метод не столько привлекателен для поиска зависимых инструментов, сколько для диверсификации портфеля роботов. Для этого просто нужно подгрузить в R эквити каждого из них и посмотреть результаты.
Возможные недостатки данного подхода заключаются в работе с Финамовскими данными. Эту проблему, вероятно, можно обойти с помощью пакетов quantmod или rusalgo.
Инструмент не такой сложный, разобраться в нем сможет любой желающий, но если будут вопросы, — обращайтесь, каждый день сижу в онлайн офисе InStrate. Там могу подсказать что-то по r, или рассказать о скрипте. Приглашение в офис тут: vk.com/instrate_team