image

Как всегда, все началось с идеи: а что если поискать корреляцию между индексом ММВБ и ценами акций, входящими в данный индекс, но только использовать цены следующего дня? Например, искать корреляцию между ценой закрытия индекса ММВБ на дату Х и ценой закрытия акции Газпрома на дату (X+1)? Зачем? Затем чтобы, зная цену закрытия индекса ММВБ сегодня, прогнозировать цену закрытия любой акции завтра.

Что получилось, читайте далее…

Статья не является инвестиционной рекомендацией, а скорей результатом индивидуального околоматематического исследования. Не судите строго, мне просто интересно этим заниматься, это мое хобби.

Думаю, следует кратко написать о регрессионном анализе. Википедия конечно дает ответ, но для тех, кто математику подзабыл, читается сложновато. На самом деле все проще, более того, уверен что вы используете регрессию почти ежедневно. Допустим вы любите кофе, часто его пьете и знаете сколько стоит чашечка кофе рядом с вашим домом, офисом и также местах в городе, которые вы посещали. И если вас спросят «сколько может стоить чашечка кофе в центре города?» — вы сможете спрогнозировать цену с определенной точностью. Те, кто занимаются недвижимостью — могут спрогнозировать примерную цену на недвижимость на которой специализируются. Ну и так далее. Причем, чем больше опыт — тем выше ваша точность. Во всех подобных ситуациях наше сознание выполняет функцию регрессионного анализа. Конечно, это достаточно сильное упрощение.

Свою задачу разбил на этапы:

  1. Получение массива цен закрытия индекса ММВБ и цен акций, входящих в индекс.
  2. По каждой паре «Акция, Индекс» считаем коэффициент корреляции Пирсона, индексы b0 и b1 уравнения регрессионной прямой, рисуем регрессионную прямую.
  3. Если коэффициент корреляции больше 0.5, т.е. если данные будут коррелировать, то я могу подставить в полученное уравнение цену закрытия индекса ММВБ на сегодня и спрогнозировать цену интересущей меня акции на завтра… Еще раз акцентирую Ваше внимание, я считаю корреляцию между значением индекса на сегодня и ценой актива(акции) на завтра.
  4. Вступаю в клуб анонимных финансовых гуру.

Теперь подробнее о реализации и результатах


Получение данных

Конечно можно было бы воспользоваться услугами брокера и просто выгрузить этот небольшой массив напрямую из торгового терминала (например из 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 в помощь.

Как реализован процесс получения и обработки итогов торгов на текущий момент:

  1. Каждую ночь, с помощью cron, запускается скрипт который запрашивает данные за прошедший торговый день с сервера биржи ММВБ
  2. Полученные данные загружаются в таблицу MySQL на сервере
  3. После сохранения данных запускается скрипт пересчета всех коэффициентов

В реализации использовал Flask+MySQL+Requests+Jinja. Графики вывожу с помощью Chart.js Нет, не использовал sklearn для подсчета коэффициентов регрессии, т.к. расчетов по минимуму и требования по производительности не высоки.

Расчеты


По полученным данным считал коэффициент корреляции Пирсона, далее обсчитывал коэффициенты b0 и b1 уравнения регрессионной прямой, используя метод наименьших квадратов. Что не сделано: не считал коэффициент детерминации с целью проверки гипотезы о значимости, а также не проводил расчеты полиноминальной регрессии, только линейной. «Почему так небрежно ?», спросите Вы? Отвечаю: не удовлетворен результатами расчетов, в частности большой величиной среднеквадратичного отклонения, что делает все расчеты весьма приблизительными.

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

Как это выглядит, хочу показать на примере:

image

где:

  • красная кривая — график цен закрытия индекса ММВБ (IMOEX)
  • желтая кривая — график цен закрытия актива (в данном примере «Лукойл»)

Чуть ниже приведена таблица в результатами прогнозирования, причем цветом таблицы выделяется результат прогноза:

  1. Серый цвет — нет вменяемой корреляции (коэффициент корреляции в диапазоне [-0.5; +0.5])
  2. Красный цвет, корреляция есть, прогноз на понижение
  3. Зеленый цвет, корреляция есть, прогноз на рост цены актива

Жмем кнопку «Далее» и видим результаты расчетов и график разброса цен индекса ММВБ к ценам закрытия (на следующий день)

image

Все здорово, красиво, прямо как по учебнику статистики. Уверен, если постараться, можно даже «добиться» графика нормального распределения остатков. Но, что не так? Ниже графика я привел все расчеты, смотрим на последнюю строку:

image

Ага, а прогноз у нас 7401.10 руб исходя из текущей цены в 7134.5руб. Простыми словами это звучит так: «прогнозирую рост на 3.7% при точности в плюс/минус 5.4%»

image

Вот такая вот история неудачи :)

Что еще хотелось бы добавить к описанному:

  1. Через свою модель считал регрессию не только по отношению к индексу ММВБ, но и к фьючерсам, в том числе и по фьючерсам на конкретный актив. Корреляции особо не увидел;
  2. Для себя удалось разрушить некоторые стереотипы аналитиков. В частности о обратной корреляции золота к рынку (когда рынок растет, золото падает и наоборот). Посмотрите на графики золотодобывающих компаний и поймете что это не так;
  3. Что касается газпрома и сбербанка — несмотря на хорошую корреляцию, расчеты не объективны, т.к. данные активы занимают существенную долю в индексе (более 30%);
  4. Поэтому, в своих расчетах, склонен придерживаться своей «старой позиции»: следовать за большими объемами, крупными сделками (или сериями сделок) на покупку/продажу

Комментарии (5)


  1. MilashchenkoEA
    06.10.2021 10:22
    +1

    Отрицательный результат - тоже результат :) Старания достойны похвалы :)


  1. x67
    06.10.2021 13:32
    +1

    Доверительный интервал в случае нормального распределения принято считать по 2-3-более СКО, так вероятность попасть в этот интервал будет адекватной, таким образом ДИ у вас +-16.2%.

    Также стоит заметить, что распределение навряд ли будет нормальным, поэтому и использовать статистики вроде СКО тут вообще неправильно

    А результат вполне предсказуем, цена акции не может быть связана с одним лишь индексом, тут есть много факторов разной степени значимости. Но эта тема уже уходит за пределы сферы применимости коэффициента корреляции Пирсона


  1. anonymous
    00.00.0000 00:00


    1. rPman
      06.10.2021 20:18

      Объемы да! еще информацию по спреду (для простоты хотя бы min/max взять за период)

      А еще можно убрать индекс и попробовать найти взаимокореляции между валютными парами, виртуальными валютными парами кросскурсов, брать от курсов какие-нибудь популярные среди трейдеров-аналитиков индикаторы (Moving Average, RSI, MACD, Bollinger Bands, Fibonacci,..) сами они возможно не могут давать полезное предсказание но так как их учитывают большинство, влияние на рынок эти индексы имеют, но главное, большинство из них уже нормированы (дают значение на интервале) что благоприятно действует на большинство алгоритмов, используемых для прогнозирования, например нейронные сети


  1. robomakerr
    12.10.2021 21:36

    корреляцию между ценой закрытия индекса ММВБ и ценой закрытия акции Газпрома


    «Приращений цен», вы наверное хотели сказать?