As seen on Quantocracy
All research
QuanterLab · Research

O'Shaughnessy's Trending Value Taken Apart: Twenty Years on the S&P 500 as It Stood

How this study was run: the companies, the method, the dates
Universe · S&P 500 (point-in-time constituents)
Method · Comparative: Trending Value vs Low P/E + trend component
Manipulated variable ·
Two arms open each first of January with the same point-in-time S&P 500 membership, every member read on the statements filed on or before the anchor, as first filed, and on its prices to the anchor; a negative price multiple (a loss, a negative book, a negative EBITDA) counts as the dearest. Arm B … (full registered statement)Two arms open each first of January with the same point-in-time S&P 500 membership, every member read on the statements filed on or before the anchor, as first filed, and on its prices to the anchor; a negative price multiple (a loss, a negative book, a negative EBITDA) counts as the dearest. Arm B holds the 25 stocks with the largest six-month price rise among the cheapest tenth of the index on price to earnings alone. Arm A holds the 25 stocks with the largest six-month price rise among the cheapest tenth of the index on six price measures together (price to earnings, to book and to sales, EV to EBITDA, free cash flow yield, dividend yield). So the arms differ in one registered field, the book. Every name is bought equal weight at the anchor close and held to the end of the one-year window, dividends reinvested on the ex-date, 10 basis points paid one way at entry and at exit; a name that stops trading marks flat at its last close and is sold there; fewer than ten names in either arm excludes the window. SPY is held the same way.
Step size · 1 year per forward window
In-sample · 2 years before each anchor
Out-of-sample span · 2006-01-03 → 2025-12-31
Compiled · October 27, 2026
Search record · none (size unknown, see §2.3)
Abstract

Trending Value is a stock-picking formula from James O'Shaughnessy's book "What Works on Wall Street", and stock screeners have copied it for years. It has two components. The value component finds the cheapest stocks in the market, judged on six price measures at once. The trend component then buys, from those cheap stocks, the ones whose prices did best over the last six months.

We wanted to know which component does the work. So we built the formula every January for twenty years, from the companies in the S&P 500 at the time, using only what they had reported by then, and held each year's pick for a year. Beside it we ran two versions, each changing one thing: low P/E as the value component, with the same trend component; and the trend component only, with no value component. We measured each one against the equal-weight S&P 500, with its dividends.

The famous formula made less money than the equal-weight S&P 500, and less than both of its changed versions. The trend component only ended a little ahead of the formula, but fell far deeper in the financial crisis. The change that made a large difference was the value component's measure: with low P/E in place of the six measures, the formula beat the equal-weight S&P 500, and fell less than it in the worst crash.

James O'Shaughnessy's book "What Works on Wall Street" is one of the best-known collections of tested stock-picking rules. Its fourth edition added a formula he called Trending Value, and stock screeners have copied it ever since.

The idea behind it is easy to like. A cheap stock can stay cheap for years, so buying cheap alone means a lot of waiting. Trending Value waits for a sign. Its value component first finds the cheapest stocks; its trend component then buys the ones whose prices did best over the last six months, on the view that the market is beginning to agree they were too cheap.

The rules, step by step

The formula has two components:

• The value component: score every stock on six price measures and keep the cheapest tenth, about 50 stocks.

• The trend component: of those, keep the 25 whose prices did best over the last six months. In a falling market these are the ones that fell least.

Every year, on the first trading day of January:

1. Take the companies in the S&P 500 on that day, as the index stood then.

2. The value component. Score each one on six price measures, using only the reports it had filed by then: price to earnings, price to book value, price to sales, enterprise value to EBITDA, the free cash flow yield and the dividend yield. A company losing money counts as expensive on that measure, not cheap. Keep the cheapest tenth.

3. The trend component. Of those, buy the 25 whose prices did best over the last six months, in equal amounts.

4. Hold them for a year with their dividends, then start again.

To see which component does the work, we ran two versions beside it, each changing one thing:

• Low P/E + trend component: the value component on price to earnings alone, keeping the tenth with the lowest price to earnings (a company losing money is never in it), then the same trend component, 25 stocks.

• Trend component only: the 25 stocks that did best over the last six months in the whole index, with no value component.

We measured every portfolio against one yardstick: RSP, the equal-weight S&P 500, with its dividends. It holds every stock in the index in equal amounts and resets them every quarter; our portfolios start each year in equal amounts and are then left alone.

What we found, in short

Did Trending Value beat the equal-weight S&P 500? No (Figure 1). For the first years it kept pace, through the crash and the recovery after it. Then came the long stretch when cheap stocks were out of favour almost everywhere, and the formula fell far behind. It won part of that back near the end, but it never caught up.

Does the value component matter? For where the money ended, very little (Figure 1). The trend component only, buying the stocks that had done best with no regard for price, ended a little ahead of Trending Value. The ride was the difference: in the financial crisis these stocks fell the furthest of all, and they took years to climb back.

Do six measures beat one? No, and this was the surprise (Figure 1). With low P/E as the value component and the same trend component after it, the formula stayed close to Trending Value until the financial crisis, then pulled ahead and never fell behind again.

Did any version beat the equal-weight S&P 500? Yes, one (Figure 1). Low P/E + trend component ended with more money, and in the worst crash it fell less. It pulled ahead in the years after the financial crisis, lost the lead for a while in the pandemic crash, and finished the twenty years further ahead than ever.

What $1 became in each version and in the equal-weight S&P 500, day by day over the twenty years, after costs and with dividends reinvested. The table under the picture names each line by its colour.
Figure 1. What $1 became in each version and in the equal-weight S&P 500, day by day over the twenty years, after costs and with dividends reinvested. The table under the picture names each line by its colour.
1  Methodology, in detail (click to open)

1  Methodology

Universe: the S&P 500's members on each first trading day of January from 2006 to 2025, rebuilt from the index's change log. Fundamentals: each company's statements as filed with the SEC, visible only from the day they were accepted. Value component: the platform's Value Factor card with six measures at equal weight, scored as percentiles across the index, cut to the cheapest tenth; its setting for a negative multiple ranks a loss, a negative book or a negative EBITDA as the most expensive. Trend component: the Momentum Factor card's six-month price change, the latest month included, ranked within that tenth, the top 25 kept. Portfolio: equal weights, bought at the first close of the year and held to its last close, dividends reinvested on their ex-dates, 10 basis points paid on each purchase and each sale. RSP is held the same way, with its dividends and no costs, from each year's first close to its last, so, as for every portfolio here, the move into each year's first trading day is left out; held without that gap, $1 in RSP became $6.68. Each year was written down and locked before it ran.

2  Results

Findings

Table 1 sets the four side by side over the twenty years.

2.1  Headline

Trending Value, Sharpe
0.49
day by day, every year the test ran, 2006 to 2025
Low P/E + trend component, Sharpe
0.57
day by day, every year the test ran, 2006 to 2025
The result
From 2006 to 2025, $1 in Trending Value became $5.44, against $6.16 in the equal-weight S&P 500. With low P/E as the value component and the same trend component, the formula became $8.17 and beat it. After costs, dividends reinvested.

Table 1. Ups and downs a year: the standard deviation of daily returns, annualised. Sharpe ratio: the average yearly return divided by those ups and downs, before any cash rate. Dividends reinvested, 10 basis points paid at entry and at exit. RSP, the equal-weight S&P 500, is bought at each year's first close and held to its last, with its dividends and no costs.

Portfolio$1 becameA yearWorst fallUps and downs a yearSharpe ratio
Low P/E + trend component$8.1711.1%−54%23.3%0.57
Equal-weight S&P 500 (the yardstick)$6.169.5%−61%20.7%0.54
Trend component only$5.739.1%−67%25.1%0.47
Trending Value (value component + trend component)$5.448.8%−57%22.7%0.49
Sections 2.2 to 3, the full record: every year, every test, and how each one was run (click to open)

The registration names the two groups compared Trending Value and The same rule on price to earnings alone; this paper calls them Trending Value and Low P/E + trend component.

2.2  Per-step results

Table 2. One row per step, raw out-of-sample results. A short window can pair a negative return with a positive annualised Sharpe: at high daily volatility the arithmetic mean of daily returns sits above the compounded window return, and the Sharpe reads the former. Volatility drag, printed rather than smoothed.
#Out-of-sample window Trending Value SR Low P/E + trend component SR Trend component only SR
1 2006-01-03 → 2006-12-29 1.39 0.87 0.74
2 2007-01-03 → 2007-12-31 0.76 1.03 -0.10
3 2008-01-02 → 2008-12-31 -1.14 -0.86 -0.86
4 2009-01-02 → 2009-12-31 0.59 0.83 0.26
5 2010-01-04 → 2010-12-31 0.62 0.79 0.86
6 2011-01-03 → 2011-12-30 0.27 0.19 -0.30
7 2012-01-03 → 2012-12-31 0.63 1.73 1.12
8 2013-01-02 → 2013-12-31 2.34 2.45 2.23
9 2014-01-02 → 2014-12-31 0.53 1.26 0.93
10 2015-01-02 → 2015-12-31 -0.52 -0.21 0.66
11 2016-01-04 → 2016-12-30 1.36 0.72 0.91
12 2017-01-03 → 2017-12-29 1.21 0.98 1.44
13 2018-01-02 → 2018-12-31 -0.86 -0.85 -0.45
14 2019-01-02 → 2019-12-31 1.64 1.53 2.20
15 2020-01-02 → 2020-12-31 0.05 0.15 0.83
16 2021-01-04 → 2021-12-31 1.62 1.72 1.50
17 2022-01-03 → 2022-12-30 0.67 -0.15 -0.64
18 2023-01-03 → 2023-12-29 0.73 1.08 1.05
19 2024-01-02 → 2024-12-31 1.12 1.29 1.29
20 2025-01-02 → 2025-12-31 1.00 0.96 1.12
Out-of-sample equity: normalised growth (1.00x = break even)0.41x0.99x1.57xbars into the window →
Figure 2. Trending Value: every step's out-of-sample curve overlaid, each rebased to 1× at its own start. Read alongside the per-step table: consistent shape across steps is the walk-forward's evidence; a single lucky leg is not.
Out-of-sample equity: normalised growth (1.00x = break even)0.43x1.03x1.64xbars into the window →
Figure 3. Low P/E + trend component: the same windows, the other arm. Compare shape-for-shape with the previous figure: the two arms trade the identical out-of-sample windows.
Out-of-sample equity: normalised growth (1.00x = break even)0.33x0.94x1.56xbars into the window →
Figure 4. Trend component only: the same windows once more, from a companion run. Same reading as the figures above.

2.3  Search accounting

No search record exists for this design. It was not promoted from a recorded evolving search, so the number of alternatives tried before it, on paper, in another tool, or in the author's head, is unknown. Unknown is a different fact from one: a study with no lineage is not a strategy with one trial, it is a strategy with an unrecorded number of them. Accordingly no count of alternatives tried is claimed, and nothing in this paper is corrected for a search that was never recorded; the number that stands is the raw out-of-sample result plus this disclosure. The registered per-step record below (§4) still guarantees each window's hypothesis was hashed and registered before that window was scored.

2.4  The comparison

Both arms trade the same registered windows, so their returns can be PAIRED: inside each window the two return series are inner-joined date by date and the difference rTrending Value − rLow P/E + trend component is the object under test. Because this is ONE pre-declared contrast, frozen at registration before any window was scored, the paired statistic needs no multiple-testing deflation, and the per-arm pooled numbers above are likewise uncorrected, because this design has no recorded search to correct against (§2.3). The paired contrast carries that gap differently from the arm levels: it was declared before each window ran and it is scored on the difference, so no window could be read first and scored after. What the timestamps cannot speak to is how this contrast came to be the declared one, which is the limit §2.3 states.

In the table: Arm A = Trending Value · Arm B = Low P/E + trend component.

Table 3. Window-by-window paired comparison. Δ is the growth gap (Arm A − Arm B) over the window's paired dates. The Trend component only column carries companion books' growth over the full window; the Δ and Leader columns compare only this study's two registered arms.
#WindowPaired bars Arm AArm B ΔLeader Trend component only
1 2006-01-04 → 2006-12-29 250 +20.4% +10.6% +9.8 pp Arm A +14.4%
2 2007-01-04 → 2007-12-31 250 +12.9% +18.5% -5.6 pp Arm B -3.7%
3 2008-01-03 → 2008-12-31 252 -37.8% -36.1% -1.7 pp Arm B -46.5%
4 2009-01-05 → 2009-12-31 251 +11.9% +20.7% -8.8 pp Arm B +3.5%
5 2010-01-05 → 2010-12-31 251 +11.4% +16.1% -4.7 pp Arm B +23.0%
6 2011-01-04 → 2011-12-30 251 +3.5% +1.5% +2.1 pp Arm A -14.5%
7 2012-01-04 → 2012-12-31 249 +7.8% +30.2% -22.4 pp Arm B +15.2%
8 2013-01-03 → 2013-12-31 251 +41.8% +48.7% -6.9 pp Arm B +45.4%
9 2014-01-03 → 2014-12-31 251 +7.3% +19.5% -12.2 pp Arm B +16.1%
10 2015-01-05 → 2015-12-31 251 -9.1% -4.6% -4.5 pp Arm B +10.6%
11 2016-01-05 → 2016-12-30 251 +20.2% +10.7% +9.5 pp Arm A +12.8%
12 2017-01-04 → 2017-12-29 250 +14.7% +13.1% +1.6 pp Arm A +22.6%
13 2018-01-03 → 2018-12-31 250 -15.9% -15.5% -0.4 pp Arm B -10.7%
14 2019-01-03 → 2019-12-31 251 +20.8% +21.5% -0.7 pp Arm B +26.8%
15 2020-01-03 → 2020-12-31 252 -10.3% -3.8% -6.5 pp Arm B +26.5%
16 2021-01-05 → 2021-12-31 251 +44.8% +48.8% -4.0 pp Arm B +38.5%
17 2022-01-04 → 2022-12-30 250 +14.7% -6.8% +21.4 pp Arm A -18.7%
18 2023-01-04 → 2023-12-29 249 +12.8% +20.5% -7.7 pp Arm B +16.4%
19 2024-01-03 → 2024-12-31 251 +20.7% +24.6% -4.0 pp Arm B +25.6%
20 2025-01-03 → 2025-12-31 249 +20.0% +22.9% -2.9 pp Arm B +30.1%

Paired Sharpe of the difference track: -0.31 · block bootstrap (2000 paths, block 10, seed 1234): P(Trending Value beats Low P/E + trend component) = 7.0%.

Window win-rate. Trending Value led 5 of 20 windows (25.0%), Low P/E + trend component led 15, and the mean window gap of -2.43 pp points the same way. Widest single window: 2012 at -22.4 pp.

3  The circuit

The strategy is a circuit of platform primitives, frozen when the study is registered. Below is the circuit as wired on the canvas, the objective it encodes and how the search runs through it, followed by the mathematics each primitive actually computes, the same formulas the execution engine runs. The complete parameterisation is preserved in the study ledger (Appendix A).

The hypothesis under test

The sentence below is the registration record, generated when the circuit was registered and printed verbatim; the authored description of the design is Section 1.

A COMPARATIVE study: Trending Value vs The same rule on price to earnings alone, walked on the same registered out-of-sample windows. Trending Value: S&P 500, bought equal weight at the anchor close and held one year, and run out-of-sample from the anchor: anything the design estimates from history, where it estimates at all, is re-estimated at each anchor from pre-anchor data only, and the walk advances through registered out-of-sample windows; its disposition is the realized forward path versus the benchmark. The same rule on price to earnings alone: S&P 500, bought equal weight at the anchor close and held one year, and run out-of-sample from the anchor: anything the design estimates from history, where it estimates at all, is re-estimated at each anchor from pre-anchor data only, and the walk advances through registered out-of-sample windows; its disposition is the realized forward path versus the benchmark. The arms differ in: Value Factor, Dividend Yield: medium → off; Value Factor, EV/EBITDA: medium → off; Value Factor, FCF Yield: medium → off; Value Factor, P/B Ratio: medium → off; Value Factor, P/S Ratio: medium → off. The contrast under test: whether Trending Value generates better risk-adjusted returns than The same rule on price to earnings alone over the identical out-of-sample windows.

Every block in this study is a card from the platform's catalog: the S&P 500 as it stood on each day, the Fundamentals Loader, the Value Factor with six measures, the Factor Composite and Factor Select for the cheapest tenth, the Momentum Factor on the six-month rise and a second Factor Select for the 25, and the Held Forward Test for the year. You can rebuild every test and change any setting.

The frozen circuit, data flows left to rightuniverse: click for detailsuniversefactor loader: click for detailsfactor loaderfactor value: click for detailsfactor valuefactor composite: click for detailsfactor compositefactor top tier: click for detailsfactor top tierfactor loader: click for detailsfactor loaderfactor momentum: click for detailsfactor momentumfactor composite: click for detailsfactor compositefactor top tier: click for detailsfactor top tierhold forward: click for detailshold forwarduniverse: click for detailsuniversefactor loader: click for detailsfactor loaderfactor value: click for detailsfactor valuefactor composite: click for detailsfactor compositefactor top tier: click for detailsfactor top tierfactor loader: click for detailsfactor loaderfactor momentum: click for detailsfactor momentumfactor composite: click for detailsfactor compositefactor top tier: click for detailsfactor top tierhold forward: click for detailshold forwardTrending ValueThe same rule on price to earnings aloneshared
Figure 5. The frozen circuit, every node a primitive, every wire a typed data-flow; the two arms are colour-coded (Trending Value green, Low P/E + trend component blue, shared feeds neutral). Each box is one step of the strategy; data flows along the wires left to right, and no box can see data dated later than the box feeding it. The whole diagram was frozen when the hypothesis was registered. Click any node to open what that step ran with and what it produced.

Envelopes show counts, ratios, dates, and the parameters the author chose. Full price and per-name data series are not republished: the underlying market data is licensed to QuanterLab. Point figures quoted in the prose, a named holding's return over a stated span, are summary facts derived from public market prices, not redistributed series.

What each part does
Universe, The starting set of tickers, resolved point-in-time from the index change-log, so names delisted or removed later still compete on the dates they traded.
Factor Loader, Point-in-time fundamentals, never let the user see a number before the SEC did.
Factor Value, Value, how cheap is the stock, cross-sectionally?
Factor Composite, The weighting console, blend Value, Quality, Momentum, Growth into one 0–100 score.
Factor Top Tier, The cut out of the factor lane, keep the top-ranked names.
Factor Momentum, Momentum, recent price strength, no filing required.
Hold Forward, The one hold every paper used: equal weight at the anchor, held to the end.

The objective and the search

Trending Value

UniverseS&P 500 index constituents.
Validation & out-of-sampleheld forward test (every wired name bought equal weight at the anchor close and held to the end of the one year window, dividends reinvested on the ex-date, 10 basis points one way at entry and at exit, fewer than 10 names excludes the window, SPY held the same way as the benchmark).
Other componentsFactor models: Factor Composite ×2, Factor Select ×2, Fundamentals Loader (PIT) ×2, Momentum Factor, Value Factor.

The same rule on price to earnings alone

The specification is identical to Trending Value's table above, row for row; the one registered difference between the arms is itemized below.

What differs between the arms, one manipulated variable, expressed as 5 paired settings on one node:

  • paramValue Factor, Dividend Yield: medium → off
  • paramValue Factor, EV/EBITDA: medium → off
  • paramValue Factor, FCF Yield: medium → off
  • paramValue Factor, P/B Ratio: medium → off
  • paramValue Factor, P/S Ratio: medium → off

Companion book. Trend component only comes from a companion run of the identical configuration on its own registered anchor schedule. Its results run through this paper's tables under its own name.

Everything else is held identical, so an out-of-sample gap between the arms is attributable to this one change.

Cost elements are wired into the circuit, the realised drag is reported per step in Appendix B.

Show the mathematics, 7 primitives, formulas and parity notes

3.1  Universe

The starting set of tickers, resolved point-in-time from the index change-log, so names delisted or removed later still compete on the dates they traded.

Before any math, you need a list of stocks. An index preset (S&P 500, Nasdaq-100, Dow 30) is reconstructed as it stood ON your anchor date by replaying the historical add/drop change-log backwards, so a 2018 backtest sees the 2018 membership, not today's winners.

Point-in-time membership

Start from today's constituents and un-apply every membership change after the anchor t:

\mathcal{U}(t) = \mathcal{U}_{\text{now}} \;\ominus\; \{\text{adds after } t\} \;\oplus\; \{\text{drops after } t\}
Constituents resolved from the index change-log; the same point-in-time set the factor + screening modules use.

3.2  Factor Loader

Point-in-time fundamentals, never let the user see a number before the SEC did.

Loads ~23 fundamental metrics (valuation, quality, growth) per name, but with one inviolable rule: a financial statement becomes visible only on or after its SEC acceptedDate. A 2020 backtest sees only what was actually filed by 2020, no look-ahead, ever.

The PIT gate
\text{visible}(f, t) \iff \text{acceptedDate}(f) \le t
Missing acceptance dates fall back to filingDate, else statement date + 45 days.
Byte-identical to FM101FBKT (shared_libs/factor_core). US indexes only (SEC reliability).

3.3  Factor Value

Value, how cheap is the stock, cross-sectionally?

Blends cheapness metrics, P/E, P/B, P/S, EV/EBITDA (lower is better) plus free-cash-flow and earnings yields (higher is better). Each metric is z-scored across the universe, winsorized against outliers, weighted by the importance you set (Off/Low/Med/High), and averaged.

Cross-sectional z-score per metric
z_{i,k} = \pm\,\frac{x_{i,k} - \bar x_k}{s_k}
Sign encodes direction (cheap = good). Winsorized at 1% / 99%.
Importance-weighted family score
\text{Value}_i = \frac{\sum_k \omega_k\,z_{i,k}}{\sum_k \omega_k}, \quad \omega \in \{0,\,0.5,\,1,\,2\}
Off / Low / Medium / High = 0 / 0.5 / 1 / 2. Binding rank happens in Factor Composite.
Byte-identical to FM101FBKT (shared_libs/factor_core).

3.4  Factor Composite

The weighting console, blend Value, Quality, Momentum, Growth into one 0–100 score.

Where the four factor families become a single ranking. Each family score is standardized across the universe, blended with your slider weights (or the radar's suggested tilt), and min-max scaled to 0–100. Winsorizing tames outliers; z-score or percentile normalization is your choice.

Cross-sectional standardize + winsorize
z_{i,f} = \frac{x_{i,f} - \bar x_f}{s_f}\quad(\text{clipped at the 1st / 99th percentile})
Weighted blend, scaled to 0–100
C_i = \sum_f W_f\,z_{i,f}, \qquad \text{score}_i = 100\cdot\frac{C_i - \min_j C_j}{\max_j C_j - \min_j C_j}
W = your four slider weights (total 100) OR the Regime Tilt radar's suggestion. Needs ≥ 10 names, ≥ 3 valid metrics each.
Byte-identical to FM101FBKT ranking (shared_libs/factor_core.rank_stocks_at_date).

3.5  Factor Top Tier

The cut out of the factor lane, keep the top-ranked names.

Takes the composite-ranked factor set and keeps the best N, carrying the composite score, the four family scores and the point-in-time market cap for each survivor. Feed 10–20 to a direct portfolio, or 30–100 as an optimizer pool.

Rank cut
\{\, i : \operatorname{rank}(C_i) \le N\,\}, \quad C_i = \text{composite score}
Byte-identical to FM101FBKT ranking (shared_libs/factor_core).

3.6  Factor Momentum

Momentum, recent price strength, no filing required.

Pure price-based: 1/3/6/12-month returns measured at the anchor. Because it needs no financial statement, it is always available, even for names with thin fundamentals.

Multi-horizon return, z-scored
\text{Mom}_i = \frac{\sum_k \omega_k\, z\!\big(R_{i}^{(k)}\big)}{\sum_k \omega_k}, \quad R^{(k)} = \frac{P_{\mathrm{near}}}{P_{t-k}}-1
Horizons k ∈ {1, 3, 6, 12} months, measured point-in-time. The near leg follows the node’s "Most recent month" switch: include (the default) reads the anchor close, P_near = P_t, the classic J–0; skip reads one month back, P_near = P(t−21 bars), the Fama-French J–1, and the 1-month horizon is excluded, since its window is exactly the skipped month.
Byte-identical to FM101FBKT (shared_libs/factor_core) at the default include setting; the skip is a Primitives-side option FM101 does not run.

3.7  Hold Forward

The one hold every paper used: equal weight at the anchor, held to the end.

Buys every selected name in equal parts at the anchor close and holds to the window’s end, reinvesting each dividend into the paying name on its ex-date, paying a cost once at entry and once at exit. No signal, no rebalance, nothing re-estimated: what it measures is the selection itself. A name that stops trading marks flat at its last close and is sold there; fewer names than the floor excludes the window and says so.

The book
u_i=\frac{C/N \cdot (1-f)}{P_{i,0}},\qquad E_t=\sum_i u_{i,t}P_{i,t}
C is the book, N the names, f the one-way cost. Units grow on an ex-date by the dividend over that day’s price, which is the dividend reinvested in the payer.
Dividends reinvested
u_{i,t}=u_{i,t^-}\left(1+\frac{D_{i,t}}{P_{i,t}}\right)
The same hold the F-score paper ran (fscore_study.hold_pnl), unchanged.

4  Discussion

4.1  Interpretation

The blend of six measures is meant to be steadier than any one of them. Here the plainest measure did best: with low P/E as the value component, the formula beat the equal-weight S&P 500 and fell less in the worst crash. This study cannot say why. It is one of two changes we tried, on one stretch of history and the largest American companies, and the next twenty years may favour a different measure.

The value component did one clear job: it kept the formula out of the deepest falls. Without it, the trend component alone fell the furthest of all in the financial crisis.

4.2  Limitations

The test uses the S&P 500, the 500 largest American companies, while the book used a much wider list of stocks above a size floor; small cheap companies, where value rules have done best, are not in it. Two of the six measures are stand-ins: free cash flow yield for price to cash flow, and the dividend yield for the yield of dividends plus buybacks. Our data covers fewer of the index's companies in the earlier years, and until 2019 the portfolios could not buy some of their picks, mostly companies that later left the index, a choice made with knowledge from after the pick: Trending Value held as few as 17 of its 25 picks and the low P/E version as few as 15, while the equal-weight S&P 500 held every company. Each portfolio is held for exactly one year from the first close of January; another start month would give other numbers.

Try it yourself

Open the study's circuit in the lab and change one card at a time: the number of stocks the trend component keeps, the six-month rise against twelve months, or the measures on the Value Factor card. Switch off five of the six measures and you have the low P/E version.

References

Author’s references?
  1. O'Shaughnessy, J. P. (2011). What Works on Wall Street, fourth edition. McGraw-Hill.
  2. Fama, E. F., and French, K. R. (1992). The cross-section of expected stock returns. Journal of Finance, 47(2), 427-465.
  3. Jegadeesh, N., and Titman, S. (1993). Returns to buying winners and selling losers: implications for stock market efficiency. Journal of Finance, 48(1), 65-91.
  4. Asness, C. S., Moskowitz, T. J., and Pedersen, L. H. (2013). Value and momentum everywhere. Journal of Finance, 68(3), 929-985.

Appendix A  Reproducibility in QuanterLab

Each step is backed by a frozen run report. The study is re-derivable from the ledger below.

#CommitReportAnchorOOS window
1 45b7ca3ba767 15146 2006-01-01 2006-01-03 → 2006-12-29
2 e364ea0ea029 15149 2007-01-01 2007-01-03 → 2007-12-31
3 0b83cb951f2b 15152 2008-01-01 2008-01-02 → 2008-12-31
4 1d04ecbc4d61 15155 2009-01-01 2009-01-02 → 2009-12-31
5 a52b078b6d33 15158 2010-01-01 2010-01-04 → 2010-12-31
6 aaf6706b2073 15161 2011-01-01 2011-01-03 → 2011-12-30
7 c58dcb8bb325 15163 2012-01-01 2012-01-03 → 2012-12-31
8 a71b96856d32 15167 2013-01-01 2013-01-02 → 2013-12-31
9 764c89ecd5f1 15170 2014-01-01 2014-01-02 → 2014-12-31
10 494d36c022c0 15173 2015-01-01 2015-01-02 → 2015-12-31
11 51f26bb237c5 15176 2016-01-01 2016-01-04 → 2016-12-30
12 aa7b136e627c 15179 2017-01-01 2017-01-03 → 2017-12-29
13 201ae41aecde 15182 2018-01-01 2018-01-02 → 2018-12-31
14 924614224c13 15185 2019-01-01 2019-01-02 → 2019-12-31
15 a87b932fadda 15188 2020-01-01 2020-01-02 → 2020-12-31
16 1b22ad7fd9e3 15189 2021-01-01 2021-01-04 → 2021-12-31
17 706b6b330da1 15192 2022-01-01 2022-01-03 → 2022-12-30
18 bcd0e64128c3 15195 2023-01-01 2023-01-03 → 2023-12-29
19 a45cfcbd8782 15198 2024-01-01 2024-01-02 → 2024-12-31
20 a78fb4caa5d1 15201 2025-01-01 2025-01-02 → 2025-12-31
QuanterLab reference architecture

The methods the platform implements, for every study made on it, rest on these works.

  1. Gelman, A., & Loken, E. (2013). The garden of forking paths: Why multiple comparisons can be a problem, even when there is no “fishing expedition.” Working paper, Columbia University.
  2. Harvey, C. R., Liu, Y., & Zhu, H. (2016). … and the Cross-Section of Expected Returns. Review of Financial Studies, 29(1), 5–68. doi:10.1093/rfs/hhv059
  3. Lo, A. W. (2002). The Statistics of Sharpe Ratios. Financial Analysts Journal, 58(4), 36–52. doi:10.2469/faj.v58.n4.2453

Appendix A2  Registration record

What this record does and does not establish. Every window in this study is historical: the data existed before the study began, so this is sequential registration on past windows, not pre-registration in the clinical-trial sense, and no procedure could make it so. What the platform does enforce is order, each step's specification was frozen and hashed before that step was scored, and the walk cannot advance past a step that was never run or close one with a result registered for a different window. The two timestamp columns below are the evidence: read them together and each registration precedes its own run, and each run precedes the next registration. A study whose registrations all post-date its runs would show it here. Wall-clock spacing between registrations varies with the author's schedule and queue latency; the ordering, not the tempo, is the claim.

“A COMPARATIVE study: Trending Value vs The same rule on price to earnings alone, walked on the same registered out-of-sample windows. Trending Value: S&P 500, bought equal weight at the anchor close and held one year, and run out-of-sample from the anchor: anything the design estimates from history, where it estimates at all, is re-estimated at each anchor from pre-anchor data only, and the walk advances through registered out-of-sample windows; its disposition is the realized forward path versus the benchmark. The same rule on price to earnings alone: S&P 500, bought equal weight at the anchor close and held one year, and run out-of-sample from the anchor: anything the design estimates from history, where it estimates at all, is re-estimated at each anchor from pre-anchor data only, and the walk advances through registered out-of-sample windows; its disposition is the realized forward path versus the benchmark. The arms differ in: Value Factor, Dividend Yield: medium → off; Value Factor, EV/EBITDA: medium → off; Value Factor, FCF Yield: medium → off; Value Factor, P/B Ratio: medium → off; Value Factor, P/S Ratio: medium → off. The contrast under test: whether Trending Value generates better risk-adjusted returns than The same rule on price to earnings alone over the identical out-of-sample windows.”

The same hypothesis was registered independently at every step, hashed before each step's out-of-sample window was scored:

Table 4. Registration audit, one row per registered step, with the time each specification was frozen and the time its window was scored. The hypothesis is identical on every row by design: it was registered once and re-registered unchanged at each anchor. Rows that differ would mean the specification moved mid-walk, which is the thing this record exists to rule out. The timestamps are the separate claim: each registration precedes its own run, and each run precedes the next registration.
#AnchorRegistered at (UTC)Run completed (UTC)
1 2006-01-012026-10-27 13:19:12 2026-10-27 13:57:05
2 2007-01-012026-10-27 13:57:06 2026-10-27 14:03:43
3 2008-01-012026-10-27 14:03:43 2026-10-27 14:08:21
4 2009-01-012026-10-27 14:08:21 2026-10-27 14:12:23
5 2010-01-012026-10-27 14:12:23 2026-10-27 14:17:13
6 2011-01-012026-10-27 14:17:13 2026-10-27 14:21:39
7 2012-01-012026-10-27 14:21:39 2026-10-27 14:27:05
8 2013-01-012026-10-27 14:27:05 2026-10-27 14:32:43
9 2014-01-012026-10-27 14:32:43 2026-10-27 14:37:44
10 2015-01-012026-10-27 14:37:44 2026-10-27 14:42:58
11 2016-01-012026-10-27 14:42:58 2026-10-27 14:49:00
12 2017-01-012026-10-27 14:49:00 2026-10-27 14:55:02
13 2018-01-012026-10-27 14:55:02 2026-10-27 15:01:18
14 2019-01-012026-10-27 15:01:19 2026-10-27 15:06:56
15 2020-01-012026-10-27 15:06:56 2026-10-27 15:11:35
16 2021-01-012026-10-27 15:11:35 2026-10-27 15:16:12
17 2022-01-012026-10-27 15:16:12 2026-10-27 15:22:39
18 2023-01-012026-10-27 15:22:39 2026-10-27 15:28:54
19 2024-01-012026-10-27 15:28:54 2026-10-27 15:34:45
20 2025-01-012026-10-27 15:34:45 2026-10-27 15:41:00

The companion comparison

This paper reads a second registered study beside its own. Its registration is printed here from its own record, in the same form as the table above: the hypothesis as it was registered, the day it was first locked, the time each window was registered and run, and what each window returned.

Trend component only

Its hypothesis was first locked on 27 October 2026, before its first window was run that day.

The same hypothesis was registered again, unchanged, at each of its 20 windows:

“A COMPARATIVE study: Trending Value vs The six-month risers of the whole index, walked on the same registered out-of-sample windows. Trending Value: S&P 500, bought equal weight at the anchor close and held one year, and run out-of-sample from the anchor: anything the design estimates from history, where it estimates at all, is re-estimated at each anchor from pre-anchor data only, and the walk advances through registered out-of-sample windows; its disposition is the realized forward path versus the benchmark. The six-month risers of the whole index: S&P 500, bought equal weight at the anchor close and held one year, and run out-of-sample from the anchor: anything the design estimates from history, where it estimates at all, is re-estimated at each anchor from pre-anchor data only, and the walk advances through registered out-of-sample windows; its disposition is the realized forward path versus the benchmark. The arms differ in: 6 nodes across 8 recorded settings: Factor Composite #1, Momentum %: 0 → 100; Factor Composite #1, Value %: 100 → 0; Factor Select #1, Top fraction of the ranked pool (0 = use Top N): 0.1 → 0; Factor Select #1, Top N: 20 → 25; Value Factor, removed in The six-month risers of the whole index; Fundamentals Loader (PIT), removed in The six-month risers of the whole index; Factor Composite, removed in The six-month risers of the whole index; Factor Select, removed in The six-month risers of the whole index. NOTE: with more than one difference, an out-of-sample gap cannot be attributed to any single change. The contrast under test: whether Trending Value generates better risk-adjusted returns than The six-month risers of the whole index over the identical out-of-sample windows.”

Trend component only, its registration audit. One row per registered window, with the time each specification was locked and the time its window was run, from the companion's own record; each registration comes before its own run.
#AnchorRegistered at (UTC)Run completed (UTC)
1 2006-01-01 2026-10-27 13:19:12 2026-10-27 13:57:17
2 2007-01-01 2026-10-27 13:57:18 2026-10-27 14:04:31
3 2008-01-01 2026-10-27 14:04:31 2026-10-27 14:10:10
4 2009-01-01 2026-10-27 14:10:10 2026-10-27 14:15:11
5 2010-01-01 2026-10-27 14:15:11 2026-10-27 14:20:50
6 2011-01-01 2026-10-27 14:20:50 2026-10-27 14:27:41
7 2012-01-01 2026-10-27 14:27:41 2026-10-27 14:33:55
8 2013-01-01 2026-10-27 14:33:56 2026-10-27 14:38:09
9 2014-01-01 2026-10-27 14:38:09 2026-10-27 14:44:37
10 2015-01-01 2026-10-27 14:44:37 2026-10-27 14:51:03
11 2016-01-01 2026-10-27 14:51:03 2026-10-27 14:57:17
12 2017-01-01 2026-10-27 14:57:17 2026-10-27 15:03:43
13 2018-01-01 2026-10-27 15:03:43 2026-10-27 15:09:58
14 2019-01-01 2026-10-27 15:09:58 2026-10-27 15:17:13
15 2020-01-01 2026-10-27 15:17:14 2026-10-27 15:24:05
16 2021-01-01 2026-10-27 15:24:05 2026-10-27 15:28:55
17 2022-01-01 2026-10-27 15:28:55 2026-10-27 15:37:11
18 2023-01-01 2026-10-27 15:37:11 2026-10-27 15:41:03
19 2024-01-01 2026-10-27 15:41:03 2026-10-27 15:42:40
20 2025-01-01 2026-10-27 15:42:40 2026-10-27 15:44:16
Trend component only, what each window returned, arm by arm. Each window's own return, for each of the companion's two registered arms.
#AnchorTrending ValueThe six-month risers of the whole index
1 2006-01-01 +20.4% +14.4%
2 2007-01-01 +12.9% -3.7%
3 2008-01-01 -37.8% -46.5%
4 2009-01-01 +11.9% +3.5%
5 2010-01-01 +11.4% +23.0%
6 2011-01-01 +3.5% -14.5%
7 2012-01-01 +7.8% +15.2%
8 2013-01-01 +41.8% +45.4%
9 2014-01-01 +7.3% +16.1%
10 2015-01-01 -9.1% +10.6%
11 2016-01-01 +20.2% +12.8%
12 2017-01-01 +14.7% +22.6%
13 2018-01-01 -15.9% -10.7%
14 2019-01-01 +20.8% +26.8%
15 2020-01-01 -10.3% +26.5%
16 2021-01-01 +44.8% +38.5%
17 2022-01-01 +14.7% -18.7%
18 2023-01-01 +12.8% +16.4%
19 2024-01-01 +20.7% +25.6%
20 2025-01-01 +20.0% +30.1%

Appendix B  Per-step diagnostics

Names held is the union across the window: the count of distinct instruments the book touched between the window’s first and last session, not the number it held at one time. A book that rotates monthly touches more names than it holds.

What each step's run actually did beyond its return: the portfolio book's rebalancing and cost drag. Harvested from the frozen run reports, present where the circuit produced them. Cost drag is the gap between the step's return before and after its trading costs, in percentage points of the step's starting capital, so on a book that trades every session and compounds it can exceed the step's own net return.

Open the full per-step grid (20 steps: every rebalance, per window)

Step 1 · 2006-01-03 → 2006-12-29

Trending Value

Portfolio book, rebalanced hold · 21 names held · selection: anchor · cost drag 0.241% · 4 names dropped at load for want of prices (25 selected, 21 held), weights renormalised onto the rest

Low P/E + trend component

Portfolio book, rebalanced hold · 19 names held · selection: anchor · cost drag 0.221% · 6 names dropped at load for want of prices (25 selected, 19 held), weights renormalised onto the rest

Step 2 · 2007-01-03 → 2007-12-31

Trending Value

Portfolio book, rebalanced hold · 21 names held · selection: anchor · cost drag 0.226% · 4 names dropped at load for want of prices (25 selected, 21 held), weights renormalised onto the rest

Low P/E + trend component

Portfolio book, rebalanced hold · 17 names held · selection: anchor · cost drag 0.237% · 8 names dropped at load for want of prices (25 selected, 17 held), weights renormalised onto the rest

Step 3 · 2008-01-02 → 2008-12-31

Trending Value

Portfolio book, rebalanced hold · 19 names held · selection: anchor · cost drag 0.124% · 6 names dropped at load for want of prices (25 selected, 19 held), weights renormalised onto the rest

Low P/E + trend component

Portfolio book, rebalanced hold · 15 names held · selection: anchor · cost drag 0.128% · 10 names dropped at load for want of prices (25 selected, 15 held), weights renormalised onto the rest

Step 4 · 2009-01-02 → 2009-12-31

Trending Value

Portfolio book, rebalanced hold · 21 names held · selection: anchor · cost drag 0.224% · 4 names dropped at load for want of prices (25 selected, 21 held), weights renormalised onto the rest

Low P/E + trend component

Portfolio book, rebalanced hold · 18 names held · selection: anchor · cost drag 0.242% · 7 names dropped at load for want of prices (25 selected, 18 held), weights renormalised onto the rest

Step 5 · 2010-01-04 → 2010-12-31

Trending Value

Portfolio book, rebalanced hold · 22 names held · selection: anchor · cost drag 0.223% · 3 names dropped at load for want of prices (25 selected, 22 held), weights renormalised onto the rest

Low P/E + trend component

Portfolio book, rebalanced hold · 20 names held · selection: anchor · cost drag 0.232% · 5 names dropped at load for want of prices (25 selected, 20 held), weights renormalised onto the rest

Step 6 · 2011-01-03 → 2011-12-30

Trending Value

Portfolio book, rebalanced hold · 21 names held · selection: anchor · cost drag 0.207% · 4 names dropped at load for want of prices (25 selected, 21 held), weights renormalised onto the rest

Low P/E + trend component

Portfolio book, rebalanced hold · 19 names held · selection: anchor · cost drag 0.203% · 6 names dropped at load for want of prices (25 selected, 19 held), weights renormalised onto the rest

Step 7 · 2012-01-03 → 2012-12-31

Trending Value

Portfolio book, rebalanced hold · 20 names held · selection: anchor · cost drag 0.216% · 5 names dropped at load for want of prices (25 selected, 20 held), weights renormalised onto the rest

Low P/E + trend component

Portfolio book, rebalanced hold · 19 names held · selection: anchor · cost drag 0.261% · 6 names dropped at load for want of prices (25 selected, 19 held), weights renormalised onto the rest

Step 8 · 2013-01-02 → 2013-12-31

Trending Value

Portfolio book, rebalanced hold · 19 names held · selection: anchor · cost drag 0.284% · 6 names dropped at load for want of prices (25 selected, 19 held), weights renormalised onto the rest

Low P/E + trend component

Portfolio book, rebalanced hold · 19 names held · selection: anchor · cost drag 0.298% · 6 names dropped at load for want of prices (25 selected, 19 held), weights renormalised onto the rest

Step 9 · 2014-01-02 → 2014-12-31

Trending Value

Portfolio book, rebalanced hold · 17 names held · selection: anchor · cost drag 0.215% · 8 names dropped at load for want of prices (25 selected, 17 held), weights renormalised onto the rest

Low P/E + trend component

Portfolio book, rebalanced hold · 19 names held · selection: anchor · cost drag 0.239% · 6 names dropped at load for want of prices (25 selected, 19 held), weights renormalised onto the rest

Step 10 · 2015-01-02 → 2015-12-31

Trending Value

Portfolio book, rebalanced hold · 17 names held · selection: anchor · cost drag 0.182% · 8 names dropped at load for want of prices (25 selected, 17 held), weights renormalised onto the rest

Low P/E + trend component

Portfolio book, rebalanced hold · 18 names held · selection: anchor · cost drag 0.191% · 7 names dropped at load for want of prices (25 selected, 18 held), weights renormalised onto the rest

Step 11 · 2016-01-04 → 2016-12-30

Trending Value

Portfolio book, rebalanced hold · 22 names held · selection: anchor · cost drag 0.241% · 3 names dropped at load for want of prices (25 selected, 22 held), weights renormalised onto the rest

Low P/E + trend component

Portfolio book, rebalanced hold · 22 names held · selection: anchor · cost drag 0.222% · 3 names dropped at load for want of prices (25 selected, 22 held), weights renormalised onto the rest

Step 12 · 2017-01-03 → 2017-12-29

Trending Value

Portfolio book, rebalanced hold · 24 names held · selection: anchor · cost drag 0.229% · 1 name dropped at load for want of prices (25 selected, 24 held), weights renormalised onto the rest

Low P/E + trend component

Portfolio book, rebalanced hold · 23 names held · selection: anchor · cost drag 0.226% · 2 names dropped at load for want of prices (25 selected, 23 held), weights renormalised onto the rest

Step 13 · 2018-01-02 → 2018-12-31

Trending Value

Portfolio book, rebalanced hold · 25 names held · selection: anchor · cost drag 0.168%

Low P/E + trend component

Portfolio book, rebalanced hold · 24 names held · selection: anchor · cost drag 0.169% · 1 name dropped at load for want of prices (25 selected, 24 held), weights renormalised onto the rest

Step 14 · 2019-01-02 → 2019-12-31

Trending Value

Portfolio book, rebalanced hold · 24 names held · selection: anchor · cost drag 0.242% · 1 name dropped at load for want of prices (25 selected, 24 held), weights renormalised onto the rest

Low P/E + trend component

Portfolio book, rebalanced hold · 24 names held · selection: anchor · cost drag 0.243% · 1 name dropped at load for want of prices (25 selected, 24 held), weights renormalised onto the rest

Step 15 · 2020-01-02 → 2020-12-31

Trending Value

Portfolio book, rebalanced hold · 25 names held · selection: anchor · cost drag 0.179%

Low P/E + trend component

Portfolio book, rebalanced hold · 25 names held · selection: anchor · cost drag 0.193%

Step 16 · 2021-01-04 → 2021-12-31

Trending Value

Portfolio book, rebalanced hold · 25 names held · selection: anchor · cost drag 0.29%

Low P/E + trend component

Portfolio book, rebalanced hold · 25 names held · selection: anchor · cost drag 0.298%

Step 17 · 2022-01-03 → 2022-12-30

Trending Value

Portfolio book, rebalanced hold · 25 names held · selection: anchor · cost drag 0.229%

Low P/E + trend component

Portfolio book, rebalanced hold · 25 names held · selection: anchor · cost drag 0.187%

Step 18 · 2023-01-03 → 2023-12-29

Trending Value

Portfolio book, rebalanced hold · 25 names held · selection: anchor · cost drag 0.226%

Low P/E + trend component

Portfolio book, rebalanced hold · 25 names held · selection: anchor · cost drag 0.241%

Step 19 · 2024-01-02 → 2024-12-31

Trending Value

Portfolio book, rebalanced hold · 25 names held · selection: anchor · cost drag 0.242%

Low P/E + trend component

Portfolio book, rebalanced hold · 25 names held · selection: anchor · cost drag 0.249%

Step 20 · 2025-01-02 → 2025-12-31

Trending Value

Portfolio book, rebalanced hold · 25 names held · selection: anchor · cost drag 0.24%

Low P/E + trend component

Portfolio book, rebalanced hold · 25 names held · selection: anchor · cost drag 0.246%

QuanterLab · Study 5c0b058176e3 · compiled October 27, 2026. Point-in-time constituents and hypothesis-registration timestamps are enforced by the platform. This report is generated from the frozen study artifact and is reproducible from the ledger above. Educational research, not investment advice: every result on this page is simulated, and nothing here is a recommendation to buy or sell any security.

Run a study like this one

Everything above was produced inside QuanterLab, the registration, the walk, the statistics and the paper itself. Build the circuit on a canvas, register the hypothesis before you score it, and the platform enforces the rest.

Reading the research needs no account; creating one is free. Follow the research and we'll tell you when the next study publishes.

As seen on Quantocracy

A note on AI. QuanterLab is a quantitative finance research platform, and every number in this study comes from a run on the platform. The hypothesis, the parameter choices, the validation design and the conclusions belong to the author. Runs execute on point-in-time data with walk-forward validation, and each study ships with its methodology and logs, so a reader can reconstruct the result instead of trusting it. I use AI to edit and structure the prose; it does not generate results, produce numbers, or decide what a study concludes.