Congress Leaderboard
Which members of Congress have done best on the stock purchases they disclose: one dollar-weighted, one-year-forward return per member per disclosure year. Purchases are entered at the first close after the disclosure is public — never the trade date, so there is no look-ahead — and the fixed one-year horizon keeps the years comparable. A member-level score only: it is deliberately never broken out by security or by trade, and each row blends at least three purchases across at least three different companies.
congress_leaderboard — the dataset name to pass to the Obscura API.
What one row means
One member of Congress's disclosed BUYING record for a single disclosure year, scored — a read-only `congress_leaderboard` MATERIALIZED VIEW over `congress_trades`. Every purchase the member disclosed that year is entered at the first adjusted close on or after the STOCK Act disclosure day and exited at the last adjusted close within the following 365 days; the per-purchase results are then blended, weighted by each purchase's disclosed dollar midpoint, into ONE return and ONE dollar figure for the member-year. Refreshed nightly by `RefreshGovernanceViews`. The row is the whole product: a member-level score, never a per-security or per-trade result. A group qualifies only with at least three disclosed purchases across at least three DISTINCT securities, which is what makes the published numbers an aggregate rather than a repackaged price series — with three or more unknown price ratios behind one published return, no individual security's move is recoverable from the row. The fixed one-year-forward horizon is what makes the years comparable: a 2021 cohort is not flattered by extra years of runway the way a hold-to-today measure would be.
One row per One row per (year, filer_name) — one member of Congress's disclosed buying record for one disclosure year. Never per security and never per trade..
Derived in-database from congress_trades, sharadar_sep.
Point-in-time availability
Every Obscura dataset carries available_date: the calendar day the publisher made the row
available, day-of, with no session rounding. It is the one column a backtest filters on, and it means the
same thing on every dataset in the catalog.
For congress_leaderboard: published: available_date = the latest trading session whose closing price the row consumes, i.e. max over the member's scored purchases of the session the one-year-forward exit is taken from. WHY: this is an AGGREGATE of two kinds of input, and a row is only publicly knowable once the LAST of them is public. The disclosures are the earlier input (a purchase is public the day the periodic transaction report is posted); the exit price is the later one, taken up to 365 days after that disclosure, so a row dated from the disclosures alone would claim to have been knowable up to a year before the prices it contains existed. Measured 2026-07-30, that error was 3 to 365 days (mean 337) on every one of the 336 rows, and m20260702_000212 corrects it. The disclosure-year cohort stays in `year`, so the roughly one-year gap between `year` and `available_date` is a real publication lag on a forward-looking measure, not a leak. Evidence class B — the rule is arithmetic over dates we hold and is re-derivable from the view definition and the two source tables; it inherits its floor from `congress_trades` availability. See docs/availability/congress_leaderboard.md.
Refresh cadence
Obscura refreshes congress_leaderboard daily — the most frequent scheduled job that re-collects or re-exports it. This is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when a row became public is recorded per row in available_date.
Schema — 9 columns
The full public column list for congress_leaderboard, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/congress_leaderboard.
| Column | Type | Description |
|---|---|---|
| year | integer · not null | Disclosure-year cohort: the calendar year of the purchase disclosures being scored, taken from `congress_trades.available_date`. It is the COHORT label, not the row's availability — the scoring window runs a further year past it, which is why `available_date` is later. Part of the primary key. |
| filer_name | text · not null | Name of the member of Congress (or covered filer) whose disclosed purchases this row scores, as reported on their periodic transaction reports. Part of the primary key. |
| chamber | text | Legislative chamber of the filer. |
| trades | bigint | Number of disclosed purchases scored into this row. At least 3 by construction: a group with fewer is not published at all. |
| tickers | bigint | Number of DISTINCT securities those purchases span. At least 3 by construction — the floor that keeps the published return an aggregate across securities rather than one security's result under another name. |
| volume | bigint | Total disclosed dollar volume bought, in USD: the sum of each purchase's disclosed amount-range midpoint. Derived from the disclosures alone. |
| weighted_return | double precision | THE LEADERBOARD MEASURE. Dollar-weighted one-year-forward return across every scored purchase, as a fraction (0.12 = +12%). Each purchase contributes its own forward return weighted by its disclosed dollar midpoint; the result is a single blended figure for the member-year across at least three securities. |
| est_gain | bigint | Estimated dollar gain across the scored purchases, in USD — `weighted_return` applied to `volume`. An estimate, not a realised PnL: the disclosures give dollar RANGES, not positions, and the exit is a fixed one-year horizon rather than the member's actual sale. |
| available_date | date | PUBLIC-availability date = the latest session whose closing price this row consumes (the last one-year-forward exit across the member's scored purchases). The point-in-time column to filter/join on — NEVER `year`, which is the disclosure cohort and precedes this by up to a year. |
Access congress_leaderboard
Two delivery paths, one identifier. Both require an Obscura account and an active subscription; the catalog entry and the schema above are public.
import obscura
client = obscura.Client("obs_live_…")
df = client.query(
dataset="congress_leaderboard",
symbols=["NVDA", "AAPL"],
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the congress_leaderboard dataset?
Which members of Congress have done best on the stock purchases they disclose: one dollar-weighted, one-year-forward return per member per disclosure year. Purchases are entered at the first close after the disclosure is public — never the trade date, so there is no look-ahead — and the fixed one-year horizon keeps the years comparable. A member-level score only: it is deliberately never broken out by security or by trade, and each row blends at least three purchases across at least three different companies. One member of Congress's disclosed BUYING record for a single disclosure year, scored — a read-only `congress_leaderboard` MATERIALIZED VIEW over `congress_trades`. Every purchase the member disclosed that year is entered at the first adjusted close on or after the STOCK Act disclosure day and exited at the last adjusted close within the following 365 days; the per-purchase results are then blended, weighted by each purchase's disclosed dollar midpoint, into ONE return and ONE dollar figure for the member-year. Refreshed nightly by `RefreshGovernanceViews`. The row is the whole product: a member-level score, never a per-security or per-trade result. A group qualifies only with at least three disclosed purchases across at least three DISTINCT securities, which is what makes the published numbers an aggregate rather than a repackaged price series — with three or more unknown price ratios behind one published return, no individual security's move is recoverable from the row. The fixed one-year-forward horizon is what makes the years comparable: a 2021 cohort is not flattered by extra years of runway the way a hold-to-today measure would be.
How do I avoid look-ahead bias with congress_leaderboard?
Filter on congress_leaderboard.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — published: available_date = the latest trading session whose closing price the row consumes, i.e. max over the member's scored purchases of the session the one-year-forward exit is taken from. WHY: this is an AGGREGATE of two kinds of input, and a row is only publicly knowable once the LAST of them is public. The disclosures are the earlier input (a purchase is public the day the periodic transaction report is posted); the exit price is the later one, taken up to 365 days after that disclosure, so a row dated from the disclosures alone would claim to have been knowable up to a year before the prices it contains existed. Measured 2026-07-30, that error was 3 to 365 days (mean 337) on every one of the 336 rows, and m20260702_000212 corrects it. The disclosure-year cohort stays in `year`, so the roughly one-year gap between `year` and `available_date` is a real publication lag on a forward-looking measure, not a leak. Evidence class B — the rule is arithmetic over dates we hold and is re-derivable from the view definition and the two source tables; it inherits its floor from `congress_trades` availability. See docs/availability/congress_leaderboard.md. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get congress_leaderboard?
As a Parquet bulk export (POST https://api.obscura.trade/v1/download) or as JSON from the typed query API (POST https://api.obscura.trade/v1/query), both with dataset="congress_leaderboard". The column schema is public at https://api.obscura.trade/v1/catalog/congress_leaderboard.
Can I filter congress_leaderboard by company or symbol?
Yes. congress_leaderboard carries filer_name, the column the API's symbols filter resolves against.
How often is congress_leaderboard updated?
Obscura refreshes congress_leaderboard on a daily schedule — that is the most frequent scheduled job that re-collects or re-exports the table. It is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when the publisher makes a row available is described by the availability rule above, and is recorded per row in available_date.