散戶版 13F 追蹤系統:用 Python + SEC EDGAR 免費自動化

想知道 Buffett 上季加碼了什麼、Burry 又重壓了什麼,多數人用 Whalewisdom(月費 USD 25)或免費但更新慢的 Dataroma。其實這些網站的資料源都是同一個:SEC EDGAR,公開、免費、有 API。這篇教你直接從源頭抓,順便講清楚 13F 這個數據的正確用法與限制。

13F 是什麼

先講限制,再講方法

13F 有三個結構性限制,不先弄懂就用,比不用還危險:

  1. 45 天延遲:你看到的是季末快照,機構現在可能已反向操作。
  2. 只有 long:對沖基金可能同時做多做空配對交易,只看 long 會誤判方向。
  3. 部位規模語意不同:USD 10M 對 Berkshire 是零錢,對小型基金是重押。看變動比看存量有意義,看佔組合比重比看金額有意義。

核心流程:四步驟

Step 1:用 CIK 抓機構的申報清單

每個申報機構有一個 CIK 編號(Berkshire 是 0001067983)。SEC 的 submissions API 一次回傳該機構所有申報紀錄:

import requests

HEADERS = {"User-Agent": "YourName your@email.com"}  # SEC 強制要求
CIK = "0001067983"  # Berkshire Hathaway

url = f"https://data.sec.gov/submissions/CIK{CIK}.json"
data = requests.get(url, headers=HEADERS).json()

filings = data["filings"]["recent"]
idx = [i for i, f in enumerate(filings["form"]) if f == "13F-HR"]

Step 2:解析 13F 的 XML 持股表

import xml.etree.ElementTree as ET

ns = {"ns": "http://www.sec.gov/edgar/document/thirteenf/informationtable"}
root = ET.fromstring(xml_text)

positions = []
for it in root.findall(".//ns:infoTable", ns):
    positions.append({
        "name":  it.find("ns:nameOfIssuer", ns).text,
        "cusip": it.find("ns:cusip", ns).text,
        "value": int(it.find("ns:value", ns).text),
        "shares": int(it.find("ns:shrsOrPrnAmt/ns:sshPrnamt", ns).text),
    })

Step 3:CUSIP 轉 Ticker

13F 用 CUSIP 識別證券,不是 ticker。維護一份對照表(或用 SEC 的 company_tickers.json 輔助),常見大型股一次建好就能重複用。

Step 4:季度差異比對

把本季與上季的持股表以 CUSIP 對齊,算出股數變化,就得到「加碼 / 減碼 / 新建倉 / 清倉」四類訊號,依變動金額排序輸出。

新手最常踩的四個地雷

地雷後果解法
沒設 User-Agent直接被 SEC 拒絕Header 填「姓名 + email」
請求太快超過 10 req/sec 會被封 24 小時加 rate limiting,睡 0.15 秒再抓下一筆
value 單位搞錯2023 年前申報以千美元為單位,之後改為美元。跨年度比對時混用,數字差一千倍依申報期間判斷單位再正規化
只比對最新兩季錯過建倉趨勢(連續三季加碼比單季加碼訊號強)至少保留四到八季的歷史

自動化排程

13F 集中在季末後第 40 到 45 天湧入。我的做法:Windows 工作排程器每週跑一次腳本,申報高峰期改每日;輸出寫入 Excel,變動超過門檻時寄 email 通知自己。整套系統的變動成本是零,唯一的投資是第一次搭建的幾個小時。

再往上一層的玩法,是把 13F 訊號接進 AI 研究流程:偵測到兩個以上追蹤對象同季加碼同一檔股票時,自動觸發該公司的財報深讀。這部分的作法寫在AI 研究流程那篇。

資料來源

  • SEC EDGAR full-text search 與 submissions API(data.sec.gov)
  • SEC Form 13F 官方說明與 XML technical specification
  • 程式碼為作者實際使用版本之簡化,Python 3.13 測試通過
本文為教育性質。13F 數據有最長 45 天延遲且僅含多頭部位,不構成投資建議,不建議直接照抄機構持股操作。完整免責聲明見此頁