В этом уроке мы рассмотрим свечной график или Candlestick chart. Он широко используется для изображения котировок валют. Сегодня мы агрегируем данные валютной пары за 19 лет и построим график в Google Sheets.
Знания и навыки об агрегации данных для свечного графика позволят работать аналитиком в финансовой сфере.
Candlestick chart
Представим, что у нас есть котировки валюты австралийского доллара относительно американского доллара. Мы хотим узнать, как они меняются со временем. Мы уже умеем строить линейный график, поэтому сначала изобразим его:
На этом рисунке мы видим линейный график котировок валют австралийского доллара относительно американского доллара.
Но такой график для отображения котировок неудобен и неинформативен. Мы видим только изменение текущей цены со временем. Торги на рынке происходят в каком-то окне: есть цена открытия и цена закрытия. Цена открытия — это цена, с которой начинаются торги, а по цене закрытия они заканчиваются. Поэтому таблицы с котировками обычно выглядят более сложно:
currency_exchange
date | low | open | high | close |
---|---|---|---|---|
2018-01-01 | 1.2338 | 1.2781 | 1.2784 | 1.2393 |
2018-02-01 | 1.2456 | 1.2456 | 1.2839 | 1.2819 |
2018-03-01 | 1.2689 | 1.2883 | 1.3034 | 1.3004 |
... | ... | ... | ... | ... |
В этой таблице представлены котировки валюты с шагом в один месяц. Она содержит такие столбцы:
date
— датаlow
— минимальное значение цены за этот месяцopen
— цена открытия. Это первая цена за месяцhigh
— максимальная цена за месяцclose
— цена закрытия. Это последняя цена за месяц
Из этой таблицы мы понимаем, как торги начинались и заканчивались. Также знаем минимальное и максимальное значение котировок. Для визуального представления таких таблиц используют свечной график или Candlestick chart. Он удобнее линейного графика, потому что позволяет визуализировать все параметры: цену открытия, закрытия, минимальную и максимальную цены.
Посмотрим, из чего он состоит, и где на нем находятся данные из таблицы:
На свечном графике каждый промежуток времени мы изображаем в виде «свечи». У свечи есть тело и фитиль. Нижний и верхний фитили на картинке обозначены как Lower Wick и Upper Wick. Тело свечи отмечено как Real Body. Open и Close — это цены открытия и закрытия.
Тело — это прямоугольник, у которого одна из границ — цена открытия, а вторая — закрытия. Цена открытия бывает меньше или больше цены закрытия — это зависит от трендов на рынке.
Фитиль рисуется узкой вертикальной линией. Верхняя граница фитиля — это максимальная цена за период торгов, а нижняя — минимальная. Если фитиль длинный, а тело нет — это говорит о том, что рынок очень волатильный, то есть быстро меняется.
По таблице CurrencyExchange мы можем построить свечной график котировок. Он будет выглядеть так:
Здесь мы видим свечной график котировок валют. Он содержит в себе не информацию о текущей стоимости валюты, а цену открытия, закрытия, минимальную и максимальную во временном окне, когда идут торги.
Чтобы получить из таблицы, в которой есть только текущая стоимость, таблицу с ценами открытия, закрытия, минимальной и максимальной, мы агрегируем данные. По агрегированной таблице мы уже построим свечной график.
Агрегация курсов валют
Мы будем агрегировать таблицу курса валют помесячно. Для агрегации мы проделаем такие шаги:
- Создадим вспомогательную таблицу с первыми и последними значениями цены за месяц
- Создадим вспомогательную таблицу для цен открытия и закрытия
- Создадим вспомогательные таблицы для минимальных и максимальных значений за месяц
- Объединим эти таблицы с помощью SQL-функции
join
и проведем итоговую агрегацию
Первые и последние значения цены за месяц
Откроем базу australian_currency.
В базе данных есть таблица exchange
с двумя полями:
- date — дата, в которую валюта имела определенную стоимость
- currency — значение котировки валюты
Посмотрим на саму таблицу:
Currency
date | currency |
---|---|
2000-01-03 | 1.5172 |
2000-01-04 | 1.5239 |
2000-01-05 | 1.5267 |
... | ... |
2019-12-31 | 1.4225 |
В этой таблице 5019 строк. Мы видим, что в таблице есть данные за 2000-2019 года.
Нам нужно создать новую таблицу с минимумом, максимумом, первой ценой и последней ценой за определенный период времени. Мы будем агрегировать данные помесячно.
Чтобы получить первую и последнюю цены за месяц, мы создадим вспомогательную таблицу monthly_dates. В нее мы агрегируем первую и последнюю дату за месяц, само значение месяца и уникальный ключ, по которому мы будем джойнить таблицы:
CREATE TABLE monthly_dates (
year_month VARCHAR,
month DATE,
min_date DATE,
max_date DATE
);
Мы создали таблицу с полями:
- year_month — уникальный строковый ключ с годом и месяцем
- month — значение месяца
- min_date — первая дата за месяц
- max_date — последняя дата за месяц
Агрегируем данные и запишем их в новую таблицу:
INSERT INTO monthly_dates (
SELECT
TO_CHAR(month, 'YYYY-MM') AS year_month,
month,
min_date,
max_date
FROM (
SELECT
DATE_TRUNC('month', date) AS month,
MIN(date) AS min_date,
MAX(date) AS max_date
FROM exchange
GROUP BY month
) AS subquery
ORDER BY min_date
);
Мы записали в таблицу ключ year_month
, поле month
, минимальное значение даты за месяц min_date
и максимальное значение даты max_date
.
Функция concat
применяется, чтобы объединить несколько строковых значений. date_trunc
позволяет «схлопнуть» даты временного промежутка в один. А с помощью значения month
в функции date_trunc
мы использовали агрегацию в месяц.
Сортировка по дате нужна, чтобы избежать перемешивания дат. Уникальный ключ, в котором есть год и месяц, нам понадобится в дальнейшем для джойна таблиц.
Цены открытия и закрытия
Теперь мы создадим таблицу open
, чтобы сохранить в нее первые значения котировок в месяце. В ней тоже будет уникальный ключ year_month
, а также первая дата за месяц и значение open
цены валюты в эту дату:
CREATE TABLE open (
year_month VARCHAR PRIMARY KEY,
date DATE,
open FLOAT
);
Теперь сджойним таблицу monthly_dates
с таблицей open
по минимальной дате. Мы не будем использовать агрегацию, а только возьмем значения котировок в минимальные даты каждого месяца:
INSERT INTO open
SELECT
year_month,
exchange.date,
currency AS open
FROM exchange
INNER JOIN monthly_dates ON exchange.date = monthly_dates.min_date
ORDER BY date;
По аналогии с таблицей open
создадим таблицу close
, в которой будет последнее значение валюты за месяц. Мы будем джойнить ее с таблицей monthly_dates
по максимальной дате месяца:
CREATE TABLE close (
year_month VARCHAR PRIMARY KEY,
date DATE,
close FLOAT
);
INSERT INTO close
SELECT
year_month,
exchange.date,
currency as close
FROM exchange
INNER JOIN monthly_dates ON exchange.date = monthly_dates.max_date
ORDER BY date;
Минимальные и максимальные цены за месяц
Теперь мы создадим таблицу min_max_currency
. В ней будет значение месяца, потому что мы агрегируем минимальное и максимальное значения валюты за месяц, и сами минимальное и максимальное значения котировок:
CREATE TABLE min_max_currency (
month DATE,
min_currency FLOAT,
max_currency FLOAT
);
Агрегируем таблицу exchange
по минимальным и максимальным помесячным значениям валют и запишем в min_max_currency
. Для помесячной агрегации мы используем функцию date_trunc
:
INSERT INTO min_max_currency
SELECT
DATE_TRUNC('month', date) AS month,
MIN(currency) AS min_currency,
MAX(currency) AS max_currency
FROM exchange
GROUP BY month
ORDER BY month;
Витрина данных и свечной график
Теперь осталось создать таблицу с витриной, в которой будут уникальный ключ, цена открытия и закрытия и минимальная и максимальная цены:
CREATE TABLE data_mart (
year_month VARCHAR,
month DATE,
min_currency FLOAT,
open FLOAT,
max_currency FLOAT,
close FLOAT
);
Для создания витрины мы сджойним таблицы monthly_dates
, open
, close
и min_max_currency
:
INSERT INTO data_mart
(
SELECT
monthly_dates.year_month,
monthly_dates.month,
min_currency,
open,
max_currency,
close
FROM monthly_dates
INNER JOIN open ON monthly_dates.year_month = open.year_month
INNER JOIN close ON open.year_month = close.year_month
INNER JOIN min_max_currency ON monthly_dates.month = min_max_currency.month
ORDER BY month
);
Мы создали витрину данных, по которой будем строить свечной график. Мы сделали джойн таблиц monthly_dates
, open
и close
по ключу year_month
и полученной таблицы с min_max_currency
по значению месяца month
.
Итоговая таблица содержит 240 строк и выглядит так:
data_mart
year_month | month | min_currency | open | max_currency | close |
---|---|---|---|---|---|
2000-1 | 2000-01-01 | 1.4954 | 1.5172 | 1.5962 | 1.5669 |
2000-2 | 2000-02-01 | 1.5657 | 1.5835 | 1.6351 | 1.6247 |
2000-3 | 2000-03-01 | 1.6221 | 1.6483 | 1.6622 | 1.6496 |
... | ... | ... | ... | ... | ... |
2019-12 | 2019-12-01 | 1.4225 | 1.4665 | 1.4676 | 1.4225 |
В ней есть поля:
- year_month — уникальный строковый ключ
- month — месяц, по которому производилась агрегация
- min_currency — минимальное значение валюты за месяц
- open — первое значение валюты за месяц
- max_currency — максимальное значение валюты за месяц
- close - последнее значение валюты за месяц
Поля идут в таком порядке, потому что так по ним удобнее строить Candlestick Chart в Google Sheets.
Построим график по следующим шагам:
- Скопируем витрину в Google Sheets
- Выделим все столбцы, кроме
year_month
- Для столбца
month
выберем «Формат» -> «Числа» -> «Обычный текст» - В столбцах с котировками заменим все точки на запятые
- Вставим диаграмму и типом диаграммы выберем «График "японские свечи"»
В итоге мы получим график, который видели выше:
Мы построили свечной график по помесячным котировкам. Видим, что он состоит из свечей. Но на нем слишком много данных и мы не можем посмотреть на фитили. Поэтому возьмем только данные за 2019 год и запишем их в таблицу data_mart_new_data
:
CREATE TABLE data_mart_new_data (
year_month VARCHAR,
month DATA,
min_currency FLOAT,
open FLOAT,
max_currency FLOAT,
close FLOAT
);
INSERT INTO data_mart_new_data (
SELECT * FROM data_mart
WHERE month >= '2019-01-01'
);
Здесь мы отобрали все даты, которые больше или равны 1 января 2019 года.
Теперь построим свечной график по этим данным. В дополнительных настройках вертикальной оси установим минимальное значение 1.2, чтобы рассмотреть график на большем масштабе:
Мы построили свечной график котировок валют за 2018-2019 год. На этом графике отчетливо видно, что свечной график состоит из тела свечи и фитилей. Границы тела определяются ценой открытия и закрытия, а фитили — минимальным и максимальным значениями за месяц.
Выводы
В этом уроке мы научились агрегировать данные для свечного графика. Мы взяли котировки валютной пары австралийского доллара и доллара США, сделали помесячную агрегацию валют и построили свечной график в Google Sheets. Агрегация валют позволит работать в финансовой сфере и строить отчеты по валютным парам.
Самостоятельная работа
Повторите шаги, описанные в уроке.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.