Как всегда, все началось с идеи: а что если поискать корреляцию между индексом ММВБ и ценами акций, входящими в данный индекс, но только использовать цены следующего дня? Например, искать корреляцию между ценой закрытия индекса ММВБ на дату Х и ценой закрытия акции Газпрома на дату (X+1)? Зачем? Затем чтобы, зная цену закрытия индекса ММВБ сегодня, прогнозировать цену закрытия любой акции завтра.
Что получилось, читайте далее…
Статья не является инвестиционной рекомендацией, а скорей результатом индивидуального околоматематического исследования. Не судите строго, мне просто интересно этим заниматься, это мое хобби.
Думаю, следует кратко написать о регрессионном анализе. Википедия конечно дает ответ, но для тех, кто математику подзабыл, читается сложновато. На самом деле все проще, более того, уверен что вы используете регрессию почти ежедневно. Допустим вы любите кофе, часто его пьете и знаете сколько стоит чашечка кофе рядом с вашим домом, офисом и также местах в городе, которые вы посещали. И если вас спросят «сколько может стоить чашечка кофе в центре города?» — вы сможете спрогнозировать цену с определенной точностью. Те, кто занимаются недвижимостью — могут спрогнозировать примерную цену на недвижимость на которой специализируются. Ну и так далее. Причем, чем больше опыт — тем выше ваша точность. Во всех подобных ситуациях наше сознание выполняет функцию регрессионного анализа. Конечно, это достаточно сильное упрощение.
Свою задачу разбил на этапы:
- Получение массива цен закрытия индекса ММВБ и цен акций, входящих в индекс.
- По каждой паре «Акция, Индекс» считаем коэффициент корреляции Пирсона, индексы b0 и b1 уравнения регрессионной прямой, рисуем регрессионную прямую.
- Если коэффициент корреляции больше 0.5, т.е. если данные будут коррелировать, то я могу подставить в полученное уравнение цену закрытия индекса ММВБ на сегодня и спрогнозировать цену интересущей меня акции на завтра… Еще раз акцентирую Ваше внимание, я считаю корреляцию между значением индекса на сегодня и ценой актива(акции) на завтра.
- Вступаю в клуб анонимных финансовых гуру.
Теперь подробнее о реализации и результатах
Получение данных
Конечно можно было бы воспользоваться услугами брокера и просто выгрузить этот небольшой массив напрямую из торгового терминала (например из Quik). Однако, данные я хочу получать ежедневно и в автоматическом режиме, независимо от того, включаю я терминал или нет. Поэтому самый простой способ, это забирать данные из первоисточника, точнее напрямую с биржы ММВБ. У них есть классное API, вот описание:
https://iss.moex.com/iss/reference/
Например, для получения результатов торгов по индексу ММВБ начиная с 01.01.2021 можно воспользоваться следующим запросом:
https://iss.moex.com/iss/history/engines/stock/markets/index/boards/SNDX/securities/IMOEX.json?iss.json=extended&from=2021-01-01
Есть небольшое ограничение на количество выдаваемых сервером записей, но я это заметил только на момент получения исторических данных за период с начала года. Обошел посредством деления периода на более короткие промежутки времени. Как говорится, python в помощь.
Как реализован процесс получения и обработки итогов торгов на текущий момент:
- Каждую ночь, с помощью cron, запускается скрипт который запрашивает данные за прошедший торговый день с сервера биржи ММВБ
- Полученные данные загружаются в таблицу MySQL на сервере
- После сохранения данных запускается скрипт пересчета всех коэффициентов
В реализации использовал Flask+MySQL+Requests+Jinja. Графики вывожу с помощью Chart.js Нет, не использовал sklearn для подсчета коэффициентов регрессии, т.к. расчетов по минимуму и требования по производительности не высоки.
Расчеты
По полученным данным считал коэффициент корреляции Пирсона, далее обсчитывал коэффициенты b0 и b1 уравнения регрессионной прямой, используя метод наименьших квадратов. Что не сделано: не считал коэффициент детерминации с целью проверки гипотезы о значимости, а также не проводил расчеты полиноминальной регрессии, только линейной. «Почему так небрежно ?», спросите Вы? Отвечаю: не удовлетворен результатами расчетов, в частности большой величиной среднеквадратичного отклонения, что делает все расчеты весьма приблизительными.
Тем не менее, результаты этой неудачной, но все же работы, Вы можете увидеть вот здесь. Ресурс в публичном доступе, расчеты проводятся автоматически также каждую ночь, без моего участия.
Как это выглядит, хочу показать на примере:
где:
- красная кривая — график цен закрытия индекса ММВБ (IMOEX)
- желтая кривая — график цен закрытия актива (в данном примере «Лукойл»)
Чуть ниже приведена таблица в результатами прогнозирования, причем цветом таблицы выделяется результат прогноза:
- Серый цвет — нет вменяемой корреляции (коэффициент корреляции в диапазоне [-0.5; +0.5])
- Красный цвет, корреляция есть, прогноз на понижение
- Зеленый цвет, корреляция есть, прогноз на рост цены актива
Жмем кнопку «Далее» и видим результаты расчетов и график разброса цен индекса ММВБ к ценам закрытия (на следующий день)
Все здорово, красиво, прямо как по учебнику статистики. Уверен, если постараться, можно даже «добиться» графика нормального распределения остатков. Но, что не так? Ниже графика я привел все расчеты, смотрим на последнюю строку:
Ага, а прогноз у нас 7401.10 руб исходя из текущей цены в 7134.5руб. Простыми словами это звучит так: «прогнозирую рост на 3.7% при точности в плюс/минус 5.4%»
Вот такая вот история неудачи :)
Что еще хотелось бы добавить к описанному:
- Через свою модель считал регрессию не только по отношению к индексу ММВБ, но и к фьючерсам, в том числе и по фьючерсам на конкретный актив. Корреляции особо не увидел;
- Для себя удалось разрушить некоторые стереотипы аналитиков. В частности о обратной корреляции золота к рынку (когда рынок растет, золото падает и наоборот). Посмотрите на графики золотодобывающих компаний и поймете что это не так;
- Что касается газпрома и сбербанка — несмотря на хорошую корреляцию, расчеты не объективны, т.к. данные активы занимают существенную долю в индексе (более 30%);
- Поэтому, в своих расчетах, склонен придерживаться своей «старой позиции»: следовать за большими объемами, крупными сделками (или сериями сделок) на покупку/продажу