рекомендации

четверг, 16 января 2020 г.

Анализ котировок акций в Python

Перевод. Оригинал: Stock Analysis in Python

Легко увлечься богатством данных и бесплатными инструментами с открытым исходным кодом, доступными для data science. Потратив немного времени с финансовой библиотекой quandl и библиотекой моделирования prophet, я решил попробовать простое исследование биржевых данных. Через несколько дней и 1000 строк Python я получил полный инструмент анализа и прогнозирования курсов. Хотя я не достаточно уверен (или глуп), чтобы использовать его для инвестирования, я изучил много тонкостей Python в процессе, и в духе открытого исходного кода, хочу поделиться своими результатами и кодом, чтобы другие могли извлечь из него выгоду.


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




Основы Stocker

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

from stocker import Stocker

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

  • microsoft = Stocker('MSFT')

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

Теперь у нас есть микрообъект со всеми свойствами класса Stocker. Stocker построен на основе базы данных quandl WIKI, которая дает нам доступ к более чем 3000 американских акций с ежедневными ценовыми данными (полный список). Для этого примера мы будем исследовать Microsoft, хотя Microsoft можно рассматривать как противоположность open-source.

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

  • stock_history = microsoft.stock
  • stock_history.head()


Преимущество класса 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.




Значением по умолчанию является скорректированная цена закрытия, которая учитывает разделение акций (когда одна акция делится на несколько акций, скажем, 2, при этом каждая новая акция стоит 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.


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



Не уверен насчет достоверности этих источников Google

Похоже, что нет никаких признаков того, что акции 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

Общая прибыль от покупки и удержания MSFT с 1986-03-13 по 2018-01-16 для 100 акций = $ 8829,11




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

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

  • 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

Общая прибыль от покупки и удержания MSFT с 1999-01-05 по 2002-01-03 для 100 акций = $ -56,92

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

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

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

model, model_data = microsoft.create_prophet_model()



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

  • # model и model_data из предыдущего вызова метода
  • model.plot_components(model_data)
  • plt.show()


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

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

False
True

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



Я не смог заставить этот график выглядеть хорошо.

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

Точки смены тренда

Точки смены тренда обозначают интервалы, когда временной ряд переходит от роста к падению или наоборот (в более строгом смысле они расположены там, где изменение скорости временного ряда является наибольшим). Эти времена чрезвычайно важны, потому что знание, когда акция достигнет пика или вот-вот начнет расти, может принести значительные экономические выгоды. Определение причин появления точек изменения может позволить нам предсказать будущие колебания стоимости акций. Объект 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


Точки изменения, как правило, совпадают с пиками и спадами в цене акций. Prophet находит точки изменения только в первых 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


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

Если бы мы нашли корреляцию, остался бы вопрос о причинно-следственной связи. Мы не будем знать, вызвали ли поиски или новости изменение цены, или изменение цены вызвало поиски. Там может быть некоторая полезная информация, но есть также много случайных корреляций. Не стесняйтесь опробовать несколько разных поисковых запросов, чтобы узнать, сможете ли вы найти какие-нибудь интересные тенденции!

microsoft.changepoint_date_analysis(search = 'Microsoft Office')


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

Прогнозы

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

  • # указываем количество дней в будущем, чтобы сделать прогноз
  • model, future = microsoft.create_prophet_model(days=180)

Predicted Price on 2018-07-15 = $97.67


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

Комментариев нет:

Отправить комментарий