Продвинутая аналитика на SQL
Теория: Агрегация для candlestick-диаграмм
В этом уроке мы рассмотрим свечной график или Candlestick chart. Он широко используется для изображения котировок валют. Сегодня мы агрегируем данные валютной пары за 19 лет и построим график в Google Sheets.
Знания и навыки об агрегации данных для свечного графика позволят работать аналитиком в финансовой сфере.
Candlestick chart
Представим, что у нас есть котировки валюты австралийского доллара относительно американского доллара. Мы хотим узнать, как они меняются со временем. Мы уже умеем строить линейный график, поэтому сначала изобразим его:
На этом рисунке мы видим линейный график котировок валют австралийского доллара относительно американского доллара.
Но такой график для отображения котировок неудобен и неинформативен. Мы видим только изменение текущей цены со временем. Торги на рынке происходят в каком-то окне: есть цена открытия и цена закрытия. Цена открытия — это цена, с которой начинаются торги, а по цене закрытия они заканчиваются. Поэтому таблицы с котировками обычно выглядят более сложно:
currency_exchange
В этой таблице представлены котировки валюты с шагом в один месяц. Она содержит такие столбцы:
date— датаlow— минимальное значение цены за этот месяцopen— цена открытия. Это первая цена за месяцhigh— максимальная цена за месяцclose— цена закрытия. Это последняя цена за месяц
Из этой таблицы мы понимаем, как торги начинались и заканчивались. Также знаем минимальное и максимальное значение котировок. Для визуального представления таких таблиц используют свечной график или Candlestick chart. Он удобнее линейного графика, потому что позволяет визуализировать все параметры: цену открытия, закрытия, минимальную и максимальную цены.
Посмотрим, из чего он состоит, и где на нем находятся данные из таблицы:
На свечном графике каждый промежуток времени мы изображаем в виде «свечи». У свечи есть тело и фитиль. Нижний и верхний фитили на картинке обозначены как Lower Wick и Upper Wick. Тело свечи отмечено как Real Body. Open и Close — это цены открытия и закрытия.
Тело — это прямоугольник, у которого одна из границ — цена открытия, а вторая — закрытия. Цена открытия бывает меньше или больше цены закрытия — это зависит от трендов на рынке.
Фитиль рисуется узкой вертикальной линией. Верхняя граница фитиля — это максимальная цена за период торгов, а нижняя — минимальная. Если фитиль длинный, а тело нет — это говорит о том, что рынок очень волатильный, то есть быстро меняется.
По таблице CurrencyExchange мы можем построить свечной график котировок. Он будет выглядеть так:
Здесь мы видим свечной график котировок валют. Он содержит в себе не информацию о текущей стоимости валюты, а цену открытия, закрытия, минимальную и максимальную во временном окне, когда идут торги.
Чтобы получить из таблицы, в которой есть только текущая стоимость, таблицу с ценами открытия, закрытия, минимальной и максимальной, мы агрегируем данные. По агрегированной таблице мы уже построим свечной график.
Агрегация курсов валют
Мы будем агрегировать таблицу курса валют помесячно. Для агрегации мы проделаем такие шаги:
- Создадим вспомогательную таблицу с первыми и последними значениями цены за месяц
- Создадим вспомогательную таблицу для цен открытия и закрытия
- Создадим вспомогательные таблицы для минимальных и максимальных значений за месяц
- Объединим эти таблицы с помощью SQL-функции
joinи проведем итоговую агрегацию
Первые и последние значения цены за месяц
Откроем базу australian_currency.
В базе данных есть таблица exchange с двумя полями:
- date — дата, в которую валюта имела определенную стоимость
- currency — значение котировки валюты
Посмотрим на саму таблицу:
Currency
В этой таблице 5019 строк. Мы видим, что в таблице есть данные за 2000-2019 года.
Нам нужно создать новую таблицу с минимумом, максимумом, первой ценой и последней ценой за определенный период времени. Мы будем агрегировать данные помесячно.
Чтобы получить первую и последнюю цены за месяц, мы создадим вспомогательную таблицу monthly_dates. В нее мы агрегируем первую и последнюю дату за месяц, само значение месяца и уникальный ключ, по которому мы будем джойнить таблицы:
Мы создали таблицу с полями:
- year_month — уникальный строковый ключ с годом и месяцем
- month — значение месяца
- min_date — первая дата за месяц
- max_date — последняя дата за месяц
Агрегируем данные и запишем их в новую таблицу:
Мы записали в таблицу ключ year_month, поле month, минимальное значение даты за месяц min_date и максимальное значение даты max_date.
Функция concat применяется, чтобы объединить несколько строковых значений. date_trunc позволяет «схлопнуть» даты временного промежутка в один. А с помощью значения month в функции date_trunc мы использовали агрегацию в месяц.
Сортировка по дате нужна, чтобы избежать перемешивания дат. Уникальный ключ, в котором есть год и месяц, нам понадобится в дальнейшем для джойна таблиц.
Цены открытия и закрытия
Теперь мы создадим таблицу open, чтобы сохранить в нее первые значения котировок в месяце. В ней тоже будет уникальный ключ year_month, а также первая дата за месяц и значение open цены валюты в эту дату:
Теперь сджойним таблицу monthly_dates с таблицей open по минимальной дате. Мы не будем использовать агрегацию, а только возьмем значения котировок в минимальные даты каждого месяца:
По аналогии с таблицей open создадим таблицу close, в которой будет последнее значение валюты за месяц. Мы будем джойнить ее с таблицей monthly_dates по максимальной дате месяца:
Минимальные и максимальные цены за месяц
Теперь мы создадим таблицу min_max_currency. В ней будет значение месяца, потому что мы агрегируем минимальное и максимальное значения валюты за месяц, и сами минимальное и максимальное значения котировок:
Агрегируем таблицу exchange по минимальным и максимальным помесячным значениям валют и запишем в min_max_currency. Для помесячной агрегации мы используем функцию date_trunc:
Витрина данных и свечной график
Теперь осталось создать таблицу с витриной, в которой будут уникальный ключ, цена открытия и закрытия и минимальная и максимальная цены:
Для создания витрины мы сджойним таблицы monthly_dates, open, close и min_max_currency:
Мы создали витрину данных, по которой будем строить свечной график. Мы сделали джойн таблиц monthly_dates, open и close по ключу year_month и полученной таблицы с min_max_currency по значению месяца month.
Итоговая таблица содержит 240 строк и выглядит так:
data_mart
В ней есть поля:
- year_month — уникальный строковый ключ
- month — месяц, по которому производилась агрегация
- min_currency — минимальное значение валюты за месяц
- open — первое значение валюты за месяц
- max_currency — максимальное значение валюты за месяц
- close - последнее значение валюты за месяц
Поля идут в таком порядке, потому что так по ним удобнее строить Candlestick Chart в Google Sheets.
Построим график по следующим шагам:
- Скопируем витрину в Google Sheets
- Выделим все столбцы, кроме
year_month - Для столбца
monthвыберем «Формат» -> «Числа» -> «Обычный текст» - В столбцах с котировками заменим все точки на запятые
- Вставим диаграмму и типом диаграммы выберем «График "японские свечи"»
В итоге мы получим график, который видели выше:
Мы построили свечной график по помесячным котировкам. Видим, что он состоит из свечей. Но на нем слишком много данных и мы не можем посмотреть на фитили. Поэтому возьмем только данные за 2019 год и запишем их в таблицу data_mart_new_data:
Здесь мы отобрали все даты, которые больше или равны 1 января 2019 года.
Теперь построим свечной график по этим данным. В дополнительных настройках вертикальной оси установим минимальное значение 1.2, чтобы рассмотреть график на большем масштабе:
Мы построили свечной график котировок валют за 2018-2019 год. На этом графике отчетливо видно, что свечной график состоит из тела свечи и фитилей. Границы тела определяются ценой открытия и закрытия, а фитили — минимальным и максимальным значениями за месяц.
Выводы
В этом уроке мы научились агрегировать данные для свечного графика. Мы взяли котировки валютной пары австралийского доллара и доллара США, сделали помесячную агрегацию валют и построили свечной график в Google Sheets. Агрегация валют позволит работать в финансовой сфере и строить отчеты по валютным парам.




