07 — Portfolio Construction

Risk Parity#

Equal RiskStatistical1 min read
◆ The PatternWeight assets so each contributes equally to total portfolio risk

Instead of targeting a return, risk parity targets equal risk contribution from each asset. This often leads to leveraged bond allocations to match equity volatility.

RCi = wi · (Σw)i / σp   →   RCi = RCj   ∀ i,j
Simplest proxy is inverse-volatility weighting: wi ∝ 1/σi. True risk parity requires numerical optimization to equalize marginal risk contributions.
// Risk parity — equal contribution allocation
All-Weather. Ray Dalio's All-Weather fund popularized risk parity — bonds carry leverage to match equity risk.
Pattern bridge: Volatility normalization echoes Indicators — ATR.
Worked example

A 60/40 portfolio of stocks (16% volatile) and bonds (5%) looks balanced by money, but stocks supply 94% of its risk. Weighting by inverse volatility gives 24% stocks, 76% bonds, with each contributing 50% of the risk. That portfolio is much less volatile, so to match 60/40’s risk it needs about 1.77× leverage — which is where the bond leverage in risk parity comes from.

Where it misleads
  • Inverse volatility only equalizes risk for two assets or when correlations are equal; with more assets you need to solve for equal contributions.
  • It relies on leverage being cheap and available; the bet is that low-volatility assets pay more per unit of risk (Asness, Frazzini & Pedersen 2012).
  • When bonds and stocks fall together, as in 2022, the “balance” offers little protection.
In code
vol = np.array([0.16, 0.05])                               # stocks, bonds
cov = np.outer(vol, vol) * np.array([[1, 0.1], [0.1, 1]])

def contributions(w):                                      # each asset's share of portfolio variance
    return w * (cov @ w) / (w @ cov @ w)

sixty_forty = contributions(np.array([0.6, 0.4]))
w_rp = (1 / vol) / (1 / vol).sum()                         # inverse volatility: equal risk for two assets
parity = contributions(w_rp)
rp_vol = np.sqrt(w_rp @ cov @ w_rp)
leverage = np.sqrt(np.array([0.6, 0.4]) @ cov @ np.array([0.6, 0.4])) / rp_vol   # to match 60/40's risk
Python, in your browser — edit the code and run it again

Assumes import numpy as np and import pandas as pd. Each snippet carries its own example numbers; the comments say which are made up or simulated.

Sources
  • S. Maillard, T. Roncalli & J. Teïletche, “The Properties of Equally Weighted Risk Contribution Portfolios”, Journal of Portfolio Management 36(4), 2010
  • C. S. Asness, A. Frazzini & L. H. Pedersen, “Leverage Aversion and Risk Parity”, Financial Analysts Journal 68(1), 2012
  • E. Qian, “Risk Parity Portfolios: Efficient Portfolios Through True Diversification”, PanAgora Asset Management, 2005

Last reviewed October 2026 · How this site checks its content · Report a mistake

Check yourself

1. How does risk parity weight assets?

Show answer

C. Low-volatility assets get larger weights, high-volatility ones smaller.

2. Compared with a 60/40 stock–bond portfolio, a stock–bond risk-parity portfolio typically…

Show answer

A. Stocks are several times as volatile as bonds, so equal risk means a much larger bond weight.

3. When is risk parity most vulnerable?

Show answer

A. 2022 was such a year: the bond-heavy, leveraged allocation lost on both sides.

Linked from 1
← Previous
Mean-Variance Optimization
Open in the full reader, with the topic sidebar