Financial Literature

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.

equitiesfactorsUnited Statesglobal
Asset classesequities · factors
Frequencydaily → annual
History1926 → today
Limit · costNo key · static zipped CSVs
KeyNo key
Formats · pull withcsv · zip — python, excel
LicenceFree for academic and personal use with attribution; the library states its data are not to be redistributed.
RedistributeNo — link and pull, do not republish
Best for“Market, size, value and momentum factor returns since 1926” · “Industry portfolios to benchmark a sector”
When to use it

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.

How to read it

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.

How to use it in your own work

Three recipes

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())
How to read the resultMkt-RF is the equity premium in percent per month; the long-run average is about 0.6% a month — half a percent either side is noise.

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())
How to read the resultMomentum crashes (2009) show up as a −30% month — the strategy's known failure mode.

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())
How to read the resultValue-weighted returns in percent; the first block is value-weighted, the second equal-weighted.

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.

SeriesAnswersRegionConcept
F-F_Research_Data_FactorsMarket, size and value factors since 1926United Statesfactors
F-F_Momentum_FactorThe momentum factorUnited Statesfactors
F-F_Research_Data_5_Factors_2x3The five-factor modelUnited Statesfactors
12_Industry_PortfoliosSector returns since 1926United Statesfactors

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.