Фиделити-гейт: поиск от грубого к точному обманывает быстрее, если дешевый прокси не ранжирует так же, как дорогой
Часть серии "Бэктесты без иллюзий".
Любой серьезный поиск параметров упирается в одну и ту же стену: пространство огромно, а каждая честная оценка стоит дорого. Мультитаймфреймовая стратегия с дюжиной порогов и тремя периодами индикаторов, оцененная на многофолдовом walk-forward разбиении, может стоить секунды на одну конфигурацию. Десять тысяч конфигураций — это часы. Поэтому вы ищете обходной путь, и обходной путь всегда один и тот же: оценивать дешево, продвигать к дорогому тесту только выживших. Отсеять десять тысяч конфигураций на одном фолде, оставить топ несколько сотен, прогнать их на всех фолдах. Отсеять на часовых свечах, углубиться до 1-секундных только для финалистов.
Это поиск от грубого к точному — drill-down, мультификсиделити, successive halving, Hyperband, ASHA — и это одна из по-настоящему хороших идей в оптимизации. Она может превратить день вычислений в час. Мы ее используем. Но она скрывает ловушку настолько тихую, что большинство тех, кто ее применяет, никогда ее не проверяют, и ловушка вот в чем: весь метод предполагает, что ваш дешевый прокси ранжирует конфигурации так же, как дорогая оценка. Если это не так, вы не ищете быстрее. Вы выбрасываете своих будущих победителей на первом же гейте и продвигаете шум — вы просто обманываете себя быстрее.
Эта статья о том единственном измерении, которое покажет, реален ли ваш drill-down или это иллюзия. Мы прогнали его на собственном мультитаймфреймовом поиске, и ответ оказался неприятным: на самой дешевой фиделити наш прокси ранжировал конфигурации почти случайно (Spearman ρ ≈ 0.03). Если бы мы агрессивно отсекали на этой фиделити — как приглашают делать настройки по умолчанию в любой коробочной ASHA — мы бы отбросили итоговых победителей уже в первом раунде. Решение — обязательный гейт, который выполняется до поиска: измерить корреляцию рангов и отказаться отсекать ниже той фиделити, на которой она заслуживает доверия.
Что такое мультификсиделити-поиск на самом деле

У этого семейства методов одна форма. Вы определяете фиделити (также называемую ресурсом или бюджетом) — регулятор от дешевого к дорогому, который на максимуме дает истинную целевую метрику. Затем вы прогоняете конфигурации на низкой фиделити, ранжируете их, оставляете лучшую долю и повторно прогоняете только выживших на более высокой фиделити — повторяя, пока небольшое число финалистов не будет оценено на полной фиделити.
Successive halving (Jamieson & Talwalkar, 2016) — это ядро метода: запустить N конфигураций с минимальным ресурсом, оставить топ 1/η, умножить ресурс на η, повторить. Hyperband (Li et al., 2018) оборачивает successive halving во внешний цикл, который хеджирует по разным стартовым ресурсам, так что вам не нужно угадывать, насколько агрессивно отсекать. ASHA (Li et al., 2020) — это асинхронная, дружественная к параллелизму версия. Скорость отсева η — единственная общая для них ручка настройки; канонический дефолт — η = 3: оставлять верхнюю треть на каждой ступени, утраивать бюджет.
Сама фиделити может быть почти чем угодно, что переходит от дешевого к дорогому и сходится к истине:
- Число walk-forward фолдов. Оценка на 1 фолде, затем на 2, затем на 3, вплоть до K. Это фиделити, которую мы изучаем ниже, потому что она естественна для бэктеста со скользящим out-of-sample разбиением.
- Разрешение свечей. Отсев на часовых барах, продвижение к минутным, углубление до 1-секундных или сырых сделок только для финалистов. Это идея адаптивного drill-down, примененная к поиску, а не к симуляции исполнения.
- Длина истории, число эпох, подвыборка датасета — классические фиделити из ML.
В бэктесте важны именно фолды и разрешение, и — это главная мысль всей статьи — они не одинаково безопасны. У одной из них есть смещение, которое тихо выбирает неверные параметры, как бы аккуратно вы ни настраивали гейт.
Единственное предположение, на котором все держится

Запишем, что на самом деле требуется successive halving, чтобы быть корректным. Ему не нужно, чтобы дешевая фиделити давала правильное значение целевой метрики — никого не волнует, что один фолд показывает другой Sharpe, чем шесть фолдов. Нужно нечто более слабое, но гораздо более специфичное: дешевая фиделити должна ранжировать конфигурации так же, как дорогая. Если конфигурация A обходит конфигурацию B на полной фиделити, A должна иметь тенденцию обходить B и на низкой фиделити. Это все. И это же — всё.
Формально величина, которая определяет, работает ли drill-down, — это корреляция рангов между низкофиделити и высокофиделити целевой метрикой по всему пространству конфигураций. Если эта корреляция высока, выжившие после дешевого раунда — те же конфигурации, что победили бы в дорогом раунде, и вы бесплатно сэкономили вычисления. Если она низка, дешевый раунд — случайный фильтр: он отбрасывает хорошие конфигурации и продвигает плохие, а вы потратили бюджет на то, чтобы быстрее прийти к худшему ответу. Никакая промежуточная настройка η вас не спасет — плохой прокси при мягком отсеве все равно теряет победителей; при агрессивном отсеве он теряет их массово.
Провал невидим обычным образом. Поиск завершается, выдает чемпиона, чемпион выглядит нормально in-sample. Ничего не выбрасывает ошибку. Вы обнаруживаете, что прокси лгал, только когда чемпион разваливается out-of-sample — и к тому моменту вы уже приписали провал стратегии, а не поиску, который ее выбрал. Так что дисциплина та же самая, к которой эта серия статей возвращается снова и снова: измеряйте то, что предполагает метод, прежде чем доверять методу. Для drill-down нужно измерять корреляцию рангов, и это измерение дешево.
Как это измерить: фиделити-гейт

Гейт — это небольшой эксперимент, который вы запускаете один раз, перед основным поиском, на том же пространстве, которое собираетесь искать. Процедура:
- Взять несколько сотен конфигураций случайным образом из пространства параметров (мы используем ~200 — достаточно для устойчивой оценки Спирмена, и достаточно дешево, чтобы это можно было себе позволить).
- Оценить каждую на каждой ступени фиделити: на 1 фолде, 2 фолдах, … вплоть до полных K фолдов. Для фиделити на основе числа фолдов это почти бесплатно, потому что фолды, вычисленные для дешевых ступеней, повторно используются в дорогой — как кумулятивное среднее.
- Для каждой ступени
rвычислить ранговую корреляцию Спирмена между ранжированием на r фолдах и полным K-фолдовым ранжированием по этим ~200 конфигурациям. - Первая ступень, на которой ρ пересекает порог (мы используем ρ ≥ 0.5), — это самая мелкая фиделити, на которой вам разрешено отсекать. Ниже нее ранжирование слишком шумное, чтобы доверять ему; там нельзя устранять конфигурации.
Все это — пара десятков строк. Суть:
def fidelity_check(cache, n_probe, seed=7):
"""Spearman ρ: cumulative mean over the first r folds (in FOLD_ORDER)
vs the full K-fold objective, on n_probe random configs."""
rng = np.random.default_rng(seed)
k = len(FOLDS)
per_fold = np.empty((k, n_probe))
order_win = np.array([list(FOLDS[fi]) for fi in FOLD_ORDER], np.int64)
for j in range(n_probe):
p = _unit_to_params(rng.random(len(PNAMES))) # random config
scores, *_ = eval_group(cache, p, _sp_of(p)[None, :], order_win, False)
per_fold[:, j] = scores[0] # score on each fold
cums = np.cumsum(per_fold, axis=0) / np.arange(1, k + 1)[:, None] # r-fold mean
rhos = []
for r in range(1, k):
rho = spearmanr(cums[r - 1], cums[-1]).statistic # r folds vs all K
rhos.append(0.0 if math.isnan(rho) else rho)
return rhos
Обратите внимание на одну намеренную деталь: фолды берутся в порядке FOLD_ORDER, чередующемся порядке, который перемежает ранние и поздние срезы календаря (фолд 0, затем средний фолд, затем фолд 1, затем более поздний, …). Это имеет огромное значение и является предметом одного из следующих разделов: это значит, что "1 фолд" — это один срез, охватывающий середину истории, а "2 фолда" — это один ранний плюс один поздний срез — никогда не непрерывное недавнее окно. Дешевая фиделити становится дешевле за счет меньшего числа фолдов, а не за счет более недавних.
Результаты: один фолд ранжирует почти случайно

Вот что показал гейт, запущенный на двух наших мультитаймфреймовых сетапах. Число — это Spearman ρ между ранжированием на r фолдах и полным K-фолдовым ранжированием по ~200 случайным конфигурациям — насколько верно дешевофиделитный ранг предсказывает полнофиделитный ранг.
Фолдов r |
Мульти-TF прогон | Более сложный режим |
|---|---|---|
| 1 | +0.43 | +0.03 |
| 2 | +0.67 | +0.43 |
| 3 | +0.78 | +0.78 |
| 4 | +0.82 | — |
| 5 | +0.91 | +0.91 |
Читайте сначала колонку "более сложный режим", потому что она тревожная. На одном фолде ρ = 0.03. Это не слабая корреляция; это отсутствие корреляции — ранжирование двухсот конфигураций на одном фолде статистически неотличимо от их перетасовки. Прогон successive halving, настроенный (как большинство — по умолчанию) начинать отсев с min_resource = 1, в этом режиме сделал бы свой первый и самый агрессивный отсев на основе подбрасывания монетки. Конфигурации, которые в итоге победили бы на полной фиделити, имеют шанс 50/50 пережить самый первый раунд. К тому моменту, когда вы достигаете фиделити, на которой ранжирование хоть что-то значит (ρ = 0.78 на трех фолдах), большинство из них уже потеряно.
Колонка мульти-TF мягче, но говорит о том же самом иначе. Даже там один фолд дает ρ = 0.43 — ниже нашего гейта в 0.5. Это выглядит как неплохая корреляция, и именно в этом опасность: 0.43 достаточно высоко, чтобы усыпить бдительность, и достаточно низко, чтобы слить ваши лучшие конфигурации. Только на двух фолдах (ρ = 0.67) ранжирование становится заслуживающим доверия.
Из этого обобщаются две вещи. Во-первых, ρ на одном фолде зависит от режима и ненадежно — мы измеряли значения от 0.03 до 0.43 в разных сетапах, и ни в одном случае один фолд не прошел планку. Во-вторых, ρ растет монотонно и быстро: к трем фолдам оба сетапа выходят на 0.78, а к пяти сходятся к 0.91. Сигнал там есть; нужно просто потратить достаточно фиделити, чтобы его увидеть. Задача гейта — найти точную ступень, на которой начинается это "достаточно", и запретить отсев ниже нее.
Почему один фолд настолько шумный
Этот шум — не баг в конструкции наших фолдов; он присущ самой природе задачи, и понимание причины удерживает от "исправления" неправильным способом. Один walk-forward фолд — это короткое окно, недели одного рыночного режима. Оценка стратегии на этом окне определяется в основном тем, насколько удачно ее параметры подошли именно этому режиму, что лишь слабо связано с тем, насколько хорошо они обобщаются. Две конфигурации, реально разные по качеству, могут поменяться местами на одном фолде просто потому, что одна из них поймала тренд, который случайно оказался в этом фолде. Целевая метрика на одном фолде — это оценщик с высокой дисперсией той метрики, которая на самом деле нужна, а ранговая корреляция — это именно то, что высокая дисперсия разрушает в первую очередь: можно сохранить среднее значение оценщика, пока его ранжирование — чистый шум.
Добавление фолдов усредняет эту дисперсию. Каждый фолд — частично независимая выборка рыночных условий; среднее по r фолдам — это оценщик с меньшей дисперсией, и его ранжирование сходится к полнофиделитному ранжированию. Это в точности тот подъем ρ = 0.03 → 0.43 → 0.78 → 0.91: меняется не целевая метрика, а стабилизируется ее оценка ранга по мере того, как усредняется удача, специфичная для режима. Урок в том, что фиделити для бэктеста — это фундаментально про то, сколько независимых режимов вы выбрали в качестве образца — а один почти никогда не бывает достаточным, чтобы по нему ранжировать.
Это также объясняет, почему более сложный режим стартует с 0.03, а мульти-TF прогон — с 0.43. В более сложном режиме единственный фолд более идиосинкратичен для этого режима — однофолдовые оценки конфигураций определяются больше удачей и меньше устойчивым преимуществом, поэтому они ранжируются ближе к случайному. Гейт автоматически считывает эту разницу и реагирует, требуя больше фолдов, прежде чем разрешит отсев. Вам не нужно заранее знать, в каком режиме вы находитесь — вы это измеряете.
Гейт в коде: автоматическое повышение минимальной фиделити
Результат работы гейта — одно целое число: min_resource, самая мелкая фиделити, на которой ASHA разрешено отсекать. Правило механическое — пройти по ступеням, взять первую, у которой ρ проходит порог:
RHO_GATE = 0.5
min_res = len(FOLDS) # default: pruning OFF (full fidelity)
rhos = fidelity_check(cache, n_probe=200) # [ρ@1, ρ@2, …, ρ@(K-1)]
passing = [r for r, rho in enumerate(rhos, 1) if rho >= RHO_GATE]
if passing:
min_res = passing[0] # first rung that clears the gate
pruner = SuccessiveHalvingPruner(min_resource=min_res, reduction_factor=3)
Проследим это на обоих прогонах. В сетапе мульти-TF ρ@1 = 0.43 не проходит гейт, но ρ@2 = 0.67 проходит его, поэтому min_resource автоматически поднимается до 2: ASHA прогоняет каждую конфигурацию как минимум на двух фолдах, прежде чем ей разрешено что-либо устранять, а дальше отсеивает как обычно. В более сложном режиме ни ρ@1 = 0.03, ни ρ@2 = 0.43 не проходят; ρ@3 = 0.78 — первое значение, прошедшее порог, поэтому min_resource становится 3. И важнейший фолбэк: если ни одна ступень не достигает 0.5, passing пусто, и min_resource остается равным K — отсев полностью отключается, и поиск деградирует изящно до обычного полнофиделитного поиска, а не до быстрого, но неверного. Drill-down, который не может доказать надежность своего прокси, просто отказывается отсекать.
Это вся философия в одной строчке управляющего кода. По умолчанию любая библиотека successive halving гласит: "отсекай начиная с min_resource = 1, доверяй дешевой ступени". Гейт заменяет это на "отсекай начиная с первой ступени, которую данные объявили заслуживающей доверия, а если такой нет — не отсекай вообще". Он стоит одного пробного прогона на ~200 конфигураций и превращает drill-down из акта веры в измеренное решение. Скорость отсева η = 3 остается без изменений; гейт не трогает, насколько сильно вы отсекаете, только то, насколько рано вам разрешено начать.
Одно честное замечание, видное в приведенном выше коде: повышение min_resource съедает часть ускорения. Отсев на 3 фолдах вместо 1 означает, что каждая конфигурация — включая те, которые вы в итоге отбросите, — оплачивает три фолда. Это цена корректности, и это правильный обмен: вдвое меньшее ускорение на поиске, который находит настоящих победителей, лучше, чем шестикратное ускорение на поиске, который их отбрасывает. Гейт делает этот обмен явным, а не прячет его.
Неверная дешевая ось: более короткая история — это ловушка
Есть дешевая фиделити, соблазнительная, очевидная и смещенная, и ее стоит назвать по имени, потому что к ней тянутся первой: более короткая история. Отсеять конфигурации на последнем месяце, продвинуть выживших на полные два года. Это тривиально дешево, и ощущается как та же идея, что и меньшее число фолдов. Это не так.
Меньшее число фолдов и более короткая история различаются одним решающим образом. Фиделити на основе числа фолдов, сделанная правильно, все равно охватывает весь календарь — она просто выбирает его более грубо. Фиделити на основе более короткой истории плотно выбирает подынтервал календаря. А подынтервал рыночной истории — это конкретный режим. Когда вы ранжируете конфигурации по последнему месяцу, вы получаете не шумную, но несмещенную оценку их ранга по полному периоду; вы получаете смещенную оценку, которая систематически благоприятствует конфигурациям, подогнанным под режим последнего месяца. Увеличивайте размер выборки сколько угодно — усредняйте по большему числу конфигураций, большему числу прогонов, — и смещение не уменьшится, потому что это не дисперсия. Вы будете продвигать конфигурации, которые лучше всего подходят под окно отсева, а это именно те, которые с наибольшей вероятностью переобучены под временный режим.
Именно поэтому наша фиделити проходит по фолдам в чередующемся порядке, а не хронологически. При K фолдах, распределенных по всей истории, "1 фолд" — это единственный срез около середины, "2 фолда" — это один ранний и один поздний срез, "3 фолда" охватывают ранний/средний/поздний — каждый уровень фиделити, даже самый дешевый, охватывает выборкой весь календарь. Дешевый прокси — это грубый взгляд на весь период, а не резкий взгляд на один его срез. Именно это чередование делает фиделити на основе числа фолдов просто шумной (излечимо гейтом), а не смещенной (что не может исправить никакой гейт — высокое ρ против смещенной цели всего лишь подтверждает, что вы будете надежно выбирать конфигурацию, подогнанную под режим). Если единственный способ удешевить вашу фиделити — сделать ее более недавней, у вас нет валидной фиделити. Сделайте ее более грубой вместо этого.
Разрешение как честная дешевая ось
Другая дешевая ось полностью избегает смещения, и она — естественный партнер адаптивного drill-down, который мы описали для симуляции исполнения: разрешение свечей. Отсеять все пространство на часовых барах, продвинуть выживших на минутные, углубиться до 1-секундных или сырых сделок только для горстки финалистов. Более грубые свечи на том же полном периоде истории дешевле в оценке — меньше баров, быстрее проходы индикаторов, быстрее симуляция — и, в отличие от короткого окна, грубый взгляд на весь календарь несмещен: он видит каждый режим, просто с меньшей внутрибарной детализацией.
Разрешение и фолды — взаимодополняющие оси фиделити, и фиделити-гейт применяется к обеим. Прежде чем доверять отсеву на часовых свечах, запустите тот же зонд: возьмите ~200 конфигураций, оцените их на 1ч и на 1м и измерьте корреляцию рангов. Если ρ(1ч, 1м) высоко, отсев на часах безопасен, и вы честно купили большое ускорение. Если оно низкое — что случается, когда преимущество стратегии живет во внутрибарной структуре, которую часовые свечи размазывают, — тогда часовой отсев для этой стратегии является случайным фильтром, и гейт говорит вам начинать с более мелкого разрешения. Правило никогда не меняется: вам разрешено отсекать на данной фиделити только после того, как вы измерили, что ее ранжирование согласуется с истиной.
Эти две оси еще и терпят неудачу противоположными способами, что полезно. Грубое разрешение теряет внутрибарную информацию; меньшее число фолдов теряет межрежимную информацию. Моментум-стратегия на дневных горизонтах может идеально ранжироваться на часовых свечах, но нуждаться во многих фолдах, чтобы усреднить удачу режима; скальпинговая стратегия может нормально ранжироваться на малом числе фолдов, но разваливаться выше 1-секундного разрешения. Гейт, запущенный по каждой оси отдельно, говорит вам, на какой фиделити вы можете позволить себе экономить для этой конкретной стратегии — вместо того, чтобы предполагать ответ, который просто удобен.
Откуда на самом деле берется экономия
Оговорка, которая удерживает drill-down честным: фиделити экономит вычисления только там, где реально живет стоимость. В нашем мультитаймфреймовом движке дорогая часть — это предвычисление индикаторов: мультитаймфреймовые HMA и сигналы разделения, которые оплачиваются один раз на конфигурацию, до запуска какого-либо фолда. Симуляция по фолдам на кэшированных сигналах сравнительно дешева. Так что отсев по числу фолдов экономит только стоимость симуляции, а не стоимость индикаторов, которая доминирует; фиделити по числу фолдов реальна, но ее потолок ниже, чем подсказывает сырое соотношение фолдов.
Ось разрешения, напротив, атакует доминирующую стоимость напрямую: более грубые свечи означают меньше баров, на которых нужно вычислять индикаторы, так что и дорогое предвычисление, и дешевая симуляция сжимаются вместе. Это не мелочь — именно это решает, какой drill-down стоит строить. Прежде чем вкладываться в мультификсиделити-поиск, спросите, куда уходят ваши секунды. Если 90% — это предвычисление индикаторов, общее для всех фолдов, фиделити по числу фолдов купит вам мало, а фиделити по разрешению купит много. Сначала профилируйте; правильная дешевая ось — та, что устраняет стоимость, которая у вас реально есть, и она все равно должна пройти гейт.
Где это связано с остальным
Фиделити-гейт занимает конкретное место в цепочке гигиены бэктестинга, которую строит эта серия:
- Он находится выше по цепочке контроля переобучения. Drill-down, отсекающий по плохому прокси, — это новый способ переобучиться: вы позволяете шумной ранней ступени выбирать ваших финалистов. Чемпион все равно должен пережить Deflated Sharpe и PBO, и число испытаний, попадающих в эти гейты, должно включать каждое отсеянное испытание, а не только выживших — отсев не делает испытание бесплатным с точки зрения учета множественного тестирования.
- Он разделяет своего врага с анализом плато: конфигурация, которая побеждает на одном фолде или одном окне отсева и больше нигде, — это тот же артефакт подгонки под режим, который оба инструмента призваны отвергать. Гейт отказывается отбирать по такому фолду; анализ плато отказывается доверять чемпиону, который стоит на одном таком фолде.
- Он предполагает честное walk-forward разбиение в основе — фолды, охватывающие весь календарь, out-of-sample данные, отложенные в сторону, — и является дополнением на этапе поиска к drill-down, который мы построили для симуляции исполнения: тот же принцип от грубого к точному, примененный к тому, какие конфигурации оценивать, а не к тому, насколько точно их исполнять.
- И он абсолютно зависит от того, чтобы фиделити была свободна от утечек на каждой ступени. Если у дешевой ступени есть look-ahead смещение, которого нет у дорогой, ρ измеряет согласие с загрязненной целью, и гейт сертифицирует утечку. Измеряйте ранговую корреляцию — да, но на честной целевой метрике.
Объединяющая идея, опять же, та, которую эта серия не устанет повторять: бэктест — это статистический эксперимент, и любой обходной путь в нем — это гипотеза, которую вы обязаны проверить. Гипотеза drill-down: "дешевый ранг ≈ дорогой ранг". Она проверяема на ~200 конфигурациях. Проверьте ее.
Выводы
- Поиск от грубого к точному опирается на одно предположение: дешевый прокси ранжирует конфигурации так же, как дорогой. Не то же самое значение — то же самое ранжирование. Если ранговая корреляция низка, агрессивный отсев отбрасывает ваших будущих победителей и продвигает шум. Вы ищете быстрее к худшему ответу.
- Измеряйте это, прежде чем доверять. Возьмите ~200 случайных конфигураций, оцените их на каждой ступени фиделити и вычислите Spearman ρ между каждой дешевой ступенью и полнофиделитным ранжированием. Это пара десятков строк и один дешевый зонд.
- Один фолд ранжирует почти случайно. Мы измеряли ρ@1 от 0.03 (подбрасывание монетки) до 0.43 (все еще ниже доверительного порога) в зависимости от режима; оно поднимается до 0.67, 0.78, 0.82 и 0.91 по мере накопления фолдов. Дефолтный
min_resource = 1любой коробочной ASHA для бэктеста обычно неверен. - Автоматически поднимайте минимальную фиделити до первой ступени, где ρ ≥ 0.5, а если ни одна не проходит порог — не отсекайте вообще. Гейт превратился в
min_resource = 2для одного сетапа и3для более сложного; фолбэк изящно деградирует до полнофиделитного поиска. Корректность стоит некоторого ускорения — заплатите за нее. - Выбирайте дешевую ось по тому, смещена ли она, а не по тому, дешева ли она. Более короткая история смещена — она отбирает параметры, подогнанные под режим, и никакой размер выборки этого не исправит. Используйте меньшее число фолдов, охватывающих весь календарь (чередующихся, а не непрерывных), либо более грубое разрешение на всем периоде. И тратьте дешевую ось там, где реально живет ваша стоимость.
Drill-down — одно из лучших ускорений в бэктестинге и один из самых легких способов превратиться в более быстрый способ обмануть самого себя. Разница между этими двумя — одно число, которое можно измерить до начала поиска. Если ваш прокси не может доказать, что ранжирует так же, как истина, это не прокси — это генератор случайных чисел с правдоподобным профилем стоимости.
Авторы
Инженер торговых систем
Разработка торговых ботов с 2017 года: межбиржевой арбитраж (подключал до 30 бирж), парный арбитраж на коинтеграции между спотом и фьючерсами, скальпинг, фронтраннинг, торговля по новостям, сентиментный анализ, трендовые алгоритмы, а также алгоритмы управления и балансировки портфелей. Делает выставление ордеров до 1 мс, warehouse для big data, бэктестинг-движки, AI-агентов и интерфейсы для ботов (в т.ч. open-source profitmaker.cc). Стек: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, архитектура.