Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

凯利公式 仓位管理 实际回测

基于十年美股日回报数据,衡量全凯利与半凯利策略的实际表现、最大回撤及可行性,揭示理论建议在真实市场中的承受力。

凯利公式是一个用于确定下注规模的公式。输入获胜概率、获胜金额和亏损金额,它会返回能使财富长期增长率最大化的资本比例。约翰·凯利于1956年在贝尔实验室将其作为信息论成果发表,后来被赌徒和交易员采用。本文从基本原理推导该公式,然后衡量其在十年真实每日股票回报数据上的建议,结果发现该建议在实践中难以承受。

凯利准则的实际含义

考虑一个重复进行的赌局:以概率 p 赢得所下注金额的 g 比例,以概率 q 输掉所下注金额的 l 比例,其中 q 等于 1 减去 p。每次重复中,能使资本增长最优的投入比例为:

f* = p / l - q / g

在经典的等额赔率情况下,即赢得的金额等于输掉的金额,gl 都等于 1,公式简化为 f* = p - q。这个差值本身就是优势。一个在等额赔率下胜率为 60% 的赌局,其优势为 20 个百分点,凯利准则建议投入 20% 的资金。

其推导过程是对财富期望对数应用一步微积分。最大化每次下注的平均对数财富,等同于最大化长期序列中的复合增长率,而实现这一目标的投入比例就是上述公式。由此得出两个特性。凯利准则绝不会建议将全部资金投入可能血本无归的赌局,因为零的对数是负无穷。并且,任何不同于 f 的固定比例,如果长期重复,其复合增长速度都会慢于 f

一个可手动验证的抛硬币例子

本节中的数字是假设的,旨在使计算过程清晰可见。假设一枚硬币正面朝上的概率为 60%,且为等额赔率,起始资金为 1000 美元。

  • 每次抛掷投入 20% 的资金。获胜后,资金从 1000 美元增至 1200 美元;亏损后,降至 800 美元。无论顺序如何,一次获胜和一次亏损后,资金剩余 960 美元。
  • 每次抛掷投入 40% 的资金。同样的先赢后亏序列,资金从 1000 美元增至 1400 美元,再降至 840 美元。
  • 每次抛掷投入全部资金。一次反面朝上将永久终止序列,无论优势有多大。

在 20% 的投入比例下,4% 的往返成本是波动性资本复利增长的代价,而在长期序列中,一个 60/40 的硬币足以多次覆盖这个成本。在 40% 的投入比例下,往返成本为 16%,硬币已无法覆盖:在凯利比例两倍的情况下,增长率大致为零。超过这一点,即使是一个拥有真实、已验证优势的赌局,也无法实现任何增长,这是该公式所蕴含的最有用的事实。

公式对每日股票下注的要求

现在将同样的公式应用于市场。将一只股票的一个交易日视为一次赌局的重复:获胜概率是收盘上涨的交易日的比例,获胜金额是平均上涨日的涨幅,亏损金额是平均下跌日的跌幅。选取 2016 年至 2025 年整整十个日历年的每日收盘数据,涵盖六只知名股票:

查询凯利输入(基于2016至2025年每日收盘价):胜率、平均收益、平均损失及公式返回比例
每个数字背后的完整 SQL
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

看前三列,优势似乎微乎其微。胜率接近抛硬币,并且对于面板中的每只股票,平均上涨日和平均下跌日的幅度都相近。SPY55.3% 的交易时段内收盘上涨,平均上涨日涨幅为 0.71%,平均下跌日跌幅为 0.76%。

最后一列才是问题所在。这些微小且近乎平衡的输入值位于公式的分母中,而小分母会产生大结果。该公式为 SPY 返回的比例是资本的 10.1 倍,而 6 只股票中最低的也达到了 2 倍。对每日股票下注应用完整的凯利准则,得出的不是账户的一个百分比,而是对杠杆的要求,这个要求没有经纪商会提供,也没有账户能承受。

权衡的形态

这是理论。下一个面板是实验。取同一十年期间标普500指数跟踪基金的实际每日回报,将每日回报乘以一个固定的下注规模,然后计算复利。下注规模为 1.0 倍代表无杠杆的指数。下注规模为 3.0 倍意味着每天为每一美元资本投入三美元,并每日重新平衡。每一行代表一个完整的十年路径,包括其最终财富以及在此过程中经历的最大峰值到谷底的跌幅。

查询标普500十年日回报按八种固定投注比例复利:终值及最大回撤
每个数字背后的完整 SQL
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 倍下注规模下,路径结束时财富是起始资本的 1.92 倍,最大跌幅为 18.2%。在 5x 倍下注规模下,同样的每日回报和同样的十年,路径结束时财富是起始资本的 14.35 倍,最大跌幅为 94.5%。

这两列的变化趋势不同,而这正是部分凯利准则的全部教训。随着下注规模的增加,最终财富先上升,然后趋于平缓,最后随着波动性复利的拖累超过额外敞口带来的收益而下降。回撤列则没有这样的转折点。它在 8 行中的每一步都在上升,并且上升速度比财富列曾经达到的速度更快。最优下注规模一半的增长潜力,可以在最优下注规模一半的水平上实现,而所承受的痛苦却小得多。这种不对称性是主张投入少于 f* 的理由,也是半凯利准则存在的原因。

估计是薄弱环节,而非公式本身

对于一个赔率已知的赌局,该公式是精确的。在赌场中,赔率是印好的。在市场中,赔率是根据历史数据估计的,而估计值会波动。以下是针对单一指数跟踪基金,分别对十个日历年中每一年运行与第一个面板相同的计算。

查询标普500跟踪器逐年凯利计算(2016至2025年)
每个数字背后的完整 SQL
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

每一行都是对同一个未知量的估计,基于大约 250 个观测值构建。2016 年返回 13.7,胜率为 53.8%。2025 年返回 12.3,胜率为 57.8%。该图表显示了当每个读数都来自单一年份时,10 个对同一个数字的读数之间可能相差多远。

这种离散程度比任何公式的改进都更重要。将你的优势高估一倍,公式会返回大约两倍的下注规模,这将使你处于或超过增长变为负值的临界点。低估你的优势,你会放弃本可以复利增长的机会,但不会面临破产风险。这两种错误并不对称,而错误中代价较小的一方是保守的一方。实际使用凯利准则的从业者倾向于投入一半或四分之一的比例,并将该公式视为一个上限而非目标。

模型不再描述市场的情况

凯利准则假设一个赌局可以以固定的、已知的赔率重复进行,并且每次重复的结果是独立的。市场打破了所有这些假设。赔率是估计的,并且随时间变化。每日回报存在聚集性:平静期之后往往跟着平静期,剧烈波动的日子会成群出现,这使得回撤幅度超出了独立性假设的预测。头寸并非在每个交易日结束时结算,价格跳空会越过赌局本应平仓的价格,而追加保证金的通知则按照经纪商的时间表而非模型的时间表到来。

该公式仍然作为一个边界有其价值。它用一行公式表明,存在一个下注规模,超过它之后,更多的信心反而会产生更少的财富,并且它根据交易员至少可以尝试测量的数量来定位这个边界。这也是同样的逻辑指向分散化的原因:几个部分独立的赌局比一个赌局能更有效地共享相同的总风险预算,这是 集中度风险 背后的算术原理。对于按计划投入资金而非进行离散下注的投资者来说,头寸规模问题由计划本身来回答,这也是 平均成本法 的论据。

常见问题解答

凯利准则的公式是什么?

对于一个以概率 p 赢得所下注金额 g 比例、以概率 q 输掉所下注金额 l 比例的赌局,使资本增长最优的比例是 f = p / l - q / g。在等额赔率情况下,它简化为 f = p - q,即优势本身。

为什么交易员使用半凯利而不是全凯利?

因为在最优比例附近增长接近平缓,而风险却持续上升,所以将下注减半会牺牲少量长期增长,但能大幅减少回撤。估计误差加剧了这一论点:由于高估优势而导致下注规模翻倍,会使其接近增长停止的临界点。

凯利准则适用于股票吗?

它作为算术公式是适用的,但其固定已知赔率和独立结果的假设在市场中并不成立。如上文第一个面板所示,将其天真地应用于每日股票回报,会要求远超任何账户能承受的杠杆。

如果下注超过凯利比例会怎样?

长期增长率会下降。在大约两倍凯利比例时,增长率降至接近零,超过这一点后,即使拥有真实优势的赌局也会导致资本随时间缩水,同时其回撤会持续加深。

凯利准则等同于每笔交易冒 1% 或 2% 的风险吗?

不。固定百分比规则完全忽略了赔率,对每个交易设置都应用相同的数字。凯利准则根据测量到的优势来调整下注规模,这使得它在优势已知时反应更灵敏,在优势是猜测时则更脆弱。


以上每个数字都来自一个可打开、编辑和重新运行的存储查询。在斯特拉斯莫终端上,你可以自行更换股票代码、时间窗口或下注规模网格,并衡量其中的权衡关系。