GRAPH ANALYTICS

Structural intelligence derived from the corporate graph

5 tabs · 13 metrics
Updated {{ updatedAt }}
Not yet computed
Loading analytics…
Analytics Not Yet Computed
Run python -m src.graph_analytics --all to populate this page, or wait for tonight's daily pipeline.
Network-analysis algorithms run against the corporate graph each day. These surface structural patterns that aren't visible in any single filing — who the bridges are, which companies cluster together, and who quietly sits at the center of the web.
Who sits at the center of the web — recursive importance, raw connectivity, bridges, clusters, and look-alikes. How the system is wired — cross-company directors and auditor concentration / switches. Where strategic money flows — corporate-to-corporate stakes (not 13F). What's coming — latent M&A pairs, implicit competitors, and blast-radius exposure. What just happened — edges added in the last 30 days.

> Top Influencers PageRank

PageRank weighs importance recursively: you're influential if influential nodes connect to you. Higher scores = more central to the whole network.
#NodeTypeScore
{{ r.rank }} {{ r.label }} {{ nodeType(r) }} {{ r.value }}

> Most Connected Companies Degree

Raw edge count — the hubs of the network.
#TickerEdges
{{ r.rank }} {{ r.label }} {{ r.value }}

> Most Connected People Board Reach

Directors and officers with the most cross-company connections.
#NameEdges
{{ r.rank }} {{ r.label }} {{ r.value }}

> Key Bridges Betweenness Centrality

Nodes that sit on the shortest path between many others — these are gatekeepers that glue clusters together. Removing one would fragment the network.
#NodeTypeBetweenness
{{ r.rank }} {{ r.label }} {{ nodeType(r) }} {{ r.value }}

> Hidden Communities Louvain Clustering

The algorithm partitions the graph into densely-connected clusters — revealing spheres of influence, interlocking director groups, and industry cliques that aren't labeled anywhere in the filings.
#{{ c.rank }} · {{ c.label }} {{ c.value }} members
Sector {{ ind.name }} {{ ind.pct }}%
Bound by {{ et.type.replace(/_/g, ' ') }} {{ et.pct }}%
Shared {{ i.type.charAt(0) }}{{ i.name }} {{ i.pct }}%
{{ m.type.charAt(0) }}{{ m.name }}

> Structurally Similar Companies Jaccard

Companies whose neighborhoods overlap — same auditors, shared board members, common investors, similar supply chains. A competitor map derived from structure, not from industry labels.
#PairFull NamesJaccard
{{ r.rank }} {{ r.label }} {{ pairNames(r) }} {{ r.value }}

> Board Network Power Rankings Cross-Company Directors

Directors who sit on multiple company boards — the hidden influence brokers. A director scoring 3+ is carrying information, norms, and decisions between boardrooms that wouldn't otherwise share a channel.
#DirectorBoardsCompanies
{{ r.rank }} {{ r.label }} {{ r.value }} {{ c.ticker || c.name }}
No cross-board directors detected yet.

> Auditor Concentration Blast-Radius View

Market share of each audit firm across the universe. A concentrated market means systemic risk: if any top auditor faces a scandal, restatement wave, or regulatory action, the ripple hits every company in that column.
# Auditor Clients Share Sample Tickers
{{ r.rank }} {{ r.label }} {{ r.value }}
{{ auditorPct(r) }}%
{{ t }}
Share based on {{ auditorTotal }} audited companies in the graph.

> Recent Auditor Switches Last 6 Months

Companies in the universe whose auditor-of-record changed since the last daily snapshot. Every switch is a governance signal — forced rotation, disagreements on accounting, or an upcoming restatement often show up here first.
Detected Ticker Company From To
{{ r.value }} {{ r.label }} {{ auditorChangeMeta(r).company_name || '--' }} {{ auditorChangeMeta(r).from_auditor }} {{ auditorChangeMeta(r).to_auditor }}
No auditor switches detected in the last 6 months. Tracking builds history on each analytics run — initial snapshot acts as baseline.

> Strategic Investments Corporate Stakes (Not 13F)

Company-to-company INVESTED_IN edges — e.g., GOOGL → DXCM, AMZN → MRVL, BRK-B's famous portfolio. Passive index-fund holdings (Vanguard / BlackRock / State Street) are deliberately excluded; this view is about strategic optionality — who is buying into whom outside the public narrative.
{{ stakeMessage }}
Investor Target Type Disclosed
{{ r.investor_ticker }}{{ r.investor_name }} {{ r.target_ticker }}{{ r.target_name }} {{ r.type || 'n/a' }} {{ r.load_date || '—' }}
Top Strategic Investors
# Investor Portfolio Targets
{{ r.rank }} {{ r.label }}{{ stakeMeta(r).name }} {{ r.value }} {{ t }} +{{ Number(r.value) - (stakeMeta(r).targets || []).length }} more
Top Strategic Investees
# Target Backers Investors
{{ r.rank }} {{ r.label }}{{ stakeMeta(r).name }} {{ r.value }} {{ t }} +{{ Number(r.value) - (stakeMeta(r).investors || []).length }} more
No strategic investments detected yet.

> M&A Prediction Signals Unconnected Pairs, High Signal Overlap

Pairs of companies that are not directly connected in the graph but share an unusual amount of governance and supply-chain infrastructure. Score = 2×shared directors + shared auditor + shared suppliers + 0.5×same industry + 0.5×max(acquirer activity). The activity term boosts pairs where one side has a recent M&A track record (Active Acquirers) — JNJ at 6 deals/24mo, MICROSOFT at 3, etc. — reflecting that a known buyer is statistically more likely to announce a *next* deal than two passive peers with the same shared signals. These are candidates where an announced deal would look "obvious in hindsight."
# Pair Score Board Auditor Suppliers Industry Activity
{{ r.rank }} {{ maMeta(r).a_ticker }} {{ maMeta(r).b_ticker }} {{ maMeta(r).a_name }} & {{ maMeta(r).b_name }} {{ r.value }} {{ maMeta(r).shared_board }} {{ maMeta(r).shared_auditor }} {{ maMeta(r).shared_suppliers }} {{ maMeta(r).same_industry }} {{ Math.max(maMeta(r).a_activity || 0, maMeta(r).b_activity || 0) }}
No high-signal unconnected pairs surfaced (need ≥2.0 score).

> Acquirer Playbook Per-acquirer M&A pattern fingerprint

What KIND of deals each serial acquirer does — extracted from their actual deal history. Five dimensions: typical sectors, deal-size range, cadence (deals/year + dry-spell weeks), structure (cash/stock/mixed), hostile-percentage. Plus an LLM-generated 2-3 sentence narrative. Reads as "JNJ buys medtech at $14.5B median in all-cash deals, ~4 per year" — the actionable summary that lets you predict not just *whether* JNJ buys next, but *what kind*.
{{ playbookMeta(p).ticker }} {{ playbookMeta(p).name }}
{{ playbookMeta(p).deal_count }} recent deals

{{ playbookMeta(p).narrative }}

Sectors {{ s.name }} {{ s.pct }}%
Deal Size Median ${{ playbookMeta(p).deal_size.median_b }}B Range ${{ playbookMeta(p).deal_size.min_b }}B–${{ playbookMeta(p).deal_size.max_b }}B ({{ playbookMeta(p).deal_size.n_disclosed }}/{{ playbookMeta(p).deal_count }} disclosed)
Cadence {{ playbookMeta(p).cadence.per_year }}/year Last {{ playbookMeta(p).cadence.weeks_since_last }}w ago Max gap {{ playbookMeta(p).cadence.longest_dry_spell_weeks }}w
Structure {{ s.name }} {{ s.pct }}%
Hostile {{ playbookMeta(p).hostile_pct }}%

> Likely Next Deal Active Acquirers × Prediction Signals join

For each serial acquirer (top of the Active Acquirers leaderboard), the highest-scoring unconnected pair candidates from the M&A Prediction Signals table — combining the *propensity* signal (this company has been buying) with the *latent connection* signal (this target is structurally close). Each row reads as a real watchlist candidate: "JNJ has 6 recent deals; the strongest unconnected target is AAPL (board interlock via Alex Gorsky)."
# Acquirer Recent Deals Likely Next Targets
{{ idx + 1 }} {{ likelyMeta(r).acquirer_ticker }} {{ likelyMeta(r).acquirer_name }} {{ likelyMeta(r).acquirer_deal_count }} {{ c.ticker }} ${{ c.target_mc_b }}B size? {{ c.score }} [{{ c.strongest }}]

> Active Acquirers Company-side M&A — historical buying velocity (last 24mo)

Companies that have filed an acquisition in the last 24 months — surfaces the *propensity* signal that the pairwise table above misses. Sourced from `TakeoverBid` (three passes: SC TO-T tender offers + 8-K Item 7.01/8.01 press releases scanned over the top 30 serial acquirers + 10-Q / 10-K Acquisitions footnotes for very-large-cap acquirers whose deals are sub-materiality at 8-K level) + Neo4j `RELATED` edges with type `MERGER` / `ACQUISITION` from 10-K + 8-K parsing. Now covers JNJ-style giants (Intra-Cellular, Shockwave, Halda) alongside mid-cap acquirers (Clario, Masimo, Wiz, Preqin).
# Acquirer Deals (24mo) Recent Targets
{{ r.rank }} {{ acquirerMeta(r).acquirer_ticker }} {{ acquirerMeta(r).acquirer_name }} {{ r.value }} {{ t.ticker }} {{ (t.name || '?').substring(0, 28) }}
No acquisition activity in the last 24 months in the current data.

> Competitive Intelligence Implicit Competitors — Same Industry, Shared Supply Chain, No Direct Link

Company pairs in the same industry that share 3+ suppliers or customers but have no direct relationship in the graph. Think CRM ↔ ORCL or INTC ↔ ON — obvious competitors whose rivalry is invisible to simple ticker searches. Use this to stress-test sector assumptions and find pair-trade setups.
# Pair Industry Shared Customers Suppliers
{{ r.rank }} {{ compMeta(r).a_ticker }} {{ compMeta(r).b_ticker }} {{ compMeta(r).a_name }} vs {{ compMeta(r).b_name }} {{ compMeta(r).industry }} {{ r.value }} {{ compMeta(r).shared_customers }} {{ compMeta(r).shared_suppliers }}
No qualifying competitor pairs surfaced (need ≥3 shared supply-chain links).

> Risk Contagion Blast Radius — If This Ticker Breaks, Who's Exposed?

For every ticker, count the distinct other tickers reachable via a distress-transmitting channel: a shared director (board, weight 2.0), the same audit firm (auditor, weight 1.5), a direct supply-chain link (supply, weight 1.0), or a strategic stake (investment, weight 0.5). Higher blast_score = more peers likely to feel the shock. Shared-auditor counts look uniform because ~105 tickers use EY/Deloitte/PwC — that is the concentration risk. The Lookup panel below runs the same query on-demand for any ticker and lists the exposed names by channel.
Blast-Radius Lookup
{{ contagionMessage }}
Seed: {{ contagionResult.ticker }} {{ contagionResult.name }} blast_score {{ contagionResult.blast_score }}
{{ channel }} {{ list.length }} exposed
No exposure via this channel.
{{ x.ticker }} {{ x.name }} via {{ x.via }}
Top Blast-Radius Hubs
# Ticker Blast Score Board Auditor Supply Investment
{{ r.rank }} {{ r.label }} {{ contagionMeta(r).name }} {{ r.value }} {{ contagionMeta(r).board_n }} {{ contagionMeta(r).auditor_n }} {{ contagionMeta(r).supply_n }} {{ contagionMeta(r).invest_n }}
Contagion hubs not computed yet — run --contagion.

> Recent Relationship Changes Last 30 Days

New relationships added to the graph in the last 30 days, drawn from filings ingested during the daily refresh. Think of this as a changelog for the corporate network — new board seats, fresh supplier links, recently-disclosed investors.
{{ s.label }} {{ s.value }}
{{ filteredRecent.length }} of {{ recentChanges.length }} events
Date Source Relationship Target Context
{{ r.value }} {{ recentMeta(r).source }} {{ (recentMeta(r).src_label || '?').charAt(0) }} {{ recentMeta(r).rel_type }} {{ recentMeta(r).target }} {{ (recentMeta(r).tgt_label || '?').charAt(0) }} {{ recentMeta(r).context || '(no context)' }} {{ recentMeta(r).context || '(no context)' }}
No relationship changes detected in the last 30 days. Run the daily pipeline to refresh.

Methodology

Graph scope: All Company, Person, Entity, Auditor, and Fund nodes connected via the relationship types surfaced by Silent Facts (board seats, auditor, supplier, partner, investor, underwriter, lender, competitor, industry, location).

Engine: NetworkX 3.6 + python-louvain, pulled live from Neo4j into an undirected graph for analysis. No paid GDS license required.

Approximations: Betweenness uses k=500 node sampling (standard approach for graphs this size — exact calculation scales O(V·E)). PageRank uses the classic damping factor α=0.85.

Refresh cadence: Daily, as part of the overnight pipeline. Results cached in SQLite for instant page loads.

Aggregation metrics (Board Power, Auditor Concentration, Recent Changes): Pure Cypher against Neo4j, no NetworkX required. Recent Changes uses edge load_date/ingested_date timestamps populated by the agent pipeline and 7PM daily refresh.

Auditor switches: The Neo4j graph only stores the current auditor-of-record per company, so history is rebuilt by diffing today's snapshot against the previous one (stored in SQLite auditor_snapshot). Every detected change is appended to auditor_change; the UI shows the last 6 months. History starts accumulating from the first run.