Skip to main content

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 codeBucketed 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:

The chip is then classified as:

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

8. Changelog

DateChange
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.