The first thing that breaks when you wire congressional trade disclosures into anything quantitative is the amount field. A member of Congress who buys a stock does not report buying $73,400 of it. They report buying somewhere between $50,001 and $100,000 of it, because that is all the periodic transaction reports under the STOCK Act require, and every number your system produces downstream inherits that fog. I have watched more than one pipeline take the midpoint of the bracket, call it $75,000, and feed it into position sizing as if it were a fill confirmation from a broker. The output looks precise, and it is precise about something nobody actually knows.
The brackets run roughly like this: $1,001 to $15,000, then $15,001 to $50,000, then $50,001 to $100,000, and they keep widening from there through $100,001 to $250,000, $250,001 to $500,000, $500,001 to $1,000,000, and on into multi-million buckets. Two structural things matter. The widths grow multiplicatively, so the biggest trades, the ones you care most about, are the ones you know the least about. And there is a blunt cap for family assets, where a spouse's transaction can simply be labeled as over $1,000,000, which flattens a two million dollar purchase and a forty million dollar purchase into the same line item.
Midpoint is a modeling choice, and usually a bad one
Taking the midpoint of a bracket feels like the neutral default, and it carries a known bias. Trade sizes in the wild are heavily right skewed. Small trades vastly outnumber large ones, which means that within any wide bracket, more of the true values sit near the bottom edge than the top. Average midpoint estimates across a whole dataset and you will systematically overstate how much money actually moved. For brackets that span a doubling, like $50,001 to $100,000, the damage is tolerable. For a bracket like $1,000,001 to $5,000,000, the midpoint says $3,000,000 while the geometric mean of the endpoints says roughly $2,240,000, and the honest answer is that you are holding a five to one uncertainty band and should carry it around as one.
My working setup is two estimates per trade, kept side by side. The conservative estimate is the bottom of the bracket, which never overstates and gives you a floor you can defend. The central estimate is the geometric mean of the bracket endpoints rather than the arithmetic midpoint, since the brackets are spaced multiplicatively and a multiplicative center respects that. Neither estimate is the truth, and the discipline is refusing to collapse them into one number until the last moment, then testing every signal against both. A rule of thumb I trust: if a trade looks interesting at the central estimate and boring at the floor, it was never interesting.
Aggregation is where the sloppiness compounds. Members frequently execute one economic decision as several transactions, say five separate buys of the same ticker on the same day, each reported at $15,001 to $50,000. Sum the midpoints and you get a confident looking $162,500. Sum the intervals and you get somewhere between $75,005 and $250,000, a band so wide that pretending to know the middle of it is close to pointless. Keep the interval arithmetic all the way through. It is mildly annoying to implement and it stops you from lying to yourself.
The same bracket means different things from different people
A purchase reported at $50,001 to $100,000 is a completely different event depending on who filed it. From a member whose disclosed holdings sum to a few hundred thousand dollars, that single trade might represent a fifth of everything they have in the market, and that is conviction whether or not the trade works out. From a member worth a few hundred million, the same bracket is portfolio dust, quite possibly an advisor rebalancing something without the member ever hearing about it. Raw size compared across filers tells you very little until you divide by the filer's balance sheet.
The useful part is that the denominator exists, because members also file annual financial disclosures listing their assets and liabilities. The catch, and by now you can guess it, is that those are reported in ranges too, so net worth is itself an interval. Build it the obvious way. Sum the bottom of every asset bracket and subtract the top of every liability bracket to get a floor, then sum the asset tops and subtract the liability bottoms to get a ceiling. The band is wide, sometimes embarrassingly wide, and it is still far better than nothing.
Two quirks of the disclosure rules actually help you here. A personal residence that produces no rental income typically does not have to be reported, and the congressional salary does not show up either, so what you are summing is closer to reportable investable wealth than to true net worth. For conviction purposes that is the denominator you wanted anyway, since the question is what fraction of the money this person actively deploys just moved into one ticker.
Conviction as an interval then falls out of simple division. The conservative ratio is the trade floor divided by the net worth ceiling, the aggressive ratio is the trade ceiling divided by the net worth floor, and conviction sits somewhere in that band. When even the conservative ratio clears a threshold, roughly a few percent of reportable wealth in a single name, the trade clearly meant something to that person. Filings like that are rarer than you would expect, and they are the ones worth your attention.
Making scores comparable across filers
Net worth normalization gets you most of the way, and it still misses habit. Some members trade constantly in small size, some almost never trade at all, and the information content of a bracket depends on what that specific filer usually does. So the second component I use is a within-filer percentile, ranking the current trade's bracket against the same member's trailing couple of years of transactions. This works better than it has any right to, because percentile ranking only needs ordinal comparisons, and the brackets are ordinal by construction. The coarseness that ruins scalar estimates does no damage to a rank. A member who has filed nothing but bottom bracket trades for two years and suddenly reports $250,001 to $500,000 is telling you something loud, before you ever look at their balance sheet.
The score I attach to a trade combines the two, and a trade only gets flagged when both agree. The pipeline, in the order the steps have to happen:
- Ingest every transaction as an interval, floor and ceiling, and never store a scalar amount.
- Merge same-day, same-ticker, same-direction transactions by summing intervals before doing anything else.
- Attach two size estimates, the floor and the geometric mean of the endpoints.
- Build a net worth interval per member from the most recent annual disclosure.
- Compute the conviction band by interval division and keep the conservative end as the headline number.
- Compute the within-filer percentile of the bracket against that member's trailing history.
- Flag only when the conservative ratio and the percentile are both elevated, and let everything else pass through unranked.
The failure modes are worth naming because each one has bitten me or someone I know. Options filings report the value bracket of the transaction, which for an option is usually the premium, so a $15,001 to $50,000 entry can control notional exposure many times larger and your conviction score will quietly understate it. Sales tell you the size of the transaction and nothing about the fraction of the position that remains, so a large sale from a large holder can be routine trimming rather than an exit. The spousal over $1,000,000 label caps your ceiling exactly where the most interesting information would live. And filings can arrive up to forty-five days after the trade, often later in practice, so size uncertainty stacks on top of timing uncertainty and both belong in the model.
None of this rescues the underlying data from being coarse. What it does is keep the coarseness visible instead of buried under false precision, which changes behavior, because you stop sizing positions off a number invented at ingestion time and start sizing off a floor you can defend. We built the congressional feed in Blockcircle around exactly this structure, intervals end to end with a conviction band per filing, mostly because the scalar version kept producing signals that evaporated the moment anyone asked how confident we really were. If you are rolling your own, start with storing the range instead of a single number. It is a small schema decision and it quietly fixes most of what goes wrong later.