Cluster Charts — Кластерные графики

Кластер (Cluster) — это определённый уровень цены в определённый момент времени, на котором совершилось некоторое количество сделок.
Кластерный график (Cluster Chart) — это способ формирования графической информации, при котором отображается общее количество проторгованного объёма на каждом ценовом уровне для каждой отдельной свечи. Несколько рядов данных отображаются рядом друг с другом в пределах одной категории (кластера). Часто реализуется как гистограмма с группировкой (grouped bar chart) или как точечный/столбчатый график, где каждый кластер соответствует одной категории по оси X, а в каждом кластере показываются значения нескольких подкатегорий (серий). Кластер здесь означает «набор столбиков (или точек), относящихся к одной общей метке по оси X». Это позволяет заглянуть внутрь цены и увидеть все действия рынка. Кластерная диаграмма сочетает в себе несколько важных характеристик, таких как время, цены OHLC, объем торгов, количество сделок купли-продажи.
Инструмент позволяет увидеть, как именно распределяется объём в свече выбранного таймфрейма на графике. Функция дополнительной фильтрации даёт возможность визуально выделять выбранным цветом особо крупные скопления объёмов от определённого размера или в процентах относительно максимального значения.

Многие базовые формы графиков (столбчатые диаграммы, линейные графики, круговые диаграммы) формировались постепенно. Вкладывали разные учёные и практики: Уильям Плейфер (William Playfair, кон. XVIII — нач. XIX вв.) считается одним из пионеров статистической графики — он ввёл линейные графики и столбчатые диаграммы в своих работах в конце XVIII — начале XIX века. Кластерный анализ впервые ввёл математик Роберт Трион в 1939 году.
Идея объёмного анализа основана на том, что основные движения на рынке создаёт один или несколько крупных участников торгов. Такой участник может удерживать актив и накапливать большую позицию, останавливая падение бумаги и разворачивая инструмент, или, наоборот, может распродавать позицию, формируя максимум стоимости с последующей коррекцией.
На графике цен актива выявить намерения даже крупных участников практически невозможно, но найти их след через объёмы вполне реально. Здесь на помощь приходят инструменты объёмного анализа, один из которых — кластерный график.
Визуальная структура
— Ось X: категории.
— Ось Y: числовое значение (объем продаж, процент, количество).
— В каждой категории несколько столбиков (серий) расположены рядом (в кластере) для удобного сравнения между сериями и по категориям.
Каждый кластер окрашен в один из двух цветов, согласно настройкам (по умолчанию, красный и зеленый). Красный означает более агрессивные продажи по этой цене, зеленый, соответственно, более агрессивные покупки. Каждый кластер закрашен согласно перевесу продаж или покупок по конкретной цене и основывается на Дельте (Bid — Ask). Интенсивность окраски пропорционально зависит от степени перевеса покупателей над продавцами или наоборот.

Каждая цена (ячейка) в баре показывает отдельный кластер.
Цвет показывает было больше продаж или покупок на конкретной цене.
Зеленый или красный цвет слева от кластеров показывает тело и направление бара, как и на свечном графике.
Кластер с наибольшим объемом выделен черным контуром.
Используя эту информацию, трейдер может оценить:
— объем торгов, который выполнялся по каждой цене;
— зоны максимального накопления объема;
— зоны высокого торгового интереса (максимальное количество сделок);
— количество покупателей и продавцов на каждом уровне цен.
АНАТОМИЯ ФУТПРИНТА
Строение Футпринта проще всего понять как простое разделение бара на кластера с информацией о сделках, которые сформировали данный бар. Кластеры с объемом прошедших сделок формируются по каждой цене, где торговался инструмент. Кластера обновляются в режиме реального времени, по мере поступления новых данных о сделках. Это позволяет трейдерам быть более информированными и наблюдать за смещением объема и потока ордеров в контексте ценовой динамики на графике. Это дает «ощущение» и лучшее понимание графика, посредством динамики транзакций между кластерами.

Традиционно графики предоставляли информацию только с Open, High, Low и Close. Футпринт преобразует стандартные бары более детальным и релевантным способом организации данных электронной торговли. Другой способ описать данный тип графика — это взять обычный бар и нарезать его на фрагменты по ценам. В Футпринте так же есть 4 базовые точки (OHLC), но он дополнительно содержит атрибуты торговли (объем, дельта, сделки, время…) по каждой цене, входящей в бар.
Технически, Футпринт/Кластер — это ячейка, которая содержит определенную информацию по каждой цене в баре. Серия кластеров составляет бар в соответствии с выбранным таймфреймом. В зависимости от того, какой тип графика используется, кластеры можно раскрасить на основании изменения дельты или объема. Раскраска кластеров содержит так же очень важную информацию, т.к. она указывает трейдерам на изменение импульса внутри бара, позволяет быстрее определять рыночные изменения и лучшие моменты для торговли.
Преимущества
— Удобно для визуального сравнения нескольких показателей в одном контексте.
— Позволяет быстро выявить закономерности, относительные различия и тренды по сериям.
Ограничения и рекомендации
— При большом числе серий (много баров в кластере) график становится перегруженным; лучше ограничить число серий или использовать интерактивность.
— Если значения сильно отличаются по масштабу, рассмотрите использование второй оси Y или нормализацию.
— Для временных рядов с большим количеством точек может быть лучше линейный grouped chart или small multiples.
Типы кластерной диаграммы
• Single cluster (Единый кластер) показывает только один тип данных на бар. Список основных Типы данных ниже вы найдете

• Double cluster (Двойное скопление) позволяет выбрать два типа данных, которые будут отображаться на каждой панели. Например, можно выбрать Том для первого типа данных и Дельта для второго типа данных.

•
Imbalance (Дисбаланс) на диаграмме следа показаны уровни цен, при которых объем торговли покупками превышает объем торговли продажами. Дисбаланс между диагональными ставками и запросами демонстрирует агрессивные рыночные заказы на покупку, отменяющие предложение, и агрессивные рыночные заказы на продажу, влияющие на ставку.

Типы данных для кластерной диаграммы
• Trades (сделки) — это количество контрактов (торгов), которые выполняются на каждом уровне цен.
• Buy (or Sell) trades (сделки на покупку или продажу) — это количество сделок «Купить» (или «Продать»), которые выполняются на каждом уровне цен.
• Volume (Объем) — общий размер всех позиций, которые исполняются на каждом уровне цен или ценовом диапазоне.
• Buy (or Sell) Volume (Объем от покупок или продаж) — общий размер всех Покупать (или продавать) позиции, которые исполняются на каждом уровне цены или ценовом диапазоне.
• Buy (or Sell) Volume, % (Объем от покупок или продаж в %) — показывает, сколько процентов от общего объема относится к сделкам «Купить» (или «Продать»)
• Delta and Delta % (Дельта и Дельта %) — показывает разницу в торгуемом объеме между покупателями и продавцами. Это позволяет оценить, кто контролирует цену на рынке в данный момент времени. Дельта % = Дельта/Объем * 100
• Average size (Средний размер — средний объем позиции), которая была исполнена по определенной цене или ценовому диапазону.
• Average Buy size (Средний размер покупки — средний объем позиции Buy), которая была исполнена по определенной цене или ценовому диапазону.
• Average Sell size (Средний размер продажи — средний объем позиции Sell), которая была исполнена по определенной цене или ценовому диапазону.
• Max one trade volume (value and %) (Макс. один объем торговли (стоимость и %)) — показывает максимальный объем одной сделки, которая была выполнена по определенной цене или ценовому диапазону (в зависимости от настройки Custom Step (ticks)).
• Filtered volume (value and %) (Отфильтрованный объем (значение и %)) — этот параметр отображает объемы, превышающие размер, указанный в фильтре. Если размер тома меньше указанного в фильтре, то значения будут равны нулю.
• Buy (or Sell) filtered volume (Купите (или продайте) отфильтрованный объем) — параметр отображает Объемы Купить (или Продавать), превышающие размер, указанный в фильтре.

Скорее всего, вы уже успели заметить, что некоторые бары не доходят до конца кластеров. Бары это тела японских свечей. А тот участок кластера, который без полоски, это и есть хвосты, фитильки или тени японских свечей. Обратите внимание, они почти совпадают с закрытием одного кластера с открытием следующего. Разумеется плюс/минус пару пунктов, из-за волатильности рынка.
А вот о чём нам сигнализируют числа, расположенные в каждой из ячеек. Кстати, каждая из горизонтальных полосок, ячеек в каждом кластере, является отметкой одного пункта. Длина каждого пункта соответствует значению цифры, расположенной в этой самой ячейке. Белой рамочкой обводится ячейка или пункт с максимально пройденным количеством контрактов по соответствующему ценовому уровню. Но стоит поправиться, что значения максимальных объёмов, можно задавать самостоятельно.
Формула расчета Cluster Charts (Кластерные графики)
Важно понимать: сам по себе кластерный график — это способ визуализации, а не единая численно-статистическая формула. Тем не менее при построении кластерного графика обычно выполняют ряд вычислений/преобразований для правильного позиционирования и масштабирования элементов. Ниже приведены ключевые формулы/подходы, используемые при отрисовке группированных столбиков (grouped bar chart).
Обозначения:
— N — количество категорий по оси X (кластеров).
— M — количество серий внутри каждого кластера (число баров в кластере).
— i = 0..N−1 — индекс категории (кластера).
— j = 0..M−1 — индекс серии внутри кластера.
— X_i — положение центра кластера i на оси X (например, X_i = i, или равномерно распределённые метки).
— w_total — общая ширина, отведённая для одного кластера на оси X (в координатах оси, единицы зависят от системы отрисовки).
— gap_between_clusters — расстояние между центрами разных кластеров (часто это 1 для дискретных меток).
— gap_between_bars — внутренний зазор между соседними барами внутри кластера (часто задаётся как доля от w_total).
1) Ширина одного бара (w_bar)
Если внутри кластера M баров и задан внутренний зазор (долю) s (0 ≤ s < 1), то суммарная ширина баров = w_total * (1 − s). У каждого бара:
w_bar = (w_total * (1 − s)) / M
2) Позиция каждого бара внутри кластера
Ориентируемся от левого края кластера или от центра. Если использовать центр X_i, позиция центра бара j:
Смещение от центра кластера для бара j:
• offset_j = −( (M−1)/2 ) * w_bar + j * w_bar + j * gap_internal
где gap_internal — внутренний зазор между баром j и j+1 (в абсолютных единицах). Если зазор задаётся как доля s, то gap_internal можно распределить как:
• total_gap = w_total * s
• gap_internal = total_gap / (M − 1) (если M>1)
Полная формула позиции центра бара:
• x_{i,j} = X_i + offset_j
Более компактная вариант (без распределённого gap_internal, если зазор учитывается через уменьшение суммарной ширины):
• x_{i,j} = X_i + ( (j − (M−1)/2) * w_bar )
3) Высота бара (визуализация значения)
Для ряда j в категории i задано значение y_{i,j} (например, продажи). Высота (в пикселях или единицах координатной системы) вычисляется через масштабирование:
y_pixels = scale_y( y_{i,j} ) = (y_{i,j} − y_min) * (plot_height / (y_max − y_min))
где:
— y_min и y_max — границы оси Y,
— plot_height — высота области построения в пикселях/единицах.
4) Пример полного расчёта (алгоритм)
• Задаём позиции кластеров X_i (например, X_i = i).
• Для каждого кластера i:
— Вычисляем w_bar = (w_total * (1 − s)) / M.
— Для каждого j вычисляем x_{i,j} = X_i + (j − (M−1)/2) * w_bar.
— Вычисляем высоту y_pixels = scale_y(y_{i,j}).
— Рисуем прямоугольник с центром x_{i,j}, шириной w_bar и высотой y_pixels (или левым/правым краем в зависимости от API).
5) Если требуется отступ между кластером и соседями
• Часто w_total = gap_between_clusters * cluster_unit, где gap_between_clusters определяет плотность кластеров.
• Если X_i = i и хотим, чтобы суммарная ширина кластера (включая зазоры) была равна fraction f от шага 1:
— w_total = f * 1 (например, f = 0.8)
и далее применяются формулы выше.
6) Нормализация и относительные величины
Иногда значение y_{i,j} нормализуют внутри категории:
y’_{i,j} = y_{i,j} / sum_{k=0..M−1} y_{i,k} (доля в кластере)
затем строят stacked или сравнительный clustered chart по долям.
Пример псевдокода (упрощённо)
Ниже — минимальный пример на Python с использованием Matplotlib и Pandas. Скрипт берёт искусственные данные по барам с распределением объёма по ценовым уровням внутри каждого бара и рисует «кластерный график»: для каждого бара — столбцы объёма на каждом ценовом уровне. В примере также показывается разделение объёма на `bid` и `ask` (футпринт-стиль) внутри каждого ценового шага.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Параметры генерации примера
n_bars = 6 # число баров (кластеров)
levels_per_bar = 8 # число ценовых уровней в баре
price_step = 1 # шаг цены (для визуализации)
# Генерируем примерные данные: для каждого бара массив цен и объёмов (bid/ask)
# Структура: list из n_bars элементов, каждый — DataFrame с колонками ['price', 'bid', 'ask']
bars = []
base_price = 100
rng = np.random.default_rng(42)
for i in range(n_bars):
# цены в баре (в порядке возрастания)
prices = base_price + i * 2 + np.arange(levels_per_bar) * price_step
# случайные объёмы bid/ask (имитируем реальные исполнения)
bid = rng.integers(0, 200, size=levels_per_bar)
ask = rng.integers(0, 200, size=levels_per_bar)
df = pd.DataFrame({'price': prices, 'bid': bid, 'ask': ask})
bars.append(df)
# Визуализация: для каждого бара рисуем мини-гистограмму объёмов по цене.
# Чтобы разместить уровни разных баров рядом, используем смещение по X.
fig, ax = plt.subplots(figsize=(12, 6))
# Параметры внешнего вида
cluster_width = 0.9 # суммарная ширина кластера (в "ценовых единицах")
bar_width = cluster_width / levels_per_bar # ширина одного столбца внутри кластера
gap_between_clusters = 2.5 # расстояние между центрами кластеров по оси X
# Отрисовка: позиционируем каждый уровень внутри кластера с небольшим сдвигом по X
for i, df in enumerate(bars):
# центр кластера по X
cluster_center = i * gap_between_clusters
# сдвиг цен внутри кластера так, чтобы уровни были расположены вокруг центра
total_span = (levels_per_bar - 1) * bar_width
left0 = cluster_center - total_span / 2 # позиция самого левого уровня
for j, row in df.iterrows():
x_pos = left0 + j * bar_width
# рисуем bid как отрицательный (вниз) столбец, ask — положительный (вверх)
ax.bar(x_pos, row['ask'], width=bar_width*0.9, align='edge',
color='green', alpha=0.7)
ax.bar(x_pos, -row['bid'], width=bar_width*0.9, align='edge',
color='red', alpha=0.7)
# подпись цены под столбцом (один раз в центре уровня)
if i == 0:
ax.text(x_pos + bar_width*0.45, -max(df['bid'].max(), df['ask'].max())*0.05,
f"{int(row['price'])}", ha='center', va='top', fontsize=8, rotation=90)
# подпись номера бара под кластером
ax.text(cluster_center, -max(df['bid'].max(), df['ask'].max())*0.2,
f"Bar {i+1}", ha='center', va='top', fontsize=9)
# Оформление осей
ax.axhline(0, color='black', linewidth=0.7) # разделительная линия между bid и ask
ax.set_xlabel('Clusters (bars)')
ax.set_ylabel('Volume (ask above, bid below)')
ax.set_title('Пример кластерного графика (bid/ask footprint внутри бар
Как на практике применять кластерный график
Появление кластеров крупных размеров говорит об интересе к текущим котировкам со стороны участников рынка. Во время торговли кластера можно использовать в двух случаях.
• Подтверждение удержания или пробоя значимых уровней. Появление крупного кластера в момент, когда цена пытается удержать или пробить важный графический или объёмный уровень, увеличивает вероятность того, что это событие окажется истинным.
Например, когда цена доходит до определённой области, интересной для покупки или продажи, и формирует там кластер большего, чем обычно, размера, а затем разворачивается и отскакивает — это усиливает удержание уровня, так как событие поддерживается объёмами.
И наоборот, если в момент пробоя значимого уровня формируется крупный кластер, а затем цена продолжает движение, это увеличивает вероятность того, что пробой окажется истинным.
• Сигнал на разворот. Появление нескольких значимых кластеров (от трёх) в одном месте или формирование нескольких кластеров в разное время примерно на одном ценовом уровне после длительного однонаправленного движения сигнализирует о возможном развороте котировок в активе.

Давайте начнём изучение кластеров шаг за шагом. Опираемся на скриншот ниже и шаг за шагом следим за ходом мыслей:

Выход лонгистов для снижение цены
На графике с отображением бид-аск, при ретесте (обведённый маркером кластер), есть две значимых ячейки. Тот пункт, что на уровне 21 922, вероятнее всего отработал отложенным ордером на продажу, т.к. во-первых, сам уровень значимый, во-вторых, пик кластера. Вряд ли получилось бы такое соотношение между бид и аск, на вершине кластера – 0 к 121 (к тому же мы держим в голове действующий флэт плотности лимитных заявок). В данной ситуации, ещё за мгновение до ретеста, кто-то из опытных участников рынка вовремя подсуетился и выставил (а возможно и выставилИ), отложенный ордер Sell Stop на уровне 21 922.
В дальнейших секундах, по мере снижения цены, очевидно, другие трейдеры подхватили данное развитие событий, запрыгнув в тронувшийся паровоз, допустив типичные ошибки большинства. Тем самым ещё больше подкинув дровишек в топку парораспределительного механизма… На чуть нижерасположенной ячейке, красного цвета на продажу видно, тоже не равномерное распределение спроса и предложения. Отчётливо заметно, как продавцы превзошли покупателей на 111 контрактов, 150-44=111. По причине превосходства, ячейка и окрасилась в красный цвет, цвет продаж. А имя этой разнице, между бид и аск – Дельта.

Как упоминалось выше, дельта это разница между бидом и аском, спросом и предложением, покупателями и продавцами. Так, на выше расположенном скриншоте, мы наблюдаем отрицательную дельту. Можно ли сказать, что после формирования этой дельты, цена устремилась вниз? Несомненно, можно. Но так же можно допустить, что эта дельта наоборот приостановила цену, при подъёме наверх. К сожалению, на истории мы этого не узнаем. Увы, мы не в курсе того, что было первоочередным, подъём или спуск. Или цена вообще 3-5 раз дёргалась туда-сюда. Но мы здесь о том и говорим, что в режиме реального времени, нам было бы в разы проще понимать концепцию движений.
Но как бы там не было, мы с вами нашли и разобрали очаг возгорания огромного нисходящего движения. Понимаете, ведь нам нужно было лишь убедиться в отношении объёмов между быками и медведями. Это важно при выходе ценой из баланса. На последнем скриншоте, кластер дельта, мы узрели инициативную сделку, а дальше, отталкиваясь от флэта, пошло как понакатанной. Примерно так происходит кластерный анализ. Понимаю, сложно. А что делать? Вы сами первые начали.


















