РАСЧЕТ ДЕЛЬТЫ
Дельта представляет собой разницу между рыночными покупками и рыночными продажами по каждой цене (footprint delta), в каждой свече/баре (bar delta) или за период (cumulative delta — кумулятивная дельта).
Дельта рассчитывается путем вычитания объема контрактов, проторгованных по цене Bid из объема контрактов, проторгованных по цене Ask. В платформе ATAS сделками, совершенными по цене Ask, считаются сделки, инициированные «агрессивными» покупателями. Сделками же, совершенными по цене Bid, считаются сделки, инициированные «агрессивными» продавцами.
Таким образом, положительная Дельта отражает более высокий объем «агрессивных» покупок, прошедших по цене Ask в результате торговли решительно настроенных покупателей. В свою очередь отрицательная Дельта отражает более высокий объем «агрессивных» продаж, прошедших по цене Bid в результате торговли решительно настроенных продавцов.
Объем торговли по цене Ask — Объем торговли по цене Bid = Дельта
Для расчета Дельты вам потребуется знать следующие переменные: цена Bid, цена Ask, последняя цена по которой торговался инструмент, объем последней сделки и время ее заключения.
Например, представьте себе, что в определенный момент времени цена Bid фьючерса на нефть марки WTI = $63.50 за баррель, а цена Ask =$63.51 и по цене Ask совершается сделка на 25 контрактов. В результате этой сделки значение Дельты увеличится на 25. Сразу же после этого на рынке совершается вторая сделка на 10 контрактов, которая на этот раз уже проходит по цене Bid ($63.50). Это приведет к уменьшению Дельты на 10. Общее изменение Дельты за время совершения двух сделок составит +25-10 =+15.
ФОРМУЛА РАСЧЕТА 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 по долям.
Искусственные данные по барам с распределением объёма по ценовым уровням внутри каждого бара и рисует «кластерный график»: для каждого бара — столбцы объёма на каждом ценовом уровне. В примере также показывается разделение объёма на `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 внутри бар