q-fin.PMAug 24, 2026
SaveKellyBoost: Growth-Optimal Portfolio Construction with Gradient-Boosted Trees
Abstract
KellyBoost is a single multi-output XGBoost model whose softmax output is the portfolio: with y the vector of per-asset holding-period returns, the training loss is - log(1 + w y), the negative log growth rate, so the fitted model is the growth-optimal (Kelly) allocation conditioned on the features. The objective is exact rather than a surrogate: we derive the gradient, the analytic diagonal Hessian and the full Hessian in closed form, verify them by finite differences, and ship a dependency-free reference engine.
Figures & tables
| Ann. | Ann. | Max | ann. log growth | |||
|---|---|---|---|---|---|---|
| Method | ( , 20d) | return | vol. | Sharpe | DD | vs. KellyBoost (%) |
| KellyBoost (ours) | 0.47 | 6.2% | 23.9% | 0.30 | -46.2% | — |
| MLP, same loss | 0.56 | 7.1% | 20.5% | 0.35 | -55.5% | -0.9 [-9.2, +8.9] |
| Two-stage LGBM + optimizer | 0.82 | 8.2% | 20.9% | 0.40 | -40.4% | -1.9 [-12.3, +10.0] |
| Multiclass surrogate | 0.35 | 4.0% | 19.2% | 0.21 | -42.7% | +2.0 [-5.6, +9.4] |
| MLP, surrogate loss | 0.20 | 2.0% | 21.8% | 0.12 | -47.4% | +4.0 [-5.1, +14.2] |
Table 1: Out-of-sample results on the evaluation segment (2013-01 to 2026-07, 163 monthly decisions, gross of costs). is the mean realized log growth per 20-day decision ( ). Sharpe is daily returns in excess of T-bills, annualized. The last column is the moving-block-bootstrap 95% interval for the difference in annualized daily log growth versus KellyBoost (negative = worse than KellyBoost).
Figure 1: Out-of-sample equity curves (log scale), all methods, evaluation segment. Every learned method is deployed identically: frozen development-tuned parameters, expanding-window refits every 21 trading days, leave-one-out ensemble.
Figure 2: KellyBoost’s deployed allocation over the evaluation segment (committee average). The model was never told what an asset class is — the rotation structure is learned from the features alone.
| Cell (growth surrogate) | ( , 20d) | 95% CI | |
|---|---|---|---|
| Boosted tree, searched | +0.12 | [-0.52, +0.75] | 0.65 |
| Boosted tree, hand-built | +0.07 | [-0.34, +0.45] | 0.63 |
| MLP, searched | +0.37 | [-0.26, +0.99] | 0.87 |
| MLP, hand-built | +0.18 | [-0.32, +0.75] | 0.77 |
| Pooled (four cells) | +0.18 | [-0.11, +0.50] | 0.89 |
Table 2: The loss effect, cell by cell: paired per-decision differences in realized log growth, growth objective minus argmax surrogate, holding the learner class and feature pipeline fixed within each cell ( , 163 decisions). Intervals: circular moving-block bootstrap, block 6 decisions, 10,000 draws. The pooled row averages the four aligned difference series at each decision date, preserving cross-cell correlation.
| Ann. | Ann. | Max | |||||
|---|---|---|---|---|---|---|---|
| Method | Features | ( ) | return | vol. | Sharpe | DD | |
| KellyBoost | hand-built | 174 | 0.39 | 5.7% | 22.9% | 0.28 | -48.3% |
| KellyBoost | searched | 5 | 0.47 | 6.2% | 23.9% | 0.30 | -46.2% |
| MLP, same loss | hand-built | 174 | 0.67 | 8.5% | 19.4% | 0.43 | -40.4% |
| MLP, same loss | searched | 19 | 0.56 | 7.1% | 20.5% | 0.35 | -55.5% |
| Two-stage LGBM + optimizer | hand-built | 174 | 0.38 | 5.2% | 23.8% | 0.26 | -36.2% |
Table 3: What the feature search bought. Hand-built: the 174-column set with random-search hyperparameters (the pipeline as first designed); searched: Section 3.5 . Deployment metrics, .
| Feature | Gain share |
|---|---|
| INTL_Q2Y_SH2P90 | 35.9% |
| WHEAT_Q2Y_RH2P25 | 27.7% |
| COPPER_Q2Y_SWP10 | 22.0% |
| SOYBEAN_Q2Y_RH2P50 | 7.7% |
| XLF_SKEW1Y | 6.7% |
Table 4: KellyBoost’s searched feature list, with each column’s share of the committed fit’s total split gain.
| Dev. score | Ann. | Max | |||
|---|---|---|---|---|---|
| Variant | ( ) | ( ) | return | Sharpe | DD |
| analytic Hessian (model) | 4.19 | 0.47 | 6.2% | 0.30 | -46.2% |
| constant Hessian | 1.43 | 0.67 | 8.3% | 0.63 | -23.6% |
| Hessian | 0.54 | 0.45 | 5.0% | 0.26 | -51.7% |
| one output per tree | 3.50 | 0.65 | 8.8% | 0.40 | -45.7% |
Table 5: Ablations. Dev. score: mean log growth ( ) under the development tuning protocol at the frozen KellyBoost parameters. Deployment columns as in Table 1 , all with .
| Method | Turnover | 0 bps | 5 bps | 10 bps | 20 bps |
|---|---|---|---|---|---|
| KellyBoost (ours) | 7.9x | 6.2% / 0.30 | 5.8% / 0.28 | 5.3% / 0.27 | 4.5% / 0.23 |
| MLP, same loss | 11.8x | 7.1% / 0.35 | 6.5% / 0.32 | 5.9% / 0.30 | 4.6% / 0.24 |
| Two-stage LGBM + optimizer | 16.5x | 8.2% / 0.40 | 7.3% / 0.36 | 6.4% / 0.32 | 4.7% / 0.24 |
| Multiclass surrogate | 13.1x | 4.0% / 0.21 | 3.3% / 0.18 | 2.7% / 0.14 | 1.3% / 0.07 |
| MLP, surrogate loss | 16.8x | 2.0% / 0.12 | 1.2% / 0.09 | 0.3% / 0.05 | -1.4% / -0.03 |
| Unconditional Kelly | 1.8x | 4.1% / 0.22 | 4.0% / 0.21 | 3.9% / 0.21 | 3.7% / 0.20 |
Table 6: Transaction-cost sensitivity: annualized return / excess Sharpe under one-way proportional costs applied to each method’s measured turnover.
More in this topic
Portfolio Optimization
Portfolio optimization selects asset weights to balance expected return, risk, diversification, and trading constraints.
See all 63 papers