Why a Price-Weighted Average Breaks When Index Constituents Change
Summary
The document raises an index-construction problem using stocks with roughly similar market capitalizations but very different share prices. It calculates an average weighted by each stock’s market-cap share, then replaces the high-priced constituent with a lower-priced stock of similar capitalization. Because the calculation multiplies each share price by its market-cap weight, the index level changes dramatically even though the represented capitalization is similar.
The example exposes a mismatch between the stated goal of tracking the average return of a universe and the proposed level calculation. A market-cap-weighted portfolio’s constituent weights can be based on market capitalization, but an index level needs a defined base and continuity rules, including adjustment for constituent changes and corporate actions. The document is framed as a question and offers no answer or formal index formula, so it illustrates the issue rather than resolving it. Its figures are examples, not evidence about a particular published index.
Key ideas
- Market capitalization determines portfolio weights, while share price alone does not indicate a company’s relative economic size.
- Multiplying raw share prices by market-cap weights can make an index level sensitive to nominal share-price differences.
- Replacing a constituent can create an artificial discontinuity if index-level construction lacks an adjustment rule.
- An index intended to represent returns needs a consistent base and procedures for membership changes.
- The example identifies a construction concern but does not provide a complete calculation method.
Tags
Full text
# Fama / French 3 Factor Data Not Giving Expected Results
# Fama / French 3 Factor Data Not Giving Expected Results
I'm toying around w/ the Fama-French 3 factor data, and I'm having a hard time getting results that approximate what was covered in their paper here: https://www.bauer.uh.edu/rsusmel/phd/Fama-French_JFE93.pdf
I downloaded the latest csv file from their website at this url: https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html#Research.
Here's some python code of a regression I did on a single stock. I know this isn't the same as an entire portfolio, but I still think the results are incorrect.
```
# cleaned file
fama = pd.read_csv('Downloads/fama_french_factors.csv')
# single stock data
data = yf.download('AAPL', freq = 'M')['Adj Close']
# get EOM returns for Apple
data = data.resample('M', convention = 'end').last()
data = data.pct_change().dropna()
data.index = data.index + MonthEnd(0)
# merge the files together
data = pd.merge_asof(data, fama, left_index = True, right_index = True)
# run a regression
y = data['Return']
X = data[['Mkt', 'SMB', 'HML']]
X = sm.add_constant(X)
# fit model w/ statsmodels
mod = sm.OLS(y, X)
res = mod.fit()
print(res.summary())
```
When I run this the regression gives an R2 value of 0.288, which strikes me as really low. I know my regressions don't exactly match what was done in paper, which is excess return for a portfolio regressed against the 3 factors, but I suspect there's something wrong, likely with how the dates are indexed against one another.
The fama data only contains year and month, and I'm not clear if those represent returns at the beginning of the month or the end of the month, which might be impact the results.
Wondering if anyone knows what's wrong with my setup.
## Answer by phdstudent (score 8, accepted)
https://quant.stackexchange.com/a/76716
That's perfectly normal. You are running a regression for a single stock. Single stocks have a lot of idiosyncratic risk (which is what the $R^2$ is capturing).
I just run the fama-french regression for Apple, and here's what I got (so very similar to you):
```
Source | SS df MS Number of obs = 504
-------------+---------------------------------- F(3, 500) = 66.44
Model | 2.39063767 3 .796879224 Prob > F = 0.0000
Residual | 5.99656588 500 .011993132 R-squared = 0.2850
-------------+---------------------------------- Adj R-squared = 0.2807
Total | 8.38720355 503 .016674361 Root MSE = .10951
------------------------------------------------------------------------------
aapl_rf | Coefficient Std. err. t P>|t| [95% conf. interval]
-------------+----------------------------------------------------------------
mktrf | 1.235098 .1121975 11.01 0.000 1.014661 1.455535
hml | -.862915 .1624236 -5.31 0.000 -1.182032 -.543798
smb | .2237973 .1714526 1.31 0.192 -.113059 .5606537
_cons | .0135796 .0049681 2.73 0.006 .0038186 .0233406
------------------------------------------------------------------------------
```
So $R^2 = 0.285$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.