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 knowledge_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.
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.knowledge_at AS entered_valuein_at,
DATEDIFF('day', fi.period_end, fi.filing_date) AS days_after_period_end
FROM filing fi
JOIN references r USING (entity_id)
WHERE fi.form_type = '8-K'
AND r.is_sp500 = TRUE
AND fi.filing_date >= '2024-01-01'
AND fi.filing_date < '2025-01-01'
ORDER BY fi.filing_date DESC
LIMIT 100
"""
try:
with ValueinClient() as client:
df = client.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.
from valuein_sdk import ValueinClient, ValueinError
filings_sql = """
SELECT
r.symbol, r.name, r.sector,
fi.filing_date
FROM filing fi
JOIN references r USING (entity_id)
WHERE fi.form_type = '8-K'
AND r.is_sp500 = TRUE
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_assets
FROM fact f
JOIN references r USING (entity_id)
WHERE f.form_type = '10-Q'
AND f.fiscal_year = 2024
AND r.is_sp500 = TRUE
GROUP BY r.symbol
"""
try:
with ValueinClient() as client:
eightk_df = client.query(filings_sql)
health_df = client.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.
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 USING (entity_id)
WHERE fi.form_type = '8-K'
AND r.is_sp500 = TRUE
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 USING (entity_id)
WHERE f.form_type = '10-K' AND r.is_sp500 = TRUE
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_pct
FROM eight_k_counts e
JOIN financial_trend f USING (symbol)
ORDER BY e.eight_k_count DESC
LIMIT 25
"""
try:
with ValueinClient() as client:
df = client.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.
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_coverage
FROM fact f
JOIN references r USING (entity_id)
WHERE f.form_type = '10-K'
AND f.fiscal_year = 2024
AND r.is_sp500 = TRUE
GROUP BY r.symbol, r.name, r.sector
HAVING div_paid_m > 0
ORDER BY fcf_div_coverage ASC NULLS LAST
LIMIT 20
"""
try:
with ValueinClient() as client:
df = client.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.
8-K filing history in Excel
Pull the full 8-K filing history for any company into Excel and annotate key events on your DCF model timeline.
let
Src = Parquet.Document(
Web.Contents(
"https://data.valuein.biz/v1/sp500/filing",
[Headers = [#"X-API-Key" = "vi_live_your_key"]]
)
),
Filtered = Table.SelectRows(Src,
each [symbol] = "TSLA"
and [form_type] = "8-K"
and [filing_date] >= #date(2024, 1, 1)),
Sorted = Table.Sort(Filtered,
{{"filing_date", Order.Descending}})
in
SortedBuild your event-driven strategy today
Free tier. 100 API calls/day. Combine 8-K events with fundamental context in one query.