Transcription
Всем привет!
Надеюсь, благодаря предыдущим урокам вы научились запрашивать у бирж исторические котировки и создавать из них датафреймы. Теперь настало время научиться визуализировать эти данные. В связи с этим в уроке будет рассмотрено два пакета Python для визуализации данных.
Пожалуй, самым популярным инструментом в Python для визуализации данных является пакет matplotlib. Устанавливается он командой pip install matplotlib. Посмотрим базовые возможности данного пакета. Для этого достаточно импортировать модуль pyplot.
Главным объектом при работе с matplotlib является рисунок. Один из способов создания рисунка заключается в вызове функции figure из модуля pyplot. Для отображения созданных рисунков используется функция show. В данном случае, вызвав эту функцию, получим один пустой рисунок.
Следует заметить, что после закрытия рисунка повторный вызов функции show не отобразит тот же рисунок. То есть закрытые рисунки функция show не отображает. Поэтому для дальнейшей работы создадим ещё один рисунок. Чтобы отобразить некоторый геометрический объект, в рисунок необходимо добавить область рисования. Это можно сделать путём вызова из рисунка метода add_subplot.
Снова вызовем функцию show. Теперь, как видите, рисунок содержит область рисования: белую прямоугольную зону. Также вместе с областью рисования в рисунок добавились оси и деления. Всё это является контейнерами, в которые, за исключением рисунка, можно добавлять графические примитивы: точки, линии, тексты, изображения и т.д.
В качестве примера добавим в область рисования прямую линию. Координаты точек зададим следующими последовательностями. Быстро создать новый рисунок и область рисования позволяет функция subplots. Теперь вызовем из области рисования метод plot и передадим ему координаты точек. Благодаря этому в область рисования добавилась прямая линия.
Посмотрим пример создания более сложного рисунка. Здесь создаётся рисунок с тремя диаграммами. Для создания нескольких областей рисования функции subplots следует передать число строк и столбцов рисунка, в которых расположатся области рисования. В этом случае функция вернёт массив из областей рисования, а их количество будет равно произведению числа строк и столбцов.
Чтобы диаграммы не смотрелись слишком сжато, размеры рисунка увеличиваются методом set_size_inches. Следующими командами в области рисования добавляются геометрические объекты: функция plot добавляет линию, функция scatter добавляет точки, а функция bar добавляет бары. Кроме того, методом set_title добавляются названия диаграмм. В результате получаем следующий рисунок, содержащий сразу три диаграммы.
Вкратце, вот таким образом с помощью пакета matplotlib реализуется визуализация данных. Пакет matplotlib позволяет создавать любые диаграммы. Одно такие большие возможности обусловливают низкоуровневый интерфейс данного пакета. Например, чтобы превратить датафрейм с ценами в свечной график, придётся потрудиться и написать не одну строку кода.
В связи с этим в дополнение к пакету matplotlib рекомендую использовать пакет mplfinance. Устанавливается он командой pip install mplfinance. Данный пакет использует в своей работе matplotlib и, по сути, упрощает некоторый его функционал. Чтобы превратить датафрейм с историческими котировками в ценовой график и сразу отобразить рисунок, достаточно воспользоваться функцией plot.
Если передать функции только датафрейм, тогда отобразится барный ценовой график. При этом тип ценового графика легко изменить. Для этого функции plot следует передать именованный аргумент type с названием типа ценового графика. Так можно построить линейный график, нестандартный график, например, «Ренко», или наиболее популярный свечной график.
Также функция plot позволяет отобразить диаграмму торговых объёмов. Эта диаграмма добавляется в рисунок путём передачи функции plot именованного аргумента volume со значением True. При этом, конечно, передаваемый функции датафрейм должен иметь столбец volume.
Помимо этого, с помощью именованного аргумента mav в график можно добавить одно или несколько скользящих средних. Значением аргумента должен быть период одного скользящего среднего или список из периодов нескольких скользящих средних. Вычисляются эти функции по ценам закрытия.
Самая интересная часть работы с mplfinance заключается в настройке внешнего вида диаграмм. В первую очередь посмотрим, как настраивается стиль диаграмм. Для установки стиля функции plot необходимо передать аргумент style. Стиль может быть встроенный и пользовательский.
Для установки встроенного стиля значением аргумента style должна быть некоторая строка. Список допустимых строк возвращает функция available_styles. Например, передав функции plot строку 'binance', получим диаграммы в стиле биржи Binance. Также значением аргумента style может быть словарь с пользовательскими настройками.
Для создания такого словаря рекомендуется использовать функцию make_mpf_style. Функция принимает ряд именованных аргументов. Аргументом marketcolors устанавливается цвет геометрических объектов. Значением этого аргумента должен быть словарь, который рекомендуется создавать функцией make_marketcolors.
Поскольку в этом примере отображается свечной график, можно сказать, что аргументом up функции передаётся цвет тела растущей свечи, аргументом down — цвет тела падающей свечи, а последним аргументом включается наследование указанных цветов остальными элементами свечей и барами объёма.
Следующими аргументами функции make_mpf_style передаётся цвет областей рисования, осей, рисунка и сеток. Вместе с этим функции передаётся стиль линий сеток и расположение вертикальных осей. Создав такой стиль и передав его функции plot, получим рисунок с диаграммами в стиле сайта TradingView.
Теперь обратите внимание на расположение диаграмм по отношению к границам рисунка. Смотрится довольно неаккуратно. Эту проблему позволяет решить аргумент scale_padding. Значением аргумента должен быть словарь с одним или несколькими ключами, указанными в этом примере.
Числа, которые являются значениями ключей, устанавливают отступы между границами диаграмм и рисунка. Число меньше 1 означает уменьшение базового отступа, а число больше 1 — увеличение отступа. Указав отступы с помощью аргумента scale_padding, получим более аккуратный рисунок.
Кроме того, функция plot позволяет настроить размеры рисунка. Для этого функция принимает аргументы figscale и figratio. Аргументом figscale указывается масштаб рисунка: отклонение числа в большую или меньшую сторону от 1 означает соответственно увеличение или уменьшение масштаба.
Второй аргумент figratio позволяет настроить соотношение сторон рисунка. Значением аргумента должен быть список или кортеж из двух элементов, где первый элемент отвечает за размер по горизонтали, а второй элемент — за размер по вертикали. Передав функции plot аргументы figscale и figratio, получим рисунок большего размера и с другим соотношением сторон.
При этом размеры диаграмм изменятся пропорционально размерам рисунка. Также функция plot позволяет настраивать текст диаграмм. В этом примере для настройки текста функции передаётся три аргумента: fontscale, axtitle и ylabel.
Первый аргумент fontscale изменяет размер шрифта всего текста диаграмм. Поскольку значение аргумента больше 1, получим диаграммы с более крупным текстом. Второй аргумент axtitle добавляет название основной диаграммы, то есть ценового графика. И третий аргумент ylabel устанавливает название вертикальной оси основной диаграммы.
По умолчанию ось называется price. Но поскольку в этом примере значением аргумента является пустая строка, то название оси будет просто удалено. Теперь посмотрим, как в диаграммы добавляются индикаторы. Для добавления в диаграмму индикатора или индикаторов функции plot необходимо передать аргумент addplot.
Значением этого аргумента должен быть словарь, который рекомендуется создавать функцией make_addplot. В этом примере функции первым аргументом передаётся серия из максимальных значений цен закрытия. Функция highest, вычисляющая эту серию, определена в модуле pandas_ta, который был показан в конце первого урока данного курса.
Помимо серии функции make_addplot передаётся цвет и толщина будущего индикатора. Теперь если вызвать функцию plot с аргументом addplot, получим ценовой график с линейным индикатором. Также с помощью функции make_addplot в диаграммы можно добавлять точечные индикаторы.
В следующем примере функции передаётся серия из цен нижних точек разворота. Далее функции передаётся аргумент type со значением 'scatter', что означает точечный индикатор. Помимо этого функции передаётся форма маркеров индикатора, их размер и цвет. Форму маркеров можно взять из модуля markers пакета matplotlib.
Передав функции plot аргумент addplot, на этот раз, получим график с точечным индикатором, каждый маркер которого указывает на цену нижней точки разворота. При необходимости добавить в диаграмму сразу несколько индикаторов, словари, которые возвращает функция make_addplot, можно заключить в список, а затем передать его функции plot.
Такой подход также позволяет добавлять индикаторы в разные диаграммы. Номера диаграмм указываются аргументом panel. Основная диаграмма имеет номер 0. Следовательно, в этом примере скользящее среднее цен закрытия добавляется в ценовой график, а скользящее среднее объемов добавляется в диаграмму объёмов.
Кроме того, функции make_addplot вместо серии можно передать датафрейм. В результате функция вернёт словарь, с помощью которого в диаграмму можно добавить несколько индикаторов одного типа. Например, линейные индикаторы.
Ещё одной важной для рассмотрения темой является анимация диаграмм. Анимированная диаграмма — это диаграмма, обновляющаяся в реальном времени. Посмотрим, как реализована анимация в этом примере. В первую очередь следует обратить внимание на создание экземпляра класса BinanceAPI.
Данный класс для удобства определён в модуле. При создании экземпляра класса происходит подключение к бирже Binance, запрос у неё исторических котировок и преобразование их в датафрейм. Далее в скрипте вызывается функция make_addplot, которая создаёт словарь для добавления в ценовой график экспоненциального скользящего среднего.
Следом вызывается функция plot. При этом ей передаётся аргумент returnfig со значением True. Данный аргумент нужен, чтобы функция вернула сразу две ссылки: на рисунок и на список с областями рисования. Стоит заметить, что такой вызов функции не запустит отображение рисунка.
Следующий шаг заключается в создании экземпляра класса FuncAnimation, определение которого находится в модуле animation пакета matplotlib. С помощью этого класса можно создать объект, который будет периодически вызывать некоторую функцию. Например, update_chart. Поскольку эта функция содержит инструкции для обновления графика, то периодический её вызов создаст анимацию.
Классу FuncAnimation следует передать ссылку на рисунок, ссылку на функцию, которая будет периодически вызываться, а также задержку в миллисекундах между вызовами функции. Важно заметить, что вызываемая функция должна иметь минимум один параметр. Этого требует класс FuncAnimation.
После создания экземпляра класса вызывается функция show для отображения рисунка. Вызов этой функции не завершится, пока рисунок открыт. Однако это не помешает работе экземпляра класса FuncAnimation, который каждую секунду будет вызывать функцию update_chart.
Посмотрим, что происходит в теле вызываемой функции. Здесь в первую очередь из экземпляра класса BinanceAPI вызывается метод update_data. Данный метод запрашивает у Binance последние котировки и создаёт датафрейм из котировок последнего закрытого торгового периода.
Далее метод сравнивает метку этого торгового периода с меткой последней строки датафрейма. Если они отличаются, датафрейм пополняется новыми котировками, а метод возвращает значение True. В таком случае выполняется инструкция if функции update_chart.
В блоке if первым делом очищается область рисования. Нужная для обновления область является первым элементом списка, который вернула функция plot. Далее вызывается функция make_addplot для создания словаря с новыми значениями скользящего среднего. При этом функции передаётся область рисования, которая должна обновиться.
Также хочу обратить ваше внимание на метод tail, за счёт которого функции make_addplot передаётся фиксированное количество элементов серии, а функции plot — фиксированное количество строк датафрейма. Благодаря такому приёму график всегда будет содержать фиксированное количество свечей и значений индикатора. Без использования метода tail их количество на графике будет постоянно увеличиваться.
По моему мнению, такая анимация смотрелась бы хуже. Последний шаг в обновлении графика заключается в вызове функции plot. Обратите внимание, что функции plot, как и функции make_addplot, передаётся обновляемая область рисования.
В заключение урока посмотрим, где искать дополнительную информацию о пакетах mplfinance и matplotlib. Довольно полезную информацию о пакете mplfinance можно получить с помощью функции kwarg_help. В качестве аргумента ей передаётся имя некоторой функции mplfinance.
В ответ она возвращает описание именованных аргументов, которые принимает указанная функция. Рекомендую воспользоваться функцией kwarg_help и разобрать несколько функций из этого примера. Также обязательно посетите сайт github, на котором размещена вся информация о пакете mplfinance.
Особое внимание уделите следующим обучающим статьям. Если же у вас появятся вопросы, связанные с использованием пакета matplotlib, то рекомендую искать ответы на официальном сайте данного пакета. Здесь вы найдёте как справочную информацию о пакете, так и множество обучающих статей.
Ссылки на оба ресурса найдёте в описании данного урока. На этом закончим урок. Свои вопросы оставляйте в комментариях. Всем пока!