Position Sizing & Leverage: Kelly Criterion Strategy › Risk Budgeting and Capital Allocation
Quantitative FinanceAll chapters 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 strategies with return vector , expected return vector , and covariance matrix . Let 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 , which is simply the weighted average of individual strategy returns. The portfolio variance is , 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:
where:
- : portfolio weight vector
- : expected return vector
- : 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:
where:
- : optimal weight vector
- : inverse covariance matrix
- : 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: . The inverse of a diagonal matrix is simply the diagonal matrix of reciprocals. In this special case, the optimal weights simplify dramatically to:
where:
- : optimal weight for strategy
- : expected return of strategy
- : variance of strategy
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.
The marginal risk contribution (MRC) of strategy to portfolio volatility measures how much portfolio risk increases when you slightly increase the weight of strategy . Formally, it is defined as:
where:
- : marginal risk contribution of strategy
- : portfolio volatility
- : weight of strategy
- : covariance matrix of returns
- : -th element of the marginal covariance vector
The term is the -th element of the vector obtained by multiplying the covariance matrix by the weight vector. It represents the covariance of strategy 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:
where:
- : total risk contribution of strategy
- : weight of strategy
- : marginal risk contribution
- : 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:
where:
- : total risk contribution
- : 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 (summing to 1) and find weights such that:
where:
- : total risk contribution of strategy
- : portfolio volatility
- : target risk contribution proportion for strategy
This constraint says that strategy should contribute fraction of total portfolio risk. Combining this with the definition of TRC leads to solving:
where:
- : weight of strategy
- : -th element of the vector (marginal covariance)
- : target risk budget
- : 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 for all strategies. This equal risk contribution constraint is the foundation of risk parity approaches, which have gained substantial popularity in institutional investing.
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.xLet's compare different allocation approaches for a three-strategy portfolio.
# 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,
}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


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.