The data behind every figure on this site
Every number on Hillscore is derived from the files below. They are published so a reader who doubts a headline can recompute it rather than take it on trust — including the sector benchmarks the comparisons are made against, and the reconciliation of the two sources, which are usually the parts nobody shows. The site's central claim, that a buy beat or trailed its own sector, rebuilds from these files exactly; a few longer-horizon figures need daily prices we do not publish, and we say which.
Source: the House Clerk's filings
One of the two raw inputs, as parsed and before anything was decided about it: 15,953 transactions read from 1,039 Periodic Transaction Reports, each row carrying the document it came from. United States government public records, republished here only because they are easier to use this way than as a thousand PDFs.
The combined table, with the decisions
Both sources reconciled, and the reconciliation shown: 41,355 records, of which 26,031 are used and 15,324 are set aside with the reason attached. Nothing is deleted, so a figure can be traced to the records behind it and to the ones that were not.
Every disclosed trade
The input. Every transaction disclosed by a tracked member that we can match to a priceable stock, as filed, with the closing price on the day attached.
Scored buys and their returns
The derived layer. Each disclosed buy with the move at one week, one month and three months, the sector benchmark it was measured against, and the signal it carries.
The sector benchmarks themselves
The comparison. Daily closes for the 14 sector ETFs every excess figure is measured against, covering the same window as the trades, so the subtraction can be checked rather than believed.
What is in them
They stack in that order. house_filings.csv is one of the
two raw inputs, as read from the Clerk's PDFs and before any judgement was
applied to it. combined_trades.csv is that source and the
commercial feed reconciled, with every record the reconciliation set aside
still present and carrying its reason. trades.csv is what
came through it: every disclosed transaction the site can price, with the
closing price on the transaction date attached, and a
trade_uid on each row that joins back to the combined table.
outcomes.csv is the derived layer: each disclosed buy with
what the stock did afterwards and how that compares with its sector.
sector_benchmarks.csv is what "compares with its sector"
means in practice: the daily closes of the ETFs, joinable to outcomes.csv on
benchmark and date. Everything else — the
Composite score, the rankings, the signal comparison, the charts — is
an aggregate of these.
Why the discarded records are published too. A pipeline that reconciles two sources is making choices, and a file that shows only the winners cannot be checked on the ones it dropped. Every record set aside is here with the reason: the same trade already held from the feed, a later filing restating an earlier one, a transaction dated in the future. A refiled report was being counted twice until a reader asked why a member's score had moved; it would have been one query against this file.
| Column | File | Meaning |
|---|---|---|
politician |
both | Name as it appears in the filing. |
bioguide_id |
both | The member's identifier in the Congressional Biographical Directory — the stable key to join on. |
party / state |
trades | Party letter and two-letter state. |
symbol |
both | Ticker. Class shares keep the filing's spelling, so BRK.B rather than BRK-B. |
asset_name |
trades | The security description exactly as filed, boilerplate included. |
transaction_type |
trades | BUY, SELL or OTHER, normalised from the filing's wording. |
owner |
trades | Whose account: Self, Spouse, Joint and so on. Same-day trades of the same stock in the same direction are combined into one row, e.g. "Self + Spouse", with their amounts added. |
transaction_date |
both | Date of the trade itself. |
filed_date |
both | Date the disclosure was filed. Members have 30 to 45 days. |
amount_min / amount_max |
trades | The disclosed band in dollars. Not what was spent. |
price_on_trade_date |
both | Closing price that day, in the money of that day. Not the execution price -- filings never disclose one. |
price_split_adjusted |
trades | The same close restated for every split since, which is the basis every return on this site is computed on. Identical to the column before it unless the stock has split: Chipotle's October 2023 close is $1,942.20 as traded and $38.84 restated, because of the 50-for-1 in 2024. Use this one to reproduce a return, and the one before it to check a filing. |
sold_date |
outcomes | When the position was sold, blank if still held. Buys are matched to sells oldest-first and weighted by the midpoint of each disclosed band, so one large sell closes as many earlier buys as it covers — the same rule the returns behind the rankings use. Filings give bands rather than share counts, so this is an estimate: a buy only partly covered by a sell still carries that date. |
sector |
outcomes | The sector assigned to the stock. See the coverage page for how. |
signal |
outcomes | The committee tag: Notable, Aligned (Mega-cap) or Unaligned. |
cluster |
outcomes | True for a Cluster buy. A buy is marked Cluster when at least one other tracked member of Congress bought the same stock within 30 days of it, regardless of committee membership. |
is_megacap |
outcomes | True for widely-held mega-cap stocks. The Cluster comparison leaves these out of both sides. |
return_1W / 1M / 3M |
outcomes | Fractional move that far after the purchase date. Blank if the window has not elapsed. |
benchmark |
outcomes | Ticker of the sector ETF the excess figures are measured against. |
benchmark_return_1W / 1M / 3M |
outcomes | What that ETF did over the identical window. Published so the excess is checkable: return minus benchmark_return is the excess, to the last decimal place. |
excess_1W / 1M / 3M |
outcomes | The same window's benchmark move, subtracted. |
date / benchmark / close |
benchmarks | One row per ETF per trading day: the closing price used for every comparison on the site. Join to outcomes.csv on benchmark and date. |
What the reconciliation does, and to how much
Two sources describing the same disclosures disagree in a handful of predictable ways. Each is handled by a rule rather than case by case, and every record it touches is in combined_trades.csv carrying the outcome, so the counts below can be checked against the file rather than taken from this page.
| What happens | Records | What we do, and why |
|---|---|---|
| already held from the other source | 15,309 | The vendor record is kept as the spine and the filing's copy set aside -- but not before anything the vendor lacks, that the shares came from exercising a contract or that a disposal was a gift, is copied onto the record that survives. |
| transaction and notification dates disagree | 52 | Kept, with the doubt recorded. Nobody is told of a trade before it happens, so one of the two dates on the row is mistyped -- but the trade is real, and which of them is wrong is not ours to decide. |
| enriched from the filing that matched it | 13 | A vendor record that took a fact from the filing that matched it. The column names the filing, so the claim can be checked. |
| a later filing restates an earlier one | 12 | A refiled report gets a new document number, so both copies read as separate trades and were counted twice. Two filings carrying an identical list of transactions are one filing reported twice; the first is kept. |
| transaction and report dates disagree | 5 | Kept, with the doubt recorded. The row agrees with itself and disagrees with the date the Clerk's index gives the report, which may instead be the date of an earlier report this one amends. |
| dated in the future | 3 | Rejected. Two read 2220 and 2202 for 2022 and one is dated December 2026; a trade that has not happened cannot be measured over windows that have not elapsed. |
Nothing is corrected silently. A date that cannot be right is still not a date we know the answer to, and a pipeline that quietly rewrites 2202 to 2022 is guessing in a way a reader cannot see. So a record is either used, or set aside with the reason, or kept with the doubt written next to it. The last of those is the important one: a table that recorded only the decisions confident enough to delete something would look cleaner than the data actually is.
Which benchmark stands for which sector
One liquid, widely-tracked ETF per sector, mostly the SPDR Select Sector funds. 16 sectors, 14 ETFs: Insurance is measured against the financials fund and Telecom against the communications fund, because neither has a fund of its own worth using.
| Sector | Benchmark |
|---|---|
| Agriculture | MOO |
| Consumer & Retail | XLY |
| Consumer Staples | XLP |
| Defense & Aerospace | ITA |
| Energy | XLE |
| Financials | XLF |
| Healthcare & Pharma | XLV |
| Industrials | XLI |
| Insurance | XLF |
| Materials & Mining | XLB |
| Media & Entertainment | XLC |
| Real Estate | XLRE |
| Technology | XLK |
| Telecom | XLC |
| Transportation | IYT |
| Utilities | XLU |
Reproducing the excess figures
Two rules decide whether your numbers match ours. Both are ordinary, and both will put you a few basis points out if you guess differently.
-
Windows are calendar days, not calendar months.
1Wis 7 days,1Mis 30 days,3Mis 91 days after the transaction date. Ninety-one days, not "three months later". - Prices are the close on or before the target date. If a window lands on a weekend, a holiday or any other non-trading day, both the stock and the ETF roll back to the previous trading day's close. The same rule applies to the entry date.
Do that and every row's arithmetic closes:
return_3M − benchmark_return_3M = excess_3M, and
benchmark_return_3M rebuilds from the two closes in
sector_benchmarks.csv. The benchmark file spans
2021-08-02 to 2026-10-30 — deliberately
wider than the trades, so the earliest buy in outcomes.csv still has a
sector to be measured against.
What these files cannot rebuild. They carry the closing price on each trade date, not a daily price series for every stock, so the one-week, one-month and three-month figures and everything derived from them can be recomputed — but the Composite score, the six- and twelve-month columns, the versus-ETF columns on the rankings and the estimated profit cannot. Those are computed from daily prices for every held position, which are not published here. We would rather say so than let you find out halfway through.
Read this before using it
-
Amounts are ranges, not figures. Filings disclose bands, so
amount_minandamount_maxare the band, not what was spent. Anywhere the site needs a single number it uses the midpoint, and says so. -
Prices are closes, not execution prices.
price_on_trade_dateis the stock's ordinary closing price that day. Filings never disclose what was actually paid, and no figure here should be read as one. -
Returns are fractions.
-0.030445is −3.0445%.excess_*is the same window's move for the stock's sector benchmark ETF subtracted — thebenchmarkcolumn names which ETF andbenchmark_return_*gives its move, so the subtraction is visible in the row rather than taken on trust. -
Blanks are missing, not zero. An empty
return_3Mmeans the window has not elapsed yet or no price was available, and an emptysold_datemeans the position is still open. Treating either as zero will change your answer. - This is not all of Congress. Every House member with ten or more disclosed stock purchases in the window, plus the senators our feed covers — not all 535. Who is tracked and why.
A sample of trades.csv
The 20 most recent rows, so you can see the shape before downloading 3.6 MB.
| Traded | Filed | Politician | Symbol | Type | Price | Amount band |
|---|---|---|---|---|---|---|
| 2026-10-23 | 2026-10-28 | Kevin Hern | STX | SELL | $630.49 | $15,001–$50,000 |
| 2026-10-23 | 2026-10-28 | Kevin Hern | ASML | SELL | $1,571.80 | $15,001–$50,000 Joint |
| 2026-10-16 | 2026-10-19 | Michael Rulli | WSBC | SELL | $37.22 | $1,001–$15,000 |
| 2026-10-16 | 2026-10-19 | Michael Rulli | GOOG | SELL | $336.91 | $50,001–$100,000 |
| 2026-10-14 | 2026-10-28 | Kevin Hern | TXN | SELL | $280.65 | $15,001–$50,000 Joint |
| 2026-10-12 | 2026-10-15 | David J. Taylor | PG | SELL | $153.20 | $1,001–$15,000 |
| 2026-10-09 | 2026-10-15 | David J. Taylor | RPM | BUY | $97.73 | $1,001–$15,000 |
| 2026-10-09 | 2026-10-15 | David J. Taylor | FITB | BUY | $50.64 | $1,001–$15,000 |
| 2026-10-09 | 2026-10-15 | David J. Taylor | T | BUY | $22.18 | $1,001–$15,000 |
| 2026-10-09 | 2026-10-22 | Cleo Fields | TSM | BUY | $453.31 | $1,001–$15,000 |
| 2026-10-08 | 2026-10-12 | Rick Larsen | WSM | BUY | $239.00 | $1,001–$15,000 |
| 2026-10-08 | 2026-10-12 | Rick Larsen | HD | SELL | $295.47 | $1,001–$15,000 |
| 2026-10-08 | 2026-10-12 | Rick Larsen | FDX | SELL | $291.73 | $1,001–$15,000 |
| 2026-10-08 | 2026-10-12 | Rick Larsen | ADI | BUY | $405.93 | $1,001–$15,000 |
| 2026-10-02 | 2026-10-13 | Kevin Hern | NEE | SELL | $76.83 | $15,001–$50,000 Joint |
| 2026-10-01 | 2026-10-12 | Gilbert Ray Cisneros, Jr. | BHE | BUY | $84.62 | $15,001–$50,000 |
| 2026-10-01 | 2026-10-22 | Cleo Fields | NVDA | BUY | $230.86 | $1,001–$15,000 |
| 2026-09-30 | 2026-10-12 | Lisa C. McClain | STX | SELL | $922.34 | $15,001–$50,000 Spouse |
| 2026-09-30 | 2026-10-12 | Lisa C. McClain | MSFT | BUY | $512.90 | $1,001–$15,000 Spouse |
| 2026-09-30 | 2026-10-12 | Lisa C. McClain | IBRX | BUY | $9.44 | $1,001–$15,000 Spouse |
Licence
Published under a Creative Commons Attribution 4.0 International licence (CC BY 4.0). You may copy, redistribute, adapt and build on this data for any purpose, including commercially, provided you credit Hillscore with a link and say if you changed anything.
The licence covers this compilation — the matching, pricing, sector assignment and scoring — not the underlying facts. The filings themselves are United States government public records and are not anyone's to license, including ours.
Rebuilt daily alongside the rest of the site; both files carry whatever the latest run held. If a figure here disagrees with the filing it came from, the filing is right — tell us and it gets fixed.
Data last updated .