1. Введение: почему скалярный критерий Келли не работает при параллельных ставках
В квантитативном беттинге и алгоритмической торговле на спортивных рынках классическая работа Джона Л. Келли-младшего 1956 года «A New Interpretation of Information Rate» служит фундаментальной основой для расчета оптимального размера позиции. Традиционная скалярная формула Келли определяет точную долю банкролла , максимизирующую асимптотическую геометрическую скорость роста капитала при изолированной оценке отдельного пари:
Здесь — истинная субъективная вероятность выигрыша, — вероятность поражения, — чистый выигрыш на единицу ставки, а — десятичный коэффициент букмекера. В строго последовательном режиме, когда исход каждой ставки становится известен и капитал пересчитывается до заключения следующего пари, критерий Келли гарантирует математически максимальный долгосрочный логарифмический рост при нулевой вероятности полного разорения.
Одновременные позиции используют общий банк до расчёта. Отдельные скалярные доли Келли могут превысить единицу в сумме, но это зависит от вероятностей и цен, а не типичного числа недельных возможностей. Проверяйте допустимость и капитал по совместным состояниям; сумма меньше единицы также не гарантирует оптимум логарифмического роста.
Более того, параллельные события нередко связаны скрытой корреляцией: ставки на чистую победу фаворита (1X2), минусовую фору (-1.5) и тотал больше 2.5 в одном и том же матче несут высокую статистическую зависимость. Независимый расчет Келли в таких ситуациях катастрофически недооценивает хвостовые риски портфеля.
Для корректного распределения банкролла между параллельными позициями необходимо переходить от скалярной арифметики к многомерной портфельной оптимизации по критерию Келли (Simultaneous / Multivariate Kelly). В данной статье приводится строгий математический вывод многомерного логарифмического критерия, аналитическое решение для независимых рынков, квадратичное программирование для ковариационных матриц и готовый алгоритм на Python.
2. Математическая формулировка: максимизация логарифмической полезности
Пусть начальный банкролл инвестора равен . В момент времени доступно параллельных неисключающих событий. Аналитик определяет вектор долей распределения капитала , где — доля банкролла в ставке , а нераспределенный остаток удерживается в виде безрискового кэша с нулевой доходностью.
Для событий существует возможных совместных состояний исходов в пространстве событий , где каждое состояние наступает с вероятностью , а . Для каждого состояния вектор чистых выплат равен , где:
Мультипликатор совокупного капитала в состоянии составляет:
Задача квант-инвестора — максимизировать математическое ожидание логарифма конечного капитала :
Квадратичная задача ниже приближает цель с помощью A. Условия KKT характеризуют решение при обычных условиях регулярности ограничений. Положительная полуопределённость даёт вогнутость приближённого роста, но не измеренное время работы или автоматический успех оптимизации. Точная цель вогнута; строгая единственность дополнительно требует, чтобы векторы доходностей с положительными вероятностями различали допустимые направления. Избыточные позиции могут разделять один оптимум.
3. Независимые состояния и квадратичное приближение
Независимость позволяет разложить совместные вероятности в произведения, но не превращает логарифм общего капитала в сумму отдельных логарифмов. Деньги заняты одновременно, поэтому точный оптимум решает общую задачу состояний. Для двух независимых бинарных ставок с коэффициентом 2 и вероятностью 0.6 скалярный Келли равен 0.2 на каждую, а точный одновременный равен 5/26, примерно 0.1923076923. Два проигрыша имеют вероятность 0.16 и множитель капитала 1-2f; смешанные состояния дают 1, две победы имеют вероятность 0.36 и множитель 1+2f. Производная этого логарифмического ожидания даёт указанный оптимум.
Разложение Тейлора второго порядка использует матрицу вторых моментов A, а не только ковариацию C. Внешнее произведение средних ненулевое при ненулевых преимуществах. Даже при независимости внедиагональные элементы A равны mu_i mu_j. Использование одной диагональной ковариации является дополнительным приближением для малых средних. Точность зависит от малости возможных доходностей всего портфеля, а не только отдельных долей. Стационарная точка без ограничений может нарушать бюджет или требовать отрицательных ставок, поэтому тогда не является допустимой аллокацией.
Пропорциональное масштабирование сохраняет отношения неотрицательных скалярных долей и соблюдает выбранный бюджет. Это допустимая эвристика, а не общее решение точной или квадратичной задачи с ограничениями. Порог 0.20 является условным выбором экспозиции, а не универсальным институциональным стандартом или гарантией просадки. Разные коэффициенты и вероятности не требуют одинакового оптимального множителя сокращения.
4. Ковариация, зависимость и обратная матрица
Для фиксированного неотрицательного портфеля положительная ковариация увеличивает дисперсию по сравнению с нулевой. Из этого не следует, что при повторной оптимизации обязательно уменьшится каждая позиция. Обратная матрица ниже решает ковариационный суррогат C f=mu. Это точная линейная алгебра для суррогата, а не точная формула логарифмического Келли. Матрица C должна быть невырожденной; отрицательные результаты также нарушают запрет коротких позиций.
Для C=[[4,0.6],[0.6,1]] и mu=(0.4,0.2) определитель равен 3.64, решение равно(0.0769230769,0.1538461538). Умножение C на этот вектор возвращает mu. При равных средних и дисперсиях суррогат даёт mu/(sigma²(1+rho)); rho 0.5 сокращает именно это приближение на треть. Процент не является универсальным свойством точной задачи совместных состояний.
Для условной бинарной пары O1=1.90,p1=0.55,O2=2.05,p2=0.52,p12=0.35 вероятности четырёх состояний равны 0.35,0.20,0.17,0.28. Ковариация равна 0.24928, корреляция примерно 0.25750. Эти числа не задают универсальный процент уменьшения ставок. Нужна допустимая совместная модель: одна ковариационная матрица не описывает все состояния логарифмического роста.
5. Ограничения и приёмка численного результата
Код считает точную цель по независимым бинарным состояниям. Их число растёт как 2^n, поэтому учебный пример принимает не больше 12 ставок. Бюджет строго меньше 1 сохраняет положительный капитал во всех состояниях. До возврата результата проверяются конечность входов, успех оптимизации, неотрицательность долей и соблюдение бюджета. Для коррелированных рынков, возвратов, половинных выигрышей, комиссий и отмен нужно явно расширить совместную модель.
6. Практический числовой пример: субботний кард из 5 событий
Пять строк ниже задают условные независимые бинарные победы, включая обычную победу «Интера», а не фору 0. Вероятности являются предположениями, а не измеренными прогнозами. Сумма скалярных долей равна 0.4836491228, выбранный бюджет 0.20. Векторы посчитаны до округления. Рост означает ожидаемый логарифм множителя капитала за раунд, а не фактический ROI или прогноз просадки.
| ID | Матч и рынок | Коэфф. () | Вер. () | Перевес | Келли | Сумма ставки |
|---|---|---|---|---|---|---|
| 1 | Арсенал (Победа 1) | 1.95 | 55.0% | +7.25% | 7.63% | $7,632 |
| 2 | Ливерпуль -1.5 фора | 2.25 | 48.0% | +8.00% | 6.40% | $6,400 |
| 3 | Реал Мадрид ТБ 2.5 | 1.80 | 60.0% | +8.00% | 10.00% | $10,000 |
| 4 | Бавария Мюнхен П1 | 1.50 | 71.0% | +6.50% | 13.00% | $13,000 |
| 5 | Победа «Интера» (бинарный исход) | 1.75 | 62.0% | +8.50% | 11.33% | $11,333 |
Масштабирование и точная оптимизация дают разные векторы. При заданной независимой модели рост эвристики равен 0.0120732581703, оптимизированный рост 0.0121349525481. Небольшой разрыв опровергает утверждение о точной оптимальности пропорционального сокращения. Сохранение 82% роста или снижение просадки на 60% здесь не установлено. Изменение зависимостей или вероятностей требует нового расчёта.
7. Дробный Келли (Fractional Kelly) для портфелей
Из-за статистической погрешности оценки вероятностей реальные квант-фонды используют Половинный Келли (Half-Kelly, ) или Четвертной Келли:
Результаты повторных раундов требуют стабильного распределения и интегрируемых логарифмических доходностей. Они не устанавливают превосходство на каждой траектории или единственный вектор при избыточных направлениях выплат. Доли роста Half/Quarter зависят от распределения;75%/43.75% возникают только в квадратичном разложении возле внутреннего оптимума. Для вероятности просадки нужны горизонт и определение фиксированной границы либо падения от пика. Приведённая программа эти вероятности не считает.
10. Регуляризация и дробные доли
Перед использованием коррелированной модели проверьте допустимость совместных вероятностей. Для двух бинарных индикаторов границы Фреше имеют вид max(0,p1+p2-1)≤p12≤min(p1,p2). В указанном примере это интервал от 0.07 до 0.52, поэтому выбранное p12=0.35 допустимо. Затем вероятности победа/победа, победа/проигрыш, проигрыш/победа и проигрыш/проигрыш равны соответственно 0.35,0.20,0.17,0.28. Их сумма равна единице; строки и столбцы возвращают заданные маргинальные вероятности. Средние чистые доходности равны 0.045 и0.066. Дисперсии отдельных доходностей равны 0.893475 и1.048944, поскольку для бинарной ставки Var(R)=O²p(1-p). Деление ковариации 0.24928 на корень из произведения этих дисперсий даёт корреляцию 0.25749576. Это проверка внутренней согласованности условной таблицы, а не эмпирическая оценка зависимости футбольных рынков. Передавать такие коррелированные исходы в опубликованный независимый генератор нельзя: произведение маргинальных вероятностей заменило бы заданную совместную таблицу другой моделью. Для расчёта нужен отдельный генератор состояний с перечисленными вероятностями и проверкой каждой выплаты.
Добавление lambda I к матрице вторых моментов или ковариации меняет её собственные значения по-разному. В общем случае это не эквивалентно умножению всех ставок на один коэффициент Half-Kelly или Quarter-Kelly. Байесовский вывод требует явных априорного распределения и правдоподобия; штраф ridge сам по себе является выбором модели. При неточной оценке преимущества меньшие доли могут помочь, но не гарантируют положительный рост. Точную цель следует пересчитать при правдоподобных изменениях вероятностей и зависимости.
8. Часто задаваемые вопросы
Полная реализация на Python и пошаговый анализ алгоритма
Для практического применения многомерного критерия Келли в алгоритмических ставках используется следующий оптимизационный модуль на Python с библиотеками numpy и scipy.optimize:
import numpy as np
from scipy.optimize import minimize
def solve_simultaneous_kelly(odds, true_probs, max_bankroll_fraction=0.25):
"""Illustrative exact state objective for at most 12 independent binary bets."""
odds = np.asarray(odds, dtype=float)
probs = np.asarray(true_probs, dtype=float)
cap = float(max_bankroll_fraction)
if (odds.ndim != 1 or probs.shape != odds.shape or not 1 <= odds.size <= 12
or not np.all(np.isfinite(odds)) or np.any(odds <= 1)
or not np.all(np.isfinite(probs)) or np.any((probs < 0) | (probs > 1))
or not np.isfinite(cap) or not 0 <= cap < 1):
raise ValueError("Require 1..12 binary bets, finite odds>1, p in [0,1], cap in [0,1).")
n = odds.size
states = ((np.arange(1 << n)[:, None] >> np.arange(n)) & 1).astype(float)
weights = np.prod(np.where(states == 1, probs, 1-probs), axis=1)
returns = states * odds - 1
def loss(f):
wealth = 1 + returns @ f
if np.any(wealth <= 0):
return np.inf
return -float(weights @ np.log(wealth))
def gradient(f):
return -(weights / (1 + returns @ f)) @ returns
scalar = np.maximum(0, (probs * odds - 1) / (odds - 1))
total = scalar.sum()
initial = scalar * min(1, cap / total) if total else scalar
if cap == 0:
return {"optimal_fractions": np.zeros(n), "total_allocation": 0.0,
"expected_growth_rate_per_round": 0.0, "success": True}
result = minimize(loss, initial, jac=gradient, method="SLSQP",
bounds=[(0, cap)] * n,
constraints=[{"type": "ineq", "fun": lambda f: cap-f.sum(),
"jac": lambda f: -np.ones(n)}],
options={"ftol": 1e-13, "maxiter": 1000})
if not result.success:
raise RuntimeError("Optimizer did not converge.")
f = np.asarray(result.x)
if (not result.success or not np.all(np.isfinite(f))
or np.min(f) < -1e-10 or f.sum() > cap + 1e-10
or np.any(1 + returns @ f <= 0) or not np.isfinite(loss(f))):
raise RuntimeError("Optimizer failed or returned an infeasible allocation.")
return {"optimal_fractions": f, "total_allocation": float(f.sum()),
"expected_growth_rate_per_round": -loss(f), "success": True}
