Dartmouth (Kenneth R. French)
Kenneth French Data Library — The Fama–French factors and portfolios since 1926 — the academic benchmark for 'did this strategy beat the market'
When you want to explain a return rather than just report it — the market premium, size, value, profitability, investment and momentum factors, or industry and characteristic-sorted portfolios — with the longest clean history anywhere.
Reach for it when…
When you want to explain a return rather than just report it — the market premium, size, value, profitability, investment and momentum factors, or industry and characteristic-sorted portfolios — with the longest clean history anywhere.
Not for: Individual stock prices, anything current-month (the library updates with a lag of weeks), non-equity assets.
Units, revisions, traps
Units. Monthly and daily returns in percent (not decimals). RF is the one-month Treasury bill; Mkt-RF is the market's excess return.
Revisions. Recent months are revised as CRSP data finalise; the deep history is stable.
- Each CSV has a description block at the top and an annual block at the bottom, with Windows line endings — normalise them and read up to the first blank line.
- Dates are YYYYMM integers for monthly files.
- Returns are in percent; divide by 100 before compounding.
Classic mistake: Compounding percent values as if they were decimals and getting astronomical wealth.
Three recipes
- Recipe 1 · The three factors, monthly, since 1926
- Recipe 2 · Momentum, added
- Recipe 3 · Industry portfolios
Each recipe: Python · Excel · Sheets, with how to read the result. Python recipes run under pandas; recipe 1 is re-run by the weekly check where the source allows it.
How to use it in your own work
Copy the snippet, change the series id, read the result the way the footer says. Replace YOUR_…_KEY with your own key where one is needed.
Recipe 1The three factors, monthly, since 1926
import pandas as pd, io, zipfile, requests
u = "https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/F-F_Research_Data_Factors_CSV.zip"
z = zipfile.ZipFile(io.BytesIO(requests.get(u, timeout=60).content))
text = z.read(z.namelist()[0]).decode("latin-1").replace("\r\n", "\n")
block = text.split("\n\n")[1] # the monthly block after the description
df = pd.read_csv(io.StringIO(block), index_col=0)
df.index = pd.to_datetime(df.index.astype(str), format="%Y%m")
print(df.tail())- Download the zip from the library, open the CSV, delete the description rows and the annual block.
- Import the CSV after trimming the blocks.
Recipe 2Momentum, added
import pandas as pd, io, zipfile, requests
def ff(name):
z = zipfile.ZipFile(io.BytesIO(requests.get(f"https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/{name}_CSV.zip", timeout=60).content))
t = z.read(z.namelist()[0]).decode("latin-1").replace("\r\n", "\n")
d = pd.read_csv(io.StringIO(t.split("\n\n")[1]), index_col=0)
d.index = pd.to_datetime(d.index.astype(str).str.strip(), format="%Y%m"); return d
df = ff("F-F_Research_Data_Factors").join(ff("F-F_Momentum_Factor"), how="inner")
print(df.tail())- Two downloads, joined on the date.
- Two imports, joined by VLOOKUP.
Recipe 3Industry portfolios
import pandas as pd, io, zipfile, requests
u = "https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/12_Industry_Portfolios_CSV.zip"
z = zipfile.ZipFile(io.BytesIO(requests.get(u, timeout=60).content))
t = z.read(z.namelist()[0]).decode("latin-1").replace("\r\n", "\n")
df = pd.read_csv(io.StringIO(t.split("\n\n")[1]), index_col=0)
print(df.tail())- Download and trim the blocks.
- Import after trimming.
Series → question map
The ids we use from Kenneth French Data Library, each with the question it answers. The catalog's compare view reads the concept tags behind these rows.
| Series | Answers | Region | Concept |
|---|---|---|---|
| F-F_Research_Data_Factors | Market, size and value factors since 1926 | United States | factors |
| F-F_Momentum_Factor | The momentum factor | United States | factors |
| F-F_Research_Data_5_Factors_2x3 | The five-factor model | United States | factors |
| 12_Industry_Portfolios | Sector returns since 1926 | United States | factors |
Compare with
Same question, different source: Shiller long-run data, Stooq, FRED. The compare view lines up coverage, frequency, history and access side by side and lists what the combination makes possible.
Open compare: Kenneth French Data Library · Shiller long-run data · Stooq →
Questions readers ask
Is the French library free?
Yes for personal and academic use; the site asks that the data not be redistributed.
How often is it updated?
Monthly, with a lag of a few weeks after month-end.
Are there international factors?
Yes — developed markets, Europe, Japan, Asia Pacific ex Japan, emerging — as separate files.
Educational only — we explain, we never advise · snippet licence: public domain · corrections to [email protected], fixed within a day and logged in the changelog.