散戶版 13F 追蹤系統:用 Python + SEC EDGAR 免費自動化
想知道 Buffett 上季加碼了什麼、Burry 又重壓了什麼,多數人用 Whalewisdom(年繳 USD 300,折合月費 USD 25)或免費但更新慢的 Dataroma。其實這些網站的資料源都是同一個:SEC EDGAR,公開、免費、有 API。這篇教你直接從源頭抓,順便講清楚 13F 這個數據的正確用法與限制。
13F 是什麼
- 誰要申報:管理美股部位達 USD 100M 的機構投資人(以任一月份最後交易日市值計,達標即須申報)
- 報什麼:多頭部位,含買進的 put/call 選擇權(表上會標 PUT 或 CALL);空頭部位看不到
- 頻率:每季,季末後 45 天內申報
- 格式:XML,機器可讀,這就是自動化的機會
先講限制,再講方法
13F 有三個結構性限制,必須先搞懂:
- 45 天延遲:你看到的是季末的部位,機構現在可能已經反向操作。
- 沒有空頭:對沖基金常做多做空配對交易,空頭那一隻腳 13F 上看不到,只看多頭會誤判方向。反倒是買進的 put 看得到(會標 PUT),Burry 那些出名的看空部位,市場就是從 13F 的 PUT 欄位讀出來的。
- 部位規模語意不同: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 會被暫時封鎖(SEC 官方說法是 brief period,降回限速以下才恢復) | 加 rate limiting,睡 0.15 秒再抓下一筆 |
| value 單位搞錯 | 2023 年前申報以千美元為單位,之後改為美元。跨年度比對時混用,數字差一千倍 | 依申報期間判斷單位再正規化 |
| 只比對最新兩季 | 錯過建倉趨勢(連續三季加碼比單季加碼訊號強) | 至少保留四到八季的歷史 |
自動化排程
13F 集中在季末後第 40 到 45 天湧入。我的做法:Windows 工作排程器每週跑一次腳本,申報高峰期改每日;輸出寫入 Excel,變動超過門檻時寄 email 通知自己。整套系統的變動成本是零,唯一的投資是第一次搭建的幾個小時。
再往上一層的玩法,是把 13F 訊號接進 AI 研究流程:偵測到兩個以上追蹤對象同季加碼同一檔股票時,自動觸發該公司的財報深讀。這部分的作法寫在AI 研究流程那篇。
讀完有想法?
對這篇有問題或有不同看法,歡迎來信 hello@taxcodeusstocks.com。
資料來源
- SEC EDGAR full-text search(於新分頁開啟) 與 submissions API(data.sec.gov)
- SEC Form 13F 官方說明(於新分頁開啟)與 XML technical specification
- 程式碼為作者實際使用版本之簡化,Python 3.13 測試通過
本文為教育性質。13F 數據有最長 45 天延遲且僅含多頭部位,不構成投資建議,不建議直接照抄機構持股操作。完整免責聲明見此頁。