kelly_lean — optimalité du critère de Kelly (log-croissance)
Mini-projet Lean 4 (avec Mathlib, toolchain v4.33.0) prouvant l’optimalité du critère de Kelly pour le position sizing. Pour un pari de Bernoulli (probabilité p de gain, cote nette b, q = 1 − p), la fraction optimale du capital à risquer est
f* = (b·p − q) / b
qui maximise de façon unique le taux de croissance espéré du capital composé
g(f) = p·log(1 + b·f) + q·log(1 − f).
Tout sur-pari (f > f*) ou sous-pari (f < f*) est strictement sous-optimal.
Ce résultat fonde le position sizing au cœur de la série trading QuantConnect, et relie cette série à un théorème propre et entièrement démontré. Référence : J. L. Kelly Jr., A New Interpretation of Information Rate, BSTJ (1956). Voir l’issue #4052 (roadmap Lean #4038, Tier 2).
Le théorème, du pari brut jusqu’à l’unicité du maximiseur — la chaîne causale des symboles Lean formant le résultat :
flowchart TD
BET["Pari de Bernoulli Bet β<br/><i>p gain, b cote, q = 1 − p</i>"]
W["Multiplicateurs de richesse<br/>W_win(f) = 1 + b·f ; W_lose(f) = 1 − f"]
G["Croissance espérée composée<br/>g(f) = p·log W_win(f) + q·log W_lose(f)"]
STAR["Fraction de Kelly<br/>f* = (b·p − q) / b"]
OPT["kelly_optimal : g(f) ≤ g(f*)<br/><i>f* maximise la log-croissance</i>"]
UNIQ["kelly_unique : f ≠ f* ⟹ g(f) < g(f*)<br/><i>sur-pari et sous-pari strictement sous-optimaux</i>"]
BET --> W --> G
G -->|"condition du 1er ordre g'(f*) = 0"| STAR
STAR --> OPT -.-> UNIQ
Stratégie de preuve
On évite la concavité abstraite (StrictConcaveOn) et l’on prouve g(f) ≤ g(f*) directement via la tangente du logarithme en 1 :
log t ≤ t − 1, avec égalité ssi t = 1 (version stricte : log t < t − 1 pour t ≠ 1).
En écrivant la différence de croissance comme
g(f) − g(f) = p·log(W_win(f) / W_win(f)) + q·log(W_lose(f) / W_lose(f*))
où W_win(f) = 1 + b·f et W_lose(f) = 1 − f sont les multiplicateurs de richesse, et en appliquant log t ≤ t − 1 à chaque rapport, on obtient la majoration clé
g(f) − g(f) ≤ (f − f)·g’(f*)
où g'(f) = p·b/(1+bf) − q/(1−f) est la pente du log-croissance. Or la condition du premier ordre donne g'(f*) = 0 (vérifiée par calcul), donc g(f) ≤ g(f*).
L’unicité suit de la version stricte log t < t − 1 : si f ≠ f*, les multiplicateurs de richesse diffèrent (injectivité de f ↦ 1 + b·f et f ↦ 1 − f), donc au moins un rapport diffère de 1, l’inégalité est stricte, et g(f) < g(f*).
La mécanique de preuve, réduite à son squelette — la tangente du log, la majoration clé et la condition du premier ordre qui la neutralise :
flowchart TD
TAN["Tangente du log en 1<br/>log t ≤ t − 1 ; <i>strict si t ≠ 1</i>"]
RAP["Rapports de multiplicateurs<br/>W_win(f) / W_win(f*) ; W_lose(f) / W_lose(f*)"]
KEY["Majoration clé : g(f) − g(f*) ≤ (f − f*)·g'(f*)<br/><i>growth_diff_le</i>"]
FOC["Condition du 1er ordre g'(f*) = 0<br/><i>growthGrad_kelly_zero</i>"]
OPT["g(f) ≤ g(f*) — kelly_optimal"]
STRICT["Cas strict t ≠ 1<br/>au moins un rapport ≠ 1"]
UNIQ["g(f) < g(f*) — kelly_unique"]
TAN -->|"appliquée à chaque rapport"| RAP --> KEY
FOC -.-> KEY --> OPT
TAN -.-> STRICT --> UNIQ
Modules
| Module | Contenu |
|---|---|
Kelly/Bet.lean |
Pari de Bernoulli Bet (p, b), fraction f, multiplicateurs de richesse winWealth/loseWealth, zone admissible Feasible = (−1/b, 1). |
Kelly/Growth.lean |
Taux de croissance espéré growth et sa pente growthGrad. |
Kelly/Kelly.lean |
Fraction de Kelly kellyFrac, condition du premier ordre growthGrad_kelly_zero, majoration clé growth_diff_le, théorèmes phares kelly_optimal + kelly_unique. |
Théorèmes prouvés (0 sorry)
kelly_optimal : Feasible β f → growth β f ≤ growth β (kellyFrac β)—f*maximise le taux de croissance espéré.kelly_unique : Feasible β f → f ≠ kellyFrac β → growth β f < growth β (kellyFrac β)— sur-pari et sous-pari strictement sous-optimaux (unicité du maximiseur).- Lemmes supports :
kellyFrac_feasible(f* ∈ (−1/b, 1)),winWealth_kelly/loseWealth_kelly(multiplicateurs en f*),growthGrad_kelly_zero(condition du premier ordre),growth_diff_le(majoration clé).
Build
lake build Kelly # 8496 jobs, 0 sorry, exit 0Vérifié localement : lake build Kelly SUCCESS, grep -rn '\bsorry\b' Kelly/ = 0, CI lean-kelly.yml (sorry-baseline: "0", sorry-filter-mode: standalone-tactic).
Jalon ouvert (non sorry-backed)
La concavité stricte abstraite de g via StrictConcaveOn (vue calcul g''(f) < 0) puis application du théorème du maximiseur unique de Mathlib est un jalonn alternatif non livré ici : la preuve directe via la tangente log t ≤ t − 1 atteint le même résultat de façon plus élémentaire et 0 sorry. Généralisation aux distributions non-Bernoulli (gain/perte continus, multi-issues) : ouvert, hors périmètre du cadre canonique de Kelly (pari de Bernoulli).
Notebooks compagnons
Le lake est le livrable formel (lake build = preuve d’exécution, convention des lakes frères) ; deux notebooks compagnons le rendent pédagogique :
| Notebook | Rôle |
|---|---|
Kelly_companion.ipynb |
Volet numérique (Python) : montre, côte à côte avec les théorèmes prouvés, pourquoi f* maximise le taux de croissance espéré g(f) et pourquoi tout sur-pari (f > f*) ou sous-pari (f < f*) est strictement sous-optimal — narration économique, figures et lien trading. |
Kelly_companion_lean.ipynb |
Jumeau à kernel Lean 4 : chaque énoncé du lake est importé et vérifié par le noyau Lean lui-même (#check, #print axioms, exemples re-prouvés en cellule) — les énoncés qui compilent, pas la prose recopiée. |