Как найти похожие ситуации в истории графика

Обновлено 2026-09-25 Read in English

Задача формулируется одной фразой: взять последний участок графика и найти в истории того же инструмента все места, где цена двигалась похоже. Дальше можно посмотреть, что происходило после каждого такого места.

Звучит просто, но между «похоже на глаз» и работающим поиском лежит пять решений, каждое из которых меняет результат. Разберём их по порядку — на том же коде, который работает на сайте.

Окно-образец

Сравнивать нужно отрезок с отрезком. Отрезок, который мы ищем, называется образцом, и первое решение — его длина.

На сайте доступны 20, 50, 60 и 100 свечей, по умолчанию стоит 50. Пятьдесят — это компромисс, который видно на обоих концах. На двадцати свечах форма слишком бедная: совпадений находится много, но они мало что значат, потому что почти любое движение из двадцати баров где-нибудь да повторялось. На ста форма настолько специфична, что точных аналогов в истории может не быть вовсе.

Длина образца задаёт и масштаб разговора. Пятьдесят четырёхчасовых свечей — это примерно восемь дней. Пятьдесят дневных — два с половиной месяца. Один и тот же ползунок означает совершенно разные вещи на разных таймфреймах, и это стоит держать в голове.

Нарезка истории

Дальше история того же инструмента нарезается на все возможные окна той же длины: свечи с первой по пятидесятую, со второй по пятьдесят первую, и так до конца. Для BTC/USDT на четырёхчасовом графике это около двадцати тысяч окон.

Каждое окно — кандидат. Задача сводится к тому, чтобы для каждого посчитать меру похожести на образец и оставить те, где она выше порога.

Нормировка: сравниваем траекторию, а не цену

Если сравнивать цены как есть, биткоин по двадцать тысяч никогда не окажется похож на биткоин по девяносто тысяч, даже если рисунок движения совпадает до мелочей. Абсолютные значения не несут информации о форме.

Поэтому каждое окно переводится в проценты изменения от своей первой свечи. Окно, которое начиналось с 20 000 и дошло до 21 000, и окно, которое начиналось с 90 000 и дошло до 94 500, после нормировки выглядят одинаково: плюс пять процентов от старта. Сравнивается траектория, а не ценник.

У этого решения есть цена, и о ней — ниже.

Быстрый предфильтр

Двадцать тысяч кандидатов — это много, если каждого сравнивать дорогим алгоритмом. Поэтому первым идёт дешёвый отсев: коэффициент корреляции Пирсона между образцом и окном. Считается он мгновенно, векторизованно, пачками по две тысячи окон.

Порог — 0.70 для методов, работающих с ценами, и 0.50 для методов, работающих с приращениями: приращения шумнее, и строгий порог срезал бы там слишком много живого.

Пирсон грубоват, он сравнивает точки строго по позициям и не прощает сдвига во времени. Но как предварительный отсев он идеален: то, что не набрало даже 0.70, точно не окажется хорошим совпадением по форме. До дорогого сравнения доходит меньшинство кандидатов.

Подробнее о том, чем Пирсон отличается от основного алгоритма и почему один не заменяет другого, — в отдельном разборе про DTW и корреляцию.

Ограничение амплитуды

Здесь возвращается цена нормировки. Основной алгоритм сравнения нечувствителен к масштабу: движение на один процент и движение на двадцать три процента с одинаковым рисунком он сочтёт похожими, потому что после нормировки они и правда похожи по форме.

На практике это бесполезно. Спокойный дрейф на процент и обвал на двадцать три — разные события, и смотреть, что было после обвала, чтобы понять дрейф, смысла нет.

Поэтому стоит отдельный фильтр по общему движению: суммарное изменение окна от первой свечи к последней должно отличаться от суммарного изменения образца не больше чем на десять процентов относительно. Для образцов с почти нулевым итогом добавлен абсолютный минимум в половину процентного пункта, иначе относительный допуск вырождается в ноль.

Порог похожести

Мера похожести приводится к процентам: сто процентов — полное совпадение, дальше вниз. Ползунок на сайте идёт от 70 до 90 с шагом 10, и по умолчанию стоит на 80.

Разница между делениями гораздо больше, чем кажется по шкале. Вот замер на BTC/USDT, четырёхчасовой график, окно 17–25 сентября 2026 года, метод сравнения по ценам:

Порог Совпадений Вверх Вниз
90 0 — —
80 28 16 12
70 53 28 25

Девяносто — это требование почти точного совпадения формы, и на живом окне оно часто не выполняется ни разу. Семьдесят даёт полсотни аналогов, но «похожесть» там уже вольная.

Отсюда практическое следствие, которое стоит проговорить прямо: чем ниже порог, тем легче найти подтверждение любой гипотезе. Если опустить ползунок до упора и потом рассуждать о том, что «в большинстве случаев цена шла вверх», это будет рассуждение о качестве отбора, а не о рынке.

Непересекающиеся совпадения

Соседние окна отличаются на одну свечу и похожи друг на друга почти так же, как на образец. Если оставить их все, десяток по-настоящему разных эпизодов превратится в сотню записей, и любая статистика по ним будет считать один и тот же случай много раз.

Поэтому из каждой группы пересекающихся окон остаётся одно, лучшее. Двадцать восемь совпадений в таблице выше — это двадцать восемь разных мест в истории, а не двадцать восемь сдвигов одного и того же.

Что в итоге

Поиск аналогов — это конвейер из пяти фильтров: длина образца, нормировка формы, быстрый отсев по корреляции, ограничение амплитуды и порог похожести. Каждый из них можно настроить, и каждый меняет ответ.

Важно понимать, что именно получается на выходе. Это список мест в истории, где цена двигалась похожим образом, и картинка того, что было после каждого из них. Это описание прошлого. Оно не превращается в прогноз оттого, что мы посчитали долю случаев, — о том, что статистика аналогов показывает и чего не показывает, есть отдельный разбор.

Посмотреть на живом графике

Тот же разбор на готовом примере: график, найденные объекты и что было дальше.

Открыть пример