8-KMaterial events. Within 4 days.
Companies must file an 8-K within 4 business days of any material event. Earnings announcements, M&A deals, CEO departures, dividend declarations, guidance revisions — the 8-K is where corporate events hit the public record first. Valuein indexes every 8-K with filing date and accepted_at timestamps so you can build event-driven strategies with clean temporal boundaries.
- Earnings announcements (Item 2.02) with precise filing timestamps
- M&A events — acquisition agreements and closings
- Executive appointments and departures (Item 5.02)
- Dividend declarations and special distributions
- Guidance revisions and material contract disclosures
Why 8-K timing matters for backtesting
The filing_date in the filing table is the SEC acceptance timestamp — the moment the document became public. Use this as your event date, not the period_end, to avoid look-ahead bias in event-driven backtests.
All 8-K filing dates are available in the filing Parquet table, separate from the fact table which holds financial figures from 10-K and 10-Q filings.
Event-driven queries that deliver alpha
Production-ready queries using ValueinClient combining 8-K metadata with fundamental context.
Earnings Announcement Event Timeline
Map every earnings release to its precise filing date. Build a programmatic earnings calendar and measure announcement lag — critical for event-driven strategies.
Show the query ↓Hide the query ↑
from valuein_sdk import ValueinClient, ValueinError sql = """SELECT r.symbol, r.name, r.sector, fi.period_end AS reporting_period, fi.filing_date AS announcement_date, fi.accepted_at AS entered_valuein_at, DATEDIFF('day', fi.period_end, fi.filing_date) AS days_after_period_endFROM filing fiJOIN references r ON fi.entity_id = r.cikJOIN index_membership im ON im.cik = r.cikWHERE fi.form_type = '8-K' AND im.index_name = 'SP500' AND im.removal_date IS NULL AND fi.filing_date >= '2024-01-01' AND fi.filing_date < '2025-01-01'ORDER BY fi.filing_date DESCLIMIT 100""" try: with ValueinClient() as client: df = client.run_query(sql) print(df.sort_values("days_after_period_end").head(20))except ValueinError as e: print(f"Valuein error: {e}")M&A Event Screen — Acquisition Announcements
Cross-reference 8-K filing density with the acquirer's balance sheet to build event-driven signals. Companies with strong cash and low leverage make better acquirers.
Show the query ↓Hide the query ↑
from valuein_sdk import ValueinClient, ValueinError filings_sql = """SELECT r.symbol, r.name, r.sector, fi.filing_dateFROM filing fiJOIN references r ON fi.entity_id = r.cikJOIN index_membership im ON im.cik = r.cikWHERE fi.form_type = '8-K' AND im.index_name = 'SP500' AND im.removal_date IS NULL AND fi.filing_date BETWEEN '2024-01-01' AND '2024-12-31'ORDER BY fi.filing_date DESC""" health_sql = """SELECT r.symbol, MAX(CASE WHEN standard_concept = 'CashAndCashEquivalentsAtCarryingValue' THEN numeric_value END) AS cash, MAX(CASE WHEN standard_concept = 'LongTermDebt' THEN numeric_value END) AS long_term_debt, MAX(CASE WHEN standard_concept = 'Assets' THEN numeric_value END) AS total_assetsFROM fact fJOIN references r ON f.entity_id = r.cikJOIN index_membership im ON im.cik = r.cikWHERE f.form_type = '10-Q' AND f.fiscal_year = 2024 AND im.index_name = 'SP500' AND im.removal_date IS NULLGROUP BY r.symbol""" try: with ValueinClient() as client: eightk_df = client.run_query(filings_sql) health_df = client.run_query(health_sql) result = eightk_df.merge(health_df, on="symbol", how="left") strong = result[result["long_term_debt"] / result["total_assets"].clip(lower=1) < 0.3] print(strong.head(20))except ValueinError as e: print(f"Valuein error: {e}")Executive Change Tracker — CEO and CFO Transitions
CEO and CFO transitions are among the most statistically significant fundamental events for forward 12-month performance. Cross-reference 8-K density with financial trajectory.
Show the query ↓Hide the query ↑
from valuein_sdk import ValueinClient, ValueinError sql = """WITH eight_k_counts AS ( SELECT r.symbol, r.name, r.sector, COUNT(*) AS eight_k_count FROM filing fi JOIN references r ON fi.entity_id = r.cik JOIN index_membership im ON im.cik = r.cik WHERE fi.form_type = '8-K' AND im.index_name = 'SP500' AND im.removal_date IS NULL AND fi.filing_date >= '2024-01-01' GROUP BY r.symbol, r.name, r.sector),financial_trend AS ( SELECT r.symbol, MAX(CASE WHEN standard_concept = 'NetIncomeLoss' AND fiscal_year = 2024 THEN numeric_value END) AS net_income_2024, MAX(CASE WHEN standard_concept = 'NetIncomeLoss' AND fiscal_year = 2023 THEN numeric_value END) AS net_income_2023 FROM fact f JOIN references r ON f.entity_id = r.cik JOIN index_membership im ON im.cik = r.cik WHERE f.form_type = '10-K' AND im.index_name = 'SP500' AND im.removal_date IS NULL GROUP BY r.symbol)SELECT e.symbol, e.name, e.sector, e.eight_k_count, ROUND(f.net_income_2024 / 1e6, 0) AS net_income_2024_m, ROUND(f.net_income_2023 / 1e6, 0) AS net_income_2023_m, ROUND( (f.net_income_2024 - f.net_income_2023) / NULLIF(ABS(f.net_income_2023), 0) * 100, 1 ) AS ni_change_pctFROM eight_k_counts eJOIN financial_trend f USING (symbol)ORDER BY e.eight_k_count DESCLIMIT 25""" try: with ValueinClient() as client: df = client.run_query(sql) print(df)except ValueinError as e: print(f"Valuein error: {e}")Dividend Sustainability Screen
Track FCF coverage of dividend payments to flag dividends at risk before a cut is announced.
Show the query ↓Hide the query ↑
from valuein_sdk import ValueinClient, ValueinError sql = """SELECT r.symbol, r.name, r.sector, ROUND( MAX(CASE WHEN standard_concept = 'NetCashProvidedByUsedInOperatingActivities' THEN COALESCE(derived_quarterly_value, numeric_value) END) - ABS(MAX(CASE WHEN standard_concept = 'PaymentsToAcquirePropertyPlantAndEquipment' THEN numeric_value END)), 0 ) / 1e6 AS fcf_m, ABS( MAX(CASE WHEN standard_concept = 'PaymentsOfDividendsCommonStock' THEN numeric_value END) ) / 1e6 AS div_paid_m, ROUND( (MAX(CASE WHEN standard_concept = 'NetCashProvidedByUsedInOperatingActivities' THEN COALESCE(derived_quarterly_value, numeric_value) END) - ABS(MAX(CASE WHEN standard_concept = 'PaymentsToAcquirePropertyPlantAndEquipment' THEN numeric_value END))) / NULLIF(ABS(MAX(CASE WHEN standard_concept = 'PaymentsOfDividendsCommonStock' THEN numeric_value END)), 0), 2 ) AS fcf_div_coverageFROM fact fJOIN references r ON f.entity_id = r.cikJOIN index_membership im ON im.cik = r.cikWHERE f.form_type = '10-K' AND f.fiscal_year = 2024 AND im.index_name = 'SP500' AND im.removal_date IS NULLGROUP BY r.symbol, r.name, r.sectorHAVING div_paid_m > 0ORDER BY fcf_div_coverage ASC NULLS LASTLIMIT 20""" try: with ValueinClient() as client: df = client.run_query(sql) print(df)except ValueinError as e: print(f"Valuein error: {e}")Event-driven research with AI
Ask Claude to surface recent 8-K activity, cross-reference with balance sheet health, and flag companies with high event density relative to sector peers.
Build your event-driven strategy today
Free tier. 100 API calls/day. Combine 8-K events with fundamental context in one query.