Cluster detection counts several insiders acquiring stock in the same company inside a short window. Compensation delivers stock to several insiders in the same company inside a short window, several times a year, on a schedule fixed long in advance. Unless the counter explicitly excludes the compensation codes, the two are indistinguishable at the row level, and a meaningful share of what any breadth-based screen surfaces is the annual grant and vest calendar wearing the costume of a coordinated purchase.
This is not a subtle data quality issue that costs a few basis points. It is a contaminant with a very specific structure, and the structure is what makes it dangerous to a research process rather than merely annoying.
The vest calendar is a cluster generator
Grants are approved by a compensation committee at a meeting, so a cohort of executives receives code A acquisitions within days of each other. Restricted stock vests on anniversaries that are common across a hiring cohort, generating code M or code A rows in the same week year after year. Tax withholding on those vests produces code F rows on the same dates. Option expiry concentrates code M exercises into the months before options run out.
Every one of those events puts multiple insider names against the same issuer inside a window of days. None of them involves anyone deciding anything. The Insider Alpha coverage list is explicit that open-market buys, open-market sells, option exercises and 10b5-1 plan sales all arrive through the same feed, which is the correct behaviour for a filings source. It also means the separation is your responsibility at the query layer, and it means you should verify what any tool's definition of a buy includes before you build on top of it rather than assuming the exclusion has been done for you.

Why these false positives do not diversify away
The standard defence against noisy signals is that errors are random and average out across a portfolio. That argument fails completely here, for three reasons.
The errors are correlated in time. Grant and vest cycles cluster in particular calendar weeks, typically around fiscal year ends and annual meeting dates. A strategy contaminated this way will take on positions in bursts, so your exposure spikes in the same weeks every year and your realised turnover has a seasonal shape nobody designed.
They are correlated in the cross section. Companies with similar compensation structures, which usually means similar sector, size and maturity, share a vest calendar shape. Your contaminated signal will therefore over-select the same kind of company, and whatever factor exposure that implies arrives without ever appearing in your factor model as an intentional tilt.
And they are persistent per name. The same issuer generates the same false cluster every year, so a backtest sees the same contaminated observations repeatedly and treats them as independent evidence. That inflates apparent sample size, which is the specific failure mode that makes a spurious result look statistically respectable.
The exclusion predicates, stated concretely
Write these into the query that builds the cluster candidate set rather than applying them in review. Review is a person and predicates are not.
- Transaction code equal to P. Nothing else counts toward a breadth number. Codes A, M, F, D, C, X, I, G, L, J, K, U, W and Z are all excluded from the count. If you want any of them, add them back individually with a written reason.
- Reported price strictly greater than zero, and not equal to the derivative security's exercise price on any related row in the same filing. A zero price acquisition is not a purchase and an acquisition at the strike is an exercise regardless of what the code column claims.
- Net beneficial ownership must increase across the entire filing, not on the single row that triggered the match. Compute the change from the shares owned following transaction figures across every row, so an exercise and same day sale nets correctly to zero or negative.
- Collapse reporting owners to people. An insider, their spouse's account and a trust they control are one filer for breadth purposes. Duplicate counting inflates the count precisely where the underlying independence is weakest.
- Exclude issuers where the candidate window overlaps a known grant or vest concentration for that issuer, at minimum as a flag rather than a hard drop, since your own history tells you which weeks those are.
The exercise and sell pair, which is the expensive one
Of all these, the case that reaches a portfolio most often is the code M and code S pair filed together. The insider exercises options well below market and sells the resulting shares immediately. Two rows, one filing, one event, and the economic reality is that the insider converted an option into cash and now has less exposure to the equity than they did that morning.
A pipeline that scores rows independently books the M leg as an acquisition, often a very large one, because exercises are typically much larger than open-market purchases. So the day an executive reduced their exposure gets recorded as the day they made a seven figure investment. If several of them do it in the same week, which they will, because expiry and window timing are shared, you have manufactured a large, high-conviction-looking cluster out of an event with the opposite sign.
The net beneficial ownership predicate above catches this, which is why it belongs in the query and not in a checklist. Row-level scoring cannot catch it by construction.
Diagnostics that will tell you if you are leaking
Two histograms, both cheap, both worth running on any cluster set before it drives capital.
First, plot the transaction code distribution of every row inside your accepted clusters. If the set is clean it is entirely code P. Anything else in that chart is a leak, and the size of the bar tells you how big.
Second, plot your cluster start dates by ISO week over several years. A genuine signal driven by valuation and business developments should be reasonably spread. If the distribution has hard spikes in the same handful of weeks each year, you are looking at a compensation calendar rather than an opinion, and no amount of parameter tuning on window length will fix it.
Run both again after any change to the ingest, because a parser change that starts populating a previously empty field can silently alter which rows match.
What the review committee needs to see
Version the exclusion rule set and store the version identifier with every signal your process generates. When a position is discussed after the fact, you need to be able to state which rules were in force on the day the signal fired, and to reproduce the candidate set exactly under those rules.
Alongside each cluster you act on, record the code distribution of its constituent rows and the count of distinct people after collapsing related entities. Those two fields turn an assertion into evidence. The difference between saying the process excludes option exercises and being able to show that this particular cluster contained four code P purchases by four unrelated individuals is the difference between a control you claim and a control you have.