Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

kelly criterion position sizing thực tế

Tiêu chí Kelly đặt kích thước cược từ lợi thế của bạn. Xem mười năm lợi nhuận cổ phiếu hàng ngày cho thấy full Kelly, drawdown và half Kelly trong thực tế.

Tiêu chí Kelly là một công thức xác định kích thước đặt cược. Đưa vào đó xác suất thắng, mức thắng và mức thua, nó trả về tỷ lệ vốn tối đa hóa tốc độ tăng trưởng tài sản dài hạn. John Kelly công bố nó tại Bell Labs năm 1956 như một kết quả của lý thuyết thông tin, và sau đó các con bạc cũng như nhà giao dịch đã áp dụng nó. Trang này giải thích công thức từ những nguyên lý cơ bản, sau đó đo lường những gì nó chỉ định trên dữ liệu lợi nhuận cổ phiếu hàng ngày thực tế trong mười năm, nơi mà chỉ định hóa ra lại không thể áp dụng được.

Tiêu chí Kelly thực sự nói gì

Hãy xem xét một vụ cá cược lặp lại, thắng một phần g của số tiền đặt cược với xác suất p, và thua một phần l của số tiền đặt cược với xác suất q, trong đó q bằng một trừ p. Tỷ lệ vốn tối ưu cho tăng trưởng cần cam kết cho mỗi lần lặp là:

f* = p / l - q / g

Trong trường hợp kinh điển là cược chẵn, khi thắng trả bằng những gì thua mất, gl đều bằng 1 và công thức rút gọn thành f* = p - q. Sự khác biệt đó chính là lợi thế. Một vụ cá cược thắng 60% số lần với tỷ lệ chẵn mang lại lợi thế 20 điểm, và Kelly đặt cược 20% số vốn vào đó.

Cách suy diễn chỉ là một bước tính vi phân áp dụng cho logarit kỳ vọng của tài sản. Tối đa hóa logarit trung bình của tài sản mỗi lần cược tương đương với tối đa hóa tốc độ tăng trưởng kép trong một chuỗi dài, và tỷ lệ đạt được điều đó chính là công thức trên. Hai tính chất được rút ra từ đó. Kelly không bao giờ đặt cược toàn bộ số vốn vào một vụ cá cược có thể mất tất cả, vì logarit của số không là âm vô cùng. Và bất kỳ tỷ lệ cố định nào khác ngoài f, nếu lặp lại đủ lâu, sẽ tăng trưởng chậm hơn so với f.

Một lần tung đồng xu bạn có thể tự kiểm tra

Các con số trong phần này là giả định, được chọn để phép tính có thể nhìn thấy được. Hãy lấy một đồng xu có mặt ngửa xuất hiện 60% số lần và trả tiền chẵn, với số vốn ban đầu là 1.000 đô la.

  • Đặt cược 20% số vốn cho mỗi lần tung. Một lần thắng đưa 1.000 đô la lên 1.200 đô la; một lần thua đưa nó xuống 800 đô la. Một lần thắng và một lần thua, theo bất kỳ thứ tự nào, để lại 960 đô la.
  • Đặt cược 40% số vốn cho mỗi lần tung. Cùng một cặp thắng rồi thua đó chạy từ 1.000 đô la lên 1.400 đô la rồi xuống 840 đô la.
  • Đặt cược toàn bộ số vốn cho mỗi lần tung. Một lần mặt sấp duy nhất kết thúc chuỗi vĩnh viễn, bất kể lợi thế là bao nhiêu.

Chi phí khứ hồi 4% ở mức đặt cược 20% là cái giá của việc kết hợp một danh mục đầu tư biến động, và một đồng xu 60/40 bù đắp nó nhiều lần trong một chuỗi dài. Ở mức đặt cược 40%, chi phí khứ hồi là 16%, và đồng xu không còn bù đắp được nữa: tốc độ tăng trưởng ở mức gấp đôi tỷ lệ Kelly đạt xấp xỉ bằng không. Vượt qua điểm đó, một vụ cá cược có lợi thế thực sự, đã được kiểm chứng, không tăng trưởng gì cả, đó là một thực tế hữu ích nhất mà công thức mang lại.

Công thức yêu cầu gì đối với một vụ cá cược cổ phiếu hàng ngày

Bây giờ hãy áp dụng cùng một công thức vào thị trường. Coi một ngày giao dịch trên một cổ phiếu là một lần lặp của vụ cá cược: xác suất thắng là tỷ lệ số ngày đóng cửa tăng, mức thắng là mức biến động trung bình của ngày tăng, và mức thua là mức biến động trung bình của ngày giảm. Mười năm dương lịch đầy đủ của giá đóng cửa hàng ngày, từ 2016 đến 2025, trên sáu cái tên quen thuộc:

Truy vấnĐầu vào Kelly từ giá đóng cửa hàng ngày, 2016 đến 2025: tỷ lệ thắng, lợi nhuận trung bình, thua lỗ trung bình và tỷ lệ phần trăm công thức trả về
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Đọc ba cột đầu tiên và lợi thế trông rất nhỏ. Tỷ lệ thắng tập trung gần như tung đồng xu, và ngày tăng trung bình cũng như ngày giảm trung bình có kích thước gần nhau đối với mọi cái tên trong bảng. SPY đóng cửa cao hơn trong 55.3% số phiên giao dịch, tăng 0.71% vào một ngày tăng trung bình so với 0.76% vào một ngày giảm trung bình.

Cột cuối cùng là nơi vấn đề bắt đầu. Những đầu vào nhỏ, gần như cân bằng đó nằm ở mẫu số của công thức, và mẫu số nhỏ tạo ra kết quả lớn. Tỷ lệ mà công thức trả về cho SPY10.1 lần vốn, và mức thấp nhất trong số 6 cái tên vẫn đạt 2 lần. Kelly đầy đủ cho một vụ cá cược cổ phiếu hàng ngày không phải là một tỷ lệ phần trăm của tài khoản. Đó là một yêu cầu về đòn bẩy mà không một nhà môi giới nào chấp nhận và không một tài khoản nào có thể chịu đựng nổi.

Hình dạng của sự đánh đổi

Đó là lý thuyết. Bảng tiếp theo là thử nghiệm. Lấy lợi nhuận hàng ngày thực tế của quỹ ETF theo dõi S&P 500 trong cùng mười năm, nhân lợi nhuận mỗi ngày với một kích thước đặt cược cố định, và kết hợp kết quả. Kích thước đặt cược 1,0x là chỉ số không đòn bẩy. Kích thước đặt cược 3,0x cam kết ba đô la cho mỗi đô la vốn, mỗi ngày, được tái cân bằng hàng ngày. Mỗi hàng là một đường đi đầy đủ trong mười năm, với tài sản cuối cùng và mức giảm sâu nhất từ đỉnh đến đáy mà nó trải qua trên đường đi.

Truy vấnMột thập kỷ lợi nhuận hàng ngày của S&P 500 được ghép lãi ở tám mức cược cố định: tài sản cuối cùng và drawdown tệ nhất
Câu lệnh SQL chính xác đằng sau mỗi con số
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

0.5x đường đi kết thúc ở 1.92 lần vốn ban đầu, với mức giảm tồi tệ nhất là 18.2% so với đỉnh trước đó. Ở 5x, cùng lợi nhuận hàng ngày và cùng thập kỷ, đường đi kết thúc ở 14.35 lần, với mức giảm tồi tệ nhất là 94.5%.

Hai cột di chuyển khác nhau, và đó là toàn bộ bài học của Kelly phân đoạn. Tài sản cuối cùng tăng lên cùng với kích thước đặt cược trong một thời gian, sau đó bằng phẳng, và sau đó quay đầu giảm khi lực cản từ việc kết hợp biến động vượt qua mức tiếp xúc thêm. Cột drawdown không có điểm ngoặt như vậy. Nó tăng lên ở mọi bước qua 8 hàng, và nó tăng nhanh hơn cột tài sản từng làm. Một nửa mức tăng trưởng của vụ cá cược tối ưu có sẵn ở một nửa kích thước đặt cược tối ưu, với một phần nhỏ của sự đau đớn. Sự bất đối xứng đó là lý lẽ cho việc đặt cược ít hơn f*, và đó là lý do tại sao quy ước nửa Kelly tồn tại.

Ước tính là phần yếu, không phải công thức

Công thức là chính xác cho một vụ cá cược mà tỷ lệ cược đã biết. Trong sòng bạc, tỷ lệ cược được in sẵn. Trong thị trường, chúng được ước tính từ lịch sử, và ước tính dao động. Đây là cùng một phép tính như bảng đầu tiên, được chạy riêng trên từng năm dương lịch trong mười năm cho một quỹ ETF theo dõi chỉ số duy nhất.

Truy vấnCùng phép tính Kelly trên tracker S&P 500, theo từng năm, 2016 đến 2025
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Mỗi hàng là một ước tính của cùng một đại lượng chưa biết, được xây dựng từ khoảng 250 quan sát. Năm 2016 trả về 13.7, với tỷ lệ thắng là 53.8%. Năm 2025 trả về 12.3, với tỷ lệ thắng là 57.8%. Biểu đồ cho thấy 10 kết quả đo của một con số có thể cách xa nhau đến mức nào khi mỗi kết quả được rút ra từ một năm duy nhất.

Sự phân tán đó quan trọng hơn bất kỳ sự tinh chỉnh nào của công thức. Phóng đại lợi thế của bạn lên gấp đôi và công thức trả về kích thước đặt cược gần như gấp đôi, điều này đặt bạn ở hoặc vượt qua điểm mà tăng trưởng trở nên âm. Đánh giá thấp nó và bạn từ bỏ mức tăng trưởng mà bạn có thể đã kết hợp, mà không có rủi ro phá sản. Hai sai số không đối xứng, và mặt rẻ của sự bất đối xứng là mặt nhỏ. Các học viên sử dụng Kelly thường đặt cược một nửa, hoặc một phần tư, và coi công thức như một trần nhà hơn là một mục tiêu.

Nơi mô hình ngừng mô tả thị trường

Kelly giả định một vụ cá cược bạn có thể lặp lại với tỷ lệ cược cố định, đã biết và các kết quả độc lập với nhau từ lần lặp này sang lần lặp khác. Một thị trường phá vỡ tất cả những điều đó. Tỷ lệ cược được ước tính và thay đổi theo thời gian. Lợi nhuận hàng ngày tập trung lại: các giai đoạn yên tĩnh nối tiếp các giai đoạn yên tĩnh, và các ngày biến động mạnh đến theo nhóm, điều này kéo dài các đợt giảm sâu vượt quá những gì giả định độc lập dự đoán. Các vị thế không được thanh toán vào cuối mỗi ngày, các khoảng trống giá bỏ qua mức giá mà lẽ ra vụ cá cược đã được đóng, và các cuộc gọi ký quỹ đến theo lịch trình của nhà môi giới chứ không phải theo lịch trình của mô hình.

Công thức vẫn giữ được giá trị của nó như một ranh giới. Nó nêu rõ, trong một dòng, rằng có một kích thước đặt cược mà vượt quá đó, sự tự tin hơn tạo ra ít tài sản hơn, và nó xác định ranh giới đó từ các đại lượng mà một nhà giao dịch ít nhất có thể cố gắng đo lường. Đó cũng là lý do tại sao cùng một logic hướng tới đa dạng hóa: một số vụ cá cược độc lập một phần chia sẻ cùng một ngân sách rủi ro tổng thể hiệu quả hơn so với một vụ cá cược duy nhất, đó là phép tính nền tảng cho rủi ro tập trung. Và đối với một nhà đầu tư thêm tiền theo một lịch trình thay vì xác định kích thước các vụ cá cược riêng lẻ, câu hỏi về kích thước vị thế được trả lời bởi chính lịch trình đó, đó là trường hợp cho trung bình chi phí đô la.

Câu hỏi thường gặp

Công thức tiêu chí Kelly là gì?

Đối với một vụ cá cược thắng một phần g của số tiền đặt cược với xác suất p và thua một phần l với xác suất q, tỷ lệ vốn tối ưu cho tăng trưởng là f = p / l - q / g. Trong trường hợp cược chẵn, nó đơn giản hóa thành f = p - q, chính là lợi thế.

Tại sao các nhà giao dịch sử dụng nửa Kelly thay vì Kelly đầy đủ?

Tăng trưởng gần như bằng phẳng gần điểm tối ưu trong khi rủi ro tiếp tục tăng vượt quá nó, vì vậy cắt giảm một nửa vụ cá cược sẽ từ bỏ một lượng tăng trưởng dài hạn khiêm tốn và loại bỏ một phần lớn drawdown. Sai số ước tính làm trầm trọng thêm lý lẽ: một vụ cá cược gấp đôi từ một lợi thế được phóng đại nằm gần điểm mà tăng trưởng dừng lại.

Tiêu chí Kelly có hiệu quả với cổ phiếu không?

Nó áp dụng như một phép tính số học, và các giả định của nó về tỷ lệ cược cố định đã biết và kết quả độc lập không tồn tại trên thị trường. Áp dụng một cách ngây thơ vào lợi nhuận cổ phiếu hàng ngày, nó yêu cầu đòn bẩy vượt xa những gì bất kỳ tài khoản nào có thể chịu đựng, như bảng đầu tiên ở trên cho thấy.

Điều gì xảy ra nếu bạn đặt cược nhiều hơn tỷ lệ Kelly?

Tốc độ tăng trưởng dài hạn giảm xuống. Ở khoảng gấp đôi tỷ lệ Kelly, nó đạt xấp xỉ bằng không, và vượt quá đó, một vụ cá cược có lợi thế thực sự sẽ làm giảm vốn theo thời gian trong khi drawdown của nó tiếp tục sâu hơn.

Tiêu chí Kelly có giống với việc mạo hiểm 1% hoặc 2% mỗi giao dịch không?

Không. Một quy tắc tỷ lệ phần trăm cố định bỏ qua hoàn toàn tỷ lệ cược và áp dụng cùng một con số cho mọi thiết lập. Kelly điều chỉnh quy mô đặt cược theo lợi thế đo được, điều này làm cho nó phản ứng nhanh hơn khi lợi thế được biết và dễ vỡ hơn khi lợi thế được phỏng đoán.


Mọi con số ở trên đều đến từ một truy vấn đã lưu mà bạn có thể mở, chỉnh sửa và chạy lại. Thay đổi mã chứng khoán, khung thời gian hoặc lưới kích thước đặt cược và tự mình đo lường sự đánh đổi trên terminal Strasmore.