Methodology: Insider Transactions (Form 4) Chip
What the chip says and what it means
On any stock page, near the ticker price, you may see one of four chips: INSIDERS BUYING, INSIDERS SELLING, INSIDERS FLAT, or INSIDERS — (em-dash). Each label encodes the result of a specific 90-day calculation against Form 4 filings reported to the SEC. This page documents exactly which calculation, what the thresholds are, when the chip is hidden, and when it has changed.
The chip is informational, not advice. Cluster insider buying is one input among many; insider selling can be driven by tax planning, diversification, or compensation plans rather than a negative view. Read the underlying Form 4 transactions on the insider tab before drawing a conclusion.
1. Data source
The chip reads GET /api/insiders?ticker=<T>&period=90d. The backend (routes/routes_analysis_fastapi/options_insiders.py) returns the Form 4 transactions for the ticker in the last 90 calendar days plus a float field carrying the most-recent reported shares-outstanding count from the company’s annual filing. The transactions come straight from SEC EDGAR via the platform’s Form 4 parser; no commercial data vendor sits between EDGAR and the chip.
Form 4 is the SEC’s reporting form for changes in beneficial ownership by company insiders — officers, directors, and ten-percent shareholders. It must be filed within two business days of the transaction. The chip’s 90-day window means it reflects roughly the last quarter of named-insider activity.
2. Transaction-code mapping
| Form 4 code | Bucketed as |
|---|---|
P (open-market or private purchase) | BUY |
A (grant, award, or other acquisition from the issuer) | BUY |
S (open-market or private sale) | SELL |
D (disposition to the issuer, including taxes) | SELL |
| Other codes (e.g., G gift, F tax-withholding, M option exercise) | Ignored |
Bucketing is deliberate. We do not net option-exercise (M) into buy or sell because the exercise itself is a wash and the more interesting signal is what the holder did with the resulting shares (which surfaces as a separate P or S row). We do not count gifts (G) because they don’t reflect a directional view. Tax-withholding (F) is excluded for the same reason — it’s a forced sale, not a voluntary one.
The code mapping lives in static/js/ticker-renderer.ts in _renderInsiderNetFlowChip.
3. The 1%-of-float threshold
Aggregate share counts cross the 90-day window:
buy_shares— sum of shares across all BUY-bucketed transactionssell_shares— sum of shares across all SELL-bucketed transactionsnet_shares=buy_shares−sell_shares
The chip is then classified as:
- INSIDERS BUYING if
net_shares > 0ANDbuy_shares ≥ 1% of float - INSIDERS SELLING if
net_shares < 0ANDsell_shares ≥ 1% of float - INSIDERS FLAT in every other case where float is known
Float is the count of freely-tradable shares (shares outstanding excluding restricted and insider-held blocks). The 1%-of-float threshold filters out single-employee transactions that are too small to be directionally meaningful on a company-wide basis. For a 200-million-float company, a single 15,000-share open-market buy by one director clears the threshold; a 500-share tax-withholding does not.
One percent is policy, not a tuning knob. It was chosen because it is high enough to filter routine compensation-plan activity and low enough that real cluster-buying still trips it on mid-cap and large-cap companies. The constant lives at static/js/ticker-renderer.ts as floatShares * 0.01.
4. The em-dash chip (fail-closed)
When the backend cannot determine the company’s float — usually because the most recent annual filing has not been indexed yet, or for a newly-listed ticker where shares-outstanding has not been reported — the chip renders as INSIDERS — (em-dash) rather than FLAT.
This is a deliberate visual distinction. Before 2026-04-27, a missing float silently collapsed the 1% threshold to zero, which painted every single-share net-buy as INSIDERS BUYING. The em-dash chip exists so that “we don’t know the float” reads differently than “we know the float and activity was balanced.” The aria-label and hover title on the em-dash chip carry the explanatory text.
5. Lookback window + caching
The lookback is a rolling 90 calendar days from the moment the page is loaded. Older Form 4 transactions are still readable on the insider tab; they just don’t affect the chip.
The chip caches its result for 5 minutes per ticker per browser session. A fresh fetch happens on every new ticker, on every page load after the cache expires, and on every hard refresh. The cache lives in memory only; closing the tab clears it.
6. Click behavior
Clicking the chip scrolls the page to #insider-feed-section — the table of underlying Form 4 transactions that produced the label. Keyboard users can use Enter or Space to trigger the same scroll. The chip never opens a separate page or modal; the full transactions are inline so a reader can audit the classification.
7. What we deliberately do not do
- No sentiment score on top of the chip. The label is mechanical: did transactions clear the threshold or not. We don’t layer a 1-to-10 conviction score because the underlying classification rule is already what we’d be scoring.
- No insider-by-name highlights on the chip itself. Some platforms surface “CEO bought” vs “director bought.” The chip stays aggregate; named-insider detail is one click away in the insider tab.
- No 10-percent shareholder reweighting. A 10-percent shareholder’s transactions count the same as an officer’s in the aggregate. The insider tab shows the role label per row so a reader can weight it themselves.
- No price-level information in the chip. We classify by share count, not dollar volume. A small-share, high-price transaction can clear the dollar bar without clearing the share bar; we use shares because the SEC filing’s ownership concept is share-denominated.
- No chip on ETFs. ETFs do not have insiders in the Form 4 sense; the chip is suppressed at render time for any ticker that the platform classifies as an ETF.
8. Changelog
| Date | Change |
|---|---|
| 2026-05-13 | Initial publication of this methodology page. Thresholds and behaviors mirror the active code in static/js/ticker-renderer.ts and routes/routes_analysis_fastapi/options_insiders.py as of this date. |
| 2026-05-12 | A1 (audit doc): chip became click-to-scroll to #insider-feed-section with Enter / Space keyboard parity per WCAG 2.1.1. Previously the chip carried only a hover tooltip and required users to scroll manually to find the underlying transactions. |
| 2026-04-27 | Run 1 item 5: missing-float fail-closed path made visually distinct via the em-dash chip. Before this date, a missing float silently set the threshold to zero and painted every net-buy as INSIDERS BUYING. The Run 2 follow-on hardened the contract test so the route’s float field cannot regress. |
| 2026-04-26 | Run 2 item 1: backend started surfacing shares_outstanding as float on the /api/insiders response so the frontend could compute the threshold without an extra round-trip. The underlying defect — chip computing data.float * 0.01 against an undefined float — was the original incident that motivated this entire methodology page. |
| 2026-04-26 earlier | EW-3 ship: chip introduced. 90-day window and 1%-of-float threshold are unchanged since this date. |
Source code and references
Backend route: routes/routes_analysis_fastapi/options_insiders.py (api_insiders). Frontend chip renderer: static/js/ticker-renderer.ts (_renderInsiderNetFlowChip + _applyInsiderNetFlowChip). Contract tests: tests/test_routes_insiders_contract.py (pins the float field presence and the error-response shape).
This page is subject to and should be read alongside the Editorial Standards. Corrections: editorial@oxfordledge.com.