Files

Factor Data (Fama-French, AQR)

Academic factor-return series used for factor attribution in backtest tearsheets (Chs 16-20) and as explanatory regressors in Ch10-14 factor modelling work. Two providers, both free, both daily and monthly.

Fama-French (Ken French Data Library)

AQR (AQR Data Sets)

  • Source: AQR Data Sets (https://www.aqr.com/Insights/Datasets).
  • Coverage: Varies by series (QMJ 1957→; BAB 1931→; HML-Devil 1926→; VME 1972→; century premia 1800s→).
  • Factors: QMJ (Quality Minus Junk), BAB (Betting Against Beta), HML-Devil (value, devil variant), VME (Value/Momentum Everywhere), century premia, credit premium, ESG frontier, TSMOM, 6 QMJ portfolios, 25 VME portfolios.
  • Size on disk: ~12 MB.
  • Runtime: ~1-2 minutes (Excel workbook downloads).
  • API key: not required.
  • License / attribution: AQR permits use for personal research with attribution to the AQR Capital Management white-paper that introduced the factor. See https://www.aqr.com/Insights/Datasets (terms on each dataset page).

Download

# Fama-French — core (ff3, ff5, mom, daily + monthly)
uv run python data/factors/ff_download.py

# Fama-French — all 70+ datasets from the library
uv run python data/factors/ff_download.py --all

# Fama-French — single dataset
uv run python data/factors/ff_download.py --dataset ff5

# AQR — all four primary factor sets
uv run python data/factors/aqr_download.py

Output layout under $ML4T_DATA_PATH/factors/:

fama-french/
├── ff3_daily.parquet
├── ff3_monthly.parquet
├── ff5_daily.parquet
├── ff5_monthly.parquet
├── mom_daily.parquet
├── mom_monthly.parquet
├── ff3_developed_monthly.parquet
├── ind_5_monthly.parquet
├── port_size_monthly.parquet
└── bp_me_monthly.parquet
aqr/
├── qmj_factors.parquet          qmj_factors_daily.parquet      qmj_6_portfolios.parquet
├── bab_factors.parquet          bab_factors_daily.parquet
├── hml_devil.parquet            hml_devil_daily.parquet
├── vme_factors.parquet          vme_portfolios.parquet
├── century_premia.parquet       credit_premium.parquet
├── esg_frontier.parquet         tsmom.parquet
├── metadata.json
└── source/                      # raw Excel / CSV archives

Loading

from data import load_ff_factors, load_aqr_factors

# Fama-French
ff5 = load_ff_factors(dataset="ff5", frequency="daily")
ff3 = load_ff_factors(dataset="ff3", frequency="monthly")
mom = load_ff_factors(dataset="mom", frequency="monthly")
ff = load_ff_factors(
    dataset="ff5", frequency="daily",
    start_date="2010-01-01", end_date="2023-12-31",
)

# AQR
qmj = load_aqr_factors(dataset="qmj")
bab = load_aqr_factors(dataset="bab")
vme = load_aqr_factors(dataset="vme")
hml = load_aqr_factors(dataset="hml_devil")

Schema (both loaders return canonical timestamp + per-factor float columns; FF files include RF risk-free rate, AQR files include per-geography columns).

Consumers

Fama-French

  • Ch16: 09_performance_reporting.py (factor attribution tab).
  • All 9 case studies*_strategy_analysis.py uses FF5 for factor-attribution tearsheets (case_studies/utils/factor_attribution.py).

AQR

  • Ch10: factor-family surveys (AQR QMJ / BAB primary references).
  • Ch14: latent factor models use AQR factor returns as comparison benchmarks.