Insider Cluster Buying: Why Three Insiders Buying Beats One
One director buying shares can mean many things: confidence, a bonus being invested, a gesture after bad news, or a board policy that executives must hold stock. When three different insiders at the same company buy within a few weeks, the explanations narrow. That pattern is called a cluster buy, and it is one of the oldest ideas in insider-trading research.
The definition we use
A deal is part of a cluster when at least three distinct persons made a market purchase at the same company within 30 days, counting back from the deal's own date and including it. Each person counts once, however many purchases they make.
What counts as a purchase matters more than the window:
- Only market purchases (
transaction_type = BUY). Share awards, option exercises, plan purchases and subscriptions in a share issue don't count. They are not discretionary decisions to buy at the market price. - The 30 days run on the transaction date, not the publication date. A late filing still joins the cluster it belongs to.
The signal built on it is stricter about the deal itself: it must be a purchase at a price (a "purchase" at zero is a delivery of shares from a plan, whatever the filing calls it), made by the PDMR personally rather than by a closely associated person.
What happened next
We looked at every market purchase at a price by a PDMR in our archive with at least 120 trading sessions of price history after the deal: 63,525 transaction lines at 2,583 companies in 17 countries, dealt between November 2013 and April 2026. For each line, we took the share's adjusted return from the deal date to 60 and 120 sessions later.
| Buys | Lines | Median return, 60 sessions | Share up after 60 | Median return, 120 sessions | Share up after 120 |
|---|---|---|---|---|---|
| Part of a cluster (3+ buyers) | 29,050 | +1.62% | 55.0% | +2.71% | 56.3% |
| Only buyer in 30 days | 22,457 | +0.66% | 51.5% | +0.64% | 51.0% |
| All buys | 63,525 | +1.29% | 53.5% | +1.92% | 54.1% |
Cluster buys did better on both measures: a median four times higher after 120 sessions, and a rise in 56% of cases against 51%.
Before you build a strategy on this, read the caveats:
- Raw returns, not excess returns. These figures are not adjusted for the market. Shares rose on average over the period, and after insider sells the median 120-session return was +1.18%. The useful comparison is between the rows, not against zero.
- Lines, not decisions. A filing with five executions counts five times, and a cluster contributes every one of its lines.
- Survivorship. Shares that were delisted have no price series and drop out.
- Coverage. Only deals with a usable price series and 120 elapsed sessions are included: a little over half of all buys.
It is a description of the past, not a forecast.
Finding cluster buys
The cluster_buy preset returns every purchase that is part of a cluster, newest first, scored with the other components of an insider buy (CEO or CFO buyer, deal size against the company's usual deals, and so on):
curl "https://api.duceusapi.com/signals?preset=cluster_buy&limit=20" \
-H "Authorization: Bearer YOUR_API_KEY"
Each result carries the feature that triggered it:
{
"preset": "cluster_buy",
"score": 65,
"evidence": ["ceo_cfo", "cluster_buy", "big_ticket"],
"features": { "cluster_buyers_30d": 4, "value_vs_issuer_median": 3.8 },
"transaction": { "issuer_name": "…", "person_role": "CEO", "transaction_type": "BUY" }
}
For one company, /issuers/{id}/insider-activity reports whether a cluster buy is under way, along with net buying over 30, 90 and 180 days.
To run it yourself in Python and group the results by company:
import os
from collections import defaultdict
import requests
response = requests.get(
"https://api.duceusapi.com/signals",
headers={"Authorization": f"Bearer {os.environ['DUCEUS_API_KEY']}"},
params={"preset": "cluster_buy", "limit": 200},
timeout=30,
)
response.raise_for_status()
clusters = defaultdict(set)
for row in response.json()["items"]:
deal = row["transaction"]
clusters[deal["issuer_name"]].add(deal["person_id"])
for issuer, buyers in sorted(clusters.items(), key=lambda item: -len(item[1])):
print(f"{issuer}: {len(buyers)} insiders")
Summary
- A cluster buy is three or more distinct insiders buying the same company's shares at market within 30 days.
- Count market purchases only: no awards, exercises, plan purchases or share-issue subscriptions.
- In our European archive, cluster buys were followed by a median +2.71% over 120 sessions, against +0.64% for lone buyers, before any market adjustment.
GET /signals?preset=cluster_buylists them as they are filed.