# House members' stock trade reports, 2014 to 2026

Data and code for The Countersign's story "House members reported more than
1,000 trades over a month late." The method is set out in full on the story's
data and method page.

Every row comes from periodic transaction reports that members of the House
file with the Clerk of the House under the STOCK Act. The reports are public
records at https://disclosures-clerk.house.gov/FinancialDisclosure. We
downloaded them on November 4, 2026. Dates are yyyy-mm-dd, and blank means
the value wasn't on the form or doesn't apply.

## Files

**filings.csv**: one row per report in the Clerk's yearly indexes for 2014 to
2026.

| Column | Meaning |
|---|---|
| doc_id | The Clerk's filing ID. Electronic reports start with 2; scanned paper reports with 8 or 9. |
| index_year | The Clerk's index the report is listed in. |
| filing_date | The filing date in the Clerk's index. |
| bioguide | The member's ID in the Biographical Directory of the US Congress. |
| member, party, state | The member's name, party (D, R, I or L) and state at the time of filing. |
| district_as_filed | The state and district as written in the Clerk's index. |
| electronic | yes for a report filed electronically, no for a scanned paper report. |
| pages | Number of pages in the PDF. |
| transactions_read | Trades read from the report. Scanned reports are not read, so this is 0 for them. |
| pdf_url | The original report on the Clerk's website. |

**transactions.csv**: one row per trade read from an electronic report.

| Column | Meaning |
|---|---|
| doc_id, line | The report, and the trade's position on it. |
| index_year, filing_date | As in filings.csv. |
| bioguide, member, party, state | As in filings.csv. |
| owner | self, spouse, joint or dependent child, from the form's owner column. |
| asset | The asset as written on the form. Older forms' text turns some capital letters into lower case; we keep the text as it is. |
| ticker | The ticker in brackets after the asset name, upper-cased. |
| asset_type_code | The form's asset type code (ST for stock, OP for option and so on), on forms from 2018. |
| asset_class | Our classification: stock, option, fund or ETF, bond or government security, or other. From 2018 we use the form's code; before that, the ticker and the words in the asset name. |
| transaction_type | purchase, sale, partial sale or exchange. |
| transaction_date, notification_date | The date of the trade, and the date the member says they learned of it. |
| amount, amount_low, amount_high | The value band as written, and its bounds. A band like "Over $1,000,000" has no upper bound. |
| filing_status | New, Amended or Deleted, as written. |
| description, comment | The form's description and comment fields. |
| deadline | The earlier of notification_date + 30 days and transaction_date + 45 days (5 U.S.C. 13105(l)). Where the notification date is before the trade date, an apparent typing error, the 45-day limit alone. |
| days_past_deadline | filing_date minus deadline, when positive. Otherwise 0. |
| late, more_than_30_days_late | yes or no, for counted trades. The $200 late fee applies to reports filed more than 30 days after the deadline (5 U.S.C. 13106(d)). |
| counted | yes if the trade counts in the lateness figures. |
| reason_not_counted | Why not: an amended or deleted line, a trade made before the member took office, or a status that couldn't be read. |

**late_by_member_2025_2026.csv**: for each member, the trades counted, late
and more than 30 days late, on reports in the 2025 and 2026 indexes. These
are the figures in the story's lead.

**by_year.csv**: for each calendar year of filing, these columns:
- reports filed, electronic and scanned, and the share scanned;
- members filing electronically;
- trades read;
- the share of counted trades that were late, and more than 30 days late;
- the share of members with at least one late trade.

**members_2014_2026.csv**: for each member who filed a report, 2014 to 2026,
these columns:
- reports, scanned reports and scanned pages;
- trades read;
- trades counted, late and more than 30 days late.

**studies.csv** and **chen_sacerdote_table1.csv**: the published figures the
story quotes from studies of members' returns, with the table or page each
comes from. We didn't compute returns ourselves.

## What the data can't tell you

- **Scanned paper reports aren't read**, so their trades are missing. Some of
  the most active traders, including Ro Khanna and Michael McCaul, file on
  paper.
- **Notification dates are self-reported.** A wrong date can make a trade
  look late or on time when it isn't.
- **Values are bands, not amounts.**
- **Some forms contain errors, kept as filed:** for example, notification
  dates before the trade, or trade dates after the filing date.
- **Lateness is not wrongdoing.** Whether any late fee was paid or waived is
  not public.

## Rerunning it

The scripts are in code.zip. You need Python 3 and poppler (`pdftotext` and
`pdfinfo`). From the folder that holds `data/`:

1. Download the Clerk's yearly index files, `<year>FD.zip` for 2014 to 2026,
   from https://disclosures-clerk.house.gov/public_disc/financial-pdfs/.
   Unzip each into `data/raw/<year>FD/`.
2. Download the member data:
   - `legislators-current.json` and `legislators-historical.json` from
     https://unitedstates.github.io/congress-legislators/ into
     `data/raw/legislators/`;
   - the Clerk's member list, https://clerk.house.gov/xml/lists/MemberData.xml,
     saved as `data/raw/clerk-MemberData.xml`;
   - for party lookups, the House roll call votes 2024 no. 500 and 2025 no.
     10, from https://clerk.house.gov/evs/, saved in `data/raw/votes-party/`.
3. `python3 -I data/download_ptrs.py` and `python3 -I data/download_history.py`.
   These fetch about 8,400 reports at one request a second, so allow two to
   three hours.
4. `python3 -I data/parse_ptrs.py`, then `python3 -I data/parse_history.py`.
5. `python3 -I data/analyze.py`, then `python3 -I data/analyze_history.py`.
6. `python3 -I data/package.py` rebuilds these files. It stops if they don't
   reproduce the story's figures.

`figures.py` writes the story's charts, and `fetch_bills.py` the bill
records, which need a free api.data.gov key. Both write to folders of ours
that you won't have, so you can skip them.

The Clerk adds new filings to the current year's index, so the 2026 files
will grow. Reports filed after November 3, 2026, aren't in our data.

## Licenses

- **The code** is under the MIT license (LICENSE-code.txt).
- **Our data files** are under Creative Commons Attribution 4.0
  (LICENSE-data.txt): reuse them freely, crediting The Countersign.
- **The reports themselves** are public records.
