Skip to content

Senate Trades Dataset

Access trading activity from US Senators. Track stock purchases and sales disclosed under the STOCK Act for systematic trading strategies that follow political insiders.

The Senate Trading dataset provides:

  • Senator Name: Name of the Senate member
  • Transaction Type: Purchase or Sale
  • Amount Range: Transaction size bracket as reported
  • Transaction Date: When the trade occurred
  • Historical Data: Years of senate trading history
Filing TypeDescriptionUpdate Frequency
Periodic Transaction ReportStock trades by senatorsAs filed
Annual Financial DisclosureComprehensive holdingsAnnual

Senate disclosures report amounts in ranges:

RangeMinimumMaximum
$1,001 - $15,000$1,001$15,000
$15,001 - $50,000$15,001$50,000
$50,001 - $100,000$50,001$100,000
$100,001 - $250,000$100,001$250,000
$250,001 - $500,000$250,001$500,000
$500,001 - $1,000,000$500,001$1,000,000
$1,000,001 - $5,000,000$1,000,001$5,000,000
Over $5,000,000$5,000,001N/A

Note: The amount field can be an exact value (e.g., "$360.00") or a range (e.g., "$15,001 - $50,000").

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
# Get senate trades as DataFrame
df = fb.senate_trades.ticker("S&P 500", "META", as_dataframe=True)
print(df.head())

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

Build alerts for significant senate purchases:

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
LARGE_TRADES = [
"$500,001 - $1,000,000",
"$1,000,001 - $5,000,000",
"Over $5,000,000"
]
def scan_large_senate_trades(tickers):
"""Find stocks with large senate purchases"""
results = []
for ticker in tickers:
try:
trades = fb.senate_trades.ticker("S&P 500", ticker)
large_purchases = [
t for t in trades.get("senateTrades", [])
if t["type"] == "Purchase"
and t["amount"] in LARGE_TRADES
]
if large_purchases:
results.append({
"ticker": ticker,
"trades": large_purchases
})
except Exception:
continue
return results
# Scan popular stocks
tickers = ["NVDA", "AAPL", "MSFT", "GOOGL", "AMZN", "META", "TSLA"]
alerts = scan_large_senate_trades(tickers)
for alert in alerts:
print(f"\n{alert['ticker']}:")
for trade in alert['trades']:
print(f" {trade['senator']}: {trade['amount']}")

Track trading activity of specific senators:

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
def get_senator_trades(senator_name, tickers):
"""Get all trades by a specific senator"""
trades_list = []
for ticker in tickers:
try:
trades = fb.senate_trades.ticker("S&P 500", ticker)
sen_trades = [
{**t, "ticker": ticker}
for t in trades.get("senateTrades", [])
if senator_name.lower() in t["senator"].lower()
]
trades_list.extend(sen_trades)
except Exception:
continue
return trades_list
# Track a specific senator's trades
senator_trades = get_senator_trades(
"Tuberville",
["NVDA", "AAPL", "MSFT", "GOOGL", "AMZN", "META"]
)
for trade in senator_trades:
print(f"{trade['date']}: {trade['ticker']} - {trade['type']} {trade['amount']}")

Analyze buying vs selling activity for a ticker:

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
def analyze_senate_activity(market, ticker):
"""Analyze senate trading activity for a ticker"""
trades = fb.senate_trades.ticker(market, ticker)
trade_data = trades.get("senateTrades", [])
purchases = [t for t in trade_data if t["type"] == "Purchase"]
sales = [t for t in trade_data if t["type"] == "Sale"]
return {
"ticker": ticker,
"total_trades": len(trade_data),
"purchases": len(purchases),
"sales": len(sales),
"buy_sell_ratio": len(purchases) / len(sales) if sales else float('inf'),
"senators": list(set(t["senator"] for t in trade_data))
}
analysis = analyze_senate_activity("S&P 500", "META")
print(f"Total trades: {analysis['total_trades']}")
print(f"Purchases: {analysis['purchases']}, Sales: {analysis['sales']}")
print(f"Buy/Sell Ratio: {analysis['buy_sell_ratio']:.2f}")

Find stocks where multiple senators are buying:

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
def find_cluster_buying(ticker, min_buyers=2):
"""Find if multiple senators are buying a stock"""
trades = fb.senate_trades.ticker("S&P 500", ticker)
purchases = [
t for t in trades.get("senateTrades", [])
if t["type"] == "Purchase"
]
# Count unique senators making purchases
buyers = set(p["senator"] for p in purchases)
if len(buyers) >= min_buyers:
return {
"ticker": ticker,
"unique_buyers": len(buyers),
"total_purchases": len(purchases),
"senators": list(buyers)
}
return None
# Check multiple tickers
for ticker in ["NVDA", "AAPL", "MSFT", "GOOGL", "META"]:
result = find_cluster_buying(ticker)
if result:
print(f"{ticker}: {result['unique_buyers']} unique senator buyers")