Portfolio LabKnowledgeSign inCreate account

Risk & attribution: methodology of risk decomposition and Brinson attribution

Advanced9 min read · updated 25 October 2026 · 12 sources

The Risk page breaks down a portfolio's volatility by position, factor and segment, and explains the excess return over a benchmark. This risk attribution methodology describes what the code actually computes: covariance estimation, Euler contributions, value at risk and conditional VaR, tracking error, factor risk, Brinson-Fachler attribution with linking over time, and factor attribution. The basics are covered in the articles Risk contribution and Value at risk.

Data basis

The basis is monthly returns of completed months in the base currency from the settings; the current month is left out because its month-end value is only provisional. The calculation runs over the common period of all positions and the benchmark, optionally over the last 36, 60 or 120 months or the whole period; the default is 60 months. With fewer than 24 common months, the risk decomposition stops with a note, and the Brinson attribution with fewer than 12. Risk uses the portfolio's target weights, reset to the targets every month. This is the same assumption as in Monte Carlo or the factor regression. Volatilities and contributions p.a. are the monthly values times √12; value at risk and conditional VaR apply to one month.

Like the Factors tool, the Factors and Factor attribution tabs calculate in US dollars, because the factor returns following Fama and French (1993) are available in dollars. The Brinson attribution uses the actual weights of a backtest without costs; more on this below.

Covariance: sample, EWMA and Ledoit-Wolf

All risk figures depend on the estimated covariance matrix Σ of monthly returns. Three estimators are available:

  • Sample: every month counts equally, with n − 1 in the denominator.
  • EWMA (exponentially weighted moving average): the most recent month counts most, and each older month λ times as much as the one after it. The default is λ = 0.97 per month, selectable from 0.80 to 0.995. Portfolio Lab subtracts the weighted mean and divides by 1 − Σ aₜ² (aₜ = weight of the month); with equal weights, this is exactly the sample estimate.
  • Ledoit-Wolf: the sample covariance is shrunk towards a multiple of the identity matrix, with the shrinkage intensity derived from the data following Ledoit and Wolf (2004). It is the same estimator as in the optimisation. The page displays the intensity δ.
Half-life = ln 0.5 / ln λ; effective number of months = 1 / Σ aₜ²
λ = 0.97
half-life 22.8 months; over 60 months, this corresponds to just over 47 equally weighted months

EWMA reacts faster to calm or turbulent phases, but estimates with fewer effective observations; Ledoit-Wolf helps when many positions meet a short history. More on this in the article Covariance estimation. The correlation table always shows the sample estimate.

Euler risk contributions

Volatility σ = √(wᵀΣw) is homogeneous of degree 1 in the weights: if you double all weights, σ doubles. By Euler's theorem, it is therefore exactly the sum of each weight times its derivative. Litterman (1996) popularised this decomposition as a tool for identifying risk concentrations, and Roncalli (2013) derives it in detail.

MCRᵢ = (Σw)ᵢ / σ; CCRᵢ = wᵢ · MCRᵢ; Σ CCRᵢ = σ; share of risk = CCRᵢ / σ
MCR
marginal contribution: change in volatility per unit of additional weight
CCR
risk contribution in volatility points

Following Menchero and Davis (2011), each contribution can be read as a product: weight times own volatility times correlation with the portfolio. The table also shows this correlation; a position with low correlation carries less risk than its volatility would suggest. In addition, there is the diversification ratio Σ wᵢσᵢ / σ. A value of 1 means that nothing offsets.

Value at risk and conditional VaR

Value at risk is the loss that, with the chosen probability (95% or 99%), is not exceeded in one month; conditional VaR, also called expected shortfall, is the average loss beyond that point Jorion (2007). Both are shown as a positive loss figure and broken down by position.

VaR = −μ_p + z · σ_p; CVaR = −μ_p + σ_p · φ(z) / (1 − c); VaRᵢ = wᵢ · (−μᵢ + z · MCRᵢ)
z
quantile of the standard normal distribution: 1.645 at 95%, 2.326 at 99%
φ(z) / (1 − c)
2.063 at 95%, 2.665 at 99%
μ
average monthly returns over the period (weighted for EWMA)

For the historical method, Portfolio Lab sorts the portfolio's monthly returns at fixed weights. VaR is the loss in the k-th worst month, with k = ⌈n · (1 − c)⌉. With 60 months and 95%, that is the third worst; at 99%, the worst. CVaR is the average loss over these k months; a position's contribution is its average contribution in exactly these months, and the total adds up exactly. For the historical component VaR, a single month is not enough: the code averages the contributions in the months ranked k − h to k + h (h = 2% of the months, at least one) and scales them to the VaR. This is an estimate in the sense of Hallerbach (2003); the page labels it as such.

Tracking error and risk budget over time

With a benchmark (another portfolio from the grid or a single ticker), the page also decomposes the tracking error, the volatility of the return difference Grinold and Kahn (2000). The basis is the active weights a = w − w_B across all positions on both sides; positions held only by the benchmark enter with a negative active weight.

TE = √(aᵀΣa); contributionᵢ = aᵢ · (Σa)ᵢ / TE; Σ contributions = TE

With the sample covariance, this is exactly the standard deviation of the monthly difference between portfolio and benchmark times √12. The page shows both figures. The rolling risk budget calculates the shares of risk in windows of 36 months (selectable from 24 to 120 in steps of 6) at today's target weights and only with data up to the end of each window; it needs at least twelve months more than the window.

Factor risk

Each position is regressed on the chosen factor model by least squares with an intercept over the same months: rᵢ − RF = αᵢ + Bᵢ · f + εᵢ. From this follow the portfolio's exposures b = Bᵀw, the systematic variance bᵀFb with Euler contributions bₖ · (Fb)ₖ per factor, and the specific variance wᵀΣεw with contributions per position.

wᵀ Cov(r − RF) w = bᵀFb + wᵀΣεw (exact in the sample)
F
covariance of the factor returns
Σε
covariance of the residuals; its diagonal holds the residual variances

The equation holds exactly because the residuals of a regression with an intercept over the same period have a mean of zero and are uncorrelated with the factors. The code splits the specific variance into residual variances (wᵀDw) and residual correlations. The latter reveal common features that the model does not capture, such as industries or currencies. With a benchmark, it calculates the same for the active weights.

Regions, countries, sectors and asset classes

For the breakdown by region, country, sector, currency and asset class, Portfolio Lab uses the shares from the look-through (see Look-through methodology). The risk contribution of each position is distributed across the segments in proportion to these shares and set against the weight share. This is an approximation: it assumes that every euro within a fund has the same risk density. In reality, technology stocks, for example, are more volatile than utilities; the table shows roughly where the risk sits. Positions without holdings data appear as “No look-through”.

Brinson-Fachler attribution

The attribution explains the excess return over a benchmark through three decisions per segment s. The decomposition goes back to Brinson et al. (1986); Portfolio Lab uses the variant of Brinson and Fachler (1985), in which allocation is measured against the total return of the benchmark: an overweight only counts as positive if the segment performed better than the benchmark as a whole.

Aₛ = (wₛ − Wₛ)(bₛ − B); Sₛ = Wₛ(rₛ − bₛ); Iₛ = (wₛ − Wₛ)(rₛ − bₛ); Σ (A + S + I) = R − B
wₛ, Wₛ
weights of portfolio and benchmark at the start of the month
rₛ, bₛ
returns of the segment in the portfolio and the benchmark
R, B
returns of portfolio and benchmark

The weights at the start of the month are the actual weights of a backtest without costs at the end of the previous month, after drift and the chosen rebalancing; this makes R exactly the return of the backtest. Segments are, as you choose, positions, asset classes or their main categories from the taxonomy, with each position assigned as a whole. If the benchmark does not hold a segment, bₛ = rₛ applies, and the deviation is then allocation; if the portfolio does not hold it, rₛ = bₛ applies. With positions as segments, the entire excess return is allocation, because both sides hold the same security with the same return. Regions and sectors are deliberately left out: fund returns cannot be cleanly split by region.

Linking over time

Monthly effects cannot simply be added up: because of compounding, the sum of the monthly excess returns is not the excess return over the period. Both methods on the page weight each month with a factor so that all effects together add up to exactly R_total − B_total. Menchero (2004) sets out requirements for such methods and compares them; Bacon (2008) gives an overview.

Carino: kₜ / k with kₜ = [ln(1 + Rₜ) − ln(1 + Bₜ)] / (Rₜ − Bₜ); Menchero: βₜ = M + c · (Rₜ − Bₜ)
k
the same expression for the returns over the whole period
M
(R − B) / (T · [(1 + R)^(1/T) − (1 + B)^(1/T)]) with T months
c
correction so that the total adds up exactly, with factors as even as possible

The cumulative curve links afresh from the start to each month, and the table by calendar year links within each year.

Factor attribution

Factor attribution breaks down the portfolio's return in excess of the risk-free rate of the factor data into beta times factor return for each factor, alpha (the intercept) and a residual. In the static version, the betas come from a regression over the whole period, as in the factor regression methodology; the residual is then zero on average. In the rolling version, the code estimates betas and alpha for each month from the 36 months before it (selectable from 24 to 120), i.e. without look-ahead; the residual absorbs whatever the prior estimate misses. The contributions are summed arithmetically, not linked.

Limitations

  • All figures are historical estimates; correlations often rise precisely in crises.
  • Parametric VaR assumes a normal distribution and underestimates fat tails; historical VaR depends on a few months.
  • Fixed target weights: the risk applies to the portfolio as it is intended today, not to the drifted weights of the past.
  • The Brinson effects depend on the choice of segments; the same excess return can be labelled allocation or selection depending on the segments.

Frequently asked questions

Why is a position's share of risk larger than its weight?

Because it is more volatile than the rest and closely linked to the portfolio. The risk contribution is weight times volatility times correlation with the portfolio; equities in a mixed portfolio therefore usually carry far more risk than capital.

What is the difference between VaR and CVaR?

VaR gives the loss threshold that is not exceeded with 95% or 99% probability. CVaR tells you how large the loss is on average if the threshold is exceeded after all. It therefore looks into the tail of the distribution.

Why does the attribution need linking?

Because returns compound multiplicatively over several months. The sum of the monthly effects does not exactly match the excess return over the period; the Carino and Menchero methods weight the months so that it adds up exactly.

Why does Brinson by position only show allocation?

Because portfolio and benchmark hold the same security with the same return: within a single position, there is no selection. Selection only arises in segments with several positions, for example by asset class.

Why do the factor tabs calculate in US dollars?

The Fama and French factor returns are available in dollars. If you regressed euro returns on them, the currency movement would show up as a factor contribution or as alpha.

Literature

  1. Bacon, Carl R. (2008): Practical Portfolio Performance Measurement and Attribution. Wiley, 2nd edition.
  2. Brinson, Gary P.; Fachler, Nimrod (1985): Measuring non-US. equity portfolio performance. The Journal of Portfolio Management 11 (3), pp. 73–76. doi:10.3905/jpm.1985.409005
  3. Brinson, Gary P.; Hood, L. Randolph; Beebower, Gilbert L. (1986): Determinants of Portfolio Performance. Financial Analysts Journal 42 (4), pp. 39–44. doi:10.2469/faj.v42.n4.39
  4. Fama, Eugene F.; French, Kenneth R. (1993): Common risk factors in the returns on stocks and bonds. Journal of Financial Economics 33 (1), pp. 3–56. doi:10.1016/0304-405x(93)90023-5
  5. Grinold, Richard C.; Kahn, Ronald N. (2000): Active Portfolio Management. McGraw-Hill, 2nd edition.
  6. Hallerbach, Winfried (2003): Decomposing portfolio value-at-risk: a general analysis. The Journal of Risk 5 (2), pp. 1–18. doi:10.21314/jor.2003.076
  7. Jorion, Philippe (2007): Value at Risk: The New Benchmark for Managing Financial Risk. McGraw-Hill, 3rd edition.
  8. Ledoit, Olivier; Wolf, Michael (2004): A well-conditioned estimator for large-dimensional covariance matrices. Journal of Multivariate Analysis 88 (2), pp. 365–411. doi:10.1016/s0047-259x(03)00096-4
  9. Litterman, Robert (1996): Hot Spots™ and Hedges. The Journal of Portfolio Management 23 (5), pp. 52–75. doi:10.3905/jpm.1996.052
  10. Menchero, Jose (2004): Multiperiod Arithmetic Attribution. Financial Analysts Journal 60 (4), pp. 76–91. doi:10.2469/faj.v60.n4.2638
  11. Menchero, Jose; Davis, Ben (2011): Risk Contribution Is Exposure Times Volatility Times Correlation: Decomposing Risk Using the X-Sigma-Rho Formula. The Journal of Portfolio Management 37 (2), pp. 97–106. doi:10.3905/jpm.2011.37.2.097
  12. Roncalli, Thierry (2013): Introduction to Risk Parity and Budgeting. Chapman & Hall/CRC.

Full bibliography

This page describes how Portfolio Lab calculates; past results are not a forecast. All terms in the glossary.