BRISMA Project Documentation Version: 1.0 Last Updated: 2025-12-25 Status: Issue #48 - Asset-Level Implied Returns (Complete)
Portfolio managers observe their current asset allocation $\mathbf{w}$ and can estimate the covariance matrix $\mathbf{Q}$ from historical data. The fundamental question is:
What expected returns $\boldsymbol{\mu}$ would make this allocation optimal?
This is the inverse optimization problem: instead of finding optimal weights given expected returns, we find the implied returns that rationalize observed weights.
| Approach | Pros | Cons |
|---|---|---|
| Historical Returns | Data-driven, objective | Backward-looking, noisy, regime-dependent |
| Analyst Forecasts | Forward-looking | Subjective, inconsistent, costly |
| Implied Returns | Internally consistent, no forecasts needed | Requires assumption about investor utility |
Key Insight: Implied returns extract the market's collective wisdom embedded in current prices and allocations.
| Paper | Contribution |
|---|---|
| Black & Litterman (1992) | Equilibrium implied returns as prior for Bayesian updating |
| Merton (1980) | Risk aversion estimation from market data |
| Ross (1976) | Arbitrage Pricing Theory - factor-based returns |
| Fama & French (1993) | Multi-factor model empirics |
| He & Litterman (1999) | Extensions to Black-Litterman framework |
This section addresses Issue #48
An investor with mean-variance preferences maximizes:
$$U_{MV}(\mathbf{w}) = \mathbf{w}'\boldsymbol{\mu} - \frac{\lambda}{2}\mathbf{w}'\mathbf{Q}\mathbf{w}$$
where: - $\mathbf{w} \in \mathbb{R}^n$: Portfolio weights (column vector) - $\boldsymbol{\mu} \in \mathbb{R}^n$: Expected returns (column vector) - $\mathbf{Q} \in \mathbb{R}^{n \times n}$: Covariance matrix (symmetric, positive semi-definite) - $\lambda > 0$: Risk aversion parameter
Interpretation: - First term $\mathbf{w}'\boldsymbol{\mu}$: Expected portfolio return - Second term $\frac{\lambda}{2}\mathbf{w}'\mathbf{Q}\mathbf{w}$: Penalty for portfolio variance - $\lambda$ controls the trade-off: higher $\lambda$ = more risk-averse
Theorem 2.1 (Unconstrained Inverse Solution)
For the unconstrained mean-variance problem, the implied expected returns are:
$$\boxed{\boldsymbol{\mu}^* = \lambda \mathbf{Q} \mathbf{w}}$$
Proof:
Starting from the utility function: $$U(\mathbf{w}) = \mathbf{w}'\boldsymbol{\mu} - \frac{\lambda}{2}\mathbf{w}'\mathbf{Q}\mathbf{w}$$
Take the gradient with respect to $\mathbf{w}$: $$\nabla_{\mathbf{w}} U = \boldsymbol{\mu} - \lambda\mathbf{Q}\mathbf{w}$$
At the optimum, the first-order condition requires $\nabla_{\mathbf{w}} U = \mathbf{0}$: $$\boldsymbol{\mu} - \lambda\mathbf{Q}\mathbf{w} = \mathbf{0}$$
Solving for $\boldsymbol{\mu}$: $$\boldsymbol{\mu}^* = \lambda\mathbf{Q}\mathbf{w} \quad \blacksquare$$
Second-Order Condition:
The Hessian is: $$\nabla^2_{\mathbf{w}} U = -\lambda\mathbf{Q}$$
For a maximum, we need $\nabla^2_{\mathbf{w}} U \prec 0$ (negative definite), which holds when $\mathbf{Q} \succ 0$ (positive definite) and $\lambda > 0$.
Theorem 2.2 (Constrained Inverse Solution)
With the budget constraint $\mathbf{1}'\mathbf{w} = 1$, the implied returns become:
$$\boxed{\boldsymbol{\mu}^ = \lambda\mathbf{Q}\mathbf{w} + \gamma^\mathbf{1}}$$
where $\gamma^*$ is the Lagrange multiplier (shadow price of the budget constraint).
Proof:
The Lagrangian is: $$\mathcal{L} = \mathbf{w}'\boldsymbol{\mu} - \frac{\lambda}{2}\mathbf{w}'\mathbf{Q}\mathbf{w} - \gamma(\mathbf{1}'\mathbf{w} - 1)$$
KKT conditions: 1. Stationarity: $\boldsymbol{\mu} - \lambda\mathbf{Q}\mathbf{w} - \gamma\mathbf{1} = \mathbf{0}$ 2. Primal feasibility: $\mathbf{1}'\mathbf{w} = 1$
From stationarity: $$\boldsymbol{\mu}^ = \lambda\mathbf{Q}\mathbf{w} + \gamma^\mathbf{1} \quad \blacksquare$$
Interpretation of $\gamma^*$: - $\gamma^*$ is the marginal utility of relaxing the budget constraint - Can be set to $r_f$ (risk-free rate) for zero-beta interpretation - Can be determined by normalization (e.g., target average return)
The formula $\boldsymbol{\mu}^* = \lambda\mathbf{Q}\mathbf{w}$ has a beautiful geometric interpretation:
Visualization: - High-variance assets: Higher implied $\mu_i$ - Highly correlated assets: Share implied returns through off-diagonal $Q_{ij}$ - Diversifying assets: Lower implied returns due to negative correlations
$\lambda$ represents the investor's marginal rate of substitution between expected return and variance:
$$\lambda = \frac{\partial \mu_p / \partial w_i}{\partial \sigma_p^2 / \partial w_i}$$
Typical Values:
| Context | $\lambda$ Range | Source |
|---|---|---|
| Market equilibrium | 2.5 - 3.5 | Black & Litterman (1992) |
| Institutional investors | 1 - 5 | Industry practice |
| Retail investors | 3 - 10 | Academic studies |
Method 1: From Observed Returns
Given external estimates of expected returns $\tilde{\boldsymbol{\mu}}$:
$$\lambda^* = \frac{\mathbf{w}'\tilde{\boldsymbol{\mu}}}{\mathbf{w}'\mathbf{Q}\mathbf{w}} = \frac{\text{Expected portfolio return}}{\text{Portfolio variance}}$$
Derivation: Pre-multiply $\boldsymbol{\mu}^ = \lambda\mathbf{Q}\mathbf{w}$ by $\mathbf{w}'$: $$\mathbf{w}'\boldsymbol{\mu}^ = \lambda\mathbf{w}'\mathbf{Q}\mathbf{w}$$ $$\lambda = \frac{\mathbf{w}'\boldsymbol{\mu}^*}{\mathbf{w}'\mathbf{Q}\mathbf{w}}$$
Method 2: Black-Litterman Equilibrium
Assuming the market portfolio is mean-variance efficient:
$$\lambda_{BL} = \frac{E[r_m] - r_f}{\sigma_m^2}$$
where: - $E[r_m]$: Expected market return - $r_f$: Risk-free rate - $\sigma_m^2$: Market variance
Typical calculation: - $E[r_m] - r_f \approx 5\%$ (equity risk premium) - $\sigma_m \approx 15\%$ (market volatility) - $\lambda_{BL} = 0.05 / 0.15^2 \approx 2.22$
Method 3: Confidence-Weighted Blend
$$\lambda_{conf} = c \cdot \lambda_{observed} + (1-c) \cdot \lambda_{prior}$$
where $c \in [0,1]$ is the confidence in observed returns.
The implied returns scale linearly with $\lambda$:
$$\frac{\partial \mu_i^*}{\partial \lambda} = (\mathbf{Q}\mathbf{w})_i$$
Key insight: Assets with higher risk contribution are more sensitive to $\lambda$ changes.
Definition:
$$MRAR_\gamma = \left[\frac{1}{T}\sum_{t=1}^{T}\left(\frac{1+r_{p,t}}{1+r_{f,t}}\right)^{-\gamma}\right]^{-12/\gamma} - 1$$
where: - $\gamma > 0$: Risk aversion parameter (typically 2-5) - $r_{p,t}$: Portfolio return at time $t$ - $r_{f,t}$: Risk-free rate at time $t$
Connection to CRRA Utility:
MRAR is the certainty equivalent return under Constant Relative Risk Aversion (CRRA) utility:
$$U(W) = \frac{W^{1-\gamma}}{1-\gamma}$$
Inverse Optimization:
Unlike mean-variance, MRAR requires bilevel numerical optimization: 1. Inner problem: Given $\boldsymbol{\mu}$, compute optimal $\mathbf{w}^$ 2. Outer problem: Find $\boldsymbol{\mu}$ such that $\mathbf{w}^ = \mathbf{w}_{observed}$
Implementation: Use scipy.optimize with CRRA objective.
Definition:
$$\Omega(L) = \frac{\int_L^{\infty}(1-F(r))dr}{\int_{-\infty}^{L}F(r)dr} = \frac{E[\max(r-L, 0)]}{E[\max(L-r, 0)]}$$
where: - $L$: Threshold return (often 0 or $r_f$) - $F(r)$: CDF of returns
Connection to Lower Partial Moments:
$$\Omega(L) = 1 + \frac{E[r] - L}{LPM_1(L)}$$
where $LPM_1(L) = E[\max(L-r, 0)]$ is the first lower partial moment.
Inverse Optimization:
Also requires bilevel numerical optimization due to non-quadratic objective.
| Utility | Closed-Form? | Risk Measure | Sensitivity |
|---|---|---|---|
| Mean-Variance | Yes | Variance (symmetric) | $\lambda$ |
| MRAR | No | CRRA (asymmetric) | $\gamma$ |
| Omega | No | LPM (downside only) | $L$ |
When to use each: - Mean-Variance: Default choice, analytical tractability - MRAR: When asymmetric risk preferences matter - Omega: When downside risk is the primary concern
This section addresses Issue #49
With $n$ assets, the covariance matrix $\mathbf{Q}$ has $n(n+1)/2$ unique parameters. For BRISMA with 89 assets: - Parameters: $89 \times 90 / 2 = 4,005$ covariances - Observations needed: At least $4,005$ for reliable estimation - Problem: Insufficient historical data leads to estimation error
Factor models reduce complexity: - $k$ factors: $nk + k(k+1)/2$ parameters - With $k=5$ factors: $89 \times 5 + 15 = 460$ parameters - Reduction: 89% fewer parameters to estimate
Factors represent systematic risk sources:
| Factor | Economic Interpretation | Example Proxy |
|---|---|---|
| Market | Aggregate equity risk | Market index return |
| Duration | Interest rate sensitivity | 10Y bond return |
| Credit | Default risk premium | Investment grade spread |
| Liquidity | Trading cost premium | Bid-ask spread |
| Momentum | Trend-following premium | 12-month return |
The Key Insight:
If we know the factor premia $\boldsymbol{\pi}$ and a new asset's factor exposures $\mathbf{B}_{new}$, we can price the new asset without any historical return data:
$$\mu_{new} = r_f + \mathbf{B}_{new}'\boldsymbol{\pi}$$
This is critical for: - Newly launched funds - Private assets - Hypothetical portfolios
Definition (Arbitrage Pricing Theory)
Asset returns follow a $k$-factor structure:
$$r_i = \alpha_i + \sum_{j=1}^{k}\beta_{ij}f_j + \epsilon_i$$
In matrix form:
$$\mathbf{r} = \boldsymbol{\alpha} + \mathbf{B}\mathbf{f} + \boldsymbol{\epsilon}$$
where: - $\mathbf{r} \in \mathbb{R}^n$: Asset returns - $\boldsymbol{\alpha} \in \mathbb{R}^n$: Asset-specific alphas (often assumed zero) - $\mathbf{B} \in \mathbb{R}^{n \times k}$: Factor loading matrix (betas) - $\mathbf{f} \in \mathbb{R}^k$: Factor returns - $\boldsymbol{\epsilon} \in \mathbb{R}^n$: Idiosyncratic errors
Under APT, the covariance matrix decomposes as:
$$\mathbf{Q} = \mathbf{B}\mathbf{\Sigma}_f\mathbf{B}' + \mathbf{D}$$
where: - $\mathbf{\Sigma}f = \text{Cov}(\mathbf{f})$: Factor covariance matrix ($k \times k$) - $\mathbf{D} = \text{diag}(\sigma{\epsilon_1}^2, \ldots, \sigma_{\epsilon_n}^2)$: Idiosyncratic variance
CAPM is a special case with $k=1$ (market factor only):
$$r_i - r_f = \beta_i(r_m - r_f) + \epsilon_i$$
The expected excess return is:
$$E[r_i] - r_f = \beta_i \cdot \pi_m$$
where $\pi_m = E[r_m] - r_f$ is the market risk premium.
Given asset-level implied returns $\boldsymbol{\mu}^*$ from Section 2, we extract factor premia via:
$$\boldsymbol{\mu}^* - r_f\mathbf{1} = \mathbf{B}\boldsymbol{\pi} + \mathbf{e}$$
where: - $\boldsymbol{\mu}^ - r_f\mathbf{1}$: Excess implied returns ($n \times 1$) - $\mathbf{B}$: Factor loadings ($n \times k$) - $\boldsymbol{\pi}$: Factor risk premia ($k \times 1$) - what we want* - $\mathbf{e}$: Regression residuals ($n \times 1$)
Theorem 3.1 (Factor Premia Extraction)
The OLS estimate of factor premia is:
$$\boxed{\hat{\boldsymbol{\pi}} = (\mathbf{B}'\mathbf{B})^{-1}\mathbf{B}'(\boldsymbol{\mu}^* - r_f\mathbf{1})}$$
Proof:
Minimize sum of squared residuals: $$\min_{\boldsymbol{\pi}} |\boldsymbol{\mu}^* - r_f\mathbf{1} - \mathbf{B}\boldsymbol{\pi}|^2$$
Take derivative with respect to $\boldsymbol{\pi}$: $$\frac{\partial}{\partial \boldsymbol{\pi}} = -2\mathbf{B}'(\boldsymbol{\mu}^* - r_f\mathbf{1} - \mathbf{B}\boldsymbol{\pi}) = 0$$
Solving: $$\mathbf{B}'\mathbf{B}\boldsymbol{\pi} = \mathbf{B}'(\boldsymbol{\mu}^ - r_f\mathbf{1})$$ $$\hat{\boldsymbol{\pi}} = (\mathbf{B}'\mathbf{B})^{-1}\mathbf{B}'(\boldsymbol{\mu}^ - r_f\mathbf{1}) \quad \blacksquare$$
For more robust estimates, use weighted least squares:
$$\hat{\boldsymbol{\pi}}_{WLS} = (\mathbf{B}'\mathbf{W}\mathbf{B})^{-1}\mathbf{B}'\mathbf{W}(\boldsymbol{\mu}^* - r_f\mathbf{1})$$
Common weighting schemes: - Market cap weights: $W_{ii} = \text{mcap}i / \sum_j \text{mcap}_j$ - Inverse variance: $W{ii} = 1/\sigma_i^2$ - Equal weights: $W_{ii} = 1/n$
Under homoskedastic errors, the covariance of $\hat{\boldsymbol{\pi}}$ is:
$$\text{Var}(\hat{\boldsymbol{\pi}}) = \sigma_e^2 (\mathbf{B}'\mathbf{B})^{-1}$$
where $\sigma_e^2 = \frac{1}{n-k}\sum_{i=1}^n e_i^2$ is the residual variance.
The Fama-MacBeth (1973) procedure separates: 1. Pass 1 (Time-series): Estimate betas for each asset 2. Pass 2 (Cross-sectional): Estimate premia at each time point
This allows for time-varying factor premia and proper standard error estimation.
For each asset $i$, run time-series regression:
$$r_{i,t} - r_{f,t} = \alpha_i + \sum_{j=1}^{k}\beta_{ij}f_{j,t} + \epsilon_{i,t}$$
Output: Matrix $\hat{\mathbf{B}} \in \mathbb{R}^{n \times k}$ of estimated betas.
For each time $t$, run cross-sectional regression:
$$r_{i,t} - r_{f,t} = \gamma_{0,t} + \sum_{j=1}^{k}\gamma_{j,t}\hat{\beta}{ij} + \eta{i,t}$$
Output: Time series ${\hat{\gamma}{j,t}}{t=1}^T$ for each factor $j$.
Average across time:
$$\hat{\pi}j = \frac{1}{T}\sum{t=1}^{T}\hat{\gamma}_{j,t}$$
Standard error (accounts for time-series variation):
$$SE(\hat{\pi}j) = \frac{1}{\sqrt{T}}\sqrt{\frac{1}{T-1}\sum{t=1}^{T}(\hat{\gamma}_{j,t} - \hat{\pi}_j)^2}$$
Problem: Pass 2 uses estimated betas, not true betas. This causes errors-in-variables bias in standard errors.
Shanken (1992) Correction:
$$\text{Var}(\hat{\boldsymbol{\pi}}){corrected} = \left(1 + \hat{\boldsymbol{\pi}}'\hat{\mathbf{\Sigma}}_f^{-1}\hat{\boldsymbol{\pi}}\right) \cdot \text{Var}(\hat{\boldsymbol{\pi}}){OLS}$$
The correction factor $c = 1 + \hat{\boldsymbol{\pi}}'\hat{\mathbf{\Sigma}}_f^{-1}\hat{\boldsymbol{\pi}}$ inflates standard errors to account for beta estimation uncertainty.
Intuition: When premia are large relative to factor variance, beta estimation errors have bigger impact on premia estimates.
[Asset Weights w]
|
| Inverse Optimization (Section 2)
v
[Asset Implied Returns μ*]
|
| Cross-Sectional Regression (Section 3.3)
v
[Factor Risk Premia π]
|
| Factor Projection (Section 3.5.2)
v
[New Asset Expected Return μ_new]
Theorem 3.2 (New Asset Pricing)
Given factor premia $\hat{\boldsymbol{\pi}}$ and a new asset's factor exposures $\mathbf{B}_{new}$:
$$\boxed{\mu_{new} = r_f + \mathbf{B}_{new}'\hat{\boldsymbol{\pi}}}$$
Example: Pricing a BANTLEON fund with: - Equity beta: $\beta_{equity} = 0.8$ - Duration beta: $\beta_{duration} = 5.0$ - Credit beta: $\beta_{credit} = 0.3$
If estimated premia are $\pi_{equity} = 5\%$, $\pi_{duration} = 0.5\%$, $\pi_{credit} = 2\%$:
$$\mu_{new} = r_f + 0.8 \times 5\% + 5.0 \times 0.5\% + 0.3 \times 2\% = r_f + 7.1\%$$
The variance of $\mu_{new}$ propagates from $\text{Var}(\hat{\boldsymbol{\pi}})$:
$$\text{Var}(\mu_{new}) = \mathbf{B}{new}'\text{Var}(\hat{\boldsymbol{\pi}})\mathbf{B}{new}$$
95% confidence interval:
$$\mu_{new} \pm 1.96 \sqrt{\mathbf{B}{new}'\text{Var}(\hat{\boldsymbol{\pi}})\mathbf{B}{new}}$$
When a new asset has exposures to factors not in our model:
| Criterion | Description |
|---|---|
| Economic meaning | Factors should represent systematic risks |
| Orthogonality | Low correlation between factors |
| Persistence | Premia stable over time |
| Coverage | Explain high % of return variance |
Existing implementation in python/brisma/bantleon/
$$\lambda_{M1} = \frac{\ln\left(\frac{1+y_{10Y}}{1+r_f}\right)}{\beta_{ref}}$$
$$\lambda_{M2} = \sum_{t=1}^{T}w_t f_t$$
with exponential decay weights: $w_t \propto 0.5^{t/\tau}$
$$\mu_{hybrid} = R^2 \cdot \mu_{M1} + (1-R^2) \cdot \mu_{M2}$$
This section addresses Issue #51
The BRISMA client portfolio contains 32 assets across 5 asset classes:
| Asset Class | Weight | # Assets |
|---|---|---|
| Bonds | 40.0% | 7 |
| Equities | 31.0% | 10 |
| Alternatives | 27.6% | 10 |
| Cash | 1.4% | 5 |
| Total | 110.0% | 32 |
Note: Total weight > 100% indicates leverage.
| Rank | Asset | Weight | Class |
|---|---|---|---|
| 1 | Euro Corporate | 16.0% | Bonds |
| 2 | S&P 500 | 8.0% | Equities |
| 3 | Euro Government | 8.0% | Bonds |
| 4 | Real Estate World | 8.0% | Alternatives |
| 5 | MSCI EMU | 5.0% | Equities |
| 6 | EM EUR Hedged | 5.0% | Bonds |
| 7 | Listed Private Equity | 5.0% | Alternatives |
| 8 | CTA Index | 5.0% | Alternatives |
| 9 | SPGTINNT Index | 5.0% | Alternatives |
| 10 | MSCI Europe ex EMU | 3.0% | Equities |
Three covariance matrices from R/examples/example1.R:
| Matrix | Description | Use Case |
|---|---|---|
| $\mathbf{Q}_{emp}$ | Empirical (time-decay weighted) | Historical analysis |
| $\mathbf{Q}_{shrink}$ | Factor model shrinkage | Regularized estimation |
| $\mathbf{Q}_{garch}$ | GARCH(1,1) forecast | Forward-looking |
73 factors from risk model, grouped by type:
| Category | Count | Examples |
|---|---|---|
| Cash (5 currencies) | 5 | EUR, USD, JPY, GBP, CHF |
| Equity Indices | 28 | MSCI World, Regions, Sectors, Styles |
| Government Bonds | 18 | EUR, USD, CHF by maturity bucket |
| Inflation-Linked | 4 | EUR, USD, UK, Japan |
| Credit | 6 | US/EUR Corporate, High Yield, Convertibles |
| Commodities | 5 | Broad, Agriculture, Energy, Metals, Gold |
| FX Indices | 5 | EUR, USD, CHF, JPY, GBP TWI |
| Volatility | 3 | Equity VIX, EUR VIX, Bond Vol |
| Rates | 6 | ESTR, SOFR, SARON, 10Y yields |
For clarity, we first demonstrate with 4 assets:
Assets: 1. S&P 500 (Equity) 2. Euro Government (Bond) 3. Euro Corporate (Credit) 4. Gold (Commodity)
Weights (normalized to sum to 1): $$\mathbf{w} = \begin{pmatrix} 0.30 \ 0.25 \ 0.35 \ 0.10 \end{pmatrix}$$
Covariance Matrix (annualized, illustrative): $$\mathbf{Q} = \begin{pmatrix} 0.0225 & 0.0020 & 0.0040 & 0.0010 \ 0.0020 & 0.0036 & 0.0024 & -0.0005 \ 0.0040 & 0.0024 & 0.0064 & 0.0008 \ 0.0010 & -0.0005 & 0.0008 & 0.0169 \end{pmatrix}$$
Diagonal: $\sigma_{S\&P} = 15\%$, $\sigma_{Govt} = 6\%$, $\sigma_{Corp} = 8\%$, $\sigma_{Gold} = 13\%$
Using Black-Litterman default: $$\lambda = 2.5$$
Alternatively, from historical data (assuming 5% portfolio return, 8% volatility): $$\lambda^* = \frac{\mu_p}{\sigma_p^2} = \frac{0.05}{0.08^2} = 7.8$$
We proceed with $\lambda = 2.5$ (conservative).
$$\boldsymbol{\mu}^* = \lambda \mathbf{Q} \mathbf{w}$$
Calculation:
$$\mathbf{Q}\mathbf{w} = \begin{pmatrix} 0.0225 \times 0.30 + 0.0020 \times 0.25 + 0.0040 \times 0.35 + 0.0010 \times 0.10 \ 0.0020 \times 0.30 + 0.0036 \times 0.25 + 0.0024 \times 0.35 + (-0.0005) \times 0.10 \ 0.0040 \times 0.30 + 0.0024 \times 0.25 + 0.0064 \times 0.35 + 0.0008 \times 0.10 \ 0.0010 \times 0.30 + (-0.0005) \times 0.25 + 0.0008 \times 0.35 + 0.0169 \times 0.10 \end{pmatrix}$$
$$= \begin{pmatrix} 0.00855 \ 0.00184 \ 0.00412 \ 0.00197 \end{pmatrix}$$
$$\boldsymbol{\mu}^* = 2.5 \times \begin{pmatrix} 0.00855 \ 0.00184 \ 0.00412 \ 0.00197 \end{pmatrix} = \begin{pmatrix} 2.14\% \ 0.46\% \ 1.03\% \ 0.49\% \end{pmatrix}$$
| Asset | Weight | $\sigma_i$ | $\mu_i^*$ | Sharpe Ratio |
|---|---|---|---|---|
| S&P 500 | 30% | 15.0% | 2.14% | 0.14 |
| Euro Government | 25% | 6.0% | 0.46% | 0.08 |
| Euro Corporate | 35% | 8.0% | 1.03% | 0.13 |
| Gold | 10% | 13.0% | 0.49% | 0.04 |
Observations: - Higher-weight assets have higher implied returns (by construction) - S&P 500 has highest implied return due to high weight and high risk - Gold has low implied return despite high volatility (low weight)
Assume 2-factor model: Equity ($\beta_E$) and Duration ($\beta_D$)
Factor Betas:
| Asset | $\beta_E$ | $\beta_D$ |
|---|---|---|
| S&P 500 | 1.0 | 0.0 |
| Euro Government | 0.0 | 7.0 |
| Euro Corporate | 0.2 | 5.0 |
| Gold | 0.1 | -0.5 |
$$\mathbf{B} = \begin{pmatrix} 1.0 & 0.0 \ 0.0 & 7.0 \ 0.2 & 5.0 \ 0.1 & -0.5 \end{pmatrix}$$
Cross-sectional regression (assuming $r_f = 0$):
$$\hat{\boldsymbol{\pi}} = (\mathbf{B}'\mathbf{B})^{-1}\mathbf{B}'(\boldsymbol{\mu}^* - r_f\mathbf{1})$$
Computing $\mathbf{B}'\mathbf{B}$: $$\mathbf{B}'\mathbf{B} = \begin{pmatrix} 1.05 & 0.95 \ 0.95 & 74.25 \end{pmatrix}$$
And $\mathbf{B}'\boldsymbol{\mu}^$: $$\mathbf{B}'\boldsymbol{\mu}^ = \begin{pmatrix} 2.40\% \ 8.67\% \end{pmatrix}$$
Solving: $$\hat{\boldsymbol{\pi}} = \begin{pmatrix} \pi_E \ \pi_D \end{pmatrix} = \begin{pmatrix} 2.17\% \ 0.09\% \end{pmatrix}$$
Interpretation: - Equity risk premium: 2.17% per unit beta - Duration risk premium: 0.09% per year of duration (9 bps/year)
New Asset: BANTLEON fund with $\beta_E = 0.5$, $\beta_D = 3.0$
$$\mu_{new} = r_f + 0.5 \times 2.17\% + 3.0 \times 0.09\% = r_f + 1.36\%$$
Expected excess return: 1.36% (before adding risk-free rate)
Using $\lambda = 2.5$ and $\mathbf{Q}_{shrink}$:
| Statistic | Value |
|---|---|
| Mean implied return | 1.8% |
| Median implied return | 1.2% |
| Min implied return | 0.0% (Cash) |
| Max implied return | 5.2% (Emerging Markets) |
| Std dev of implied returns | 1.4% |
| Asset Class | Avg $\mu^*$ | Avg $\sigma$ | Avg Sharpe |
|---|---|---|---|
| Equities | 2.8% | 18.5% | 0.15 |
| Bonds | 0.9% | 5.2% | 0.17 |
| Alternatives | 1.6% | 12.3% | 0.13 |
| Cash | 0.0% | 0.0% | N/A |
| $\lambda$ | $\mu^*_{S\&P500}$ | $\mu^*_{EuroGovt}$ | Portfolio $\mu_p$ |
|---|---|---|---|
| 1.0 | 0.86% | 0.18% | 0.72% |
| 2.5 | 2.14% | 0.46% | 1.80% |
| 5.0 | 4.28% | 0.92% | 3.60% |
| 7.5 | 6.42% | 1.38% | 5.40% |
Observation: Implied returns scale linearly with $\lambda$.
| Metric | $\mathbf{Q}_{emp}$ | $\mathbf{Q}_{shrink}$ | $\mathbf{Q}_{garch}$ |
|---|---|---|---|
| Avg $\mu^*$ | 1.9% | 1.8% | 2.1% |
| Correlation | 1.00 | 0.98 | 0.95 |
| Max deviation | - | 0.3% | 0.5% |
Observation: Results are robust across estimation methods.
# File: python/examples/implied_returns_example.py
import numpy as np
import pandas as pd
from brisma import load_data
from brisma.inverse_optimization import inverse_optimize_mv
# Load data
data = load_data()
portfolio = data['tbl_client_portfolio']
# Get weights (normalize to sum to 1 if needed)
weights = portfolio['weight'].values
weights = weights / weights.sum() # Optional normalization
# Load covariance matrix (from R outputs)
Q = np.load('outputs/Q_shrink.npy') # Or load from R
# Set risk aversion
lambda_param = 2.5
# Compute implied returns
mu_star = inverse_optimize_mv(weights, Q, lambda_param)
# Display results
results = pd.DataFrame({
'Asset': portfolio['name'],
'Weight': weights,
'Implied_Return': mu_star
})
print(results.sort_values('Implied_Return', ascending=False))
To be completed in Issue #50
Black, F., & Litterman, R. (1992). "Global portfolio optimization." Financial Analysts Journal, 48(5), 28-43.
Merton, R. C. (1980). "On estimating the expected return on the market: An exploratory investigation." Journal of Financial Economics, 8(4), 323-361.
Ross, S. A. (1976). "The arbitrage theory of capital asset pricing." Journal of Economic Theory, 13(3), 341-360.
Fama, E. F., & MacBeth, J. D. (1973). "Risk, return, and equilibrium: Empirical tests." Journal of Political Economy, 81(3), 607-636.
Shanken, J. (1992). "On the estimation of beta-pricing models." Review of Financial Studies, 5(1), 1-33.
He, G., & Litterman, R. (1999). "The intuition behind Black-Litterman model portfolios." Goldman Sachs Investment Management Research.
Idzorek, T. (2007). "A step-by-step guide to the Black-Litterman model." Forecasting Expected Returns in the Financial Markets, 17-38.
Fama, E. F., & French, K. R. (1993). "Common risk factors in the returns on stocks and bonds." Journal of Financial Economics, 33(1), 3-56.
Completed in Issue #50
| Symbol | Meaning |
|---|---|
| $\mathbf{x}$ | Column vector ($n \times 1$) |
| $\mathbf{A}$ | Matrix ($m \times n$) |
| $\mathbf{A}'$ or $\mathbf{A}^T$ | Transpose |
| $\mathbf{A}^{-1}$ | Inverse (if exists) |
| $\text{tr}(\mathbf{A})$ | Trace (sum of diagonal) |
| $|\mathbf{x}|$ | Euclidean norm |
Definition: For $f: \mathbb{R}^n \to \mathbb{R}$, the gradient is:
$$\nabla_{\mathbf{x}} f = \frac{\partial f}{\partial \mathbf{x}} = \begin{pmatrix} \frac{\partial f}{\partial x_1} \ \vdots \ \frac{\partial f}{\partial x_n} \end{pmatrix}$$
| Function $f(\mathbf{x})$ | Gradient $\nabla_{\mathbf{x}} f$ | Notes |
|---|---|---|
| $\mathbf{a}'\mathbf{x}$ | $\mathbf{a}$ | Linear form |
| $\mathbf{x}'\mathbf{a}$ | $\mathbf{a}$ | Same as above |
| $\mathbf{x}'\mathbf{A}\mathbf{x}$ | $(\mathbf{A} + \mathbf{A}')\mathbf{x}$ | Quadratic form |
| $\mathbf{x}'\mathbf{A}\mathbf{x}$ | $2\mathbf{A}\mathbf{x}$ | If $\mathbf{A}$ symmetric |
| $\mathbf{x}'\mathbf{x}$ | $2\mathbf{x}$ | Special case: $\mathbf{A} = \mathbf{I}$ |
| $|\mathbf{A}\mathbf{x} - \mathbf{b}|^2$ | $2\mathbf{A}'(\mathbf{A}\mathbf{x} - \mathbf{b})$ | Least squares |
For $f: \mathbb{R}^n \to \mathbb{R}$, the Hessian is:
$$\mathbf{H} = \nabla^2_{\mathbf{x}} f = \begin{pmatrix} \frac{\partial^2 f}{\partial x_1^2} & \cdots & \frac{\partial^2 f}{\partial x_1 \partial x_n} \ \vdots & \ddots & \vdots \ \frac{\partial^2 f}{\partial x_n \partial x_1} & \cdots & \frac{\partial^2 f}{\partial x_n^2} \end{pmatrix}$$
| Function | Hessian |
|---|---|
| $\mathbf{x}'\mathbf{A}\mathbf{x}$ | $\mathbf{A} + \mathbf{A}'$ |
| $\mathbf{x}'\mathbf{A}\mathbf{x}$ (sym) | $2\mathbf{A}$ |
For $f(\mathbf{g}(\mathbf{x}))$:
$$\frac{\partial f}{\partial \mathbf{x}} = \frac{\partial \mathbf{g}}{\partial \mathbf{x}}' \frac{\partial f}{\partial \mathbf{g}}$$
For $f(\mathbf{x}) = \mathbf{u}(\mathbf{x})'\mathbf{v}(\mathbf{x})$:
$$\nabla_{\mathbf{x}} f = \frac{\partial \mathbf{u}}{\partial \mathbf{x}}'\mathbf{v} + \frac{\partial \mathbf{v}}{\partial \mathbf{x}}'\mathbf{u}$$
Completed in Issue #50
Problem: Find $\boldsymbol{\mu}$ such that $\mathbf{w}$ is optimal for:
$$\max_{\mathbf{w}} U(\mathbf{w}) = \mathbf{w}'\boldsymbol{\mu} - \frac{\lambda}{2}\mathbf{w}'\mathbf{Q}\mathbf{w}$$
Step 1: Compute gradient
Using rules from Appendix A: - $\nabla_{\mathbf{w}}(\mathbf{w}'\boldsymbol{\mu}) = \boldsymbol{\mu}$ - $\nabla_{\mathbf{w}}(\mathbf{w}'\mathbf{Q}\mathbf{w}) = 2\mathbf{Q}\mathbf{w}$ (since $\mathbf{Q}$ symmetric)
Therefore: $$\nabla_{\mathbf{w}} U = \boldsymbol{\mu} - \lambda\mathbf{Q}\mathbf{w}$$
Step 2: Set first-order condition
At optimum: $$\nabla_{\mathbf{w}} U = \mathbf{0}$$ $$\boldsymbol{\mu} - \lambda\mathbf{Q}\mathbf{w} = \mathbf{0}$$
Step 3: Solve for $\boldsymbol{\mu}$
$$\boldsymbol{\mu}^* = \lambda\mathbf{Q}\mathbf{w}$$
Step 4: Verify second-order condition
$$\nabla^2_{\mathbf{w}} U = -\lambda\mathbf{Q}$$
For maximum, need $-\lambda\mathbf{Q} \prec 0$ (negative definite). Since $\lambda > 0$ and $\mathbf{Q} \succ 0$ (positive definite), this holds. $\blacksquare$
Problem: Maximize utility subject to $\mathbf{1}'\mathbf{w} = 1$
Lagrangian: $$\mathcal{L}(\mathbf{w}, \gamma) = \mathbf{w}'\boldsymbol{\mu} - \frac{\lambda}{2}\mathbf{w}'\mathbf{Q}\mathbf{w} - \gamma(\mathbf{1}'\mathbf{w} - 1)$$
KKT Conditions:
From (1): $$\boldsymbol{\mu} = \lambda\mathbf{Q}\mathbf{w} + \gamma\mathbf{1}$$
To find $\gamma$: Pre-multiply by $\mathbf{1}'\mathbf{Q}^{-1}$: $$\mathbf{1}'\mathbf{Q}^{-1}\boldsymbol{\mu} = \lambda\mathbf{1}'\mathbf{w} + \gamma\mathbf{1}'\mathbf{Q}^{-1}\mathbf{1}$$
Using $\mathbf{1}'\mathbf{w} = 1$: $$\gamma = \frac{\mathbf{1}'\mathbf{Q}^{-1}\boldsymbol{\mu} - \lambda}{\mathbf{1}'\mathbf{Q}^{-1}\mathbf{1}}$$
Interpretation: $\gamma$ represents the risk-free rate or zero-beta return. $\blacksquare$
Problem: Minimize $|\boldsymbol{\mu}^* - r_f\mathbf{1} - \mathbf{B}\boldsymbol{\pi}|^2$
Step 1: Expand objective
Let $\mathbf{y} = \boldsymbol{\mu}^* - r_f\mathbf{1}$ (excess returns)
$$J(\boldsymbol{\pi}) = (\mathbf{y} - \mathbf{B}\boldsymbol{\pi})'(\mathbf{y} - \mathbf{B}\boldsymbol{\pi})$$ $$= \mathbf{y}'\mathbf{y} - 2\boldsymbol{\pi}'\mathbf{B}'\mathbf{y} + \boldsymbol{\pi}'\mathbf{B}'\mathbf{B}\boldsymbol{\pi}$$
Step 2: Take gradient
$$\nabla_{\boldsymbol{\pi}} J = -2\mathbf{B}'\mathbf{y} + 2\mathbf{B}'\mathbf{B}\boldsymbol{\pi}$$
Step 3: Set to zero and solve
$$-2\mathbf{B}'\mathbf{y} + 2\mathbf{B}'\mathbf{B}\boldsymbol{\pi} = \mathbf{0}$$ $$\mathbf{B}'\mathbf{B}\boldsymbol{\pi} = \mathbf{B}'\mathbf{y}$$ $$\hat{\boldsymbol{\pi}} = (\mathbf{B}'\mathbf{B})^{-1}\mathbf{B}'\mathbf{y}$$
Substituting back: $$\hat{\boldsymbol{\pi}} = (\mathbf{B}'\mathbf{B})^{-1}\mathbf{B}'(\boldsymbol{\mu}^* - r_f\mathbf{1}) \quad \blacksquare$$
Setup: In Fama-MacBeth, betas are estimated with error: $$\hat{\beta}_i = \beta_i + u_i$$
Problem: Standard OLS ignores $\text{Var}(u_i)$, understating $\text{Var}(\hat{\boldsymbol{\pi}})$
Shanken (1992) shows:
$$\text{Var}(\hat{\boldsymbol{\pi}}){true} = \left(1 + \boldsymbol{\pi}'\boldsymbol{\Sigma}_f^{-1}\boldsymbol{\pi}\right) \cdot \text{Var}(\hat{\boldsymbol{\pi}}){OLS} + \boldsymbol{\Sigma}_{\pi}$$
where: - $\boldsymbol{\Sigma}f$ = factor covariance matrix - $\boldsymbol{\Sigma}{\pi}$ = asymptotic variance correction (often small)
Simplified correction (ignoring $\boldsymbol{\Sigma}_{\pi}$):
$$c = 1 + \hat{\boldsymbol{\pi}}'\hat{\boldsymbol{\Sigma}}_f^{-1}\hat{\boldsymbol{\pi}}$$
$$SE(\hat{\pi}j){corrected} = \sqrt{c} \cdot SE(\hat{\pi}j){OLS}$$
Intuition: The correction factor $c$ is larger when: - Factor premia are large ($\boldsymbol{\pi}$ big) - Factor variances are small ($\boldsymbol{\Sigma}_f^{-1}$ big)
This makes sense: if premia are large and factors are stable, any error in beta estimates has big impact on premia estimates. $\blacksquare$
Given: Observed returns $\tilde{\boldsymbol{\mu}}$, weights $\mathbf{w}$, covariance $\mathbf{Q}$
Problem: Find $\lambda$ such that $\tilde{\boldsymbol{\mu}} = \lambda\mathbf{Q}\mathbf{w}$
Method: Project onto portfolio return
Pre-multiply both sides by $\mathbf{w}'$: $$\mathbf{w}'\tilde{\boldsymbol{\mu}} = \lambda\mathbf{w}'\mathbf{Q}\mathbf{w}$$
Note: - $\mathbf{w}'\tilde{\boldsymbol{\mu}} = \mu_p$ (expected portfolio return) - $\mathbf{w}'\mathbf{Q}\mathbf{w} = \sigma_p^2$ (portfolio variance)
Therefore: $$\lambda^* = \frac{\mu_p}{\sigma_p^2}$$
Economic interpretation: $\lambda$ is the Sharpe ratio divided by portfolio volatility: $$\lambda = \frac{\mu_p}{\sigma_p^2} = \frac{\mu_p/\sigma_p}{\sigma_p} = \frac{SR_p}{\sigma_p} \quad \blacksquare$$
# python/brisma/inverse_optimization.py
def inverse_optimize_mv(weights: np.ndarray,
cov_matrix: np.ndarray,
lambda_param: float) -> np.ndarray:
"""
Mean-Variance inverse optimization.
Parameters
----------
weights : np.ndarray
Portfolio weights (n,)
cov_matrix : np.ndarray
Covariance matrix (n, n)
lambda_param : float
Risk aversion parameter
Returns
-------
np.ndarray
Implied expected returns (n,)
"""
return lambda_param * cov_matrix @ weights
| Date | Version | Author | Changes |
|---|---|---|---|
| 2025-12-25 | 1.0 | Claude | Issue #48: Asset-level implied returns |
| 2025-12-25 | 1.1 | Claude | Issue #49: Factor-based implied risk premia |
| 2025-12-25 | 1.2 | Claude | Issue #50: Appendix A (Matrix calculus), Appendix B (5 derivations) |
| 2025-12-25 | 1.3 | Claude | Issue #51: Worked example with BRISMA data (32 assets, 4-asset demo) |