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 выберем "Формат" -> "Числа" -> "Обычный текст"</li>
71
<li>Для столбца month выберем "Формат" -> "Числа" -> "Обычный текст"</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>