Анализ данных на Python — построение модели фондового рынка со Stocker

Stock market prediction python

В Data Science легко увлечься разнообразием данных и бесплатными инструментами с открытым исходным кодом. Проведя немного времени с финансовой библиотекой quandl и библиотекой прогнозирования Prophet, я решил попробовать исследовать несколько простых курсов акций. Парочка дней и 1000 строк кода Python привели меня к полноценному инструменту анализа и прогнозирования рынка. Хотя я и недостаточно смелый (или глупый!), чтобы применить его для инвестиций в настоящие акции, в процессе я узнал многое о Python, и в духе open-source хочу поделиться своими результатами и кодом с вами — может кому пригодится.

Введение

В этой статье будет показано, как использовать Stocker, инструмент для анализа и прогнозирования рынка, реализованный в виде класса Python. Название было изначально произвольным, но потом оказалось, что оно хорошо подходит для «исследователя рынка» («stock» (англ.) = «акция», прим.). Несколько раз я пытался одолеть классы, основу объектно-ориентированного программирования на Python, но, как и большинство разделов программирования, они не имели смысла, пока я только читал книги. Только когда я погрузился в реальный проект, в котором возникла проблема, которую я раньше не решал, лишний раз убедился, что практика > теория! Помимо рассмотрения Stocker, мы затронем некоторые важные темы, включая основы классов Python и аддитивных моделей. Для тех, кто хочет использовать Stocker, весь код можно найти в GitHub вместе с документацией. Программа специально  разрабатывалась так, чтобы быть простой в использовании (даже для тех, кто не знаком с Python), и я рекомендую всем читающим статью опробовать ее.

Перейдем к возможностям Stocker!

Stocker и Python

Начало работы со Stocker

После установки необходимых библиотек первое, что нужно сделать — импортировать класс Stocker в сессию Python. Сделать это можно из интерактивного режима, или же в Jupyter Notebook, запущенного в каталоге со скриптом.

from stocker import Stocker

Теперь класс Stocker есть в нашей сессии, и мы можем использовать его для создания экземпляра класса. В Python экземпляры класса называются объектами, а акт создания объекта называют конструированием. Чтобы создать объект Stocker, нам нужно передать действительный идентификатор (stock ticker), в нашем случае, 'MSFT'. Жирным шрифтом будем обозначать вывод программы.

microsoft = Stocker('MSFT')

MSFT Stocker Initialized. Data covers 1986-03-13 to 2018-01-16.

Теперь у нас есть объект microsoft со всеми свойствами класса Stocker. Stocker построен на базе данных Quandl WIKI, которая дает нам доступ к более чем 3000 наборам данных рынков США с известными ежедневными ценами в течение многих лет (полный список здесь). В этом примере мы будем использовать акции Microsoft. Хотя эту компанию рассматривают как противников open-source, недавно она стала меняться и внушать оптимизм: Microsoft начали развивать сообщество с открытым исходным кодом (включая Python).

Преимущества Python

Класс в Python состоит из двух основных частей: полей и методов. Не вдаваясь в подробности, поля (или атрибуты) — значения или данные, связанными либо с классом в целом, либо с конкретными экземплярами (объектами) класса. Методы — это функции, содержащиеся в классе, которые могут взаимодействовать с этими данными. Одно из полей объекта Stocker — это история рынка для конкретной компании, значение которого связывается с объектом при его создании. Чтобы проверить это, мы можем получить доступ к атрибуту и ​​присвоить его значение другой переменной:

# Stock - это атрибут объекта microsoft
stock_history = microsoft.stock
stock_history.head()
рынок акций
Данные по акциям Microsoft

Преимущество класса Python заключается в том, что функции и данные, на которые они действуют, связаны с одним и тем же объектом. Мы можем использовать функцию объекта Stocker для построения всей истории курса:

# у функции нужно писать скобки
microsoft.plot_stock()

Maximum Adj. Close = 89.58 on 2018-01-12.
Minimum Adj. Close = 0.06 on 1986-03-24.
Current Adj. Close = 88.35.

python analysis

По умолчанию значение, которое рисуется — это скорректированная цена закрытия, т.к. акции могут разделить («Stock split». Например, акция начнет стоит 1/2 от предыдущей цены, но и количество акций удвоится. Это делается, чтобы акции стали доступны для мелких инвесторов).

Это довольно простой график, который мы легко бы нашли самостоятельно в поиске Google, но так приятно сделать это самому несколькими строками на Python! Функция plot_stockимеет ряд необязательных аргументов. По умолчанию этот метод отображает скорректированную цену закрытия за весь доступный промежуток времени, можно задавать диапазон дат, желаемую статистику для графика и тип графика. Например, если мы хотим сравнить ежедневное изменение цены со скорректированным объемом (количеством акций), то укажите их в вызове функции.

microsoft.plot_stock(start_date = '2000-01-03',  end_date = '2018-01-16', 
                   stats = ['Daily Change', 'Adj. Volume'],  plot_type='pct')

Maximum Daily Change = 2.08 on 2008-10-13.
Minimum Daily Change = -3.34 on 2017-12-04.
Current Daily Change = -1.75.

Maximum Adj. Volume = 591052200.00 on 2006-04-28.
Minimum Adj. Volume = 7425503.00 on 2017-11-24.
Current Adj. Volume = 35945428.00.

анализ данных Python

Обратите внимание, что ось y измеряется в процентах относительно среднего значения для статистики. Эта шкала необходима, потому что ежедневный объем торговли акциями находится в диапазоне в сотнен миллионов, а ежедневное изменение цены обычно составляет несколько долларов!

Ежедневное изменение цены предсказать невозможно

Преобразовав в процентное изменение, мы можем посмотреть на оба набора данных в аналогичном масштабе. На графике показано, что нет никакой корреляции между объемом торгов и ежедневным изменением цены. Это удивительно, поскольку мы могли ожидать, что больше акций будет продаваться в дни с большими изменениями цен, поскольку люди спешат воспользоваться преимуществами колебаний. Тем не менее, единственной тенденцией, по-видимому, является то, что объем торговли с течением времени уменьшается. 4 декабря 2017 года также произошло значительное снижение цены, и мы могли бы попытаться соотнести с новостями о Microsoft. Быстрый поиск новостей за 3 декабря выдает следующее:

Надежность этих источников вызывает вопросы
Надежность этих источников вызывает вопросы

Разумеется, нет никаких признаков того, что на следующий день это приведет к крупнейшему падению акций Microsoft за 10 лет! Наоборот, у трейдера должен был возникнуть соблазн купить акции, если делать решения, основываясь только на новостях, потому что сделка с NFL (второй результат в выдаче) выглядит как положительная новость.

Построим графики на любой вкус

Используя plot_stock,  мы можем исследовать любую из величин в данных в любом диапазоне дат и искать корреляции с реальными событиями (если они есть). На данный момент мы перейдем к одной из наиболее приятных частей Stocker: прогнозирование ненастоящих сделок!

Давайте притворимся, что однажды у нас хватило ума инвестировать в 100 акций Microsoft при первоначальном публичном размещении (IPO) компании. Насколько стали бы мы богаче?

microsoft.buy_and_hold(start_date='1986-03-13',
                      end_date='2018-01-16', nshares=100)

MSFT Total buy and hold profit from 1986-03-13 to 2018-01-16 for 100 shares = $8829.11

Красивый график на Python

Использование этих результатов позволит планировать наши «перемещения» во времени назад, чтобы максимизировать прибыль.

Изменим временной промежуток и сравним полученный результат:

microsoft.buy_and_hold(start_date='1999-01-05',
                     end_date='2002-01-03', nshares=100)

MSFT Total buy and hold profit from 1999-01-05 to 2002-01-03 for 100 shares = $-56.92

Удивительно, но на фондовом рынке можно потерять деньги!

Аддитивные модели

Аддитивные модели — мощный инструмент анализа и предсказания временных рядов, одного из наиболее распространенных типов данных. Концепция проста: временные ряды представляют как комбинацию некоторых шаблонов в разных временных масштабах и общий тренд. Мы знаем, что тренд для акций Microsoft — постоянный рост, но также могут быть закономерности на ежегодной или ежедневной основе, такие как рост каждый вторник, что выгодно знать инвестору. Prophet — потрясающая библиотека разработанная Facebook, для анализа временных рядов с ежедневными наблюдениями (например, цены акций) (“prophet” (англ.) = “пророк”, прим.). Stocker делает моделирование с Prophet под капотом, остается вызвать метод для создания и проверки модели:

model, model_data = microsoft.create_prophet_model()

Моделирование цены акций на Python

Аддитивная модель сглаживает шум в данных, поэтому смоделированная линия не совпадает с наблюдениями. Модели Prophet также вычисляют неопределенность, естественную часть моделирования, поскольку никогда нельзя быть уверенным в прогнозах при работе с колебаниями реальных процессов в жизни. Prophet модель способна делать прогнозы на будущее, но пока мы больше озабочены прошлым. Обратите внимание, что этот вызов метода возвратил два объекта, модель и некоторые данные, которые мы присвоили переменным. Используем эти переменные для построения временных рядов.

# model и model_data из предыдущего вызова функций
model.plot_components(model_data)
plt.show()

зависимости найденные Stocker

Общая тенденция — рост в последние три года (первый график). Также заметна годовая зависимость (нижний график), когда цены снижаются в сентябре и октябре и достигают пика в ноябре и январе. По мере уменьшения масштаба времени данные становятся более шумными. В течение типичного месяца сигнала больше, чем шума! Если мы предполагаем существование недельной зависимости, добавим ее в модель, изменив атрибут weekly_seasonality объекта Stocker:

print(microsoft.weekly_seasonality)
microsoft.weekly_seasonality = True
print(microsoft.weekly_seasonality)

False
True

Значение по умолчанию для weekly_seasonality — False, но мы изменили значение, чтобы включить «недельную сезонность» в нашу модель. Затем сделаем еще один вызов create_prophet_model и отобразим полученные компоненты. Ниже приведена зависимость новой модели.

некрасивый график Stocker
У меня не получилось заставить график выглядеть хорошо

Мы можем игнорировать выходные дни, потому что цена меняется только в течение рабочей недели (на самом деле также незначительно меняется во время after-hours trading (OTC), но это не влияет на наш анализ). К сожалению, на недельном графике нелья выделить тенденцию, поэтому  отключим недельную сезонность. Такое поведение ожидаемо: по мере уменьшения масштаба времени шум начинает подавлять сигнал. На ежедневной основе движение акций непредсказуемо, тренды видны только за счет увеличения масштаба до годового. Надеюсь, это послужит напоминанием о том, почему не стоит играть на ежедневных колебаниях курса!

Контрольные точки

Попросту говоря, контрольные точки возникают, когда временные ряды меняют направление движения от увеличения к уменьшению или наоборот (они расположены там, где наблюдается наибольшее изменение скорости временного ряда). Эти места чрезвычайно важны, потому что продавать акции важно на пике цены, а покупать — на локальном минимуме, что максимизирует выгоду. Определение причин, по которым возникают эти точки, поможет прогнозировать будущие колебания стоимости акций. Stocker умеет автоматически находить 10 самых значимых контрольных точек.

microsoft.changepoint_date_analysis()

Changepoints sorted by slope rate of change (2nd derivative):

         Date Adj. Close     delta
48  2015-03-30   38.238066 2.580296
337 2016-05-20   48.886934 2.231580
409 2016-09-01   55.966886 -2.053965
72  2015-05-04   45.034285 -2.040387
313 2016-04-18   54.141111 -1.936257

экстремумы цены найденные с помощью Python

Контрольные точки имеют тенденцию находиться на пиках и провалах в ценах акций. «Пророк» находит точки смены только на первых 80% данных, но эти результаты все равно полезны, поскольку их можно сопоставить с событиями и новостями. Мы могли бы повторить то, что делали ранее — вручную искать новости Google, происходившие в эти даты. Но было бы предпочтительнее, если бы Stocker сделал это вместо нас. Возможно, вы знаете инструмент Google Search Trends, который показывает относительную популярность поискового запроса с течением времени в результатах поиска Google. Stocker автоматически извлекает информацию об указанном запросе, и выводит результат поверх исходных данных. Чтобы найти и рассчитать частоту поисковых запросов, модифицируем предыдущий вызов функции:

# тот же метод, но с поисковыми запросами
microsoft.changepoint_date_analysis(search = 'Microsoft profit')

Top Related Queries:

                 query value
0  microsoft non profit    100
1      microsoft office     55
2                 apple     30
3         microsoft 365     30
4  microsoft office 365     20

Rising Related Queries:

                  query value
0          microsoft 365    120
1   microsoft office 365     90
2  microsoft profit 2014     70

акции Microsoft и зависимость

Помимо графического отображения относительной частоты поиска, Stocker отображает близкие связанные и набирающие популярность для диапазона дат графика запросы. На графике ось y нормализуется между 0 и 1, деля значения по их максимумам, позволяя сравнивать две переменные с разными шкалами. Из рисунка, похоже, следует, что корреляции между поисками «прибыль Microsoft» и ценой акций Microsoft нет.

Зависимость: прямая, обратная или случайная?

Если бы мы нашли корреляцию, все равно возник вопрос о причинной связи. Мы не знали бы, влияют ли поисковые запросы или новости на изменение акций, или наоборот, изменение цены вызвало интерес. Возможно, найдется полезная информация, но есть также много случайных корреляций. (Для осознания таких случайных отношений проверьте юмористические ложные корреляции). Проверьте несколько запросов и проверьте, получается ли найти интересные зависимости.

microsoft.changepoint_date_analysis(search = 'Microsoft Office')

анализ <span trueданных Python и Stocker» width=»570″ height=»386″ data-mce-src=»https://neurohive.io/wp-content/uploads/2018/08/1_6aJKZOdBN7Fs3EYTxU3LjA-570×386.png» ><=»» p=»»>

Похоже, что уменьшение количества поисковых запросов «Microsoft Office» приводит к росту цен на акции. Кто-то должен сказать Microsoft об этом.

Предсказания цены акций на Python

Мы изучили только первую половину возможностей Stocker. Вторая половина предназначена для прогнозирования будущей цены акций. Хотя это может быть бесполезным упражнением (или, по крайней мере, не окупающимся по деньгам), здесь еще есть чему поучиться!

О предсказании — во второй части статьи. Или вы можете разобраться самостоятельно (см. подробную документацию). Для поддержания интереса оставлю вам еще одну картинку:

# specify number of days in future to make a prediction
model, future = microsoft.create_prophet_model(days=180)

Predicted Price on 2018-07-15 = $97.67

предсказание цены акций Python

Хотя все возможности Stocker уже давно общедоступны и известны, процесс создания этого инструмента для меня был приятным и, что более важно, дал мне больше знаний о Data Science, Python и фондовом рынке, чем обучающие курсы. Мы живем в невероятном мире свободных знаний, где каждый может узнать о программировании или даже о современных областях, таких как машинное обучение, без лишних формальностей. Если у вас есть идея для проекта, но вы считаете, что знаний для ее реализации недостаточно, или что она уже была реализована раньше — не позволяйте этому останавливать вас. Ваше решение может оказаться лучшим, и даже если окажется не так, вы все равно узнаете гораздо больше, чем если бы вы никогда не попробовали!

Как всегда, я приветствую конструктивную критику и обратную связь (en). Меня можно найти в Twitter на @koehrsen_will.

Оригинал


Больше статей о машинном обучении на Python:

Подписаться
Уведомить о
guest

0 Comments
Межтекстовые Отзывы
Посмотреть все комментарии

gogpt