US examples
Cheap stock ratio
On this page5
Count how many US stocks trade at deeply discounted price-to-book (PB) and price-to-earnings (PE) ratios, and use that share as a gauge of market-wide capitulation. Near market highs few stocks are this cheap; when a crash drives prices to extreme lows, the number of cheap stocks surges. It suits investors who want a market regime signal rather than a stock-picking rule.
Strategy logic
There are many ways to define cheapness. This indicator uses the two most fundamental, based on book value and earnings:
- PB cheap: price-to-book below 0.6. A PB below 1.0 means the market values the company at less than its net asset value; below 0.6 is deep value territory, where the market is pricing in severe distress or simply mispricing the stock. Negative-equity companies are left out.
- PE cheap: price-to-earnings below 8, counting only positive P/E. A P/E of 8 is an earnings yield of 12.5%, well above the long-term average market return. Such low P/Es typically appear in market panics, when investors flee equities regardless of fundamental value.
- Each day, divide the number of cheap stocks by the number of stocks with a valid value, for each measure.
- Plot both ratios under the S&P 500 index and look for spikes.
Code
from finlab import data
import plotly.graph_objects as go
from plotly.subplots import make_subplots
data.set_market('us')
# Price-to-book: market value / stockholders' equity (equity aligned to each SEC filing date)
market_value = data.get('etl:us_market_value')
equity = data.get('us_balance_sheet:total_stockholders_equity')
pb = market_value / equity
pb = pb[pb > 0] # Negative equity is distress, not "cheap"
small_pb_ratio = (pb < 0.6).sum(axis=1) / pb.notna().sum(axis=1)
# Price-to-earnings: price / trailing-12-month diluted EPS
price = data.get('price:close')
eps = data.get('us_income_statement:eps_diluted')
pe = price / eps.rolling(4).sum()
# Filter to positive PE only (negative PE = unprofitable, not "cheap")
pe_positive = pe[pe > 0]
small_pe_ratio = (pe_positive < 8).sum(axis=1) / pe_positive.notna().sum(axis=1)
# S&P 500 index as the market reference
sp500 = data.get('world_index:adj_close')['^GSPC']
fig = make_subplots(
rows=2,
cols=1,
shared_xaxes=True,
subplot_titles=('S&P 500', 'Cheap Stock Ratios'),
)
fig.add_trace(
go.Scatter(x=sp500.index, y=sp500.values, name='S&P 500'),
row=1,
col=1,
)
fig.add_trace(
go.Scatter(x=small_pb_ratio.index, y=small_pb_ratio.values, name='PB < 0.6 Ratio'),
row=2,
col=1,
)
fig.add_trace(
go.Scatter(x=small_pe_ratio.index, y=small_pe_ratio.values, name='PE < 8 Ratio'),
row=2,
col=1,
)
fig.update_layout(height=600, title_text="Cheap Stock Ratios vs. S&P 500")
fig.show()Read the chart
Near market highs, both cheap stock ratios tend to be low: most companies are priced at premium valuations, and very few qualify as deeply discounted.
When the market crashes to a low, both ratios spike sharply. Look for both rising at the same time:
- If only the PB ratio spikes, it may be sector-specific distress (for example, financials with impaired book values) rather than a broad market bottom.
- If only the PE ratio spikes, it may reflect an earnings collapse (falling E) rather than genuine cheapness.
- When both spike together, it is stronger evidence that the market has reached a capitulation point, with prices driven below fundamental value across a wide range of stocks.
Major market bottoms, such as the 2008–2009 financial crisis and the March 2020 COVID crash, typically come with dramatic spikes in both ratios. These moments are peak pessimism, when a large fraction of the market trades at distressed valuations. The exact bottom is impossible to pinpoint, but a simultaneous spike in both ratios has historically been a reliable sign that the market is in deep-value territory.
How to adjust it
pb < 0.6andpe_positive < 8: the cheapness thresholds. Raise them to count more stocks as cheap, lower them for only the deepest discounts.- Use the ratios as a regime signal:
- High ratios (both PB and PE): consider increasing equity exposure, adding to long positions or deploying cash reserves.
- Low ratios: the market is richly valued; consider reducing risk, tightening stop-losses or building cash.
- Divergence (one high, one low): be cautious; the signal is mixed and may not mark a true bottom.
- Combine the ratios with other market breadth indicators (such as the advance-decline line or the percentage of stocks above their 200-day moving average) for a more robust market timing framework.
Related pages
- S&P 500 regime filter A breadth-based switch that moves a strategy to cash.
- Long-short hedge Hold deep-value stocks with a short SPY hedge.
- Data visualization More ways to chart strategies and data.
- Load more data Find price, statement and index datasets.
Was this page helpful?