Insider Radar
Documentation
What company insiders do with their own money. Insider Radar reads every SEC Form 4 filing transaction by transaction and does the one thing an insider screen has to do to be worth anything: separate real conviction from mechanical noise. A compensation grant is not a purchase and a tax-withholding event is not a sale — quarantining them is what leaves the handful of genuine conviction events visible.
What is Insider Radar?
Every officer, director and 10% owner of a US-listed company must report their own trades in that company’s stock on SEC Form 4, within two business days. It is the most timely disclosure in US markets — and the most misread, because the form makes no distinction in prominence between a chief executive spending two million dollars of their own money and the same executive having a few hundred shares clipped to cover the tax on a vesting grant.
Insider Radar is a daily pipeline and dashboard over those filings with a single job: tell the two apart. Most “insider buying” screens are worthless because they count a compensation grant (code A) as a purchase and a tax-withholding event (code F) as a sale. Insider Radar quarantines the routine flow and labels it, so what is left is small, legible and actually a decision somebody made.
Only open-market purchases at a market price survive the gate. Grants, exercises, gifts, conversions and tax withholding are set aside and labelled, not deleted and not counted.
Cluster detection: distinct insiders buying the same issuer inside a rolling 30-day window. Several people independently reaching the same conclusion is the strongest documented insider signal.
A 0–100 conviction score over six factors — cluster breadth, size against the insider's own prior stake, role seniority, dollar size against market cap, that person's track record and the price context. The full breakdown is on the row.
Per-insider hit rate and average forward return on their own past gated buys, measured on adjusted closes at 30, 90 and 180 days, minimum-sample gated.
Insider Radar vs. the other two. Fund Tracker reads Form 13F and ETF X-Ray reads Form N-PORT — both are quarterly positions, what a manager or a fund held on one date. Form 4 is a transaction: a named person, a date, a price and a reason code, filed within two business days. It is the only one of the three that tells you what somebody did rather than what they were left holding.
Where does the data come from?
All transaction data is SEC Form 4, retrieved through sec-api.io’s Insider Trading API. The response is fully structured JSON, so there is no XML parsing step and no bespoke schema guessing — the failure mode of hand-rolled Form 4 parsers is a silently mis-mapped footnote, and this avoids the category entirely. A separate pipeline transforms and scores the filings and publishes into a database that only this site’s server reads. Your browser never talks to the warehouse directly.
Every comparable screen filters out small companies, usually for liquidity reasons. Insider Radar deliberately does not. Microcap insider buying is historically the strongest insider signal — a chief financial officer at a $60m company knows more, relative to what the market knows, than one at a $600bn company. A cap floor removes exactly the observations the product exists to surface. The market-cap band is available as a filter instead, so the reader chooses rather than the pipeline.
The unit of storage is the transaction leg, not the filing. One Form 4 routinely reports several transactions of different codes on the same day — an option exercise, the sale that funded it, and the shares withheld for tax. Collapsing that to one row per filing destroys the signal: the filing has no single code, no single price and no single direction, so any summary of it is a fiction. 174,852 filings carry 406,606 legs, and it is the legs that are classified, scored and counted.
The pipeline runs once a day at 22:30 ET, Monday to Friday. That looks unnecessarily late until you watch EDGAR: it accepts Form 4 filings through the evening, and an early-evening run consistently misses the tail of the day’s filings — which then arrive a day late and out of order. One run after the window closes is simpler and more complete than two runs that overlap.
Step-by-step guide
It is the default tab and it is the product. Every row is already a gated open-market purchase, ranked by conviction score in the database — so the top of the list is the answer, not the most recent filing.
The filter card above the tabs holds the lookback in days, a minimum score, a minimum score coverage, a sector and a clusters-only switch. Ninety days is the default because a 90-day forward horizon needs a comparable lookback to be readable.
Score coverage is the share of the scoring weight that was actually measurable for that row. Partially-covered rows are rescaled, and rescaling inflates them — see the conviction score below. For a like-for-like ranking, filter to full coverage.
Clicking a row expands it in place to the full factor attribution: every factor, its points, its maximum and whether its inputs were available. A score you cannot take apart is a score you should not use.
Either one opens the drill-through drawer, which shows the whole reported history for that issuer or that person — including the quarantined flow. This is the context the ranked feed cannot show.
It is the quarantine made explicit: every reported leg in the window sorted into what it signifies, with a plain-English meaning per bucket and a transaction-code explainer. It is the fastest way to understand why the feed is so much smaller than the filing count.
The search box in the page header queries the whole issuer master and opens the same drawer. You do not need the company to be in the current window or above the current score threshold.
A tab you have not opened costs nothing. Loading the page issues one universe-stats call — usually zero, because the server seeds it into the first paint — plus one call for whichever tab is open. The sector-flow rows are fetched once and shared, because the sector filter is built from the labels they contain, so opening Sector flows issues no request at all.
Transaction codes, and what counts as noise
Every leg on a Form 4 carries a transaction code in Table I or Table II. The codes are the whole taxonomy, and two of them are the reason naive screens are wrong in both directions at once.
The code alone is not enough. Three cross-cutting rules override it, and each exists because the literal reading of the code would have been wrong.
An exercise followed by a sale of the same shares, by the same owner at the same issuer on the same date, is collapsed into one exercise_and_sell event. Read literally it is a sale, and it would print as insider selling. It is not a view on the price — it is somebody monetising compensation, which is what stock compensation is for. Paired, labelled, quarantined.
If the filing carries the aff10b5One flag, the leg is bucketed as planned_10b5_1 regardless of its code — including code P. The trade executed on a schedule set out in a plan adopted months earlier, so it carries no information about the insider's view today. This override wins over everything else on this page, because a scheduled purchase is not a decision to purchase now.
A routineness detector flags a leg when, for the same insider at the same issuer over a trailing twelve months, there are four or more prior purchases AND a regular cadence AND a uniform size. That shape is a standing arrangement — a DRIP or an ESPP-style monthly deduction — not a judgement about the price. It is reported as routine and excluded from the feed, and the noise panel prints how many legs it caught.
Quarantined is not deleted. Every classified leg stays in the warehouse and stays visible in the noise panel and the drill-through drawer. The point is not to hide the routine flow — it is roughly everything, and a reader who does not see it will not believe the feed. The point is that it is labelled, so it is never mistaken for a decision.
The conviction score
The score is a 0–100 ranking of open-market purchases. It is not a price target and it is not a probability — it is an ordering, so that a reader with two hundred buys in a window reads the twenty that carry the most information first.
A leg is scoreable only if all four hold: the code is P, the trade was on the open market, it is not a 10b5-1 plan execution, and it is not routine.
Fail the gate and the score is NULL, not 0, and the leg does not appear in the feed at all. This is the distinction the whole product turns on: a grant is not a low-conviction event that belongs at the bottom of the ranking, it is not a conviction event. Sorting it to the bottom with a zero would imply it is on the same scale as a real buy, and would let it drift up the list the moment somebody sorted by a different column.
Every factor's points, maximum and availability are stored with the row and shown in the UI, expandable per signal. A score a portfolio manager cannot audit is a score a portfolio manager will not trust, and rightly — an opaque 0–100 is indistinguishable from a number somebody made up.
Where a factor's inputs do not exist, the factor is marked unavailable and dropped from the denominator entirely. The score is computed over the weight that WAS available and rescaled to 0–100, and score_coverage reports what fraction of the weight that was. Scoring it zero would punish an issuer for a gap in our data rather than for anything the insider did.
If less than half the weight could be measured, the score is NULL rather than a low number. Assembling a 0–100 ranking out of 30 points of evidence is not a cautious estimate; it is inventing a number and then dressing it in two significant figures.
Rescaling has a cost, and here it is. Dividing by a smaller denominator inflates a partially-covered row. It is worse than a generic rounding concern, because the two price-dependent factors — price context and track record, 25 of the 100 points between them — are exactly the ones a weak buy scores lowest on. So a signal at an issuer with no price history can outrank a fully-measured buy that genuinely scored badly, purely because the evidence against it was never gathered.
The dashboard therefore exposes score coverage as a column and as a filter. Set it to 100% whenever you are comparing scores against each other; leave it open only when you are browsing.
One more explicit fallback: where an insider has too few matured prior buys to measure, the track-record factor applies a documented neutral prior— half of the factor’s weight — and labels itself as having done so. That is preferable to both alternatives: a zero would treat an unknown history as a bad one, and a fabricated figure would be worse than either.
The five panels
The default tab and the product. One row per gated, scored open-market purchase, ordered by conviction score in SQL. Each row expands in place to the full factor attribution; clicking the issuer or the insider opens the drill-through drawer. Column sorting reorders the returned set, and the footer says so — the server chose those rows BY SCORE, so re-sorting by dollar value gives you the largest of the highest-scoring buys, not the largest buys.
Issuers where two or more distinct insiders bought inside a 30-day window, with the role mix and the aggregate dollars. This is the panel to open first if you only have a minute: breadth is the heaviest factor in the score for a reason.
The quarantine, made explicit. Every reported leg in the window grouped by bucket, with a plain-English “what this signifies” line per bucket that comes from the warehouse rather than the UI, plus the transaction-code explainer. Bars are scaled to the largest bucket in the response and the footer states it.
Per-person hit rate and average forward return on their own past gated buys, sortable, and gated on a minimum sample the reader sets. Somebody with two prior buys has no track record, and the panel declines to imply otherwise.
Net insider dollars by sector and month as a hand-rolled heatmap — no charting library, because rows are sectors and columns are months. Filterable by market-cap band. Cells absent from the data are hatched rather than tinted palest, because “nobody bought here” and “we have no data here” are different facts.
The drill-through drawer shows the quarantine too, on purpose. Click any issuer or insider and the drawer reports the whole reported flow, routine legs included. An executive whose only prior activity is an annual grant and the tax withheld on it is a different proposition from one who has bought every drawdown for three years — and the ranked feed, which by construction contains only gated buys, shows you neither history. The score tells you about one event; the drawer tells you about the person.
Forward returns and prices
Every scoreable leg is measured forward at 30, 90 and 180 days, on adjusted closes. Those returns feed the track-record factor and the track-record panel, so two decisions about them matter more than they look.
The pipeline reads adjcloserather than the raw close. The usual justification for that is splits — and here it would be wrong. This endpoint’s unadjusted close is already fully back-adjusted for splits, so reading the wrong field produces no split cliff at all. There is no obvious break in the series to catch the mistake.
What it produces instead is a silent few-percent-a-year drag concentrated entirely in dividend payers — the missing total return. That is much worse than a visible break, because it is systematic: it would rank insiders at value names, utilities and banks below insiders at non-payers, purely as an artefact of the field name. The measured gap on this data is 12.28% for XOM over three years.
Every scoreable leg carries one row per horizon, and that row either has a return or a status explaining its absence. It never has both, and it never has neither.
None of those is 0%. Recording a delisting as a flat outcome is the single most damaging shortcut available here: it makes acquisitions and bankruptcies both disappear into the middle of the distribution, and it biases the whole backtest exactly where the information is most valuable — because a takeover at a premium and a wipeout are the two outcomes an insider is most likely to have seen coming.
Two CHECK constraints make the mistake unrepresentable rather than merely discouraged: a non-ok status carrying a number, and an ok status carrying none, are both rejected — in the local store and in Postgres.
Price coverage is 2,482 of 2,538 tickers (97.8%). Every ticker that could not be priced is recorded with a reason and none is dropped, so the gap is countable rather than invisible.
Limitations and known gaps
These are documented here as prominently as the features, because most of them look like bugs to a reader who has not been told, and a caveat you can see is worth more than a figure you cannot check.
Twelve months of history is a small sample, and the weights are not tuned. At a 90-day horizon, twelve months yields only a few non-overlapping observations per person. The six scoring weights are a documented first cut and have deliberately not been fitted, because fitting six weights to twelve months of history at a 90-day horizon is fitting noise and then reporting the fit as evidence. Read the score as an ordering to triage by, not as a calibrated forecast.
Section 16 requires every person with a pecuniary interest to file separately, so a single fund purchase can arrive as ten Form 4s — a partnership plus nine partners, identical date, identical share count, identical price. Counting those as ten insiders would manufacture a cluster out of one decision, and cluster breadth is the heaviest factor in the score.
Cluster breadth therefore counts decision units, collapsing legs that match on date, shares and price. 458 such groups exist, covering 1,155 of 21,212gated legs. The consequence is worth stating plainly: somebody cross-checking a cluster against EDGAR will count more filings than the dashboard’s insider count shows. That is the collapse working, not a discrepancy.
The dollar-size factor divides by the LATEST reported shares outstanding. For a company that has issued heavily since the purchase, the denominator is too large and the factor understates the buy. Separately, 372 of 2,693 scoreable issuers have no float data at all; that is recorded as unknown and never as zero — a zero denominator would hand those issuers a maximum score on the factor, which is the opposite of the truth.
The literal strings, in the tradingSymbol field. Most are genuinely unpriceable — interval funds, non-traded REITs, BDCs — and are recorded as having no ticker. But 29 were real listed companies whose filer simply left the field blank or filled it with a placeholder, and those were recovered through the Mapping API rather than written off.
One live filing reports a transaction date in 2036 — that is present in the original SEC submission, not introduced here. Another reports a transaction from 2002 filed in 2026, twenty-four years late. Both are detected and given their own status rather than silently trusted or silently dropped. Filers make errors, and the errors reach the public record.
Form 4/A amendments restate history. A superseded filing's legs are MARKED as superseded, never deleted, so the correction stays auditable and the original stays inspectable. A figure moving between visits is an amendment, not a sync bug.
A dollar value is not computable for every instrument. For debt and convertible securities, Form 4 reports the PRINCIPAL in the shares field and sometimes the same principal again in the price field, so a naive shares × price is meaningless — it would print a number several orders of magnitude wrong and look plausible. Those values are recorded as unavailable and rendered as a dash, rather than published as a figure nobody could defend.
Important limitations
The filings are facts. The classification, the cluster detection and the score are a model. A Form 4 is a disclosure: a person, a date, a code, a price. Everything Insider Radar adds on top — which bucket a leg belongs in, whether two purchases are one decision, whether a code P is routine, and what the conviction score is — is our interpretation of that disclosure, not part of it.
Insider purchases are not predictions. Insiders are better informed about their own company than the market is. They are not better informed about the market, the sector or the macro environment, and they are frequently early. A high conviction score means a well-placed person made a real decision with their own money — nothing more.
Insider Radar is provided for informational and research purposes only. Nothing in it constitutes investment advice, a recommendation to buy, sell or hold any security, a solicitation or an offer.
The conviction score, the cluster detection, the routineness verdict and the track-record figures are formulas applied to filed data. The full factor breakdown is shown beside every score. They are not judgements about any company or any person.
Form 4 data is used as filed. An error in the original filing — a wrong date, a placeholder ticker, a principal amount in the price field — is reproduced faithfully, flagged where it is detectable, and corrected only when the filer amends.
Every row links to its Form 4 on EDGAR. Before acting on any figure here, open the filing and read it, including the footnotes — the footnotes routinely carry the reason a transaction happened, and no structured field captures that.
Rock Group makes no representations or warranties as to the accuracy, completeness or timeliness of any data on this page or in the product.
Original filings are public. Look any of them up on SEC EDGAR by company name, insider name or CIK and compare.
Rock Group · Insider Radar Documentation · Last updated September 2026
Questions? Contact us