如何用 Python 构建实时 SEC 备案监控(不足 50 行)

发布: (2025年12月15日 GMT+8 00:41)
4 min read
原文: Dev.to

Source: Dev.to

封面图片:如何在 Python 中构建实时 SEC 文件监控(不足 50 行)

有没有想过对冲基金是如何在你之前得知内部交易的?
他们并不是有超能力,只是拥有实时监控 SEC 文件的系统。当 Form 4 出现在 EDGAR 上的那一刻,他们就知道了。

为什么要监控 SEC 文件?

有三类文件会影响市场:

  • 8‑K – 未预告的重大事件(CEO 辞职、宣布合并、提起诉讼)
  • 10‑K / 10‑Q – 年度和季度财报
  • Form 4 – 内部交易——高管买卖自己公司的股票

当一位 CEO 购买价值 200 万美元的自家公司股票时,这就是一个信号。

我们要构建的东西

一个 Python 脚本,能够:

  • 每 5 分钟检查一次新文件
  • 按你的自选列表(特定股票代码)过滤
  • 将提醒打印到控制台(可以轻松扩展到 Slack、邮件等)

不需要爬虫。无需解析 HTML。也不必处理 EDGAR 的各种怪癖。

首先,获取免费 API 密钥点此获取)。

代码

import requests
import time
from datetime import datetime

# Config
API_KEY = "your_api_key"  # Free tier at earningsfeed.com
BASE_URL = "https://earningsfeed.com/api/v1"
WATCHLIST = ["AAPL", "TSLA", "NVDA", "MSFT", "GOOGL"]
CHECK_INTERVAL = 300  # 5 minutes

# Track what we've already seen
seen_filings = set()

def get_recent_filings():
    """Fetch recent SEC filings for watchlist tickers."""
    headers = {"Authorization": f"Bearer {API_KEY}"}
    filings = []

    for ticker in WATCHLIST:
        response = requests.get(
            f"{BASE_URL}/filings",
            headers=headers,
            params={"ticker": ticker, "limit": 10}
        )
        if response.ok:
            filings.extend(response.json().get("items", []))

    return filings

def check_for_new_filings():
    """Check for new filings and alert on any we haven't seen."""
    filings = get_recent_filings()

    for filing in filings:
        filing_id = filing.get("accessionNumber")
        if filing_id and filing_id not in seen_filings:
            seen_filings.add(filing_id)
            alert(filing)

def alert(filing):
    """Print alert for new filing. Swap this for Slack/email/SMS."""
    company = filing.get("companyName", "Unknown")
    form_type = filing.get("formType", "???")
    filed_at = filing.get("filedAt", "")
    url = filing.get("url", "")

    print(f"""
🚨 NEW FILING DETECTED
━━━━━━━━━━━━━━━━━━━━━
Company:   {company}
Form:      {form_type}
Filed:     {filed_at}
Link:      {url}
━━━━━━━━━━━━━━━━━━━━━
    """)

def main():
    print(f"👀 Monitoring {len(WATCHLIST)} tickers: {', '.join(WATCHLIST)}")
    print(f"⏱️  Checking every {CHECK_INTERVAL // 60} minutes")
    print("Press Ctrl+C to stop\\n")

    # Initial check
    check_for_new_filings()

    while True:
        time.sleep(CHECK_INTERVAL)
        print(f"[{datetime.now().strftime('%H:%M:%S')}] Checking...")
        check_for_new_filings()

if __name__ == "__main__":
    main()

运行方式

pip install requests
python sec_monitor.py

示例输出

👀 Monitoring 5 tickers: AAPL, TSLA, NVDA, MSFT, GOOGL
⏱️  Checking every 5 minutes
Press Ctrl+C to stop

🚨 NEW FILING DETECTED
━━━━━━━━━━━━━━━━━━━━━
Company:   NVIDIA Corp
Form:      4
Filed:     2024-12-14T16:32:00.000Z
Link:      https://www.sec.gov/Archives/edgar/data/1045810/...
━━━━━━━━━━━━━━━━━━━━━

让它真正有用

alert() 函数是你自定义通知方式的入口。

Slack 通知

def alert(filing):
    requests.post(SLACK_WEBHOOK, json={
        "text": f"🚨 {filing['companyName']} just filed a {filing['formType']}"
    })

按表单类型过滤(仅内部交易)

if filing.get("formType") == "4":
    alert(filing)

只关注重大事件

# In get_recent_filings(), add forms filter
params={"ticker": ticker, "forms": "8-K,4", "limit": 10}

为什么我会做这个

全披露:我创建 Earnings Feed 是因为对现有方案感到厌倦。

EDGAR 的直接 API 有速率限制,容易被封锁。大多数商业 API 每月要几百美元。我想要一个免费层且真的能用的服务。

该数据库覆盖了所有公开公司向 SEC 提交的文件:每一份 10‑K、每一份 Form 4、每一份 8‑K。

如果你在金融科技领域构建产品,这可能会帮你省去不少麻烦。

你会怎么用?

我很好奇你会如何利用实时 SEC 数据:

  • 基于内部买入的交易信号?
  • 当竞争对手提交 8‑K 时的提醒?
  • 通过 13F 跟踪机构持股变动?

欢迎留言!

Back to Blog

相关文章

阅读更多 »