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 price per share
  • Ownership Changes: Post-transaction holdings
  • Filing Links: Direct links to SEC 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")
df = fb.insider_transactions.ticker("AAPL", as_dataframe=True)
print(df)

For complete code examples in Python, JavaScript, C++, Rust, and cURL, see the API Reference.

Plot insider transactions on a price chart with the built-in SDK chart. You must supply your own price data:

from finbrain import FinBrainClient
import yfinance as yf
fb = FinBrainClient(api_key="YOUR_API_KEY")
# Provide your own price data
price_df = yf.download("NVDA", start="2024-01-01", end="2025-01-01")
# One-line interactive chart with buy/sell markers on price
fb.plot.insider_transactions("NVDA", 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(symbols, days=30, min_value=100000):
"""Find symbols 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 symbol in symbols:
try:
df = fb.insider_transactions.ticker(
symbol, date_from=date_from, date_to=date_to,
as_dataframe=True
)
purchases = df[
(df["transactionType"] == "Buy") &
(df["totalValue"] >= min_value)
]
if not purchases.empty:
total_value = purchases["totalValue"].sum()
results.append({
"symbol": symbol,
"purchases": len(purchases),
"total_value": total_value
})
except Exception:
continue
return sorted(results, key=lambda x: x["total_value"], reverse=True)
# Scan tech stocks
tech_symbols = ["AAPL", "MSFT", "GOOGL", "AMZN", "NVDA", "META", "TSLA"]
purchases = scan_insider_purchases(tech_symbols)
for p in purchases:
print(f"{p['symbol']}: {p['purchases']} purchases, ${p['total_value']:,.0f}")

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

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
def detect_cluster_buying(symbol):
"""Detect cluster buying (multiple insiders buying)"""
df = fb.insider_transactions.ticker(symbol, as_dataframe=True)
purchases = df[df["transactionType"] == "Buy"].copy()
# Group by month
purchases["month"] = purchases.index.to_series().str[:7] # YYYY-MM
clusters = []
for month, group in purchases.groupby("month"):
unique_insiders = group["insider"].unique()
if len(unique_insiders) >= 2:
clusters.append({
"period": month,
"insiders": list(unique_insiders),
"total_value": group["totalValue"].sum()
})
return clusters
clusters = detect_cluster_buying("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(symbol):
"""Filter for C-suite and board member transactions"""
df = fb.insider_transactions.ticker(symbol, as_dataframe=True)
mask = df["relationship"].str.lower().apply(
lambda r: any(title.lower() in r for title in C_SUITE_TITLES)
)
return df[mask]
csuite = get_csuite_transactions("AAPL")
for date, row in csuite.iterrows():
print(f"{date}: {row['insider']} ({row['relationship']})")
print(f" {row['transactionType']} ${row['totalValue']:,.0f}")