Строим свой индикатор точечных объемов на Python (VPOC)

В этой статье мы рассмотрим, как с помощью Python и библиотек Pandas и Plotly можно построить индикатор поиска точечного объема (Volume Point of Control, VPOC) на графике.
VPOC — это ценовой уровень, на котором был зафиксирован наибольший объем торгов за определенный временной интервал. Этот индикатор полезен для трейдеров, так как он помогает определить ключевые уровни поддержки и сопротивления.

В трейдинге анализ объемов играет ключевую роль, позволяя трейдерам понимать, на каких ценовых уровнях происходят наибольшие сделки. Один из важных инструментов для такого анализа — Volume Point of Control (VPOC), который указывает цену с наибольшим объемом торгов в определенный период. В этой статье мы рассмотрим, как с помощью Python и библиотеки Plotly построить индикатор VPOC на графике цен.
Импорт библиотек
import pandas as pd # Для работы с табличными данными
import plotly.graph_objects as go # Для построения интерактивных графиков
- Pandas используется для обработки и анализа данных.
- Plotly позволяет создавать интерактивные графики, такие как свечные графики и точечные диаграммы.
Настройка временного интервала
INTERVAL = '5min' # Временной интервал для группировки данных
Здесь задается интервал времени, который будет использоваться для группировки данных. В данном случае это 5 минут.
Загрузка данных
<code>def load_data(file_path):
df = pd.read_csv(file_path) # Загрузка данных из CSV-файла
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s') # Преобразование временной метки в формат datetime
return df # Возвращаем DataFrame с обработанными данными</code>
Функция load_data загружает данные из CSV-файла и преобразует столбец timestamp в формат datetime для удобства работы с временными данными.
Расчет VPOC
def calculate_vpoc(df, min_volume=None):
"""
Вычисляет Volume Point of Control (VPOC) для каждого временного интервала с возможностью фильтрации по минимальному объему.
Параметры:
df (pd.DataFrame): Данные с колонками 'timestamp', 'price' и 'size'.
min_volume (int, optional): Минимальный объем для фильтрации ценовых уровней.
Возвращает:
pd.DataFrame: Данные с колонками 'time_bin', 'vpoc_price', 'vpoc_volume'.
"""
df['time_bin'] = df['timestamp'].dt.floor(INTERVAL) # Группировка данных по временным интервалам
vpoc_data = [] # Список для хранения результатов
for time_bin, group in df.groupby('time_bin'): # Группировка данных по временным интервалам
volume_profile = group.groupby('price')['size'].sum() # Суммирование объема по каждому ценовому уровню
if min_volume is not None: # Фильтрация по минимальному объему, если указано
volume_profile = volume_profile[volume_profile >= min_volume]
if not volume_profile.empty: # Если данные не пустые
vpoc_price = volume_profile.idxmax() # Цена с максимальным объемом
vpoc_volume = volume_profile.max() # Максимальный объем
vpoc_data.append([time_bin, vpoc_price, vpoc_volume]) # Добавление результата в список
return pd.DataFrame(vpoc_data, columns=['time_bin', 'vpoc_price', 'vpoc_volume']) # Возврат DataFrame с результатами
- Функция
calculate_vpoc
вычисляет VPOC для каждого временного интервала. Она группирует данные по времени и находит цену с максимальным объемом торгов. - Если задан параметр
min_volume
, то учитываются только те ценовые уровни, объем которых превышает это значение.
Построение графика
def plot_vpoc(df, vpoc_df):
fig = go.Figure() # Создание объекта Figure для построения графика
# Добавление свечного графика
df['time_bin'] = df['timestamp'].dt.floor(INTERVAL) # Группировка данных по временным интервалам
ohlc = df.groupby('time_bin').agg({
'price': ['first', 'max', 'min', 'last'] # Расчет OHLC (Open, High, Low, Close) для каждого интервала
})
ohlc.columns = ['open', 'high', 'low', 'close'] # Переименование колонок
ohlc.reset_index(inplace=True) # Сброс индекса для удобства работы
fig.add_trace(go.Candlestick(
x=ohlc['time_bin'], # Временные метки
open=ohlc['open'], # Цена открытия
high=ohlc['high'], # Максимальная цена
low=ohlc['low'], # Минимальная цена
close=ohlc['close'], # Цена закрытия
name='OHLC' # Название графика
))
# Нормализация объемов для определения размеров маркеров
max_volume = vpoc_df['vpoc_volume'].max() # Максимальный объем
min_marker_size = 5 # Минимальный размер маркера
max_marker_size = 20 # Максимальный размер маркера
def scale_volume_to_size(volume):
return ((volume / max_volume) * (max_marker_size - min_marker_size)) + min_marker_size # Масштабирование объема
vpoc_df['marker_size'] = vpoc_df['vpoc_volume'].apply(scale_volume_to_size) # Применение функции масштабирования
# Добавление VPOC с динамическими размерами маркеров
fig.add_trace(go.Scatter(
x=vpoc_df['time_bin'], # Временные метки
y=vpoc_df['vpoc_price'], # Цены VPOC
mode='markers+lines', # Режим отображения (маркеры и линии)
name='VPOC', # Название графика
line=dict(color='white', width=0.5), # Настройка линии
marker=dict(
color='white', # Цвет маркера
symbol="circle", # Форма маркера
size=vpoc_df['marker_size'], # Размер маркера
sizemode='diameter', # Режим размера маркера
sizeref=0.68, # Коэффициент масштабирования
sizemin=min_marker_size # Минимальный размер маркера
)
))
# Настройка макета графика
fig.update_layout(
title=f"BTCUSDT Volume Point of Control ({INTERVAL})", # Заголовок графика
xaxis_title='Time', # Название оси X
yaxis_title='Price', # Название оси Y
template='plotly_dark', # Темная тема
xaxis_rangeslider_visible=False, # Скрытие ползунка диапазона
height=800 # Высота графика
)
# Фиксация масштаба осей
fig.update_xaxes(
fixedrange=True, # Запретить изменение масштаба по оси X
range=[ohlc['time_bin'].min(), ohlc['time_bin'].max()] # Диапазон оси X
)
fig.update_yaxes(
fixedrange=True, # Запретить изменение масштаба по оси Y
range=[ohlc['low'].min(), ohlc['high'].max()] # Диапазон оси Y
)
fig.show() # Отображение графика
Функция plot_vpoc строит свечной график и добавляет на него точки VPOC. Размер маркеров VPOC зависит от объема торгов на соответствующем ценовом уровне.
Основной процесс
if __name__ == '__main__':
file_path = './BTCUSDT2020-05-23.csv' # Путь к файлу с данными
# Загрузка данных
df = load_data(file_path)
# Расчет VPOC с фильтрацией по минимальному объему
min_volume = 10 # Установите минимальный объем для фильтрации
vpoc_df = calculate_vpoc(df, min_volume=min_volume)
# Построение графика
plot_vpoc(df, vpoc_df)
В основном блоке кода загружаются данные, рассчитывается VPOC и строится график.


Заключение
В этой статье мы разобрали, как с помощью Python и библиотек Pandas и Plotly можно построить индикатор поиска точечного объема (VPOC) на графике. Мы подробно описали каждую строку кода, чтобы вы могли легко адаптировать его под свои нужды.
VPOC — это мощный инструмент для анализа рыночных данных, который помогает трейдерам определять ключевые уровни поддержки и сопротивления, а также следдить за крупным объемам
Ссылка на код в нашем репозитории GitHub — не забудьте поставить звездочку, подписаться на наш профиль в GitHub, а такеже на наш телеграм-канал и профиль на Trading view.