HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В этом уроке мы рассмотрим свечной график или Candlestick chart. Он широко используется для изображения котировок валют. Сегодня мы агрегируем данные валютной пары за 19 лет и построим график в Google Sheets.</p>
1 <p>В этом уроке мы рассмотрим свечной график или Candlestick chart. Он широко используется для изображения котировок валют. Сегодня мы агрегируем данные валютной пары за 19 лет и построим график в Google Sheets.</p>
2 <p>Знания и навыки об агрегации данных для свечного графика позволят работать аналитиком в финансовой сфере.</p>
2 <p>Знания и навыки об агрегации данных для свечного графика позволят работать аналитиком в финансовой сфере.</p>
3 <h2>Candlestick chart</h2>
3 <h2>Candlestick chart</h2>
4 <p>Представим, что у нас есть котировки валюты австралийского доллара относительно американского доллара. Мы хотим узнать, как они меняются со временем. Мы уже умеем строить линейный график, поэтому сначала изобразим его:</p>
4 <p>Представим, что у нас есть котировки валюты австралийского доллара относительно американского доллара. Мы хотим узнать, как они меняются со временем. Мы уже умеем строить линейный график, поэтому сначала изобразим его:</p>
5 <p>На этом рисунке мы видим линейный график котировок валют австралийского доллара относительно американского доллара.</p>
5 <p>На этом рисунке мы видим линейный график котировок валют австралийского доллара относительно американского доллара.</p>
6 <p>Но такой график для отображения котировок неудобен и неинформативен. Мы видим только изменение текущей цены со временем. Торги на рынке происходят в каком-то окне: есть цена открытия и цена закрытия. Цена открытия - это цена, с которой начинаются торги, а по цене закрытия они заканчиваются. Поэтому таблицы с котировками обычно выглядят более сложно:</p>
6 <p>Но такой график для отображения котировок неудобен и неинформативен. Мы видим только изменение текущей цены со временем. Торги на рынке происходят в каком-то окне: есть цена открытия и цена закрытия. Цена открытия - это цена, с которой начинаются торги, а по цене закрытия они заканчиваются. Поэтому таблицы с котировками обычно выглядят более сложно:</p>
7 <p><strong>currency_exchange</strong></p>
7 <p><strong>currency_exchange</strong></p>
8 <p>В этой таблице представлены котировки валюты с шагом в один месяц. Она содержит такие столбцы:</p>
8 <p>В этой таблице представлены котировки валюты с шагом в один месяц. Она содержит такие столбцы:</p>
9 <ol><li>date - дата</li>
9 <ol><li>date - дата</li>
10 <li>low - минимальное значение цены за этот месяц</li>
10 <li>low - минимальное значение цены за этот месяц</li>
11 <li>open - цена открытия. Это первая цена за месяц</li>
11 <li>open - цена открытия. Это первая цена за месяц</li>
12 <li>high - максимальная цена за месяц</li>
12 <li>high - максимальная цена за месяц</li>
13 <li>close - цена закрытия. Это последняя цена за месяц</li>
13 <li>close - цена закрытия. Это последняя цена за месяц</li>
14 </ol><p>Из этой таблицы мы понимаем, как торги начинались и заканчивались. Также знаем минимальное и максимальное значение котировок. Для визуального представления таких таблиц используют<strong>свечной график</strong>или<strong>Candlestick chart</strong>. Он удобнее линейного графика, потому что позволяет визуализировать все параметры: цену открытия, закрытия, минимальную и максимальную цены.</p>
14 </ol><p>Из этой таблицы мы понимаем, как торги начинались и заканчивались. Также знаем минимальное и максимальное значение котировок. Для визуального представления таких таблиц используют<strong>свечной график</strong>или<strong>Candlestick chart</strong>. Он удобнее линейного графика, потому что позволяет визуализировать все параметры: цену открытия, закрытия, минимальную и максимальную цены.</p>
15 <p>Посмотрим, из чего он состоит, и где на нем находятся данные из таблицы:</p>
15 <p>Посмотрим, из чего он состоит, и где на нем находятся данные из таблицы:</p>
16 <p>На свечном графике каждый промежуток времени мы изображаем в виде "свечи". У свечи есть тело и фитиль. Нижний и верхний фитили на картинке обозначены как Lower Wick и Upper Wick. Тело свечи отмечено как Real Body. Open и Close - это цены открытия и закрытия.</p>
16 <p>На свечном графике каждый промежуток времени мы изображаем в виде "свечи". У свечи есть тело и фитиль. Нижний и верхний фитили на картинке обозначены как Lower Wick и Upper Wick. Тело свечи отмечено как Real Body. Open и Close - это цены открытия и закрытия.</p>
17 <p>Тело - это прямоугольник, у которого одна из границ - цена открытия, а вторая - закрытия. Цена открытия бывает меньше или больше цены закрытия - это зависит от трендов на рынке.</p>
17 <p>Тело - это прямоугольник, у которого одна из границ - цена открытия, а вторая - закрытия. Цена открытия бывает меньше или больше цены закрытия - это зависит от трендов на рынке.</p>
18 <p>Фитиль рисуется узкой вертикальной линией. Верхняя граница фитиля - это максимальная цена за период торгов, а нижняя - минимальная. Если фитиль длинный, а тело нет - это говорит о том, что рынок очень волатильный, то есть быстро меняется.</p>
18 <p>Фитиль рисуется узкой вертикальной линией. Верхняя граница фитиля - это максимальная цена за период торгов, а нижняя - минимальная. Если фитиль длинный, а тело нет - это говорит о том, что рынок очень волатильный, то есть быстро меняется.</p>
19 <p>По таблице CurrencyExchange мы можем построить свечной график котировок. Он будет выглядеть так:</p>
19 <p>По таблице CurrencyExchange мы можем построить свечной график котировок. Он будет выглядеть так:</p>
20 <p>Здесь мы видим свечной график котировок валют. Он содержит в себе не информацию о текущей стоимости валюты, а цену открытия, закрытия, минимальную и максимальную во временном окне, когда идут торги.</p>
20 <p>Здесь мы видим свечной график котировок валют. Он содержит в себе не информацию о текущей стоимости валюты, а цену открытия, закрытия, минимальную и максимальную во временном окне, когда идут торги.</p>
21 <p>Чтобы получить из таблицы, в которой есть только текущая стоимость, таблицу с ценами открытия, закрытия, минимальной и максимальной, мы агрегируем данные. По агрегированной таблице мы уже построим свечной график.</p>
21 <p>Чтобы получить из таблицы, в которой есть только текущая стоимость, таблицу с ценами открытия, закрытия, минимальной и максимальной, мы агрегируем данные. По агрегированной таблице мы уже построим свечной график.</p>
22 <h2>Агрегация курсов валют</h2>
22 <h2>Агрегация курсов валют</h2>
23 <p>Мы будем агрегировать таблицу курса валют помесячно. Для агрегации мы проделаем такие шаги:</p>
23 <p>Мы будем агрегировать таблицу курса валют помесячно. Для агрегации мы проделаем такие шаги:</p>
24 <ol><li>Создадим вспомогательную таблицу с первыми и последними значениями цены за месяц</li>
24 <ol><li>Создадим вспомогательную таблицу с первыми и последними значениями цены за месяц</li>
25 <li>Создадим вспомогательную таблицу для цен открытия и закрытия</li>
25 <li>Создадим вспомогательную таблицу для цен открытия и закрытия</li>
26 <li>Создадим вспомогательные таблицы для минимальных и максимальных значений за месяц</li>
26 <li>Создадим вспомогательные таблицы для минимальных и максимальных значений за месяц</li>
27 <li>Объединим эти таблицы с помощью SQL-функции join и проведем итоговую агрегацию</li>
27 <li>Объединим эти таблицы с помощью SQL-функции join и проведем итоговую агрегацию</li>
28 </ol><h3>Первые и последние значения цены за месяц</h3>
28 </ol><h3>Первые и последние значения цены за месяц</h3>
29 <p>Откроем базу<a>australian_currency</a>.</p>
29 <p>Откроем базу<a>australian_currency</a>.</p>
30 <p>В базе данных есть таблица exchange с двумя полями:</p>
30 <p>В базе данных есть таблица exchange с двумя полями:</p>
31 <ul><li>date - дата, в которую валюта имела определенную стоимость</li>
31 <ul><li>date - дата, в которую валюта имела определенную стоимость</li>
32 <li>currency - значение котировки валюты</li>
32 <li>currency - значение котировки валюты</li>
33 </ul><p>Посмотрим на саму таблицу:</p>
33 </ul><p>Посмотрим на саму таблицу:</p>
34 <p><strong>Currency</strong></p>
34 <p><strong>Currency</strong></p>
35 <p>В этой таблице 5019 строк. Мы видим, что в таблице есть данные за 2000-2019 года.</p>
35 <p>В этой таблице 5019 строк. Мы видим, что в таблице есть данные за 2000-2019 года.</p>
36 <p>Нам нужно создать новую таблицу с минимумом, максимумом, первой ценой и последней ценой за определенный период времени. Мы будем агрегировать данные помесячно.</p>
36 <p>Нам нужно создать новую таблицу с минимумом, максимумом, первой ценой и последней ценой за определенный период времени. Мы будем агрегировать данные помесячно.</p>
37 <p>Чтобы получить первую и последнюю цены за месяц, мы создадим вспомогательную таблицу monthly_dates. В нее мы агрегируем первую и последнюю дату за месяц, само значение месяца и уникальный ключ, по которому мы будем джойнить таблицы:</p>
37 <p>Чтобы получить первую и последнюю цены за месяц, мы создадим вспомогательную таблицу monthly_dates. В нее мы агрегируем первую и последнюю дату за месяц, само значение месяца и уникальный ключ, по которому мы будем джойнить таблицы:</p>
38 <p>Мы создали таблицу с полями:</p>
38 <p>Мы создали таблицу с полями:</p>
39 <ul><li>year_month - уникальный строковый ключ с годом и месяцем</li>
39 <ul><li>year_month - уникальный строковый ключ с годом и месяцем</li>
40 <li>month - значение месяца</li>
40 <li>month - значение месяца</li>
41 <li>min_date - первая дата за месяц</li>
41 <li>min_date - первая дата за месяц</li>
42 <li>max_date - последняя дата за месяц</li>
42 <li>max_date - последняя дата за месяц</li>
43 </ul><p>Агрегируем данные и запишем их в новую таблицу:</p>
43 </ul><p>Агрегируем данные и запишем их в новую таблицу:</p>
44 <p>Мы записали в таблицу ключ year_month, поле month, минимальное значение даты за месяц min_date и максимальное значение даты max_date.</p>
44 <p>Мы записали в таблицу ключ year_month, поле month, минимальное значение даты за месяц min_date и максимальное значение даты max_date.</p>
45 <p>Функция concat применяется, чтобы объединить несколько строковых значений. date_trunc позволяет "схлопнуть" даты временного промежутка в один. А с помощью значения month в функции date_trunc мы использовали агрегацию в месяц.</p>
45 <p>Функция concat применяется, чтобы объединить несколько строковых значений. date_trunc позволяет "схлопнуть" даты временного промежутка в один. А с помощью значения month в функции date_trunc мы использовали агрегацию в месяц.</p>
46 <p>Сортировка по дате нужна, чтобы избежать перемешивания дат. Уникальный ключ, в котором есть год и месяц, нам понадобится в дальнейшем для джойна таблиц.</p>
46 <p>Сортировка по дате нужна, чтобы избежать перемешивания дат. Уникальный ключ, в котором есть год и месяц, нам понадобится в дальнейшем для джойна таблиц.</p>
47 <h3>Цены открытия и закрытия</h3>
47 <h3>Цены открытия и закрытия</h3>
48 <p>Теперь мы создадим таблицу open, чтобы сохранить в нее первые значения котировок в месяце. В ней тоже будет уникальный ключ year_month, а также первая дата за месяц и значение open цены валюты в эту дату:</p>
48 <p>Теперь мы создадим таблицу open, чтобы сохранить в нее первые значения котировок в месяце. В ней тоже будет уникальный ключ year_month, а также первая дата за месяц и значение open цены валюты в эту дату:</p>
49 <p>Теперь сджойним таблицу monthly_dates с таблицей open по минимальной дате. Мы не будем использовать агрегацию, а только возьмем значения котировок в минимальные даты каждого месяца:</p>
49 <p>Теперь сджойним таблицу monthly_dates с таблицей open по минимальной дате. Мы не будем использовать агрегацию, а только возьмем значения котировок в минимальные даты каждого месяца:</p>
50 <p>По аналогии с таблицей open создадим таблицу close, в которой будет последнее значение валюты за месяц. Мы будем джойнить ее с таблицей monthly_dates по максимальной дате месяца:</p>
50 <p>По аналогии с таблицей open создадим таблицу close, в которой будет последнее значение валюты за месяц. Мы будем джойнить ее с таблицей monthly_dates по максимальной дате месяца:</p>
51 <h3>Минимальные и максимальные цены за месяц</h3>
51 <h3>Минимальные и максимальные цены за месяц</h3>
52 <p>Теперь мы создадим таблицу min_max_currency. В ней будет значение месяца, потому что мы агрегируем минимальное и максимальное значения валюты за месяц, и сами минимальное и максимальное значения котировок:</p>
52 <p>Теперь мы создадим таблицу min_max_currency. В ней будет значение месяца, потому что мы агрегируем минимальное и максимальное значения валюты за месяц, и сами минимальное и максимальное значения котировок:</p>
53 <p>Агрегируем таблицу exchange по минимальным и максимальным помесячным значениям валют и запишем в min_max_currency. Для помесячной агрегации мы используем функцию date_trunc:</p>
53 <p>Агрегируем таблицу exchange по минимальным и максимальным помесячным значениям валют и запишем в min_max_currency. Для помесячной агрегации мы используем функцию date_trunc:</p>
54 <h3>Витрина данных и свечной график</h3>
54 <h3>Витрина данных и свечной график</h3>
55 <p>Теперь осталось создать таблицу с витриной, в которой будут уникальный ключ, цена открытия и закрытия и минимальная и максимальная цены:</p>
55 <p>Теперь осталось создать таблицу с витриной, в которой будут уникальный ключ, цена открытия и закрытия и минимальная и максимальная цены:</p>
56 <p>Для создания витрины мы сджойним таблицы monthly_dates, open, close и min_max_currency:</p>
56 <p>Для создания витрины мы сджойним таблицы monthly_dates, open, close и min_max_currency:</p>
57 <p>Мы создали витрину данных, по которой будем строить свечной график. Мы сделали джойн таблиц monthly_dates, open и close по ключу year_month и полученной таблицы с min_max_currency по значению месяца month.</p>
57 <p>Мы создали витрину данных, по которой будем строить свечной график. Мы сделали джойн таблиц monthly_dates, open и close по ключу year_month и полученной таблицы с min_max_currency по значению месяца month.</p>
58 <p>Итоговая таблица содержит 240 строк и выглядит так:</p>
58 <p>Итоговая таблица содержит 240 строк и выглядит так:</p>
59 <p><strong>data_mart</strong></p>
59 <p><strong>data_mart</strong></p>
60 <p>В ней есть поля:</p>
60 <p>В ней есть поля:</p>
61 <ul><li>year_month - уникальный строковый ключ</li>
61 <ul><li>year_month - уникальный строковый ключ</li>
62 <li>month - месяц, по которому производилась агрегация</li>
62 <li>month - месяц, по которому производилась агрегация</li>
63 <li>min_currency - минимальное значение валюты за месяц</li>
63 <li>min_currency - минимальное значение валюты за месяц</li>
64 <li>open - первое значение валюты за месяц</li>
64 <li>open - первое значение валюты за месяц</li>
65 <li>max_currency - максимальное значение валюты за месяц</li>
65 <li>max_currency - максимальное значение валюты за месяц</li>
66 <li>close - последнее значение валюты за месяц</li>
66 <li>close - последнее значение валюты за месяц</li>
67 </ul><p>Поля идут в таком порядке, потому что так по ним удобнее строить Candlestick Chart в Google Sheets.</p>
67 </ul><p>Поля идут в таком порядке, потому что так по ним удобнее строить Candlestick Chart в Google Sheets.</p>
68 <p>Построим график по следующим шагам:</p>
68 <p>Построим график по следующим шагам:</p>
69 <ol><li>Скопируем витрину в Google Sheets</li>
69 <ol><li>Скопируем витрину в Google Sheets</li>
70 <li>Выделим все столбцы, кроме year_month</li>
70 <li>Выделим все столбцы, кроме year_month</li>
71 <li>Для столбца month выберем "Формат" -&gt; "Числа" -&gt; "Обычный текст"</li>
71 <li>Для столбца month выберем "Формат" -&gt; "Числа" -&gt; "Обычный текст"</li>
72 <li>В столбцах с котировками заменим все точки на запятые</li>
72 <li>В столбцах с котировками заменим все точки на запятые</li>
73 <li>Вставим диаграмму и типом диаграммы выберем "График "японские свечи""</li>
73 <li>Вставим диаграмму и типом диаграммы выберем "График "японские свечи""</li>
74 </ol><p>В итоге мы получим график, который видели выше:</p>
74 </ol><p>В итоге мы получим график, который видели выше:</p>
75 <p>Мы построили свечной график по помесячным котировкам. Видим, что он состоит из свечей. Но на нем слишком много данных и мы не можем посмотреть на фитили. Поэтому возьмем только данные за 2019 год и запишем их в таблицу data_mart_new_data:</p>
75 <p>Мы построили свечной график по помесячным котировкам. Видим, что он состоит из свечей. Но на нем слишком много данных и мы не можем посмотреть на фитили. Поэтому возьмем только данные за 2019 год и запишем их в таблицу data_mart_new_data:</p>
76 <p>Здесь мы отобрали все даты, которые больше или равны 1 января 2019 года.</p>
76 <p>Здесь мы отобрали все даты, которые больше или равны 1 января 2019 года.</p>
77 <p>Теперь построим свечной график по этим данным. В дополнительных настройках вертикальной оси установим минимальное значение 1.2, чтобы рассмотреть график на большем масштабе:</p>
77 <p>Теперь построим свечной график по этим данным. В дополнительных настройках вертикальной оси установим минимальное значение 1.2, чтобы рассмотреть график на большем масштабе:</p>
78 <p>Мы построили свечной график котировок валют за 2018-2019 год. На этом графике отчетливо видно, что свечной график состоит из тела свечи и фитилей. Границы тела определяются ценой открытия и закрытия, а фитили - минимальным и максимальным значениями за месяц.</p>
78 <p>Мы построили свечной график котировок валют за 2018-2019 год. На этом графике отчетливо видно, что свечной график состоит из тела свечи и фитилей. Границы тела определяются ценой открытия и закрытия, а фитили - минимальным и максимальным значениями за месяц.</p>
79 <h2>Выводы</h2>
79 <h2>Выводы</h2>
80 <p>В этом уроке мы научились агрегировать данные для свечного графика. Мы взяли котировки валютной пары австралийского доллара и доллара США, сделали помесячную агрегацию валют и построили свечной график в Google Sheets. Агрегация валют позволит работать в финансовой сфере и строить отчеты по валютным парам.</p>
80 <p>В этом уроке мы научились агрегировать данные для свечного графика. Мы взяли котировки валютной пары австралийского доллара и доллара США, сделали помесячную агрегацию валют и построили свечной график в Google Sheets. Агрегация валют позволит работать в финансовой сфере и строить отчеты по валютным парам.</p>