Продолжаем цикл «Аллокация капитала».
Сегодня первый практический алгоритм — равновесная кластеризация по корреляции. Это самый простой и прозрачный способ: собрали похожих роботов в кластеры и поделили капитал поровну. Никаких оценок волатильности — только корреляция.
1) Торговая идея
Идея на поверхности: если два робота торгуют почти одинаково, не надо давать им обоим полный капитал. Сначала соберём похожих в группы, а уже потом поделим деньги между группами поровну.
Почему «равновесный»: капитал делится ровно — 1/N на кластер, внутри кластера — поровну на каждого робота. Просто, предсказуемо, и никакой оценки риска не требуется.
2) Формулы
Шаг 1. Доходность. По файлам позиций OsEngine считает доходность каждого робота за период (неделю или месяц). На выходе — матрица «роботы × периоды», где каждая ячейка — процент за период. Пропущенные у робота периоды добиваются нулями.
Шаг 2. Корреляция. Между каждой парой роботов считается корреляция Пирсона:
ρ = cov(x, y) / (σx · σy)
где x и y — ряды доходностей двух роботов.
Шаг 3. Расстояние. Корреляция — это «похожесть», а для кластеризации удобнее «расстояние». Превращаем одно в другое:
d = √(0,5 · (1 − ρ))
Смотрите, как красиво: ρ = 1 → d = 0 (роботы близнецы), ρ = 0 → d ≈ 0,71, ρ = −1 → d = 1 (максимально разные).
Шаг 4. Кластеризация. Метод — полная связь (complete-linkage): робот попадает в кластер, только если его корреляция выше порога со ВСЕМИ роботами этого кластера. Другими словами, кластер — это «клика»: любая пара внутри неё достаточно похожа.
Порог задаёт один параметр — min_correlation. Чем он выше, тем жёстче требование и тем больше кластеров (вплоть до «каждый сам по себе»). Чем ниже — тем крупнее группы.
Шаг 5. Веса. Капитал делится поровну: 1/N на кластер, внутри — поровну на робота. Вес робота:
w = 1 / (N · M)
где N — число кластеров, M — число роботов в его кластере.
3) Почему именно полная связь, а не «похожесть к лидеру»
Есть и другой, наивный способ: выбрать «лидера» и клеить к нему всех, кто похож на него. Проблема в том, что два робота, оба похожие на лидера, могут быть совсем не похожи друг на друга — а вы их сложили в один кластер. Плюс такой способ зависит от порядка перебора роботов.
Полная связь лишена обоих недостатков: кластер определяется только данными (порогом), а не порядком. Результат детерминирован — два запуска дают одинаковые кластеры.
4) Интерфейсы
В OsEngine алгоритм живёт на вкладке «Расчёты» → «Равновесная кластеризация».
Поле min_correlation — тот самый порог (по умолчанию 0,4).
5) MCP API
Тот же алгоритм доступен через MCP — для автоматической работы ИИ:
allocation_clustering_settings_set — задать min_correlation;Ответ result_get повторяет таблицу на экране: по каждому кластеру — номер и список роботов, по каждому роботу — его номер в кластере и веса-плечи 100%–600%.
6) Когда выбирать этот алгоритм
Равновесная кластеризация — это «просто и понятно». Она не пытается оценить, какой робот рискованнее, а просто разносит капитал по группам. Выбирайте её, когда важна прозрачность и не хочется полагаться на оценку волатильности. Если же хочется, чтобы менее волатильные роботы получали больше капитала — нужен HRP, о нём следующая статья.
Удачных алгоритмов!
https://smart-lab.ru/company/os_engine/blog/1024149.php
Скачать OsEngine: https://github.com/AlexWan/OsEngine
Официальная поддержка OsEngine в MAX:https://max
Канал Научный трейдинг в MAX:https://max.ru/
Поддержка OsEngine в Телеграм:https://t.me/osengine_official_support
Канал Научный трейдинг (Bad Quant) в Телеграм:https://t.me/bad_quant