策略的凱利公式:如何確定倉位大小並分配資本
正期望策略也可能因為下注規模失誤而爆倉。我們從公式推導一路講到策略組合,剖析凱利公式:為什麼 full Kelly 很危險,分數凱利如何用一半的波動率換來 75% 的增長,以及在量化交易中真正可用的倉位配方是什麼。文章中段有一個互動式計算器,讓你直觀看到凱利比例如何牽動收益與風險。
任何策略都必須回答的那個問題
你有一個具備正向優勢(edge)的策略:長期來看它能賺錢。剩下的只有一個細節——單筆交易該投入多少比例的資本,或者一個策略該分配多少資本。
這不是次要問題,而是核心問題。正的數學期望並不能讓你免於爆倉:押注太多——一連串失利就會把賬戶拖進一個統計上無法迴歸的區域(見 盈虧的不對稱性)。押注太少——你又會把大部分潛在增長白白留在桌上。
凱利公式給出了精確答案:它是那個能最大化長期增長速度的資本比例——是幾何增長,而非算術增長。正是幾何增長決定了你的賬戶在一千筆交易後會落在哪裡,因為收益是相乘的,而不是相加的(見 收益的乘法本質)。
公式從何而來:最大化資本的對數
凱利(1956)以及之後索普的核心思想是:需要最佳化的不是單筆交易的期望利潤,而是最終資本的期望對數。對數的出現並非偶然——它是唯一一個在最大化時能讓資本以最大幾何速度增長的函數。
二元情形:有兩種結果的下注
設以機率 ,下注每單位帶來淨賠付 (賠率),而以機率 ,我們輸掉本金。我們押上資本的比例 。一筆交易後,贏時資本乘以 ,輸時乘以 。
期望對數增長:
對 求導並令其為零:
解出來就是凱利公式:
用文字說:最優比例等於你的優勢除以賠率。沒有優勢()——就不下注。
示例
某策略在 55% 的交易中獲勝,賠付比為 1:1():
full Kelly 要求每筆交易拿 10% 的資本去冒險。記住這個數字——下文我們會看到,為什麼幾乎沒人應該恰好押這麼多。
連續情形:用收益率代替下注
在交易中,一筆交易很少表現為只有兩種結果的下注——存在的是一個收益率分佈。對於單期均值為 、方差為 的收益率,在槓桿(比例) 下的期望對數增長近似等於:
最大值在以下處取得:
這就是著名的凱利連續形式(也叫默頓比例)。而最優點處的增長速度與夏普比率 的關係優美到了極致:
一個值得掛在牆上的結論:組合的最大幾何增長速度等於其夏普比率平方的一半。夏普翻倍——資本增長速度就翻四倍。
為什麼 full Kelly 太過頭了
公式給出的是關於增長的數學最優。但這個最優有一個公式沒有說出的代價:路徑的可怕波動和回撤,任何真實賬戶、任何真實的人都會在這上面崩潰。
偏離最優點的幾何
把比例 (其中 是凱利乘子: 是 full Kelly, 是 half Kelly)代入增長公式。相對於最大值,我們得到:

這條拋物線用一行字講完了風險管理的全部故事:
| 乘子 | 增長佔比 | 波動率 | 評註 |
|---|---|---|---|
| 0.25 (quarter) | 43.8% | 25% | 用四分之一的風險拿到近一半的增長 |
| 0.50 (half) | 75.0% | 50% | 實戰者的黃金中道 |
| 1.00 (full) | 100.0% | 100% | 增長最大,波動瘋狂 |
| 1.50 | 75.0% | 150% | 與 half 相同的增長,但風險高三倍 |
| 2.00 (double) | 0.0% | 200% | 沒有增長,風險最大 |
| > 2.00 | 負值 | — | 即便 edge 為正也會爆倉 |
三個結論:
- half Kelly 用一半的波動率拿走 75% 的增長。 從風險/收益比來看,這遠好於 full Kelly。
- 拋物線關於 對稱。 押 凱利得到的增長與 相同,但波動高三倍。過頭比不足受到的懲罰更狠。
- 在 凱利處增長歸零,再往後就變成負的。即便是一個能贏的策略,過於激進的倉位也會殺死資本。
full Kelly 的回撤:一個讓人清醒的公式

對於連續模型,資本曾經跌到初始值某個比例 的機率等於:
代入各凱利檔位——就得到這張表,看完之後 full Kelly 就不再顯得有吸引力了:
| 乘子 | P(曾經 −50%) | P(曾經 −75%) |
|---|---|---|
| 1.00 (full) | 50% | 75% |
| 0.50 (half) | 12.5% | 1.6% |
| 0.25 (quarter) | 0.78% | 0.006% |
| 2.00 (double) | 100% | 100% |
在 full Kelly 下,賬戶在某個時刻經歷 50% 回撤的機率等於 50%。這不是尾部情景——這是拋硬幣。half Kelly 把它壓到 12.5%,quarter Kelly——壓到不到一個百分點。而且這還是在理想化的高斯模型裡;現實中的肥尾會讓實際回撤更深。
計算器:調整凱利比例——觀察收益與風險
拖動滑塊。上面兩個設定策略的優勢(獲勝機率和賠付率),下面那個是凱利乘子 。看資本增長速度和深度回撤機率如何同時變化。注意文章的主線情節:當從 half 移向 full Kelly 時,增長只漲了一點點,而回撤風險——成倍上升。
把凱利比例滑塊在 0.5 和 1.0 附近來回撥一撥:相對最大值的增長從 75% 升到 100%,而 50% 回撤的風險卻從 13% 跳到 50%。這正是專業人士活在拋物線左半邊的原因。
分數 Kelly 作為行業標準
嚴肅的管理人幾乎從不押 full Kelly。典型區間是 到 凱利。除了回撤之外,還有四個根本性的理由去削減比例。
1. 參數估計誤差。 公式假設你知道真實的 、、、。而實際上你是在用有限樣本去估計它們。增長函數又是不對稱的:高估優勢會把你推到最優點之外,那裡增長下跌的速度比同等幅度低估時增長上漲的速度更快。如果真實凱利為 ,而你帶誤差地估計了它,那麼系統性地押少一些會更安全。粗略規則:估計存在不確定性時,把比例減半。
2. 非平穩性。 策略的優勢不是常數——市場狀態會變,edge 會衰減,競爭對手會複製你的想法。用昨天的資料算出的凱利,到了明天可能就偏高了。分數乘子是應對 edge 衰減的緩衝墊。
3. 肥尾。 高斯公式 低估了極端波動的風險。在現實中具有重尾的分佈上,它會系統性地下注過頭。分數 Kelly 在一定程度上補償了這一點。
4. 業務上回撤的成本。 對做市商而言,回撤不只是心理問題。它意味著追加保證金、在最糟糕的時刻被迫減倉、投資者資本流出、融資成本上升(見 funding rates 如何殺死槓桿)。一條平滑的資本曲線本身就有獨立的價值,而凱利公式裡並沒有這一項。
策略組合的 Kelly

到目前為止我們談的都是單一策略。但真正的問題是複數意義上的為多個策略選擇凱利:你有好幾個策略,需要在它們之間分配資本。
樸素的做法——為每個策略單獨算凱利再相加——是災難性地錯誤,因為它忽略了相關性。兩個高度相關的策略,本質上就是一個加倍的下注,總風險必須按一個來算。
矩陣形式
對於期望收益向量 和協方差矩陣 ,一次性求出所有策略的最優比例向量:
最優點處的增長速度推廣為組合夏普的平方:
請注意: 正是最大夏普組合(切點組合)的方向。凱利和均值-方差最佳化是同一枚硬幣的兩面:凱利只是把槓桿水平固定在那個能最大化幾何增長的水平上。
協方差逆矩陣在做什麼
- 相關的策略分攤風險預算。 如果兩個策略幾乎相同,矩陣會把它們的總比例削減到一個策略的水平——自動完成,不需要手工打補丁。
- 不相關的策略獲得分散化溢價。 它們可以保持在接近各自單獨的規模,而組合的總夏普會高於其中任何一個。
- 負相關的策略可能獲得加大的比例——它們互相對沖,矩陣會鼓勵這一點。
關於估計 的警告
協方差矩陣求逆在數值上是不穩定的:在有噪聲的估計上, 會把微小誤差放大成離譜的權重。協方差向對角線的收縮(shrinkage)、槓桿約束以及同一個分數乘子都是必須的。沒有這些,矩陣凱利會給出在回測上漂亮、在實盤中致命的比例。
量化交易與做市的修正
純粹的公式活在一個無菌的世界裡。在真實的引擎中需要做修正。
- 手續費和滑點 會削減有效優勢。請用扣除所有成本之後的收益率來算凱利,否則你會系統性地下注過頭。
- 下注的離散性和手數 讓你無法恰好押到 ——請向下取整,而不是向上。
- 非平穩的 edge 需要隨時間重新計算:用帶半衰期的滑動視窗去估計 和 ,而不是用全部歷史。
- 回撤約束。 在凱利之上設一個硬上限:最大回撤、最大槓桿、單策略最大比例。存在正式的帶回撤約束的凱利版本(Bassett、Boyd),但實踐中一個簡單的上限就夠了。
- 誠實評估 edge。 最大的錯誤是把樣本內(in-sample)測出來的優勢餵給凱利。只取樣本外(out-of-sample)的估計,走 walk-forward,扣除手續費之後。喂進公式的 edge 被高估了——出來的下注就被高估了。
配方:如何應用
- 誠實地評估優勢。 樣本外、走 walk-forward、扣除手續費和滑點。這是最重要的一步——輸入端的垃圾會在輸出端變成爆倉。
- 算出 full Kelly。 離散結果用二元式 ,收益率用連續式 。
- 取一個分數。 預設是 full Kelly 的 –。edge 越不穩定——乘子就越小。
- 組合就用矩陣算。 ,對協方差做收縮,然後用同一個分數乘子。
- 設硬性上限。 單倉位上限、槓桿上限、回撤限制——凌駕於一切之上。
- 重新計算。 隨著估計的更新,在不確定性上升和 edge 衰減時削減比例。
程式碼
import numpy as np
def kelly_binary(p, b):
"""p — 获胜概率,b — 每 1 单位下注的净赔付率。"""
q = 1 - p
return (b * p - q) / b # = p - q/b
def kelly_continuous(mu, sigma):
"""mu, sigma — 单期收益率的均值和标准差(同一单位)。"""
return mu / sigma ** 2
def kelly_portfolio(mu, cov, shrink=0.0):
"""策略组合的矩阵凯利。
mu — 期望收益向量;
cov — 收益率的协方差矩阵;
shrink — 向对角线收缩的系数(0..1),用于求逆的稳定性。"""
cov = np.asarray(cov, float)
if shrink:
cov = (1 - shrink) * cov + shrink * np.diag(np.diag(cov))
return np.linalg.solve(cov, np.asarray(mu, float))
def sized(f_star, kelly_fraction=0.25, cap=0.2):
"""带比例硬上限的分数凯利。"""
return float(np.clip(f_star * kelly_fraction, -cap, cap))
f = kelly_binary(p=0.55, b=1.0) # 0.10 — full Kelly
print(sized(f)) # 0.025 — quarter Kelly,安全的规模
常見錯誤
- 在樣本內 edge 上用凱利。 最昂貴的錯誤。被高估的優勢 → 下注過頭 → 負增長。
- 忽略策略之間的相關性。 單個凱利之和不等於組合凱利。
- 在實盤中用 full Kelly。 增長的數學最大值,但有 50% 的機率回撤掉一半本金。幾乎不適合任何人。
- 在不穩定的 edge 上用凱利。 如果優勢在衰減,公式會系統性地高估下注。
- 混淆目標。 凱利最大化的是資本的幾何增長——不是夏普,不是保持盈利的機率,也不是舒適度。如果你更看重曲線的平滑,那就有意識地押分數凱利。
總結
凱利公式用一個最大化長期幾何增長的公式,回答了任何策略的核心問題——押多少:下注用 ,收益率用 ,組合則用 。
但 full Kelly 是關於增長的數學最優,而非關於存活的最優。分數 Kelly(–)用成倍更小的波動和回撤,拿走了大部分增長。所以關於為策略選擇凱利這個問題,實戰上的答案是這樣的:誠實地算出 full Kelly——然後只押它的一個分數,並凌駕於硬性風險限額之上。
相關閱讀:
Authors
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.