The mistake I keep watching people make is treating a disclosure feed like it is a moving average. They pull a list of congressional trades or Form 4 filings, tag every day where one fired as a signal day, run it through the same backtester they use for RSI crossovers, and get a number that looks fine and means almost nothing. The problem is that a filing is not a state you are in. It is a thing that happened at a timestamp, and everything interesting about it lives in the window right around that timestamp. If your tooling cannot align returns to the event and measure what happened relative to a benchmark, you are not testing the signal, you are testing the calendar.
Event study methodology is the boring academic name for the right tool here. It has been used to measure the effect of earnings surprises and merger announcements for decades, and it happens to be exactly what you want for a disclosure feed. The core idea is simple. Pick the moment the event became actionable, line up every event on that shared reference point, and ask how the stock moved from there compared to how it should have moved if nothing had happened.
Getting the event time right is most of the work
Before any math, you have to decide what time you are aligning to, and this is where disclosure signals get you. There are usually two timestamps and they are not close together. There is the transaction date, when the member of Congress or the insider actually traded, and there is the disclosure date, when the filing hit the public record. For congressional trades that gap can run weeks. You cannot trade on information you did not have yet, so your event time has to be the moment you could have acted, which is the disclosure timestamp, not the trade. I have seen backtests that quietly align to the transaction date, and they look spectacular because they are reading the news before it was printed.
Call the event moment day zero. Everything else is measured in trading days relative to it. Day minus one is the session before, day plus five is a week after. You want returns in a window around zero, something like minus five to plus twenty, so you can see both the run-up before the public knew and the drift after.
Abnormal returns, not raw returns
A stock going up 3 percent the day after a filing tells you nothing on its own if the whole market went up 3 percent that day. What you want is the piece of the move that the event might actually explain, which means subtracting off what the stock would have done anyway. That leftover is the abnormal return.
The clean way to get it is to estimate the stock's normal behavior over a window well before the event, the estimation window, usually a few months ending some days before day zero so the event itself does not contaminate it. Fit a simple relationship between the stock and a benchmark over that window. A market model regression against a broad index is standard, and it gives you an alpha and a beta. Then for each day in your event window, the abnormal return is the actual return minus what the model predicted from the benchmark's return that day. If you do not want to fit a regression, a decent shortcut is market adjusted returns, where you just subtract the benchmark return outright and assume beta is one. It is cruder but it survives contact with reality.
Here is the whole loop, per event:
- Fix day zero at the disclosure timestamp, mapped to the next tradeable session if it landed after the close or on a weekend.
- Grab the estimation window, say 120 trading days ending 10 days before day zero, and fit the stock against your benchmark.
- For each day in the event window, compute the abnormal return as actual minus predicted.
- Sum the abnormal returns across the window to get the cumulative abnormal return, the CAR, for that event.
The CAR is the number you actually care about. It is how much the stock outran or lagged its benchmark over the horizon, cleaned of the market's own move. Average the CAR across all your events and you get the average cumulative abnormal return, which is the honest answer to whether the feed carries alpha and over what horizon it shows up.
Clustered events will lie to you
The assumption underneath all of this is that your events are independent. In disclosure data they are frequently not. When a bill moves or a sector catches a bid, a dozen members file trades in the same names within the same week, and a batch of insiders at the same company file on the same day. If you treat those as separate independent observations, your averages get dominated by a handful of correlated clusters, and your confidence in the result is wildly overstated because you have far fewer real bets than your event count suggests.
A few ways to keep this honest. Deduplicate at the name and week level so five filings on the same ticker in the same window count as one event, not five. When you compute significance, remember that overlapping event windows on correlated names are not independent draws, so lean on the cross sectional spread of your CARs rather than trusting a naive standard error. And always look at the distribution, not just the mean. A positive average CAR driven by two enormous winners and thirty flat outcomes is a very different signal from one where most events drift the same direction a little. The median CAR and the hit rate, the share of events with positive CAR, tell you which world you are in.
Reading the curve
Once you have average CAR plotted across the event window, the shape tells you almost everything. A jump concentrated on day zero and day plus one that then flattens means the market priced the disclosure fast and there is nothing left for you. A slow steady drift from day zero out to day fifteen or twenty means the information diffuses slowly and there is a tradeable horizon, and now you know roughly how long to hold. A run-up that happens entirely before day zero and reverses after is the ugly case, it usually means the move was already in the price by the time the filing went public, and you are looking at leakage, not opportunity.
The practical output of the whole exercise is one sentence you can say out loud. This feed produces a positive abnormal return of roughly this size, showing up over roughly this many days, on roughly this fraction of events. If you cannot fill in that sentence with numbers you would bet on, the feed does not have tradeable alpha yet, and no amount of position sizing fixes that. When we wire a new disclosure source into Blockcircle, this event study pass is the gate it has to clear before it goes anywhere near execution. It is unglamorous and it kills more signal ideas than it saves, which is the point.