agentsclimarketplace

Sec 13f analysis

Skill cxcscmu/SkillLearnBench/skills/b1-one-shot-claude-sonnet-4-6/financial-analysis/sec-13f-analysis

[COLM'26] SkillLearnBench is the first benchmark for evaluating continual learning methods that automatically generate agent skills.

Install
npx -y skills add cxcscmu/SkillLearnBench --skill sec-13f-analysis

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

What its author says it does

Copied from the file, not written here

Parse and analyze SEC 13-F filing TSV datasets to extract AUM, holdings count, and fund details by accession number.

SKILL.md

1.9 KB, 523 tokens by cl100k_base, as published. Nobody here has run it

SEC 13-F Analysis Skill

Overview

SEC Form 13-F datasets consist of TSV files downloaded from EDGAR. Each quarter has the same file structure.

Key Files

FilePurpose
COVERPAGE.tsvFund identity: FILINGMANAGER_NAME, ACCESSION_NUMBER, REPORTCALENDARORQUARTER
SUMMARYPAGE.tsvAggregated stats: TABLEVALUETOTAL (AUM in thousands), TABLEENTRYTOTAL (number of holdings)
INFOTABLE.tsvIndividual holdings: CUSIP, NAMEOFISSUER, VALUE (thousands), SSHPRNAMT (shares)
SUBMISSION.tsvFiler metadata

Common Tasks

Load data with pandas

import pandas as pd

q3_dir = "/root/2025-q3"
coverpage = pd.read_csv(f"{q3_dir}/COVERPAGE.tsv", sep="\t", dtype=str)
summarypage = pd.read_csv(f"{q3_dir}/SUMMARYPAGE.tsv", sep="\t", dtype=str)
infotable = pd.read_csv(f"{q3_dir}/INFOTABLE.tsv", sep="\t", dtype=str)

Get AUM for a fund (by accession_number)

row = summarypage[summarypage["ACCESSION_NUMBER"] == accession_number]
aum_thousands = int(row["TABLEVALUETOTAL"].iloc[0])
aum_dollars = aum_thousands * 1000

Get holdings count

holdings = infotable[infotable["ACCESSION_NUMBER"] == accession_number]
num_holdings = len(holdings)
# Or use TABLEENTRYTOTAL from SUMMARYPAGE for the reported count

Get holdings detail

holdings = infotable[infotable["ACCESSION_NUMBER"] == accession_number].copy()
holdings["VALUE"] = pd.to_numeric(holdings["VALUE"], errors="coerce")
holdings["SSHPRNAMT"] = pd.to_numeric(holdings["SSHPRNAMT"], errors="coerce")

Notes

  • VALUE in INFOTABLE is in thousands of USD
  • TABLEVALUETOTAL in SUMMARYPAGE is also in thousands of USD
  • TABLEENTRYTOTAL is the number of positions reported

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 327,132. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.