- Получение котировок акций при помощи Python
- Yahoo Finance
- Получение минутных данных при помощи Alpha vantage
- Так как matplotlib.finance устарел, как я могу использовать новый модуль mpl_finance?
- 8 ответов
- Забираем данные по ценным бумагам с finance.yahoo.com Python класс в подарок.
- Забираем данные по ценным бумагам с finance.yahoo.com Простой способ на Python.
Получение котировок акций при помощи Python
Привет, Хабр! Представляю вашему вниманию перевод статьи «Historical Stock Price Data in Python» автора Ishan Shah.
Статья о том, как получить ежедневные исторические данные по акциям, используя yfinance, и минутные данные, используя alpha vantage.
Как вы знаете, акции относятся к очень волатильному инструменту и очень важно тщательно анализировать поведение цены, прежде чем принимать какие-либо торговые решения. Ну а сначала надо получить данные и python может помочь в этом.
Биржевые данные могут быть загружены при помощи различных пакетов. В этой статье будут рассмотрены yahoo finance и alpha vantage.
Yahoo Finance
Сначала испытаем yfianance пакет. Его можно установить при помощи команды pip install yfinance. Приведенный ниже код показывает, как получить данные для AAPL с 2016 по 2019 год и построить скорректированную цену закрытия (скорректированная цена закрытия на дивиденды и сплиты) на графике.
Ну а если необходимо получить по нескольким акциям, то необходимо внести небольшое дополнение в код. Для хранения значений используется DataFrame. При помощи пакета matplotlib и полученных данных можно построить график дневной доходности.
Для значений по российским акциям есть небольшая тонкость. К названию акцию добавляется точка и заглавными буквами ME. Спасибо знатоки на смартлабе подсказали.
Получение минутных данных при помощи Alpha vantage
К сожалению, бесплатная версия Yahoo Finance не позволяет получить данные с периодичностью меньше, чем дневная. Для этого можно использовать пакет Alpha vantage, которые позволяет получить такие интервалы, как 1 мин, 5 мин, 15 мин, 30 мин, 60 мин.
В дальнейшем эти данные можно проанализировать, создать торговую стратегию и оценить эффективность при помощи пакета pyfolio. В нем можно оценить коэффициент Шарпа, коэффициент Сортино, максимальную просадку и многие другие необходимые показатели.
Надеюсь, что мой перевод оригинальной статьи будет для Вас полезен. Код был проверен и все работает. Но пока для меня остался вопрос в возможности использования Alpha vantage для российского рынка.
Источник
Так как matplotlib.finance устарел, как я могу использовать новый модуль mpl_finance?
Я пытаюсь импортировать модуль matplotlib.finance в python, чтобы я мог сделать график OCHL Candlestick. Моя matplotlib.pyplot версия 2.00. Я попытался импортировать его с помощью следующих команд:
Я получаю эту ошибку:
warnings.warn (message, mplDeprecation, stacklevel = 1) MatplotlibDeprecationWarning: Финансовый модуль устарел в mpl 2.0 и будет удален в mpl 2.2. Пожалуйста, используйте вместо этого модуль mpl_finance.
Затем вместо использования приведенных выше строк в Python я попытался использовать следующую строку:
Я получаю эту ошибку:
ImportError: нет модуля с именем ‘mpl_finance’
Что я должен сделать, чтобы импортировать подсвечник из matplotlib.pyplot ?
8 ответов
Это предупреждение говорит вам о том, что финансовый модуль будет удален в какой-то момент.
На данный момент вам не нужно беспокоиться об этом предупреждении. Это повлияет на вас, только когда вы обновитесь до версии 2.2 matplotlib, и в этом случае вам придется изменить свой импорт.
Если вы уже хотите быть совместимыми с будущими версиями сейчас, вы можете скачать модуль mpl_finance с https://github.com/matplotlib/mpl_finance.
После загрузки файлов вы можете установить обычным способом,
В качестве альтернативы вы можете попробовать установить через pip,
Причина этого заключается в том, что люди в matplotlib хотят содержать свой код в чистоте и не поддерживать специализированный пакет, подобный этому, в основном коде. Вероятно, они также не хотят поддерживать пакет и тратить на него ресурсы, которые можно лучше использовать при разработке ядра.
Я перестал использовать mpl_finance (и плотно), так как они слишком медленные. Вместо этого я написал оптимизированную библиотеку финансовых графиков finplot, которую я использую для тестирования до 10 6 свечи.
Вот небольшой пример:
Прилагаемые примеры показывают SMA, EMA, полосы Боллинджера, накопление / распределение, Хейкин Аши по балансовому объему, RSI, TD-последовательному, MACD, индикаторам точечной диаграммы, графикам обновления в реальном времени и интерактивным измерениям; все с разумными настройками по умолчанию готовы к использованию.
Я занимаюсь кормлением собак каждый день, напишите мне записку или запрос на получение информации, если вы хотите что-то. Надеюсь, вы берете это на себя!
Поскольку mpl_finace сейчас не на пипсе, вы также можете использовать следующую команду для установки mpl_finance по pip :
pip install https://github.com/matplotlib/mpl_finance/archive/master.zip
mpl_finance больше не является частью matplotlib . Установите модуль прямо с gitHub через pip
И импортировать его с
Тогда он работает так же, как и раньше.
Plotly.py, интерактивный модуль построения графиков на основе веб-браузера, имеет функции финансового построения https://plot.ly/python/candlestick-charts/. И это поддерживается.
Просто используйте pip install mpl_finance для Windows или pip3 install mpl_finance для Linux / Unix для установки.
Затем используйте from mpl_finance import candlestick_ohlc для вызова библиотеки в блокноте Jupyter!
Я работаю над Google Colab, у меня та же проблема. тогда что я сделал — для python3.6
from mpl_finance import candlestick_ohlc
В 2020 году теперь можно pip install mplfinance
Источник
Забираем данные по ценным бумагам с finance.yahoo.com Python класс в подарок.
Забираем данные по ценным бумагам с finance.yahoo.com
Простой способ на Python.
Продолжаю рассматривать способы получения данных по бумагам в свой скрипт. Из предыдущего поста где я рассказывал как можно просто буквально распарсить поисковую выдачу в гугле и вытащить текущие показатели цены я узнал по комментариям уважаемых резидентов смартлаба, что этот способ не будет хорошим решением, в силу особенности использования html тэгов и атрибутов таких как id класса. В конечном итогеid поменяется и скрипт работать не будет. Лучше посмотреть в сторону чего то более долгоиграющего.
На этот раз я хочу сделать свой скрипт более универсальным. Он должен забирать данные по скормленному ему списку или словарю вот такого вида:
и в результате своей работы скрипт должен выдавать значения, например: цена, процент изменения и объем.
Для красоты и отладки можно также вывести это всё в красивую табличку.
Я решил создать класс Ticker отдельно и использовать его в разных скриптах, когда мне это потребуется.
Через этот класс мы реализуем создание всех отдельно запрашиваемых тикеров.
Скрипт будет состоять из двух частей. yahooparser.py который содержит в себе класс, и main.py, в котором я просто продемонстрирую что можно с этим классом делать.
Данный пример, о котором дальше пойдет речь, в исходниках можно забрать ТУТ
Воспользуемся ресурсом finance.yahoo.com и будем получать интересующие нас данные в формате JSON. для удобства работы с JSON информацией сразу рекомендую установить расширение для браузера JSON-handle. Это облегчит вам жизнь в поиске нужной информации.
Если установлен плагин, в браузере мы получим вот такой красивый отформатированный древовидный JSON.
Тут мы видим в теле запроса тикер GAZP.ME, который мы в дальнейшем можем заменить в новом запросе на любой другой и получить точно такую же информацию по данному инструменту. При этом структура запроса остается неизменной. Это как раз то, что нам нужно.
Просто меняем GAZP.ME на SBER.ME и получаем всю информацию по Сбербанку.
Теперь подумаем, как это можно отсюда забрать.
Я буду использовать способ из предыдущего примера и воспользуюсь библиотекой requests для формирования URL запроса.
Если она еще не установлена, в консоли пишем pip install requests и устанавливаем.
Также сразу можно установить библиотеку dpath, которая поможет нам работать с полученным JSON, а точнее мы будем использовать её для того чтобы более удобно передвигаться внутри словарей и доставать нужные строчки без особых усилий. Аналогичным образом устанавливаем через pip
Теперь переходим к коду.
Создадим отдельный файл, в моем примере это yahooparser.py подключаем нужные библиотеки вначале
Создаем класс Ticker и внутри него сразу опишем переменные для URL запроса
В отличии от моего предыдущего парсера теперь мы устанавливаем сессию через requests.session(), иначе ничего работать не будет. Также в запрос мы добавим заголовки. Сохраним их предварительно в переменную headers. Ссылку с запросом мы пока объявлять не будем, а добавим её в метод, который опишем чуть позже.
Посмотрим в полученный выше JSON в браузере и определим какие нам нужно вытащить ключи.
Я возьму оттуда
regularMarketPrice — текущая цена,
regularMarketChange — значениеизменения цены,
regularMarketChangePercent — значение изменения цены, выраженное в процентах
regularMarketVolume — текущие объемы
нам нужны ключи raw, точнее значения по ним, каждого из этих элементов, именно для быстрого доступа к ним, мы будем использовать dpath в дальнейшем
Следующим шагом объявим словарь (все также внутри класса), который будет содержать в себе те поля, которые мы будем вытаскивать из полученного JSON.
Этот список вы можете редактировать на свое усмотрение и вытаскивать именно то, что нужно по вашим задачам.
С полями определились, теперь приступим к описанию конструктора. Создадим эквивалентные поля, тем, которые мы собираемся получать в каждый экземпляр класса.
Также я описал переменную self.name значение которой экземпляр получит при его объявлении.
Например gazp = Ticker(‘GAZP.ME’) создаст экземпляр класса gazp с полем name, значение этого поля будет GAZP.ME и его мы будем передавать в URL запрос, добавляя его в ссылку запроса.
Следующим шагом опишем метод __get_update(self) который будет обслуживать URL запросы, получать JSON, обрабатывать его, и возвращать все искомые значения по итогу своей работы. Здесь разместим ссылку для URL запроса.
Переменнаяlink содержит ссылку запроса:
query2.finance.yahoo.com/v10/finance/quoteSummary/
Всё готово для того, чтобы отправить URL запрос. используем session.get() передаем ей ссылку и заголовки.
Ответ запишем в response
response теперь содержит в себе полученный массив данных. Для того чтобы с этим можно было работать запишем его в виде словаря
Данные получены, осталось только вытащить те поля, которые нам нужны. Объявим список return_value для наполнения его искомыми значениями.
В цикле for мы прогоним словарьself.value объявленный вначале класса, содержащий в себе те поля, которые мы будем искать в JSON.
Для каждого ключа из этого словаря мы будем добавлять в список return_value значение, полученное в ходе работы функции values из dpath.util импорт которой мы определили в самом начале какpath_val. Функция принимает наш массив данных, который сейчас лежит вarray и возвращает нам каждый проходself.valueFinance python не работает, то есть значение из словаря по индексу ключа. Это значение содержит искомое поле
например, цикл доходит до и возвращает значение regularMarketChangePercent по индексу percent, оно подставляется в дерево запроса списка. И далее нам нужно получить первый элемент c индексом [0].
Полученную строку конвертируем какfloat.
Возвращаем список return_value в конце работы метода __get_update(self)
Выглядит это менее страшно, чем я объяснил.
Создадим еще один метод update(self), который мы будем использовать для вызова __get_update(self)
Его задача просто быть вызванным через экземпляр класса и присвоить полям обновленные значения.
например, gazp.update() обновит все значения в этом объекте. И можно просто обратиться например к цене print(gazp.price) которая покажет нам обновленное значение. Аналогичным образом можно получить значения других полей.
Значения обновляются через присвоение вызова __get_update(self) для полей класса. Так как в ходе работы возвращается список, то присваиваем переменным новые значения просто указывая их через запятую.
Вот и всё! наш класс готов и его можно использовать в разных ситуациях. Сохраним его отдельным файлом. В моем случае yahooparser.py.
Для демонстрации работы класса давайте набросаем небольшой скрипт, для отображения информации по списку бумаг.
Создаем новый документ main.py
Для этого примера я использовал словарь с тикерами по которым собираюсь получить информацию.
Для наглядности представления вывода информации можно установить очень маленькую и очень простую но удобную библиотеку prettytable
Устанавливаем ее черезpip install prettytable
Импортируем всё что нам нужно
в первую очередь нам нужен наш созданный класс Ticker.
И prettytable
Создадим словарь с тикерами которые будем скармливать в класс для создания экземпляров.
Создадим функцию, которая будет получать этот словарь в аргументе и через for создаст нам все объекты.
Первый for создает новый экземпляр класса с именем индекса словаряticker_list и передает ему в качестве аргумента значение словаря по индексу соответственно
например, при проходе for создаетсяgazp = Ticker(‘GAZP.ME’) и так далее по словарю
Второй for обращается к методу update для каждого вновь созданного объекта
например, при проходе for вызывается gazp.update() а что случается при этом вызове мы уже знаем 😁
Таким образом получаем актуальную информацию по всем тикерам.
В конце работы функция возвращает список с объектами
теперь вызовем эту функцию и поместим результат её работы в переменную tickers в которую и вернется список с созданными объектами.
Далее эти объекты и данные из них, вы можете использовать как вашей душе угодно. Полет фантазии не ограничен.
Я приведу простой пример и просто распечатаю табличку с полученной информацией.
Создадим функцию show_table(tickers) и в цикле for переберем полученный нами список из переменной tickers, которую нужно передать в аргументе при вызове.
При каждом проходеfor вытаскиваем значения полей из объектов и присваиваем в переменные.
(можно конечно этого и не делать и использовать обращения к полям, но это так, просто для примера).
Все результаты помещаем в список show_list элементами которого будут словари с элементом по индексуname и значением, состоящим из списка элементовprice,change,percent, volume
Значения переменных можно округлить до сотых для удобства представления данных. Также значение percent умножается на 100 чтобы отобразить значение в процентах
Данные отформатированы как нам нужно и теперь их можно распечатать
Для этого воспользуемся нашей prettytable создаем новую таблицу myTable и объявляем для нее заголовки столбцов
Теперь просто через for перебираем наш список show_list, который мы сформировали парой строк выше и добавляем строки через myTable.add_row, в аргументах указывая список и его элементы.
Напечатаем нашу таблицу в конце
Теперь чтобы всё заработало вызываем эту функцию
Кто дочитал — молодец! 😁Ниже полный код класса и полный код main:
Источник