Skip to content
All library documents

Why Portfolio Beta May Differ from a Weighted Average of Component Betas

Article Quant Q&A · Author: dsugasa

Summary

The example asks why a portfolio beta estimated by regressing portfolio returns on market returns might not equal the weighted average of the individual asset betas. It constructs portfolio returns from two bond price series using weights based on estimated market values, then compares a portfolio regression with the component estimates. This setup highlights that beta aggregation depends on using consistent return observations, regression orientation, and weights that match the portfolio returns being measured.

The excerpt contains the question and illustrative code but no answer or reported regression results, so it does not identify which implementation detail causes the discrepancy. In particular, it cannot establish whether the issue lies in the regressions, the weights, or the constructed portfolio series. The conceptual relation between portfolio beta and weighted component betas applies when the same market benchmark and sample are used and portfolio returns are formed with the corresponding weights.

Key ideas

  • Portfolio beta is estimated as the sensitivity of portfolio returns to market returns.
  • A weighted average of component betas requires weights that match how portfolio returns are constructed.
  • Comparisons also require consistent market benchmarks and observation samples.
  • The document gives no answer or numerical results identifying the source of the mismatch.

Tags

Full text
# Why don't these betas match?


# Why don't these betas match?












I am sure I am missing something simple, but I would expect my portfolio beta when regressed against the market to match my individual component betas multiplied by the portfolio weights. I have created a simple example below. Any help in explaining where I have gone wrong would be much appreciated.

```
import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels import regression

def beta(x, y):
    x = sm.add_constant(x)
    model = regression.linear_model.OLS(y, x).fit()
    # Remove the constant now that we're done
    x = x[:, 1]
    return model.params[1]

bond_one = [100, 96, 102, 88, 96, 101, 120, 110, 105, 107, 106]
bond_two = [98, 102, 88, 95, 105, 100, 101, 99, 104, 108, 112]
mkt = [1000, 1004, 1000, 1010, 1020, 1000, 990, 995, 1005, 1025, 1035]

df_mkt = pd.DataFrame(mkt, columns = ['mkt'])
df_mkt = df_mkt.pct_change().dropna()
df = pd.DataFrame(bond_one, columns = ['bond_one'])
df['bond_two'] = bond_two

df_price = df.copy()
df = df.pct_change().dropna()

notionals = {'bond_one': 2500000,
                'bond_two': 6500000}

mkt_values = {key: value*(df_price[key].iloc[-1]/100)
              for (key, value) in notionals.items()}

#create portfolio market value
tot_port = sum(list(mkt_values.values()))
#generate weights
wts = {key: value/tot_port for (key, value) in mkt_values.items()}

#create portfolio returns
df_port = df.copy()*0
df_port = df.mul(list(wts.values()), axis=1)
df_port['port'] = df_port.sum(axis=1)

#add port and market into original dataframe
df['port'] = df_port['port'].copy()
df['mkt'] = df_mkt['mkt'].copy()

#run OLS on individuals and portfolio
b1_beta = regression.linear_model.OLS(x = df['bond_one'].values, y=df['mkt'].values).fit()
b2_beta = beta(x=df['bond_two'].values, y=df['mkt'].values)
port_beta = beta(x=df['port'].values, y=df['mkt'].values)

calc_beta = wts['bond_one']*b1_beta + wts['bond_two']*b2_beta
###why don't calc_beta and port_beta match?
```

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.