Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

kryterium Kelly'ego wielkość pozycji wyniki

Kryterium Kelly'ego wyznacza wielkość zakładu na podstawie przewagi. Dziesięć lat dziennych stóp zwrotu z akcji pokazuje implikacje pełnego Kelly'ego, drawdownu i połowy Kelly'ego w

Kryterium Kelly’ego to wzór na wielkość zakładu. Po wprowadzeniu prawdopodobieństwa wygranej, wielkości wygranej i wielkości straty, zwraca ono ułamek kapitału maksymalizujący długoterminowe tempo wzrostu majątku. John Kelly opublikował je w Bell Labs w 1956 roku jako wynik teorii informacji, a później przyjęli je gracze i inwestorzy. Ta strona wyprowadza wzór od podstaw, a następnie mierzy, co zaleca on na dziesięciu latach rzeczywistych dziennych stóp zwrotu z akcji, gdzie zalecenie okazuje się niemożliwe do zrealizowania.

Co kryterium Kelly’ego faktycznie mówi

Rozważmy powtarzany zakład, który wygrywa ułamek g postawionej kwoty z prawdopodobieństwem p i traci ułamek l postawionej kwoty z prawdopodobieństwem q, gdzie q to jeden minus p. Optymalny dla wzrostu ułamek kapitału do zaangażowania w każdej powtórce to:

f* = p / l - q / g

W klasycznym przypadku równych pieniędzy, gdzie wygrana płaci tyle, ile kosztuje strata, g i l są równe 1, a wzór upraszcza się do f* = p - q. Ta różnica to sama przewaga. Zakład wygrywający w 60% przypadków przy równych pieniądzach niesie 20-punktową przewagę, a Kelly stawia na niego 20% kapitału.

Wyprowadzenie to jeden krok rachunku różniczkowego zastosowany do oczekiwanego logarytmu majątku. Maksymalizacja średniego logarytmu majątku na zakład jest równoważna maksymalizacji złożonej stopy wzrostu w długim szeregu, a ułamek, który to osiąga, to ten powyżej. Wynikają z tego dwie właściwości. Kelly nigdy nie stawia całego kapitału na zakład, który może wszystko stracić, ponieważ logarytm zera to minus nieskończoność. A każdy stały ułamek inny niż f, powtarzany wystarczająco długo, rośnie wolniej niż f.

Rzut monetą, który możesz sprawdzić ręcznie

Liczby w tej sekcji są hipotetyczne, dobrane tak, aby arytmetyka była widoczna. Weźmy monetę, która daje orła w 60% przypadków i płaci równymi pieniędzmi, z początkowym kapitałem 1000 USD.

  • Stawiaj 20% kapitału na każdy rzut. Wygrana podnosi 1000 USD do 1200 USD; strata obniża je do 800 USD. Jedna wygrana i jedna przegrana, w dowolnej kolejności, pozostawia 960 USD.
  • Stawiaj 40% kapitału na każdy rzut. Ta sama para wygrana-potem-przegrana zmienia 1000 USD na 1400 USD, a następnie na 840 USD.
  • Stawiaj cały kapitał na każdy rzut. Pojedyncza reszka kończy sekwencję na stałe, niezależnie od przewagi.

Ten 4% koszt podróży w obie strony przy stawce 20% to cena składania zmiennego kapitału, a moneta 60/40 pokrywa go wielokrotnie w długim szeregu. Przy stawce 40% koszt podróży w obie strony wynosi 16%, a moneta już go nie pokrywa: tempo wzrostu przy dwukrotności ułamka Kelly’ego spada mniej więcej do zera. Powyżej tego punktu zakład z rzeczywistą, potwierdzoną przewagą nie przynosi żadnego wzrostu, co jest najważniejszym pojedynczym faktem, jaki niesie wzór.

O co wzór pyta w przypadku dziennego zakładu na akcje

Teraz skierujmy ten sam wzór na rynek. Potraktuj jeden dzień handlowy w jednej akcji jako jedną powtórkę zakładu: prawdopodobieństwo wygranej to odsetek sesji, które zamknęły się wzrostem, wielkość wygranej to średni ruch w górę, a wielkość straty to średni ruch w dół. Dziesięć pełnych lat kalendarzowych dziennych zamknięć, 2016–2025, dla sześciu znanych spółek:

ZapytanieWspółczynniki Kelly’ego z dziennych zamknięć, 2016–2025: wskaźnik wygranych, średni zysk, średnia strata oraz ułamek zwracany przez formułę
Dokładny kod SQL dla każdej liczby
WITH daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), window_start) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'KO', 'JNJ', 'MSFT', 'NVDA', 'TSLA')
      AND window_start >= '2016-01-01 00:00:00'
      AND window_start <  '2026-01-01 00:00:00'
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, dt
),
steps AS (
    SELECT ticker, dt, c,
           lagInFrame(c) OVER (PARTITION BY ticker ORDER BY dt
                               ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev
    FROM daily
),
rets AS (
    SELECT ticker, c / prev - 1 AS ret
    FROM steps
    WHERE prev > 0 AND c != prev
)
SELECT ticker,
       round(100 * countIf(ret > 0) / count(), 1) AS win_rate_pct,
       round(100 * avgIf(ret, ret > 0), 2) AS avg_gain_pct,
       round(100 * abs(avgIf(ret, ret < 0)), 2) AS avg_loss_pct,
       round(countIf(ret > 0) / count() / abs(avgIf(ret, ret < 0))
             - countIf(ret < 0) / count() / avgIf(ret, ret > 0), 1) AS full_kelly_x
FROM rets
GROUP BY ticker
HAVING countIf(ret > 0) > 0 AND countIf(ret < 0) > 0
ORDER BY full_kelly_x DESC
Run this yourself

Przeczytaj pierwsze trzy kolumny, a przewaga wydaje się niewielka. Wskaźniki wygranych oscylują wokół rzutu monetą, a średni dzień wzrostowy i średni dzień spadkowy są zbliżone wielkością dla każdej spółki w panelu. SPY zamknęło się wyżej w 55.3% swoich sesji, zyskując 0.71% w przeciętnym dniu wzrostowym wobec 0.76% w przeciętnym dniu spadkowym.

Ostatnia kolumna to miejsce, w którym zaczynają się kłopoty. Te małe, prawie zrównoważone dane wejściowe znajdują się w mianownikach wzoru, a małe mianowniki dają duże wyniki. Ułamek, który wzór zwraca dla SPY, wynosi 10.1 razy kapitał, a najniższy z 6 spółek wciąż wynosi 2 razy. Pełny Kelly w przypadku dziennego zakładu na akcje to nie procent rachunku. To żądanie dźwigni, której nie oferuje żaden broker i której żaden rachunek nie przetrwa.

Kształt kompromisu

To jest teoria. Następny panel to eksperyment. Weź rzeczywiste dzienne stopy zwrotu trackera S&P 500 z tych samych dziesięciu lat, przeskaluj każdą dzienną stopę zwrotu przez stałą wielkość zakładu i złóż wynik. Wielkość zakładu 1,0x to indeks bez dźwigni. Wielkość zakładu 3,0x angażuje trzy dolary na każdy dolar kapitału, każdego dnia, z codziennym rebalansowaniem. Każdy wiersz to jedna pełna dziesięcioletnia ścieżka, z końcowym majątkiem i najgłębszym spadkiem od szczytu do dołka, jaki napotkała po drodze.

ZapytanieDziesięcioletnie dzienne stopy zwrotu S&P 500 skapitalizowane przy ośmiu stałych wielkościach zakładu: końcowy majątek i najgorsze obniżenie
Dokładny kod SQL dla każdej liczby
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), window_start) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= '2016-01-01 00:00:00'
      AND window_start <  '2026-01-01 00:00:00'
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY dt
),
steps AS (
    SELECT dt, c,
           lagInFrame(c) OVER (ORDER BY dt ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev
    FROM daily
),
rets AS (
    SELECT dt, c / prev - 1 AS ret
    FROM steps
    WHERE prev > 0
),
sizes AS (
    SELECT arrayJoin([0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0]) AS bet
),
paths AS (
    SELECT bet, dt,
           exp(sum(log(greatest(1 + bet * ret, 0.0001)))
               OVER (PARTITION BY bet ORDER BY dt
                     ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) AS equity
    FROM rets CROSS JOIN sizes
),
peaks AS (
    SELECT bet, dt, equity,
           max(equity) OVER (PARTITION BY bet ORDER BY dt
                             ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS peak
    FROM paths
)
SELECT concat(toString(bet), 'x') AS bet_size,
       round(argMax(equity, dt), 2) AS ending_multiple,
       round(100 * max(1 - equity / peak), 1) AS max_drawdown_pct
FROM peaks
GROUP BY bet
ORDER BY bet
Run this yourself

Przy 0.5x ścieżka zakończyła się na 1.92 razy początkowego kapitału, z najgorszym spadkiem 18.2% od poprzedniego szczytu. Przy 5x, tych samych dziennych stopach zwrotu i tej samej dekadzie, ścieżka zakończyła się na 14.35 razy, z najgorszym spadkiem 94.5%.

Te dwie kolumny poruszają się inaczej i to jest cała lekcja ułamkowego Kelly’ego. Końcowy majątek rośnie wraz z wielkością zakładu przez pewien czas, spłaszcza się, a następnie spada, gdy opór ze strony składania zmienności przewyższa dodatkową ekspozycję. Kolumna spadków nie ma takiego punktu zwrotnego. Rośnie na każdym kroku w 8 wierszach i rośnie szybciej niż kiedykolwiek rosła kolumna majątku. Połowa wzrostu optymalnego zakładu jest dostępna przy połowie optymalnej wielkości zakładu, przy niewielkim ułamku bólu. Ta asymetria jest argumentem za stawianiem mniej niż f* i to dlatego w ogóle istnieje konwencja połowy Kelly’ego.

Oszacowanie jest słabym punktem, nie wzór

Wzór jest dokładny dla zakładu, którego szanse są znane. W kasynie szanse są wydrukowane. Na rynku są szacowane na podstawie historii, a oszacowanie się zmienia. Oto to samo obliczenie, co w pierwszym panelu, przeprowadzone osobno dla każdego z dziesięciu lat kalendarzowych dla pojedynczego trackera indeksu.

ZapytanieTa sama kalkulacja Kelly’ego dla trackera S&P 500, rok po roku, 2016–2025
Dokładny kod SQL dla każdej liczby
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), window_start) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= '2016-01-01 00:00:00'
      AND window_start <  '2026-01-01 00:00:00'
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY dt
),
steps AS (
    SELECT dt, c,
           lagInFrame(c) OVER (ORDER BY dt ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev
    FROM daily
),
rets AS (
    SELECT dt, c / prev - 1 AS ret
    FROM steps
    WHERE prev > 0 AND c != prev
)
SELECT toString(toYear(dt)) AS year,
       round(100 * countIf(ret > 0) / count(), 1) AS win_rate_pct,
       round(100 * avgIf(ret, ret > 0), 2) AS avg_gain_pct,
       round(100 * abs(avgIf(ret, ret < 0)), 2) AS avg_loss_pct,
       round(countIf(ret > 0) / count() / abs(avgIf(ret, ret < 0))
             - countIf(ret < 0) / count() / avgIf(ret, ret > 0), 1) AS full_kelly_x
FROM rets
GROUP BY year
HAVING countIf(ret > 0) > 0 AND countIf(ret < 0) > 0
ORDER BY year
Run this yourself

Każdy wiersz to oszacowanie tej samej nieznanej wielkości, zbudowane z około 250 obserwacji. Rok 2016 zwrócił 13.7, przy wskaźniku wygranych 53.8%. Rok 2025 zwrócił 12.3, przy wskaźniku wygranych 57.8%. Wykres pokazuje, jak daleko od siebie 10 odczyty jednej liczby mogą się znaleźć, gdy każdy pochodzi z jednego roku.

To rozproszenie ma większe znaczenie niż jakiekolwiek udoskonalenie wzoru. Przeceniając swoją przewagę dwukrotnie, wzór zwraca mniej więcej dwukrotnie większą wielkość zakładu, co umieszcza cię w punkcie, w którym wzrost staje się ujemny, lub poza nim. Niedoceniając ją, rezygnujesz ze wzrostu, który mógłbyś składać, bez ryzyka ruiny. Te dwa błędy nie są symetryczne, a tania strona asymetrii to strona mała. Praktycy, którzy w ogóle używają Kelly’ego, zwykle stawiają połowę lub ćwierć i traktują wzór jako sufit, a nie cel.

Gdzie model przestaje opisywać rynek

Kelly zakłada zakład, który można powtarzać przy stałych, znanych szansach, oraz wyniki, które są niezależne od siebie w kolejnych powtórkach. Rynek łamie to wszystko. Szanse są szacowane i zmieniają się w czasie. Dzienny zwrot grupuje się: spokojne okresy następują po spokojnych okresach, a gwałtowne dni pojawiają się w grupach, co rozciąga spadki poza to, co przewiduje założenie niezależności. Pozycje nie są rozliczane na koniec każdego dnia, luki cenowe przeskakują cenę, po której zakład zostałby zamknięty, a wezwania do uzupełnienia depozytu pojawiają się zgodnie z harmonogramem brokera, a nie harmonogramem modelu.

Wzór wciąż spełnia swoją rolę jako granica. Stwierdza w jednym wierszu, że istnieje wielkość zakładu, powyżej której większe przekonanie przynosi mniejszy majątek, i lokalizuje tę granicę na podstawie wielkości, które inwestor może przynajmniej spróbować zmierzyć. To również dlatego ta sama logika wskazuje na dywersyfikację: kilka częściowo niezależnych zakładów dzieli ten sam całkowity budżet ryzyka bardziej efektywnie niż jeden zakład, co jest arytmetyką leżącą u podstaw ryzyka koncentracji. A dla inwestora dodającego pieniądze zgodnie z harmonogramem, a nie wyceniającego dyskretne zakłady, kwestia wielkości pozycji jest rozwiązywana przez sam harmonogram, co jest argumentem za uśrednianiem kosztu dolara.

FAQ

Jaki jest wzór kryterium Kelly’ego?

Dla zakładu, który wygrywa ułamek g stawki z prawdopodobieństwem p i traci ułamek l z prawdopodobieństwem q, optymalny dla wzrostu ułamek kapitału to f = p / l - q / g. W przypadku równych pieniędzy upraszcza się do f = p - q, czyli samej przewagi.

Dlaczego inwestorzy używają połowy Kelly’ego zamiast pełnego Kelly’ego?

Wzrost jest prawie płaski w pobliżu optimum, podczas gdy ryzyko nadal rośnie poza nim, więc przecięcie zakładu o połowę rezygnuje z umiarkowanej ilości długoterminowego wzrostu i usuwa dużą część spadku. Błąd estymacji potęguje ten argument: podwojony zakład wynikający z przeszacowanej przewagi znajduje się w pobliżu punktu, w którym wzrost się zatrzymuje.

Czy kryterium Kelly’ego działa w przypadku akcji?

Ma zastosowanie jako arytmetyka, ale jego założenia o stałych znanych szansach i niezależnych wynikach nie obowiązują na rynkach. Zastosowane naiwnie do dziennych stóp zwrotu z akcji wymaga dźwigni znacznie przekraczającej to, co jakikolwiek rachunek może udźwignąć, jak pokazuje pierwszy panel powyżej.

Co się stanie, jeśli postawisz więcej niż ułamek Kelly’ego?

Długoterminowe tempo wzrostu spada. Przy mniej więcej dwukrotności ułamka Kelly’ego osiąga około zera, a powyżej tego zakład z rzeczywistą przewagą zmniejsza kapitał w czasie, podczas gdy jego spadki nadal się pogłębiają.

Czy kryterium Kelly’ego to to samo, co ryzykowanie 1% lub 2% na transakcję?

Nie. Zasada stałego procentu ignoruje szanse i stosuje tę samą liczbę do każdego układu. Kelly skaluje stawkę wraz z mierzoną przewagą, co czyni go bardziej responsywnym, gdy przewaga jest znana, i bardziej kruchym, gdy przewaga jest zgadywana.


Każda liczba powyżej pochodzi z zapisanego zapytania, które możesz otworzyć, edytować i uruchomić ponownie. Zamień tickery, okno lub siatkę wielkości zakładu i zmierz kompromis samodzielnie na terminalu Strasmore.