Urgent.News

What's breaking now, across thousands of outlets.

Tech

Parsing SEC 13F filings: the CUSIP problem nobody warns you about

Every quarter, roughly 45 days after quarter end, thousands of institutional investors file Form 13F with the SEC. The filing lists holdings by CUSIP , not by ticker. If you build anything on top of 13F data, the first real problem you hit is not parsing the XML. It is what happens to CUSIPs you have never seen before. I run 13Foresight , a 13F tracker built on FastAPI and PostgreSQL. Here is…

Every quarter, approximately 45 days after the end of a quarter, numerous institutional investors submit Form 13F filings to the SEC. These filings list each investor's holdings by CUSIP rather than ticker symbol. The primary issue encountered when constructing systems based on 13F data is not parsing the XML; rather, it is the handling of unfamiliar CUSIPs.

I operate a 13F tracker named 13Foresight, which is constructed using FastAPI and PostgreSQL. Here's the issue we experienced following Q2 2026 and how we currently resolve it. The symptom: holders quietly disappearing Our holdings table links each CUSIP to a ticker symbol upon processing a filing. If a CUSIP cannot be mapped, it is assigned a value of "N/A" for the ticker.

After Q2 2026, this led to two noticeable outcomes: The holder count for Honeywell dropped from 2,773 to 172 as most funds reported a new CUSIP for the same company, and the new CUSIP had not yet been assigned a ticker. SpaceX, which had 1,724 filers in that quarter, was also absent from the data. While the system did not crash, the information was incomplete, and the computed "number of owners" for the stock was inaccurate, making it difficult to notice.

Where new CUSIPs originate A stock does not retain the same CUSIP forever. In our database, unmapped CUSIPs typically originate from: IPOs: A brand new security without any historical data. Spin-offs: A new CUSIP assigned to a company that did not exist as a separate holding in the previous quarter. Re-domiciles and share-class changes: The same company receiving a new CUSIP.

Addressing the issue We extract unmapped CUSIPs from the holdings table following each filing season and place them in a work queue for resolution. These CUSIPs are then mapped to a ticker using OpenFIGI, and the results are stored along with a status to prevent blind retries on failed lookups. As a backup, we use the first 8 characters of the CUSIP (issuer and issue, excluding the check digit) since the same security may appear with variations in different formats.

It's crucial to verify manually. Setting the ticker alone is insufficient. Once a ticker is assigned, all subsequent calculations derived from it become outdated. Prices must be retrieved, quarterly returns, cumulative returns, and ranking metrics must be recalculated for every affected fund. Two lessons learned from our initial mistake: Recalculate each fund individually, not one at a time for every CUSIP.

Fixing 22 securities one by one means a fund holding multiple of them undergoes recalculations multiple times. Set all tickers and prices first, compile the list of affected fund and quarter pairs, then recalculate each fund only once, starting from the earliest affected quarter. Do not treat spin-offs as purchases. When a fund receives spun-off shares, it did not actively choose to acquire them.

If you calculate "most bought this quarter," spin-offs must be flagged as corporate actions, excluded from the list, or both, or they will inaccurately appear at the top of the chart. Additionally, the most recent quarter of every fund is unique: its end price has not yet been determined, so any recalculation at this point must avoid writing a real return into the placeholder row, as the next season's processing could become corrupted.

Another potential pitfall: values scaled by 1000 Approximately 4% of the funds in our database report the value field multiplied by 1000. When building systems based on absolute values, always verify the scale. Using percentages instead, which remain stable, is more reliable for comparisons. Checklist for your own 13F pipeline Run a CUSIP mapping cycle after every filing deadline, allowing a week or two for late submissions.

Alert when the percentage of holdings with "N/A" CUSIPs grows, not just when a job fails. Create a database index on the CUSIP column before you need to remap large amounts of data. Keep corporate actions separate from "bought" and "sold" statistics. Compare holder counts for a few large names before and after each update to ensure accuracy.

If you want to see the end result, every fund and stock page on 13Foresight.com is created using this pipeline, and the fund rankings are built from a backtest that purchases a portfolio only after its filing becomes public. Disclosure: Research and drafting were assisted by artificial intelligence; the data, backtests, and final analysis were conducted by 13Foresight.

Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.

Read the original at dev.to →

More in Tech

More from Monday 28 September →