Skip to content

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.

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
Filing TypeDescriptionUpdate Frequency
Form 4Changes in beneficial ownershipReal-time
Form 3Initial statement of ownershipReal-time
Form 144Notice of proposed saleReal-time
TypeDescriptionSignal
PurchaseOpen market buyBullish - insiders buying with their own money
SaleOpen market sellMay be neutral (planned sales) or bearish
Option ExerciseStock option converted to sharesNeutral - compensation related
GiftShares donatedNeutral
Automatic10b5-1 plan executionNeutral - pre-planned
from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
# Get insider transactions as DataFrame
df = 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.

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 FinBrainClient
import 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 chart
fb.plot.insider_transactions("S&P 500", "NVDA", price_data=price_df)
Insider Transactions Chart
NVDA insider transactions overlaid on price chart

Build a scanner to find stocks with significant insider buying:

from finbrain import FinBrainClient
from 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 stocks
tech_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}")

Detect when multiple insiders are buying - a stronger bullish signal:

from finbrain import FinBrainClient
from 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}")

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}")