Insider Transactions Dataset
Track executive purchases, sales, option exercises, and ownership changes from SEC Form 4 filings. Insider transactions are among the most predictive alternative data signals for equity returns.
What’s Included
Section titled “What’s Included”The Insider Transactions dataset provides:
- Transaction Details: Buy, sell, option exercise, and gift transactions
- Insider Information: Name, title, and relationship to company
- Share Data: Number of shares and transaction price
- Ownership Changes: Post-transaction holdings
- Filing Dates: Transaction date and SEC filing date
- Direct SEC Links: Links to original Form 4 filings
Coverage
Section titled “Coverage”| Filing Type | Description | Update Frequency |
|---|---|---|
| Form 4 | Changes in beneficial ownership | Real-time |
| Form 3 | Initial statement of ownership | Real-time |
| Form 144 | Notice of proposed sale | Real-time |
Transaction Types & Signals
Section titled “Transaction Types & Signals”| Type | Description | Signal |
|---|---|---|
| Purchase | Open market buy | Bullish - insiders buying with their own money |
| Sale | Open market sell | May be neutral (planned sales) or bearish |
| Option Exercise | Stock option converted to shares | Neutral - compensation related |
| Gift | Shares donated | Neutral |
| Automatic | 10b5-1 plan execution | Neutral - pre-planned |
Quick Start
Section titled “Quick Start”from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
# Get insider transactions as DataFramedf = fb.insider_transactions.ticker("S&P 500", "AAPL", as_dataframe=True)print(df.head())For complete code examples in Python, JavaScript, C++, Rust, and cURL, see the API Reference.
Visualization
Section titled “Visualization”Plot insider transactions on a price chart using the Python SDK. Since FinBrain doesn’t provide historical prices, you must supply your own price data:
from finbrain import FinBrainClientimport yfinance as yf
fb = FinBrainClient(api_key="YOUR_API_KEY")
# Load price data (example using yfinance)price_df = yf.download("NVDA", start="2025-10-01", end="2026-01-30")
# Plot insider transactions overlaid on price chartfb.plot.insider_transactions("S&P 500", "NVDA", price_data=price_df)
Use Cases
Section titled “Use Cases”Insider Purchase Scanner
Section titled “Insider Purchase Scanner”Build a scanner to find stocks with significant insider buying:
from finbrain import FinBrainClientfrom datetime import datetime, timedelta
fb = FinBrainClient(api_key="YOUR_API_KEY")
def scan_insider_purchases(tickers, days=30, min_value=100000): """Find tickers with significant insider purchases""" date_from = (datetime.now() - timedelta(days=days)).strftime("%Y-%m-%d") date_to = datetime.now().strftime("%Y-%m-%d")
results = []
for ticker in tickers: try: data = fb.insider_transactions.ticker( "S&P 500", ticker, date_from=date_from, date_to=date_to )
purchases = [ t for t in data.get("insiderTransactions", []) if t["transaction"] == "Buy" and t["USDValue"] >= min_value ]
if purchases: total_value = sum(p["USDValue"] for p in purchases) results.append({ "ticker": ticker, "purchases": len(purchases), "total_value": total_value }) except Exception as e: continue
return sorted(results, key=lambda x: x["total_value"], reverse=True)
# Scan tech stockstech_tickers = ["AAPL", "MSFT", "GOOGL", "AMZN", "NVDA", "META", "TSLA"]purchases = scan_insider_purchases(tech_tickers)
for p in purchases: print(f"{p['ticker']}: {p['purchases']} purchases, ${p['total_value']:,.0f}")Cluster Buying Detection
Section titled “Cluster Buying Detection”Detect when multiple insiders are buying - a stronger bullish signal:
from finbrain import FinBrainClientfrom collections import defaultdict
fb = FinBrainClient(api_key="YOUR_API_KEY")
def detect_cluster_buying(market, ticker): """Detect cluster buying (multiple insiders buying)""" data = fb.insider_transactions.ticker(market, ticker)
purchases = [ t for t in data.get("insiderTransactions", []) if t["transaction"] == "Buy" ]
# Group by month monthly = defaultdict(list) for p in purchases: month = p["date"][:7] # YYYY-MM monthly[month].append(p)
# Find months with multiple buyers clusters = [] for month, txns in monthly.items(): unique_insiders = set(t["insiderTradings"] for t in txns) if len(unique_insiders) >= 2: clusters.append({ "period": month, "insiders": list(unique_insiders), "total_value": sum(t["USDValue"] for t in txns) })
return clusters
clusters = detect_cluster_buying("S&P 500", "AAPL")for c in clusters: print(f"{c['period']}: {len(c['insiders'])} insiders, ${c['total_value']:,.0f}")C-Suite Tracking
Section titled “C-Suite Tracking”Focus on CEO, CFO, and board member transactions - often the most informed insiders:
from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
C_SUITE_TITLES = [ "Chief Executive Officer", "CEO", "Chief Financial Officer", "CFO", "Chief Operating Officer", "COO", "President", "Director", "Chairman"]
def get_csuite_transactions(market, ticker): """Filter for C-suite and board member transactions""" data = fb.insider_transactions.ticker(market, ticker)
csuite = [ t for t in data.get("insiderTransactions", []) if any(title.lower() in t["relationship"].lower() for title in C_SUITE_TITLES) ]
return csuite
csuite = get_csuite_transactions("S&P 500", "AAPL")for t in csuite: print(f"{t['date']}: {t['insiderTradings']} ({t['relationship']})") print(f" {t['transaction']} ${t['USDValue']:,.0f}")Related Resources
Section titled “Related Resources”- Insider Transactions API Reference - Endpoint details, parameters, and response schema
- Building an Insider Trading Scanner - Step-by-step guide
- Congressional Trading Data - Track politician trades
- Python SDK Documentation