Hillscore

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.

CSV · 15,953 rows · 3.6 MB

Download house_filings.csv

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.

CSV · 41,355 rows · 7.7 MB

Download combined_trades.csv

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.

CSV · 19,095 rows · 3.2 MB

Download trades.csv

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.

CSV · 7,187 rows · 1.3 MB

Download outcomes.csv

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.

CSV · 18,466 rows · 405 KB

Download sector_benchmarks.csv

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.

ColumnFileMeaning
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.

SectorBenchmark
AgricultureMOO
Consumer & RetailXLY
Consumer StaplesXLP
Defense & AerospaceITA
EnergyXLE
FinancialsXLF
Healthcare & PharmaXLV
IndustrialsXLI
InsuranceXLF
Materials & MiningXLB
Media & EntertainmentXLC
Real EstateXLRE
TechnologyXLK
TelecomXLC
TransportationIYT
UtilitiesXLU

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.

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

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 .