Trade of the House

How the number is produced

Method, and where it stops being trustworthy

The one filter

In remit. A trade counts only when the traded company's industry falls under a committee the member sits on. Across the full dataset those buys average +6.93% twelve-month alpha per decision at t = +5.03 over 2,844 decisions, the sign holds in both halves of a split sample, and it survives dropping any single member — so it is not a bet on one person. Which jurisdictions it comes from, and how unevenly, is broken out on the committees page.

Nobody is pre-selected. Every member who trades inside their own jurisdiction is tracked, whatever their record. This site used to apply a second filter — a member contributed only once their own settled in-remit trades averaged positive alpha — and that filter was removed after it was tested. The section below shows what it did.

One decision counts once. A member who buys the same stock on the same day across four accounts files four lines. That is one judgement disclosed four times, so the statistics count it once — otherwise a single good morning passes for a pattern. Senator Sullivan's best day is eight tickers bought at once in a dependent child's account, filed in triplicate: 24 of his 30 in-remit lines come from that one morning. Position sizes are still summed across the lines, because the duplication is real money — it just is not real repetition.

How much of this is really the committee link? Perhaps half. Committee jurisdictions are technology, defense, healthcare and financials, which are also the sectors that led this market — so "in-remit buys beat the index" could mean members know something, or it could be a long-tech proxy with extra steps. Matched within the same sector and the same quarter, so only the committee link varies, the edge falls from +6.93% to +4.54% at t = +1.54. That is suggestive, not proven, and it is the honest size of the effect.

One limit cannot be fixed here. The public roster (congress-legislators) publishes committee membership only as it stands today — there is no historical file — so a 2021 trade is judged against the member's seat in 2026. Assignments are sticky, but every remit figure on this page is therefore measured at its most flattering.

Leadership access, and who the result rests on

Defining the signal by committee jurisdiction has a structural blind spot: congressional leadership sits on no standing committees, so a jurisdiction filter cannot see them at all. That is backwards — the Speaker is briefed across every committee's subject matter and sits in the Gang of Eight for classified matters, which is broader access than any single seat confers, not narrower.

So one role is carried explicitly. Nancy Pelosi is included as Speaker Emerita, with a remit of all sectors rather than a jurisdiction match, because her access is not subject-limited. Her committee history is genuinely empty for this period, and there is nothing to look up: the congress-legislators dataset publishes current committee membership only — committee-membership-historical.json does not exist — and she has held no standing seat throughout the window this data covers.

The list of such roles is maintained by hand, is deliberately one name long, and is as much an editorial judgement as the committee mapping. Members whose remit comes from leadership are labelled as such wherever they appear, so blanket access is never silently presented as a jurisdiction match.

The headline no longer rests on one or two people. That claim used to be impossible to make here. Under the retired rule, removing Pelosi cost about four and a half points of annual return, and two members were most of the result. Weighting every name equally and dropping the member filter changes that: removing Pelosi moves the headline from +21.63% to +21.60%, and removing Gottheimer moves it to +22.25% — it gets marginally better. Neither is load-bearing. The committee edge itself survives dropping any single member, with its t-statistic staying between 2.30 and 3.28.
The dollars are still lopsided, which is why they are not the headline. Gottheimer is 20.4% of in-remit trades but 53.5% of the disclosed money — he files single MSFT purchases in the $1,000,001–$5,000,000 band, several lines at a time — and Pelosi is 2.3% of trades but 30.0% of the money. A size-weighted book is therefore a concentrated bet on two people even though the equal-weighted one is not. Both curves are on the front page; they land within half a point of each other, which is the reassuring part. Committees shows which jurisdictions the result actually comes from.

Pelosi's trades are executed through her husband's account, and no finding of wrongdoing has been made against either of them, or against Gottheimer. Everything here is drawn from public filings.

How fast the member filed

Every trade carries a badge like filed in 9 days. It is the plainest number on the site and it separates the data more sharply than anything else measured here, for a reason that needs no theory: nobody outside can act until the filing is public, so the lag is exactly the part of the move a follower does not get. A trade filed in nine days hands over most of the following year; one filed on day 44 has already spent six weeks of it.

Filed withinDecisionsAlpha 12mt
14 days713+16.37%+4.07
30 days1,844+9.53%+4.81
over 45 days386−3.44%−1.83

The last row is the one that makes this credible. If the badge were picking up something about which members file fast rather than the filing speed itself, the slow band would be merely weaker. It is negative — late disclosures have underperformed the index — which is what the mechanism predicts and a member-quality story does not.

It also holds up under the same split-sample test every selection rule on this site has to pass, and more evenly than any of them: a +14.44% edge over the unfiltered baseline in the training window and +17.88% in the test window, with the slow band negative in both (−3.84% and −9.14%). Within a single member, comparing their own fast filings against their own slow ones gives +8.88 points at t = +1.60, 9 of the 13 members who trade enough on both sides pointing the same way — suggestive that it is the speed rather than the filer, though not proof.

The strategy does not filter on it. Narrowing to trades filed inside two weeks would have returned +31.5% a year, but on 713 decisions instead of 2,844 and with a −47.7% drawdown against the current −32.7%. The badge is shown so a reader can see the difference and weight a given trade themselves; making it a filter would be choosing a much more concentrated book on the strength of one cut of the data. python src/cli.py selection prints all four speed rules beside every other candidate.

A lag is only shown when it can be trusted. Four filings in this dataset are dated after the document that disclosed them, so their apparent lag is negative; those show no badge rather than a very fast one.

What "hit rate" means here

The share of settled trades that beat the S&P 500 over twelve months — not the share that made money. Those are very different numbers, and the difference is the whole reason the site quotes the harder one.

Of 2,844 settled in-remit decisions…Share
simply made money (return above zero)67.0%
beat the S&P 500 (positive alpha) — the hit rate46.4%

So 20.6% of these trades rose and still lost to an index fund. A tracker that reported the 67% would look far better and tell you nothing: over this period the S&P roughly doubled, so most of anything would have gone up. The question worth asking is whether following a member beat the thing you could have bought instead without reading a single filing, and 46.4% is the answer to that.

A hit rate below 50% is not a contradiction of a positive average, either. These returns are right-skewed: most trades do a little worse than the index and a few do a great deal better. That is why the mean alpha (+6.93%) and the median (near zero) sit so far apart, and why the sample size and t-statistic are printed next to every figure on this site.

When the strategy sells, and why it ignores when they do

Every position is held for 365 days from entry and then closed on the calendar. The member's own later sale is recorded, displayed, and deliberately not acted on. That looks like throwing away information, so it was measured.

Members disclosed selling 1,564 of 3,181 settled in-remit positions inside the twelve months — a majority. Exiting on the first tradable day after each of those sales became public, instead of at twelve months, changes the result:

Exit ruleIn-remit alphat
Hold 365 days (what the site does) +6.76%+5.39
Follow the member out +3.57%+4.89

On the 1,564 positions where the rule actually changes something, following the member out costs 6.50 percentage points at t = −3.82. The median position gets closed after 96 days and gives up the rest of the year for nothing. The likeliest reason is the same disclosure lag that makes this whole project possible: by the time a sale is public it is up to 45 days old, and whatever the member was reacting to has already happened.

A disclosed sale is not a shorting signal either. For that, the ticker would have to fall reliably against the index afterwards. Measured from the first tradable day after each of ~15,000 disclosed sales became public:

HorizonTradesMean alphaMediantFell vs S&P
1 month15,475+0.00%−0.55%+0.0253%
3 months15,198+0.08%−1.74%+0.4655%
12 months12,739+0.22%−6.00%+0.3258%

No edge at any horizon, and that is before borrow costs. The medians are negative while the means are flat, which says the distribution has a long right tail — a short would be right slightly more often than not and lose money on the occasions it was wrong. python src/cli.py selection reproduces both tables.

Judging a trade against the seat held at the time

Committee membership is published only as it stands today. Using that for the whole history is the single largest error this project has had to correct: it credits a member with jurisdictions they gained later, and strips ones they have since left. Marjorie Taylor Greene held no committee seats at all through 2021 and 2022 and Homeland Security only from 2023; Maria Elvira Salazar joined Financial Services years after the trades that were being scored against it.

There is no historical membership file, but the source repository's git history is one — the current file at any past commit is that date's membership. Quarterly snapshots from 2019 onward are reconstructed that way, and every trade is judged against the snapshot in force when it was made. Seven quarters needed care: at the start of each Congress the file is emptied and refilled over weeks, so a literal reading would have recorded "nobody sits on anything" and deleted a quarter of in-remit trades. Those fall forward to the first complete snapshot of the same Congress, and the date actually used is stored beside each one.

The correction made the signal stronger, not weaker, which was not the expected result. In-remit alpha went from +5.25% (t = +3.25) to +6.93% (t = +5.03), and the split-sample edge became almost identical across halves — +6.00% training, +6.27% test, where before it decayed from +6.91% to +2.78%. The old reading was adding noise in both directions rather than flattering the result.

It also closed most of a survivorship hole. Members who have left Congress were previously unmatched and then, once matched, had no committee data and so no remit. With point-in-time snapshots they have a real remit for the years they served: 31 former members now contribute 1,057 in-remit trades, 27.8% of the book, Greene among them with 152 and an in-remit alpha of +27.2%. What remains is 460 transactions that still resolve to nobody, mostly representatives who later became senators.

One gap is unchanged and worth repeating: 24.4% of attributed purchases are in tickers with no sector in this taxonomy at all — Home Depot, Tesla, Coca-Cola, Ford. Consumer goods deliberately map to no committee, because no committee's jurisdiction is Home Depot, so those trades can never be in remit for anyone whatever seat the buyer holds.

The filter that was removed, and why

Until this was tested, the strategy also required a member's own in-remit record to be positive before their trades counted. It sounds obviously right. It does not work.

Tested like for like — restricted to members who already had at least 5 settled in-remit decisions, so both sides are the same people over the same period, and matched within entry quarter so neither side is credited with the calendar — trades that passed the gate returned −1.16% against those that failed it, at t = −1.34, with 47% of quarters favouring the gate. That is a coin flip. For it, the gate discarded three quarters of the evidence: 2,844 in-remit decisions became 532, and 45 live members became 11.

Its apparent value was position sizing, not selection. Weighted by disclosed dollars the gated rule looked respectable; weighted equally — one share of attention per name, which is what a reader can actually replicate — it lost to the S&P 500.

RuleReturnS&P 500CAGRMax drawdownTrades
Every in-remit buy (headline, equal weight) 3.66x 2.61x +21.8% -33% 3,822
Retired: same trades, positive-record members only 2.12x 2.61x +12.1% -28% 743

Both rows cover 6.6 years — 2020-01-03 to 2026-08-12, 1,660 trading days — and are pinned to the same window. Without that pinning the retired rule would start about a year later, because a member could not qualify until five of their decisions had settled, and it would be scored against a different market than the rule it is being compared with. That is the difference between a comparison and a coincidence.

Removing a member filter also removes the thing that made point-in-time testing necessary. Choosing people because their trades worked and then reporting what those trades returned is circular, and the old rule needed an elaborate walk-forward apparatus to stay honest about it. Selecting no people at all has no such bias to defend against: the current rule uses a committee roster and a sector map, neither of which is an outcome.

Twenty-one candidate rules were scored this way — committee filters, grade filters, track-record filters and combinations. Run python src/cli.py selection to reproduce the whole table. One warning from it is worth repeating: the rank correlation between a rule's training-window edge and its test-window edge was +0.270. That is weak, so the rule here was chosen by which ones held their sign across both halves, never by which posted the biggest backtest number.

Trade grades

Every trade carries a grade from A to E describing how much it resembles a deliberate, informed position rather than routine portfolio maintenance. It scores the decision, not the outcome — what a trade returned is excluded from the grade and shown next to it.

The component that does most of the work is isolation. One filing in this dataset disclosed 66 transactions at once, in alphabetical order, on four shared dates, almost all in the same $1,001–$15,000 band. That is an adviser rebalancing a managed account; nobody forms sixty-six convictions on a Tuesday. A single trade, filed alone, in an industry the member's own committee regulates, is a different object entirely — and in that very filing the lone SpaceX purchase grades A while the seventeen-line block on another date reaches only B.

The other components are committee remit (32 points), how obscure the company is (10), whether the member had ever held that name before (8), whether it is the member's own account rather than a spouse's (8), committee leadership (8), how large the trade is against that member's own median trade (6), absolute position size (3) and whether the instrument is an option (3). Across the whole dataset the grades come out heavily skewed to D and E, which is the honest result: most congressional trading is managed money on autopilot.

The three in bold exist because of a specific comparison. Salazar's April purchase of Voyager Technologies — a $2.5bn space company, her first ever position in it, filed alone, in defence, which her seat on Foreign Affairs covers — is a different object from Gottheimer's ninth purchase of ServiceNow, a $131bn name every index fund already owns. Nobody needs inside information to buy a mega-cap.

Both score identically on the two oldest components — 32/32 for remit and 22/22 for isolation. The entire gap between them, 86.5 (A) against 64.1 (B), comes from obscurity (8.5 vs 2.1) and never having held the name before (8 vs 0). That is precisely what those components were added to catch.

Absolute position size was cut from 15 points to 3 after measuring it: trades larger than three times a member's own median averaged −5.92% alpha, so rewarding raw dollars was scoring the wrong thing. The replacement is capped, and treats an outsized trade as unusual rather than better.

A high grade is not an allegation. Every input is public, and buying into an industry you work on daily is ordinary expertise.

Does the grade predict returns? No.

It is the obvious thing to assume, so it is worth testing rather than leaving to the reader. Across 11,014 graded, settled decisions:

GradeDecisionsMean alpha 12m MedianBeat the index
A 178 -10.6% -11.0% 39%
B 1,108 +2.6% -3.4% 46%
C 1,823 +5.6% -3.7% 45%
D 3,670 -0.8% -5.0% 42%
E 4,235 +0.4% -4.0% 43%
A-graded trades did not beat E-graded ones. A+B minus D+E comes to +0.9% at t = 0.70, and the rank correlation between score and alpha is -0.002 — indistinguishable from zero. Adding the obscurity and new-position components made the grade a sharper description of a trade without making it any better at predicting returns; if anything the sign went the other way. Both facts are published because both are true.

The grade answers "does this look like a decision rather than administration", which is a question a filing can settle. It does not answer "will this make money". The table above is recomputed on every run, so if that ever changes, it will change here first.

Entry, exit, benchmark

Under the STOCK Act a member files up to 30 days after being notified of a trade and no later than 45 days after it. Nobody outside their household can act before the filing is published, so every position here opens at the first market open after the filing date — never the trade date — and is held twelve months. Alpha is the position's return minus SPY over the identical window. Positions are weighted by the midpoint of the disclosed amount range.

What this does not tell you

  • Amounts are ranges. "$1,001–$15,000" is all the filer discloses, so every dollar figure is an estimate.
  • No costs. Commissions, spread, taxes and slippage are not modelled, and fills are assumed at the open.
  • Small samples. 3,182 settled trades across 122 members is not many once you slice it further. Hit rate is 48% and the median trade alpha is -2.1% — the average is carried by a minority of large winners.
  • Scanned filings are missing. About one filing in six is a paper scan with no text layer and cannot be parsed without OCR.
  • The remit mapping is a judgement, not a measurement, and changing it changes who qualifies.
  • Committee assignments are current, not historical. The roster dataset publishes today's seats only, so a trade from 2021 is tested against the committees that member sits on now. Where someone has changed committees — or chambers, as John Curtis did moving from the House to the Senate in 2025 — their older trades are judged against a remit they did not hold at the time. Members mostly keep their committees for years, so this is usually harmless, but it is a real source of error and it flatters nobody in a predictable direction.
  • The Senate is included but barely registers. Senate PTRs are read from the Secretary's eFD portal, and senators are 6 of the 120 tracked members. But 131 of 964 Senate reports are scanned paper, and senators disclose in far smaller bands than the largest House filers, so the Senate is under 1% of the size-weighted book. It changes who is listed, not what the curve does.

Rebuilding it yourself

python src/cli.py ingest --from 2020 --to 2026   # filings
python src/cli.py prices                        # adjusted prices
python src/cli.py sectors                       # ticker → industry
python src/cli.py backtest                      # score every trade
python src/cli.py strategy                      # this site's numbers
python src/cli.py site                          # serve it

scripts/daily_scan.py does the whole cycle on a schedule and reports any new tracked filings.