Разработка системы распознавания паттернов (голова и плечи, треугольники, клинья)
Автоматическое распознавание классических графических паттернов — это задача, которая на первый взгляд выглядит простой, но на практике требует серьёзной инженерной работы. Паттерн «голова и плечи» легко увидеть на статичном графике, но детектировать его алгоритмически в реальном времени на тысячах инструментов — совсем другая история.
Классификация паттернов и их алгоритмическое представление
Все паттерны можно разбить на три категории по сложности детектирования:
Разворотные паттерны (Head & Shoulders, Inverse H&S, Double Top/Bottom, Triple Top/Bottom) — формируются на значимых уровнях, сигнализируют о смене тренда.
Паттерны продолжения (Ascending/Descending/Symmetrical Triangle, Bull/Bear Flag, Pennant, Wedge) — формируются в середине тренда как консолидация перед продолжением.
Паттерны канала (Rising/Falling Channel, Rectangle) — цена движется между параллельными уровнями.
Алгоритм обнаружения: метод опорных точек (Pivot Points)
Основной подход — выделение локальных экстремумов (swing highs и swing lows) и анализ их последовательности.
Этап 1: Поиск pivot points
def find_pivots(highs, lows, window=5):
pivot_highs = []
pivot_lows = []
for i in range(window, len(highs) - window):
if highs[i] == max(highs[i-window:i+window+1]):
pivot_highs.append((i, highs[i]))
if lows[i] == min(lows[i-window:i+window+1]):
pivot_lows.append((i, lows[i]))
return pivot_highs, pivot_lows
Размер окна (window) влияет на «масштаб» обнаруживаемых паттернов. Малое окно даёт паттерны на коротких таймфреймах, большое — на долгосрочных.
Этап 2: Матчинг паттернов
Для «головы и плеч» нужно найти последовательность из 5 pivot points: left shoulder (high), neckline left (low), head (highest high), neckline right (low), right shoulder (high).
Условия для валидного H&S:
- Head выше обоих shoulders (tolerance ±2%)
- Оба shoulders примерно одной высоты (разница < 5%)
- Neckline relatively horizontal (наклон < 15°)
- Right shoulder не превышает Head
Этап 3: Детектирование треугольников
Треугольники определяются через линейную регрессию по pivot points:
- Symmetrical: нисходящая линия по highs + восходящая по lows, конвергирующие к одной точке
- Ascending: горизонтальное сопротивление + восходящая поддержка
- Descending: горизонтальная поддержка + нисходящее сопротивление
Качество треугольника оценивается через R² коэффициент линейных регрессий. R² > 0.85 — хороший треугольник.
Этап 4: Клинья (Wedges)
Клин (wedge) отличается от треугольника тем, что обе линии направлены в одну сторону:
- Rising Wedge (медвежий сигнал): обе линии восходящие, верхняя более пологая
- Falling Wedge (бычий сигнал): обе линии нисходящие, нижняя более пологая
Ключевое условие: линии конвергируют (угол между ними уменьшается).
Оценка качества паттерна и target projection
Каждый обнаруженный паттерн получает score (0–100) на основе:
- Симметричности (для H&S)
- R² линий (для треугольников)
- Соотношения объёма (объём при формировании должен снижаться)
- Завершённости паттерна (breakout уже произошёл или нет)
Target projection — расчёт цели после breakout:
- H&S: цель = уровень neckline − высота головы
- Треугольник: цель = точка апекса ± высота основания
- Клин: цель = начало клина
Backtest и оценка надёжности
Система включает backtesting модуль: для каждого исторически обнаруженного паттерна проверяем, сработал ли target в течение следующих N свечей, и с каким процентом success rate. Это позволяет калибровать пороговые значения под конкретный актив и таймфрейм.
Типичная надёжность на крипторынке (по историческим данным BTC/ETH):
| Паттерн | Win Rate | Среднее отношение R/R |
|---|---|---|
| H&S (confirmed) | 55–65% | 1:1.5 |
| Ascending Triangle | 60–70% | 1:1.8 |
| Symmetrical Triangle | 50–55% | 1:1.2 |
| Falling Wedge | 60–68% | 1:2.0 |
Архитектура системы
Backend: Python (pandas, numpy, scipy для линейной регрессии), обработка OHLCV данных из биржевых API (CCXT library). Scan по всем инструментам запускается по расписанию (cron) на каждом закрытии свечи.
База данных: PostgreSQL для хранения обнаруженных паттернов с параметрами, статусом (forming/confirmed/failed) и результатами.
Frontend: React + TradingView Lightweight Charts. Паттерны отрисовываются как SVG-оверлеи поверх ценового графика — линии плеч, neckline, линии треугольника с подписями.
Алерты: При обнаружении нового подтверждённого паттерна или при пробое уровня — уведомление в Telegram или через webhook.
Масштабирование
Для сканирования 500+ инструментов в реальном времени используется параллельная обработка через Python multiprocessing или Celery. Результаты кэшируются в Redis. Полный скан 500 инструментов на 4h таймфрейме занимает 15–30 секунд на стандартном сервере.
Мы разрабатываем систему с настраиваемой чувствительностью детектора, поддержкой нескольких таймфреймов одновременно, визуализацией паттернов на графике и встроенным backtesting'ом для оценки качества алгоритма на исторических данных.







