Market Bottom Detection: Cheap Stock Ratio
Can we use the number of "cheap stocks" based on Price-to-Book (PB) and Price-to-Earnings (PE) ratios to estimate whether the market has reached a bottom?
When the market is at a high, few stocks trade at deeply discounted valuations. When a crash drives prices to extreme lows, the number of "cheap stocks" surges. By tracking the proportion of cheap stocks over time, we can build a quantitative gauge for market-wide capitulation.
Defining "Cheap Stocks"
There are many ways to define cheapness. Two of the most fundamental are based on book value and earnings:
PB Cheap Stocks
Stocks with a Price-to-Book ratio below 0.6. A PB below 1.0 means the market values the company at less than its net asset value; below 0.6 represents deep value territory where the market is pricing in severe distress or simply mispricing the stock.
PE Cheap Stocks
Stocks with a Price-to-Earnings ratio below 8. A PE of 8 implies an earnings yield of 12.5%, which is significantly above the long-term average market return. Such low PEs typically appear during market panics when investors flee equities regardless of fundamental value.
Code
PB Cheap Stock Ratio
Compute the proportion of all stocks that qualify as "PB cheap":
from finlab import data
data.set_market('us')
# Compute PB cheap stock ratio
pb = data.get('us_key_metrics:pbRatio')
small_pb_ratio = (pb < 0.6).sum(axis=1) / pb.notna().sum(axis=1)
PE Cheap Stock Ratio
Compute the proportion of all stocks that qualify as "PE cheap":
# Compute PE cheap stock ratio
pe = data.get('us_key_metrics:peRatio')
# 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)
Visualization
Plot the cheap stock ratios alongside a broad market index to visualize the relationship between market crashes and cheap stock surges:
import plotly.graph_objects as go
from plotly.subplots import make_subplots
close = data.get('price:adj_close')
close = close[close.index.dayofweek < 5] # remove weekends
# Use SPY as a market proxy (if available in your data)
# Otherwise, compute equal-weight market average
market_avg = close.mean(axis=1)
fig = make_subplots(rows=2, cols=1, shared_xaxes=True,
subplot_titles=('Market Average Price', 'Cheap Stock Ratios'))
fig.add_trace(go.Scatter(x=market_avg.index, y=market_avg.values, name='Market Avg Price'), 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. Market Price")
fig.show()
Indicator Interpretation
When the market is near its highs, the cheap stock ratios (both PB and PE) 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, the cheap stock ratios for both PB and PE spike sharply. The key insight is to look for both indicators surging simultaneously:
- If only the PB ratio spikes (but PE does not), it may indicate sector-specific distress (e.g., financials with impaired book values) rather than a broad market bottom.
- If only the PE ratio spikes (but PB does not), it may reflect an earnings collapse (falling E) rather than genuine cheapness.
- When both PB and PE cheap ratios spike together, it provides stronger evidence that the market has reached a capitulation point where prices have been driven below fundamental value across a wide range of stocks.
Historical Context
Major market bottoms (e.g., the 2008-2009 financial crisis, the March 2020 COVID crash) are typically accompanied by dramatic spikes in both cheap stock ratios. These moments represent peak pessimism, where a large fraction of the market trades at distressed valuations. While the exact timing of the bottom is impossible to pinpoint, a simultaneous spike in both ratios has historically been a reliable signal that the market is in deep-value territory.
Practical Usage
This indicator is best used as a market regime signal rather than a precise timing tool:
- High cheap stock ratios (both PB and PE): Consider increasing equity exposure, adding to long positions, or deploying cash reserves.
- Low cheap stock ratios: The market is richly valued; consider reducing risk, tightening stop-losses, or building cash.
- Divergence (one high, one low): Exercise caution -- the signal is mixed and may not indicate a true bottom.
The cheap stock ratio can also be combined with other market breadth indicators (e.g., advance-decline line, percentage of stocks above their 200-day moving average) for a more robust market timing framework.