% ============================================================================ % SPID — SEC Project Intelligence Database : Potential & Pilot Results % Compile: latexmk -pdf spid_potential.tex (or: tectonic spid_potential.tex) % ============================================================================ \documentclass[11pt,letterpaper]{article} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage[english]{babel} \usepackage[top=1in,bottom=1in,left=1in,right=1in]{geometry} \usepackage{mathptmx} \usepackage{microtype} \usepackage{amsmath,amssymb} \usepackage{booktabs,tabularx,multirow} \usepackage{graphicx} \usepackage{subcaption} \usepackage{float} \usepackage[dvipsnames]{xcolor} \usepackage[colorlinks=true,linkcolor=NavyBlue,citecolor=NavyBlue,urlcolor=NavyBlue,breaklinks=true]{hyperref} \usepackage[font=small,labelfont=bf,labelsep=period,justification=justified,singlelinecheck=false]{caption} \usepackage{fancyhdr} \usepackage{titlesec} \usepackage{enumitem} \usepackage{tcolorbox} \graphicspath{{figures/}} \input{tables/stats.tex} \pagestyle{fancy}\fancyhf{} \renewcommand{\headrulewidth}{0.4pt} \fancyhead[L]{\footnotesize SPID — SEC Project Intelligence Database} \fancyhead[R]{\footnotesize Pilot \& Potential} \fancyfoot[C]{\thepage} \titleformat{\section}{\large\bfseries\color{NavyBlue}}{\thesection.}{0.5em}{} \titleformat{\subsection}{\normalsize\bfseries}{\thesubsection.}{0.5em}{} \definecolor{boxgray}{HTML}{F4F6FA} \newtcolorbox{keybox}{colback=boxgray,colframe=NavyBlue,boxrule=0.6pt,arc=2pt,left=6pt,right=6pt,top=4pt,bottom=4pt} \title{\vspace{-1.2cm}\textbf{\Large SPID — A SEC Project Intelligence Database}\\[4pt] \large Reconstructing the strategic project portfolio of public companies\\ directly from raw SEC filings} \author{UQO EDGAR Research DB \\ \small Proof-of-concept report} \date{\today} \begin{document} \maketitle \thispagestyle{fancy} \vspace{-0.7cm} \begin{abstract}\noindent SEC filings are routinely mined for \emph{financial} signals. SPID treats them instead as a massive, untapped source of \emph{project intelligence}: every 10-K, 10-Q and 8-K is parsed for the concrete initiatives a company is pursuing --- acquisitions, plant and data-center builds, R\&D and drug pipelines, AI deployments, ERP and cloud migrations, capex programs, partnerships, energy-transition projects, and more. Extracted records are de-duplicated across filings into \emph{projects with lifecycles}, linked into a \emph{knowledge graph}, embedded for semantic search, and exposed through analytics. The result is a home-grown analogue of a Capital~IQ / PitchBook / Gartner platform, but \emph{project-centric}. This report documents a pilot run on \Ncompanies{} large-cap issuers that produced \textbf{\Nprojects{} resolved projects} from \Nmentions{} extractions using \texttt{gpt-4o-mini}, for roughly \$2.50 of compute --- and quantifies the path to the full corpus. \end{abstract} % --------------------------------------------------------------------------- \section{The idea: filings as project intelligence} A 10-K is usually read for revenue, margins and risk factors. But buried in the Business section, the MD\&A and 8-K event filings is a continuous, dated, legally-vetted narrative of \emph{what every public company is actually building}. No commercial database reconstructs this at the level of individual projects across the whole market. SPID does exactly that, in four moves: (i)~\textbf{extract} project records from filing text; (ii)~\textbf{resolve} the same project mentioned across many filings into one entity with a timeline; (iii)~\textbf{link} projects to companies, technologies, locations and partners in a knowledge graph; and (iv)~\textbf{serve} the result through structured, semantic and graph queries. \begin{keybox} \textbf{Pilot at a glance.}\quad \Nprojects{} resolved projects $\;\cdot\;$ \Nmentions{} raw extractions $\;\cdot\;$ \Ncompanies{} companies $\;\cdot\;$ \Ntypes{} project types $\;\cdot\;$ \$\Ncapex{}\,bn of associated capital identified $\;\cdot\;$ \Ntimeline{} dated timeline points $\;\cdot\;$ knowledge graph of \Nkgnodes{} nodes / \Nkgedges{} edges. \end{keybox} % --------------------------------------------------------------------------- \section{Data foundation and pipeline} SPID is built on top of the existing UQO EDGAR corpus: 134{,}124 filings and 127{,}800 pre-segmented sections for 500 companies (88~GB of raw filings on disk). Because the upstream parse only sectioned 10-Q and 8-K filings, SPID additionally \emph{ingests the raw 10-K HTML}, cleaning and segmenting the project-dense Items (1~Business, 1A~Risk Factors, 2~Properties, 7~MD\&A). All section text flows through a single pipeline: \begin{center} \small \textsf{raw 10-K HTML / parsed 10-Q,8-K} $\;\rightarrow\;$ \textsf{extract (gpt-4o-mini \emph{or} rules)} $\;\rightarrow\;$ \textsf{resolve} $\;\rightarrow\;$ \textsf{graph $\cdot$ embeddings $\cdot$ analytics} \end{center} \noindent Extraction is \textbf{backend-pluggable}. A deterministic rule engine gives a free, high-precision first pass; the default \texttt{gpt-4o-mini} backend (OpenAI-compatible, so it also targets a local cluster gateway) returns named projects with amounts, status, objective, technologies, partners and a confidence score in strict JSON. Per-call cost is bounded by sending only project-relevant \emph{windows} of each section to the model. % --------------------------------------------------------------------------- \section{What the pilot found} Across \Ncompanies{} issuers, SPID resolved \Nprojects{} distinct projects spanning all \Ntypes{} categories (Figure~\ref{fig:bytype}). M\&A integrations, plant construction, R\&D programs and product launches dominate by count, while capex programs and M\&A dominate by capital. The detection rate and associated capital are stable across fifteen years of filings (Figure~\ref{fig:capex}), and projects distribute sensibly across sectors and technologies (Figure~\ref{fig:sectortech}). \begin{figure}[H]\centering \includegraphics[width=\textwidth]{by_type.pdf} \caption{Resolved projects by type, by count (left) and by associated announced capital (right). A single controlled vocabulary of \Ntypes{} types is applied to every filing.} \label{fig:bytype} \end{figure} \begin{figure}[H]\centering \includegraphics[width=0.93\textwidth]{capex_year.pdf} \caption{New projects detected per year (first mention) and the announced capital attached to them. Coverage is consistent across the 2010--2026 filing window.} \label{fig:capex} \end{figure} \begin{figure}[H]\centering \includegraphics[width=\textwidth]{sector_tech.pdf} \caption{Projects by GICS sector (left) and by technology tag (right). Technology tags such as AI/ML, semiconductors, EV and battery storage are extracted from project descriptions.} \label{fig:sectortech} \end{figure} \begin{table}[H]\centering\small \caption{Largest detected M\&A / integration projects (by stated transaction value).} \input{tables/top_ma.tex} \label{tab:ma} \end{table} \noindent Table~\ref{tab:ma} shows the platform recovers real, correctly-valued transactions (e.g.\ Microsoft--Nokia, Exxon--Pioneer, Nvidia--Mellanox), and Table~\ref{tab:cos} ranks the most project-active issuers in the pilot. \begin{table}[H]\centering\small \caption{Most project-active companies in the pilot.} \input{tables/top_companies.tex} \label{tab:cos} \end{table} % --------------------------------------------------------------------------- \section{The differentiator: project lifecycles} The hard part is not finding a project once --- it is recognising the \emph{same} project across quarters and years and stitching it into a timeline. SPID resolves mentions by company, type and anchor (location or salient name token) and reconstructs a dated lifecycle for each (Figure~\ref{fig:gantt}). \begin{figure}[H]\centering \includegraphics[width=\textwidth]{gantt.pdf} \caption{Reconstructed lifecycles for the most-tracked projects in the pilot. Each bar spans the first and last filing in which the project appears; the label reports the number of distinct filings reconciled.} \label{fig:gantt} \end{figure} \noindent A concrete example: Tesla's energy-storage program is reconciled across eighteen filings (2021--2026); parsing the deployment figures embedded in each filing reproduces the program's quarter-by-quarter ramp \emph{automatically} (Figure~\ref{fig:tesla}). This is the kind of operating KPI a research analyst would normally assemble by hand. \begin{figure}[H]\centering \includegraphics[width=0.9\textwidth]{tesla_timeline.pdf} \caption{Case study --- Tesla energy-storage deployments (GWh, as reported) extracted from the project's reconciled timeline. SPID tracks not just that a project exists, but how its disclosed metrics evolve.} \label{fig:tesla} \end{figure} % --------------------------------------------------------------------------- \section{Knowledge graph and retrieval} Resolved projects are linked into a knowledge graph (\Nkgnodes{} nodes, \Nkgedges{} edges) with typed relations \textsf{Company}\,$\to$\,\textsf{owns}\,$\to$\,\textsf{Project}, and \textsf{Project}\,$\to$\,\textsf{uses}\,$\to$\,\textsf{Technology} / \textsf{located\_in}\,$\to$\,\textsf{Location} / \textsf{partners\_with}\,$\to$\,\textsf{Partner}; it exports to Parquet and Neo4j Cypher. Figure~\ref{fig:kg} shows one company's slice. \begin{figure}[H]\centering \includegraphics[width=0.86\textwidth]{kg_nvda.pdf} \caption{Knowledge-graph slice for NVIDIA: top projects and the technologies and locations they connect to. The full graph spans every company and project in the database.} \label{fig:kg} \end{figure} \noindent Every project is also embedded (384-dim, local model) so the database answers natural queries directly. For instance: \begin{itemize}[leftmargin=1.4em,itemsep=1pt] \item \emph{``generative AI and machine learning investment''} $\rightarrow$ Salesforce, Meta and Alphabet generative-AI programs (cosine 0.78--0.64); \item \emph{``semiconductor fabrication plant capacity expansion''} $\rightarrow$ Micron wafer-fab, Intel and TXN 300\,mm capacity projects; \item structured filters compose with these (e.g.\ \texttt{type=ma\_integration}, \texttt{min\_amount=\$5bn}, \texttt{sector=Financials}, \texttt{year\_from=2024}). \end{itemize} % --------------------------------------------------------------------------- \section{Scaling potential} The pilot deliberately covered \Ncompanies{} companies. The same pipeline runs unchanged on the full corpus; it is incremental and resumable (stable mention IDs, \texttt{INSERT OR REPLACE}). \begin{table}[H]\centering\small \caption{From pilot to full corpus.} \begin{tabular}{lrr} \toprule & \textbf{This pilot} & \textbf{Full corpus (projected)} \\ \midrule Companies & \Ncompanies{} & 500 \\ Filings covered & $\sim$3{,}500 sec. & 134{,}124 filings \\ Sections processed & 3{,}528 & $\sim$130{,}000 \\ Resolved projects & \Nprojects{} & $\sim$10{,}000--15{,}000 \\ \texttt{gpt-4o-mini} cost & $\approx$\$2.50 & $\approx$\$100--130 \\ \bottomrule \end{tabular} \end{table} \noindent\textbf{Extensibility already wired in.} (i)~Additional forms --- S-1, DEF~14A, 20-F, 6-K, earnings transcripts and press releases --- plug into the same ingester; everything downstream is form-agnostic, enabling month-by-month project tracking. (ii)~Embeddings can be moved to pgvector / Qdrant / Weaviate by swapping one column. (iii)~The graph loads into Neo4j from the generated Cypher. (iv)~A read-only FastAPI service exposes search, semantic search and analytics over HTTP. % --------------------------------------------------------------------------- \section{Conclusion} On a modest pilot and for a few dollars of compute, SPID reconstructs hundreds of real corporate projects --- correctly named, valued, located, classified and tracked through time --- and makes them searchable, analysable and linkable. Scaling to the full 500-company corpus is a \$100-scale, single-day job; extending to the entire universe of \(\sim\)30{,}000 SEC filers is a question of throughput, not of method. The proof of concept is complete and the platform is built. \vfill {\footnotesize\noindent\textit{Generated from the live SPID DuckDB (\texttt{project-db/data/db/spid.duckdb}). All figures and statistics in this document are produced directly from extracted data by \texttt{docs/make\_figures.py}.}} \end{document}