intermediate
8 minEarnings Momentum Strategy
Build an earnings surprise screen using eps_surprise_pct from earnings_signals.parquet.
earningsmomentumsignalsDuckDB
## Earnings Surprise as a Signal
Companies that repeatedly beat their own historical EPS trend tend to outperform. The `earnings_signals` table provides a trailing 4-quarter EPS trend estimate and the actual vs. trend surprise_pct.
python
from valuein_sdk import ValueinClient, ValueinError
try:
with ValueinClient() as client:
# Find companies that beat EPS trend by >10% for 3+ consecutive quarters
momentum = client.run_query("""
WITH beats AS (
SELECT
es.entity_id,
r.symbol, r.name, r.sector,
es.fiscal_year, es.fiscal_period,
es.eps_surprise_pct,
es.eps_actual,
es.eps_trend_est
FROM earnings_signals es
JOIN references r ON es.entity_id = r.cik
JOIN index_membership im ON im.cik = r.cik
WHERE im.index_name = 'SP500'
AND im.removal_date IS NULL
AND es.eps_surprise_pct IS NOT NULL
AND es.eps_surprise_pct > 0.10 -- Beat by >10%
),
consecutive AS (
SELECT entity_id, symbol, name, sector,
COUNT(*) AS beat_streak,
AVG(eps_surprise_pct) AS avg_beat
FROM beats
WHERE (fiscal_year, fiscal_period) IN (
(2024, 'Q4'), (2024, 'Q3'), (2024, 'Q2'), (2024, 'Q1')
)
GROUP BY entity_id, symbol, name, sector
HAVING COUNT(*) >= 3
)
SELECT * FROM consecutive
ORDER BY avg_beat DESC
LIMIT 20
""")
print(momentum)
except ValueinError as e:
print(f"Error: {e}")Try it yourself
Get your API token and run this notebook against 105M+ real SEC EDGAR facts.