Magic Formula
Joel Greenblatt's Magic Formula: cheap earnings yield and a high return on capital.
How stocks are selected
- Universe. S&P 500 point-in-time constituents. A stock can be chosen on a rebalance date only when it was in the index that day. Companies that later left the index or were delisted remain eligible on the dates they were members. Names with fewer than 200 adjusted closes in the window are left out.
- Universe size. 716 stocks with history, from 760 point-in-time S&P 500 names, including 12 later delisted.
- Filters.
- Earnings yield above 0%
- Return on capital above 0%
- Ranking. Combined rank, lowest sum wins: highest Earnings yield and highest Return on capital. Ties break on ticker
- Holdings. 20 stocks.
- Weighting. Equal weight at each rebalance. The book is sold and the new list is bought in equal dollar amounts. Between rebalance dates, weights drift with price.
- Exclusions. Financial Services, Financials, Financial, Utilities
- Earnings yield is EBIT divided by enterprise value (that day's price times shares, plus debt, minus cash). Return on capital is EBIT divided by net working capital plus net plant.
How rebalancing works
- Frequency. Annual
- Rebalance dates. First trading day of April This backtest rebalanced on 11 dates, from 2016-04-01 to 2026-04-01.
- Buys and sells. On the rebalance date every holding is sold and the new list is bought at the adjusted close, or the latest close within 7 days when that date is not a session. Names that drop off the list are sold. Names that remain are kept and resized. If no name passes, the book is held in cash until the next rebalance. Nothing is traded between rebalance dates.
- Weights. Equal weight. Each name bought on the rebalance date gets the same dollar value. Displayed weights are rounded, and the last weight is adjusted so they sum to 100%. After that, weights drift with price until the next rebalance.
- Transaction costs and slippage. No commission and no slippage. Transaction cost is 0 and slippage is 0. The trade price is the adjusted close.
- Dividends. Returns use split- and dividend-adjusted closes (FMP adjClose, otherwise the close). Dividends are included in the price. The book does not receive a separate cash dividend, and withholding tax is not modeled.
- Data lag. A statement can be used on its filing date. If the filing date is missing, or it falls before the period end, the statement can be used 90 days after the period end. Ranking and trading use the adjusted close on the rebalance date, or the latest close within 7 days before it when that date is not a session. Closes after the rebalance date are never used.
Survivorship: each rebalance uses only companies that were in the S&P 500 on that date, including names that later left the index or were delisted. Results are not limited to today's survivors.
Backtest
- Window
- 2016-04-01 to 2026-10-22
- CAGR
- 10.6%
- Total return
- 189.8%
- Max drawdown
- -41.0%
- Sharpe
- 0.61
- S&P 500 CAGR
- 13.2%
S&P 500 comparison over the same period
2016-04-01 to 2026-10-22. Benchmark SPY.
| Measure | Strategy | S&P 500 |
|---|---|---|
| CAGR | 10.6% | 13.2% |
| Total return | 189.8% | 269.8% |
| Max drawdown | -41.0% | -34.1% |
| Sharpe | 0.61 | 0.79 |
Yearly returns versus the S&P 500
| Year | Strategy | S&P 500 |
|---|---|---|
| 2016 | -1.1% | 8.0% |
| 2017 | 17.3% | 19.4% |
| 2018 | -7.4% | -6.3% |
| 2019 | 13.6% | 28.8% |
| 2020 | 17.7% | 16.2% |
| 2021 | 34.7% | 27.0% |
| 2022 | -2.0% | -19.5% |
| 2023 | 1.8% | 24.3% |
| 2024 | 4.5% | 23.3% |
| 2025 | 11.9% | 16.4% |
| 2026 | 28.3% | 12.2% |
Rebalance history
Holdings added and removed at each rebalance. Strategy and S&P 500 columns are growth of $1.
| Date | Holdings | Added | Removed | Strategy | S&P 500 |
|---|---|---|---|---|---|
| 2016-04-01 | 20 | GILD, GME, AAPL, TGNA, ASR, ELV, CNC, HON, MDLZ, PBI, HRB, DAL, IBM, IPG, EMR, GD, RTX, CPRI, DGX, RHI | — | 1.0 | 1.0 |
| 2017-04-03 | 20 | MO, HPQ, TAP, BAX, DISCK, WBD, BIIB, ACN, MCK | GME, HON, MDLZ, PBI, IBM, EMR, GD, RTX, DGX | 1.0435 | 1.1373 |
| 2018-04-02 | 20 | HOLX, HUM, FOX, CVS, HON, CPB, SNA, GIS, YUM, AYI | MO, ELV, TAP, BAX, TGNA, DISCK, WBD, RHI, ACN, DAL | 1.1093 | 1.2443 |
| 2019-04-01 | 20 | KHC, DISH, AMAT, NKTR, PM, HST, STX, MU, BBY, ELV, RHI | MCK, HOLX, HUM, FOX, HPQ, CVS, GILD, CPB, GIS, YUM, AYI | 1.1087 | 1.3814 |
| 2020-04-01 | 20 | VNO, OMC, DXC, DISCK, BKNG, WBD, HUM, STZ, WHR, NTAP, FFIV, CSCO | KHC, AAPL, AMAT, NKTR, CNC, PM, HST, STX, MU, SNA, BBY, RHI | 0.8422 | 1.1896 |
| 2021-04-01 | 20 | BIO, MO, PM, GIS, CNC, FTV, GEN, DGX, LMT, EBAY, K, RVTY, LH, ESS | VNO, CPRI, DXC, DISCK, HON, BKNG, WBD, HUM, STZ, WHR, HRB, NTAP, IPG, FFIV | 1.6952 | 1.9361 |
| 2022-04-01 | 20 | MRNA, HOLX, GILD, HPE, REGN, BBY, OGN, NUE, COR, PFE, HON, AN, SJM | MO, DISH, GIS, CNC, ELV, FTV, GEN, BIIB, LMT, EBAY, CSCO, RVTY, ESS | 1.8661 | 2.1889 |
| 2023-04-03 | 20 | MO, PXD, APA, CHRW, PSA, QCOM, CF, RHI, CPAY, CSCO, ELV, NVR, STX | BIO, HOLX, GILD, DGX, HPE, PM, REGN, BBY, COR, HON, K, LH, SJM | 1.9333 | 1.986 |
| 2024-04-01 | 20 | PM, MCK, IPG, GIS, CNC, G, EXPE, SOLV, CVS, EBAY, MCHP, HON, MTCH, MDLZ | PFE, MO, MRNA, PXD, APA, CHRW, PSA, QCOM, CF, RHI, NUE, NVR, STX, OGN | 2.0574 | 2.5235 |
| 2025-04-01 | 20 | GEHC, LDOS, MRK, NTAP, CMI, AOS, CMCSA | CSCO, PM, MCK, G, EXPE, SOLV, CVS | 2.1446 | 2.711 |
| 2026-04-01 | 20 | ADBE, FISV, SOLV, IT, KDP, CAG, VNO, DELL, ADP, MKC, ACN, CTSH, URI, CDW, G, HAS | OMC, CNC, MCHP, GEHC, LDOS, MTCH, MRK, MDLZ, IPG, NTAP, CMI, EBAY, AN, HON, AOS, CMCSA | 2.2302 | 3.1666 |
Current holdings
- CPAY 5.0%
- GIS 5.0%
- ADBE 5.0%
- FISV 5.0%
- ASR 5.0%
- SOLV 5.0%
- IT 5.0%
- KDP 5.0%
- CAG 5.0%
- VNO 5.0%
- DELL 5.0%
- ADP 5.0%
- MKC 5.0%
- ELV 5.0%
- ACN 5.0%
- CTSH 5.0%
- URI 5.0%
- CDW 5.0%
- G 5.0%
- HAS 5.0%
Past performance is not a forecast and this is not financial advice. Each rebalance uses only fundamentals that were already public (filing date, or period end plus 90 days) and the adjusted close on that date. Holdings are equal-weighted, with no transaction costs.