What is Filing Change Signal?
A year-over-year measure of how much an SEC 10-K or 10-Q's disclosure language changed, section by section, combining lexical and semantic change to flag real disclosure shifts.
In Plain English
Companies rarely send a press release when something starts to go wrong. What they do, because the law requires it, is quietly edit the relevant section of their next 10-K or 10-Q. A new sentence appears under Risk Factors. A paragraph in the MD&A gets more hedged. These edits are public the moment the filing hits EDGAR, but they are buried in documents most people skim and few read against last year's version.
The Filing Change Signal reads them for you. For every covered filing, it compares the new document to the same issuer's prior-year filing of the same type and measures how far the language moved, broken out by section. A 10-K is compared to the prior-year 10-K; a 10-Q to the same fiscal quarter a year earlier, so a routine seasonal difference is never mistaken for a real change.
The output is not one number but a small panel per section: a lexical change (how many words moved), a semantic change (whether the meaning moved), the gap between them, a point-in-time percentile against peers, and a flag for suspected format reshuffles. Together they let you separate a legal-team reformat from a substantive disclosure shift like Zillow's quiet expansion of its iBuying risk factors before that business unwound.
Technical Definition
For each filing F and its prior-year counterpart F', and for each section s in {risk_factors (Item 1A), mda (Item 7), document (whole filing)}, the signal computes:
- Lexical change:
1 − cosine(F_s, F'_s)over term-frequency vectors (numbers kept) and1 − jaccard(F_s, F'_s)over token sets. - Semantic change:
1 − cosine_embedding(F_s, F'_s)over 768-dim Gemini section embeddings. - lex_sem_divergence:
(1 − cosine) − (1 − cosine_embedding). - change_pctile_universe: cross-sectional percentile of the change, ranked as-of the filing's knowledge_ts.
- format_switch_suspected: boolean set when lexical change is high but semantic change is low.
Each record is bitemporal: effective_ts (period of report) and knowledge_ts (EDGAR acceptance).
How VectorFin Uses This
The Filing Change Signal is a VectorFin product covering ~235 tickers across 10-K and 10-Q filings, refreshed weekly. It is served at GET /v1/filings/{ticker}/changes and GET /v1/filings/changes/{accession}, returning a FilingChangeRecord with a per-section breakdown. Honest nulls are preserved: an empty parse_status means the issuer declared no material changes; not_found means the section was incorporated by reference. No metric is fabricated to fill a gap.
Code Example
import requests
resp = requests.get(
"https://api.vectorfinancials.com/v1/filings/AAPL/changes",
params={"form_type": "10-K", "section": "risk_factors", "limit": 1},
headers={"X-API-Key": "vf_sk_your_key_here"},
)
record = resp.json()[0]
sec = record["sections"][0]
if sec["parse_status"] == "ok":
print("lexical change:", round(1 - sec["cosine"], 3))
print("semantic change:", round(1 - sec["cosine_embedding"], 3))
print("divergence:", sec["lex_sem_divergence"], "pctile:", sec["change_pctile_universe"])Put Filing Change Signal to work in your pipeline
Pull AI-ready embeddings and signals as Iceberg tables or over the REST API.
Get API Access