散戶版 13F 追蹤系統:用 Python + SEC EDGAR 免費自動化
想知道 Buffett 上季加碼了什麼、Burry 又重壓了什麼,多數人用 Whalewisdom(月費 USD 25)或免費但更新慢的 Dataroma。其實這些網站的資料源都是同一個:SEC EDGAR,公開、免費、有 API。這篇教你直接從源頭抓,順便講清楚 13F 這個數據的正確用法與限制。
13F 是什麼
- 誰要申報:管理美股部位超過 USD 100M 的機構投資人
- 報什麼:多頭部位(long only),選擇權與空頭基本看不到
- 頻率:每季,季末後 45 天內申報
- 格式:XML,機器可讀,這就是自動化的機會
先講限制,再講方法
13F 有三個結構性限制,不先弄懂就用,比不用還危險:
- 45 天延遲:你看到的是季末快照,機構現在可能已反向操作。
- 只有 long:對沖基金可能同時做多做空配對交易,只看 long 會誤判方向。
- 部位規模語意不同: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 天延遲且僅含多頭部位,不構成投資建議,不建議直接照抄機構持股操作。完整免責聲明見此頁。