Position Sizing & Leverage: Kelly Criterion Strategy › Risk Budgeting and Capital Allocation

Michael BrenndoerferJanuary 23, 202610 min read
Quantitative FinanceAll chapters
Part 14 of 15Strategy Development and Backtesting
Chapter 75Position Sizing & Leverage: Kelly Criterion Strategy › Risk Budgeting and Capital Allocation
Reading section 3 of 9 · Risk Budgeting and Capital Allocation · 10 minSection 3 of 9 · 10 min

Book contents

Section 3 of 9 · 10 min read

Position Sizing & Leverage: Kelly Criterion Strategy › Risk Budgeting and Capital AllocationOne section · Sections in this chapter3 / 9 ↓
Reading tools Definitions & inline links

Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.

Article links

Make inline references clickable

Real portfolios contain multiple strategies, each with its own expected return, volatility, and correlations with other strategies. How should capital be allocated across strategies to maximize overall portfolio performance? This question extends Kelly's single-bet framework to the multi-dimensional setting that characterizes real trading operations.

Multi-Strategy Framework

Consider a portfolio of nn strategies with return vector r=(r1,…,rn)T\mathbf{r} = (r_1, \ldots, r_n)^T, expected return vector μ=(μ1,…,μn)T\boldsymbol{\mu} = (\mu_1, \ldots, \mu_n)^T, and covariance matrix Σ\boldsymbol{\Sigma}. Let w=(w1,…,wn)T\mathbf{w} = (w_1, \ldots, w_n)^T be the weight, or capital allocation, vector. The notation uses vectors and matrices because the interactions between strategies, captured by the covariance matrix, fundamentally affect optimal allocation.

The portfolio expected return is μp=wTμ\mu_p = \mathbf{w}^T \boldsymbol{\mu}, which is simply the weighted average of individual strategy returns. The portfolio variance is σp2=wTΣw\sigma_p^2 = \mathbf{w}^T \boldsymbol{\Sigma} \mathbf{w}, which accounts for individual strategy variances and all pairwise covariances. When strategies are negatively correlated, diversification reduces portfolio variance below the weighted average of individual variances.

As we discussed in Modern Portfolio Theory and Mean-Variance Optimization, the maximum Sharpe ratio portfolio solves:

max⁡wwTμwTΣw\max_{\mathbf{w}} \frac{\mathbf{w}^T \boldsymbol{\mu}}{\sqrt{\mathbf{w}^T \boldsymbol{\Sigma} \mathbf{w}}}

where:

  • w\mathbf{w}: portfolio weight vector
  • μ\boldsymbol{\mu}: expected return vector
  • Σ\boldsymbol{\Sigma}: covariance matrix of returns

This optimization seeks the portfolio with the best risk-adjusted return, balancing expected return in the numerator against risk in the denominator. For unconstrained optimization, which allows both leverage and short selling, the solution has a closed form:

w∗∝Σ−1μ\mathbf{w}^* \propto \boldsymbol{\Sigma}^{-1} \boldsymbol{\mu}

where:

  • w∗\mathbf{w}^*: optimal weight vector
  • Σ−1\boldsymbol{\Sigma}^{-1}: inverse covariance matrix
  • μ\boldsymbol{\mu}: expected return vector

This is the multi-asset generalization of the Kelly criterion. Each strategy receives weight proportional to its expected return, adjusted by the inverse covariance matrix, which accounts for both individual volatility and correlations. The inverse covariance matrix effectively adjusts weights downward for volatile strategies and for strategies that are highly correlated with others, because these provide less diversification benefit.

Independent Strategies

When strategies are independent, meaning they have zero correlation with each other, the covariance matrix is diagonal: Σ=diag(σ12,…,σn2)\boldsymbol{\Sigma} = \text{diag}(\sigma_1^2, \ldots, \sigma_n^2). The inverse of a diagonal matrix is simply the diagonal matrix of reciprocals. In this special case, the optimal weights simplify dramatically to:

wi∗∝μiσi2w_i^* \propto \frac{\mu_i}{\sigma_i^2}

where:

  • wi∗w_i^*: optimal weight for strategy ii
  • μi\mu_i: expected return of strategy ii
  • σi2\sigma_i^2: variance of strategy ii

This formula states that each strategy should be sized according to its individual Kelly criterion, independent of other strategies. This independence is powerful because it means you can optimize each strategy separately without worrying about interactions. The total portfolio leverage is then simply the sum of individual leverages.

For correlated strategies, the picture is more complex. Positive correlation between strategies reduces diversification benefits, and the optimal allocation accounts for this by reducing weights on highly correlated strategies. Intuitively, having two highly correlated strategies is almost like having twice the position in a single strategy, which may violate risk limits even when individual position sizes appear reasonable.

Risk Budgeting Framework

An alternative to return-based allocation is risk budgeting, where we allocate a "risk budget" to each strategy rather than capital directly. This approach is particularly useful when expected returns are uncertain but risk estimates are more reliable. In practice, volatilities and correlations tend to be more persistent and easier to estimate than expected returns, making risk budgeting less dependent on noisy expected-return estimates.

Risk Contribution

The marginal risk contribution (MRC) of strategy ii to portfolio volatility measures how much portfolio risk increases when you slightly increase the weight of strategy ii. Formally, it is defined as:

MRCi=∂σp∂wi=(Σw)iσp\text{MRC}_i = \frac{\partial \sigma_p}{\partial w_i} = \frac{(\boldsymbol{\Sigma} \mathbf{w})_i}{\sigma_p}

where:

  • MRCi\text{MRC}_i: marginal risk contribution of strategy ii
  • σp\sigma_p: portfolio volatility
  • wiw_i: weight of strategy ii
  • Σ\boldsymbol{\Sigma}: covariance matrix of returns
  • (Σw)i(\boldsymbol{\Sigma} \mathbf{w})_i: ii-th element of the marginal covariance vector

The term (Σw)i(\boldsymbol{\Sigma} \mathbf{w})_i is the ii-th element of the vector obtained by multiplying the covariance matrix by the weight vector. It represents the covariance of strategy ii with the overall portfolio.

The total risk contribution (TRC) measures how much of the portfolio's total risk is attributable to a particular strategy. It combines the marginal contribution with the position size:

TRCi=wi⋅MRCi=wi(Σw)iσp\text{TRC}_i = w_i \cdot \text{MRC}_i = \frac{w_i (\boldsymbol{\Sigma} \mathbf{w})_i}{\sigma_p}

where:

  • TRCi\text{TRC}_i: total risk contribution of strategy ii
  • wiw_i: weight of strategy ii
  • MRCi\text{MRC}_i: marginal risk contribution
  • σp\sigma_p: portfolio volatility

A fundamental property of risk contributions is that they decompose portfolio risk additively. The sum of total risk contributions equals the portfolio volatility:

∑iTRCi=σp\sum_i \text{TRC}_i = \sigma_p

where:

  • TRCi\text{TRC}_i: total risk contribution
  • σp\sigma_p: portfolio volatility

This decomposition property means that risk contributions provide a complete accounting of where portfolio risk comes from.

In a risk budgeting framework, we specify target risk contributions bib_i (summing to 1) and find weights such that:

TRCiσp=bi\frac{\text{TRC}_i}{\sigma_p} = b_i

where:

  • TRCi\text{TRC}_i: total risk contribution of strategy ii
  • σp\sigma_p: portfolio volatility
  • bib_i: target risk contribution proportion for strategy ii

This constraint says that strategy ii should contribute fraction bib_i of total portfolio risk. Combining this with the definition of TRC leads to solving:

wi(Σw)i=bi⋅σp2for all iw_i (\boldsymbol{\Sigma} \mathbf{w})_i = b_i \cdot \sigma_p^2 \quad \text{for all } i

where:

  • wiw_i: weight of strategy ii
  • (Σw)i(\boldsymbol{\Sigma} \mathbf{w})_i: ii-th element of the vector Σw\boldsymbol{\Sigma} \mathbf{w} (marginal covariance)
  • bib_i: target risk budget
  • σp2\sigma_p^2: portfolio variance

This system of equations is nonlinear in the weights and typically requires numerical optimization to solve. The most common special case is equal risk contribution, where bi=1/nb_i = 1/n for all strategies. This equal risk contribution constraint is the foundation of risk parity approaches, which have gained substantial popularity in institutional investing.

In[5]:
Code
import numpy as np
from scipy.optimize import minimize


def portfolio_volatility(weights, cov_matrix):
    """Calculate portfolio volatility."""
    return np.sqrt(weights @ cov_matrix @ weights)


def risk_contributions(weights, cov_matrix):
    """Calculate the risk contribution of each asset."""
    port_vol = portfolio_volatility(weights, cov_matrix)
    marginal_contrib = cov_matrix @ weights / port_vol
    risk_contrib = weights * marginal_contrib
    return risk_contrib


def risk_parity_objective(weights, cov_matrix):
    """
    Objective function for risk parity: minimize deviation from equal risk contribution.
    """
    risk_contrib = risk_contributions(weights, cov_matrix)
    target_risk = np.sum(risk_contrib) / len(weights)  # Equal risk
    return np.sum((risk_contrib - target_risk) ** 2)


def optimize_risk_parity(cov_matrix, initial_weights=None):
    """Find risk parity weights given a covariance matrix."""
    n = cov_matrix.shape[0]
    if initial_weights is None:
        initial_weights = np.ones(n) / n

    # Constraints: weights sum to 1, all positive
    constraints = {"type": "eq", "fun": lambda w: np.sum(w) - 1}
    bounds = [(0.01, 1) for _ in range(n)]  # No short selling

    result = minimize(
        risk_parity_objective,
        initial_weights,
        args=(cov_matrix,),
        method="SLSQP",
        constraints=constraints,
        bounds=bounds,
    )

    return result.x

Let's compare different allocation approaches for a three-strategy portfolio.

In[6]:
Code
# Define three strategies with different characteristics
strategy_names = ["Momentum", "Mean Reversion", "Factor"]
expected_returns = np.array([0.12, 0.08, 0.10])  # Annual expected returns
volatilities = np.array([0.20, 0.15, 0.12])  # Annual volatilities

# Correlation matrix (momentum and mean reversion tend to be negatively correlated)
correlation = np.array([[1.0, -0.3, 0.2], [-0.3, 1.0, 0.1], [0.2, 0.1, 1.0]])

# Build covariance matrix
cov_matrix = np.outer(volatilities, volatilities) * correlation

# Method 1: Equal weight allocation
equal_weights = np.ones(3) / 3

# Method 2: Kelly-optimal (inverse variance weighted by expected return)
# For simplicity, use the uncorrelated approximation first
kelly_raw = expected_returns / volatilities**2
kelly_weights = kelly_raw / np.sum(kelly_raw)  # Normalize to sum to 1

# Method 3: True mean-variance optimal (accounts for correlations)
cov_inv = np.linalg.inv(cov_matrix)
mv_raw = cov_inv @ expected_returns
mv_weights = mv_raw / np.sum(mv_raw)  # Normalize

# Method 4: Risk parity
rp_weights = optimize_risk_parity(cov_matrix)


# Calculate portfolio statistics for each method
def portfolio_stats(weights, exp_ret, cov_matrix):
    port_return = weights @ exp_ret
    port_vol = np.sqrt(weights @ cov_matrix @ weights)
    sharpe = port_return / port_vol
    risk_contrib = risk_contributions(weights, cov_matrix)
    return port_return, port_vol, sharpe, risk_contrib


methods = {
    "Equal Weight": equal_weights,
    "Kelly (uncorr)": kelly_weights,
    "Mean-Variance": mv_weights,
    "Risk Parity": rp_weights,
}
Out[7]:
Console
Strategy Characteristics:
--------------------------------------------------
Momentum: E[r] = 12.0%, σ = 20.0%, Sharpe = 0.60
Mean Reversion: E[r] = 8.0%, σ = 15.0%, Sharpe = 0.53
Factor: E[r] = 10.0%, σ = 12.0%, Sharpe = 0.83

======================================================================
Allocation Comparison:
======================================================================

Equal Weight:
  Weights: ['33.3%', '33.3%', '33.3%']
  Risk Contributions: ['49.7%', '21.2%', '29.1%']
  Portfolio: E[r] = 10.00%, σ = 8.95%, Sharpe = 1.12

Kelly (uncorr):
  Weights: ['22.2%', '26.3%', '51.4%']
  Risk Contributions: ['25.4%', '16.2%', '58.4%']
  Portfolio: E[r] = 9.92%, σ = 8.88%, Sharpe = 1.12

Mean-Variance:
  Weights: ['25.7%', '34.2%', '40.1%']
  Risk Contributions: ['31.4%', '27.8%', '40.8%']
  Portfolio: E[r] = 9.83%, σ = 8.66%, Sharpe = 1.14

Risk Parity:
  Weights: ['27.3%', '37.8%', '34.9%']
  Risk Contributions: ['33.7%', '33.6%', '32.7%']
  Portfolio: E[r] = 9.79%, σ = 8.65%, Sharpe = 1.13
Out[8]:
Visualization
Stacked bar chart showing capital allocation weights for Equal Weight, Kelly, Mean-Variance, and Risk Parity methods across Momentum, Mean Reversion, and Factor strategies.
Portfolio weights by allocation method. Mean-Variance and Kelly concentrate capital in the Factor strategy, while Risk Parity and Equal Weight provide more balanced allocations.
Stacked bar chart showing risk contributions by allocation method, illustrating how Risk Parity equalizes risk across all three strategies.
Risk contributions by allocation method. The Equal Weight portfolio is dominated by Momentum risk, whereas Risk Parity achieves equal risk contributions across all strategies.

The results show main differences between allocation approaches:

  • Equal weight treats all strategies identically regardless of their risk or return characteristics.
  • Kelly/Mean-variance tilts heavily toward strategies with better risk-adjusted returns, potentially creating concentrated bets.
  • Risk parity equalizes risk contribution, resulting in higher weights to lower-volatility strategies and more balanced risk exposure.

Notice that mean-variance optimization produces the highest Sharpe ratio by construction, but this comes with concentrated positions that are sensitive to estimation errors in expected returns. Risk parity sacrifices some expected return for more diversified risk exposure.