Введение
От умного риска до победы близко. Кто не рискует, тот не пьет шампанского. Без риска и жизнь пресна.
Эти и многие другие пословицы и поговорки про риск, знакомые нам с раннего детства, закрепляются на подсознательном уровне и, как правило, создают положительный образ риска. Однако на практике риск приносит далеко не только выигрыши. Например, портфель инвестора, который слишком часто рискует и вкладывает весь свой капитал сразу, в краткосрочной перспективе может взлететь до небес, но в долгосрочной непременно приведет к огромным финансовым потерям. Но можно ли каким-нибудь образом найти золотую середину? Безусловно, и в этом нам поможет критерий Келли.
Знакомство с критерием Келли
Критерий Келли является одним из методов оценки риска в условиях неопределенности. Он основан на идее, что риск можно измерять не только относительно возможных потерь, но и в контексте потенциального выигрыша. В этом случае критерий Келли помогает нам определиться, стоит ли идти на риск ради получения прибыли или лучше сделать выбор в пользу более безопасных вариантов развития событий. При использовании метода Келли необходимо учитывать множество факторов, таких как уровень риска, а также возможные потери и прибыль.
Эта стратегия была разработана в 1956 году американским ученым Джоном Келли, и в настоящее время она используется для принятия финансовых решений в условиях высокой степени неопределенности. Но как это часто бывает, позже выяснилось, что похожая идея была предложена еще в 1738 году швейцарским физиком Даниилом Бернулли в первом российском научном журнале — «Комментариях Санкт‑Петербургской Академии». Чтобы ознакомиться с принципом работы критерия Келли на практике, предлагаю рассмотреть задачу о «нечестной монете».
Задача о «нечестной монете»
Допустим, вы играете в подбрасывание монеты и можете поставить любую сумму X на выпадение орла или решки. Если вы угадали нужную сторону монеты, то вам возвращается ваша ставка X и выигрыш X, то есть 2X. Если вы не угадали, то ваша ставка X сгорает.
Предположим, что вам известно о «нечестности» конкретной монеты и вероятность выпадения орла — 60%. Кроме того, у вас есть 1000 у.е. и большое, но ограниченное количество бросков монеты (раундов) — например, 2000. Ваша задача — определить, по какой логике делать ставки на каждый раунд.
Для решения этой задачи напишем скрипт, который позволит нам смоделировать эту игру для простой стратегии (каждая ставка = 100 у.е.) с помощью метода Монте-Карло, и посмотрим, сколько он заработает (если заработает вовсе):
import numpy as np
import numpy.typing as npt
from typing import Callable, List
import seaborn as sns
def play_game(
strategy: Callable[[npt.ArrayLike], npt.ArrayLike],
num_rounds: int,
num_simulations: int,
win_probability_per_round: float,
starting_capital: float
) -> npt.NDArray:
result = np.ndarray((num_rounds + 1, num_simulations), dtype=float)
result[0,:] = starting_capital
for round_index in range(num_rounds):
bet = strategy(result[round_index,:])
assert(np.all(0.0 <= bet))
assert(np.all(bet <= result[round_index,:]))
round_outcome = np.random.rand(num_simulations) < win_probability_per_round
result[round_index + 1,:] = result[round_index,:] + np.where(round_outcome, 1, -1) * bet
return result
def sim_and_plot(
strategy: Callable[[npt.ArrayLike], npt.ArrayLike],
num_rounds: int,
num_simulations: int = 1000,
win_probability_per_round: float = 0.6,
starting_capital: float = 1000.0,
**kwargs
):
data = play_game(strategy, num_rounds, num_simulations, win_probability_per_round, starting_capital)
plot = sns.lineplot(
x=np.tile(np.arange(0, num_rounds + 1), num_simulations),
y=data.ravel(order='F'),
errorbar='pi', # Показываем процентили 2.5% и 97.5%
**kwargs)
plot.grid()
return plot
def fixed_bet_strategy(capital):
return np.minimum(100.0, capital)
sim_and_plot(fixed_bet_strategy, 200)
Визуализируем 1000 симуляций, содержащих по 200 бросков, с помощью следующего графика:
В среднем стратегия увеличивает капитал на где p = 0.6 — вероятность выигрыша в одном раунде, а b = 100 — наша ставка. На графике видно, что доверительный интервал после 200 раундов оказался очень большим — из 1000 симуляций примерно в 20 случаях мы вообще ничего не выиграли.
Теперь увеличим количество раундов до 2000 и получим еще один график:
sim_and_plot(fixed_bet_strategy, 2000)
Попробуем увеличить размер ставки:
def fixed_bet_strategy(capital):
return np.minimum(200.0, capital)
sim_and_plot(fixed_bet_strategy, 30)
Увеличив размер ставки, мы быстро обнаружили проблему: при больших ставках риск проиграть всю сумму до нуля резко возрастает. Например, при ставке в 200 у.е. шанс нашего банкротства уже превышает 2,5%, что недопустимо.
Попробуем решить эту задачу с аналитической точки зрения.
Допустим, что в игре остался всего один раунд, а наш текущий капитал равен . Если мы сделаем ставку , то мы закончим игру с капиталом с вероятностью , а с капиталом — с вероятностью . Таким образом, математическое ожидание конечного капитала будет равно:
Согласно данной формуле, мат. ожидание увеличивается при увеличении ставки . Так как то максимум мат. ожидания достигается при , значит, на последнем ходу выгоднее всего идти ва-банк, а мат. ожидание при этом будет равно . Аналогичным образом можно доказать, что является оптимальной ставкой и на предпоследнем ходу, и на пред-предпоследнем, и так до бесконечности. Из этого следует, что если игра состоит из n раундов, то мат. ожидание выигрыша будет равно .
С другой стороны, очевидно, что ставить всю сумму на каждом ходу — это чрезмерно рискованная стратегия. В таком случае чем больше раундов мы играем, тем больше становится наш шанс обанкротиться. К примеру, вероятность не проиграть все до нуля всего через 10 раундов составит лишь 0,6%. Стратегия, кажущаяся самой простой и эффективной с точки зрения мат. ожидания, всегда идти ва-банк, ни при каких условиях не приведет нас к успеху. Наоборот, полное разорение может наступить в течение нескольких раундов, а вероятность выигрыша при этом крайне низкая.
Чтобы не разориться до нуля, можно попробовать ставить определенную фиксированную долю от имеющегося капитала. Проведем численный эксперимент, чтобы определить, какая доля (в процентах) является самой оптимальной. Начнем с 50% и получим следующий график:
def percent_50_strategy(capital):
return capital * 0.50
plt = sim_and_plot(percent_50_strategy, num_rounds=200)
Из графика становится понятно, что среднее значение изменяется скачкообразно и к тому же процентили куда-то пропали. В связи с этим пробуем перейти в логарифмическую шкалу:
plt = sim_and_plot(percent_50_strategy, num_rounds=200)
plt.set(yscale='log')
На приведенном графике видна любопытная закономерность: среднее значение растет и в то же время выходит за верхнюю границу доверительного интервала. Чтобы получить более «репрезентативную» траекторию развития, возьмем медиану вместо среднего значения и заодно увеличим количество раундов:
plt = sim_and_plot(percent_50_strategy, num_rounds=2000, estimator='median')
plt.set(yscale='log')
Благодаря этому графику мы наконец понимаем, что при ставке в размере 50% мы все еще стабильно теряем деньги. Обращаю ваше внимание и на огромный разброс между процентилями — около 40 порядков!
Попробуем взять ставку поменьше, например в 5%:
def percent_5_strategy(capital):
return capital * 0.05
plt = sim_and_plot(percent_5_strategy, num_rounds=2000, estimator='median')
plt.set(yscale='log')
При размере ставки в 5% от банка мы наконец-то начинаем выигрывать на дистанции. Более того, этот график очень похож на тот, который получился в линейной шкале для самого первого эксперимента.
Логарифмическая функции ценности
Функция ценности — это математическая функция, которая описывает, как игрок оценивает возможные исходы игры. Однако помимо теории игр эта функция используется в экономике под названием «функция полезности» и описывает, как потребитель оценивает различные комбинации товаров и услуг. Она используется в экономике для анализа поведения потребителей и определения оптимального выбора.
Например, если у потребителя есть выбор между двумя товарами: хлебом и сыром — то функция ценности может быть описана как , где x и y — количество каждого товара. Соответственно, чем больше потребитель получает от потребления товаров, тем выше его функция ценности. Таким образом, функция ценности позволяет определить, какие товары и услуги являются наиболее ценными для потребителя, и на основе этого принимать решения о том, как распределить свой бюджет и какие товары покупать.
Такой же принцип применим и к нашей задаче, где мы должны определить, какую стратегию лучше всего использовать. В связи с этим напрашивается идея попробовать использовать другую целевую функцию ценности — мат. ожидание от логарифма капитала — и соответственно оптимизировать не средний выигрыш, а среднее изменение логарифма капитала.
Оптимальную ставку для такой функции ценности можно вывести аналитическим путем:
Допустим, что у нас снова остался всего один раунд, и мы обладаем текущим капиталом c. Чтобы максимизировать величину, мы выбираем ставку b:
Обозначим b/c за x. Поскольку log c не зависит от b, то мы можем опустить его при поиске максимума. Получается, что нам надо найти максимум следующей функции:
Построим график этой функции при p = 0,6:
x = np.linspace(0, 0.5, 100, endpoint=True)
p = 0.6
y = p * np.log(1 + x) + (1 - p) * np.log(1 - x)
sns.lineplot(x=x, y=y).grid()
Благодаря этому графику становится очевидно, что максимум достигается при x = 0,2, причем капитал увеличивается в среднем на 2% на каждом ходу. Этот же результат можно получить с помощью критерия локального экстремума:
Из этого следует, что экстремум (мы уже знаем, что это максимум) достигается x = 2p - 1, что в нашем случае дает x = 0,2. Q.E.D.
Как и в случае с фиксированной ставкой, этот вывод продолжает работать и когда в игре осталось больше одного раунда. Проверим стратегию на практике:
def percent_20_strategy(capital):
return capital * 0.2
plt = sim_and_plot(percent_20_strategy, num_rounds=2000, estimator='median')
plt.set(yscale='log')
Из этого графика видно, что, используя ставку в 20% от банка, даже при «плохом» сценарии мы за 2000 раундов выигрываем у «среднего» сценария при ставке в 5%. Однако при меньшем количестве раундов (например, 100) оптимальная стратегия может привести нас к убытку, но лишь при «плохом» сценарии. В реальных применениях критерий Келли обычно используют как ограничение сверху, потому что хотя в долгосрочной перспективе она ведет себя лучше любых стратегий, в краткосрочной перспективе она может быть слишком рискованной.
Причина, по которой логарифм от капитала используется в критерии Келли — это тот факт, что распределение выигрыша стратегий со ставкой, пропорциональной текущему капиталу, после большого количества ходов является логнормальным. Но у логарифмической функции ценности есть и чисто «житейское» объяснение — мы привыкли думать о деньгах не в абсолютных значениях, а в процентах. Предположим, что вы получаете зарплату величиной в 100 у.е, тогда ее повышение на 30 у.е. кажется очень достойной прибавкой, ведь это целые 30%. Допустим, прошло некоторое время, вы прошли путь от джуна до опытного специалиста, и теперь ваша зарплата составляет 500 у.е. В этом случае повышение на 30 у.е. — всего 6% — это тоже неплохо, но уже не выглядит так значительно. А вот повышение на 150 у.е. (то есть на 30%) — все так же привлекательно. Таким образом, разница в «привлекательности» разных сумм денег зависит именно от процентного отношения этих сумм: для функции ценности выполняется 0 :pi(kx)-pi(x)=pi(ky)-pi(y)" alt="forall x,y,k>0 :pi(kx)-pi(x)=pi(ky)-pi(y)" src="https://www.pvsm.ru/images/2023/07/28/kriterii-kelli-29.svg" width="354" height="22" title="Критерий Келли - 29"/> . Из этого следует, что представима в виде . Доказательство предоставляется читателю в качестве упражнения.
Если мы обратимся к более общей формуле критерия Келли для любой игры с двумя исходами, то обнаружим, что она допускает частичные потери (что особо актуально для инвестиций):
f* — часть активов, которую вкладывают в инвестиции;
p — вероятность положительного исхода (что инвестиции вырастут в цене);
q — вероятность отрицательного исхода (что инвестиции упадут в цене): q = 1 — p;
a — доля от вложений, которая теряется при отрицательном исходе;
b — доля от вложений, которая добавляется при положительном исходе.
Необходимо понимать, что критерий Келли может не только помочь вам в решении задачи о «нечестной монете», но и быть обобщен для игр с другими исходами. Кроме того, этот принцип часто используется в финансовой математике в более сложных случаях, например, при расчете оптимального инвестиционного портфеля.
Заключение
Критерий Келли — это довольно универсальный принцип, который может быть использован не только при инвестировании или играх на деньги, но и в повседневной жизни. Например, он способен помочь вам принять решение относительно потенциального места работы и подсказать, идти ли вам работать в крупную компанию или в развивающийся стартап (спойлер: если вы испытываете проблемы с финансами, то вам подойдет стабильная компания, а если проблем с деньгами нет, то лучше попробовать себя в стартапе).
К тому же, знание критерия Келли может сыграть вам на руку при прохождении собеседования в трейдинговые компании: в них часто встречаются задачи на его применение. Возможно, владение именно этим статистическим методом обеспечит вам столь желанное место в крупной международной организации и жизнь вашей мечты.
Автор: Яков Длугач