agentsclimarketplace

Run2 13f fund analysis

Skill cxcscmu/SkillLearnBench/skills/b2-self-feedback-claude-sonnet-4-6/financial-analysis/run2_13f-fund-analysis

Analyze fund AUM, holdings count, and cross-quarter investment changes from SEC 13F filings.From its SKILL.md

Install
npx -y skills add cxcscmu/SkillLearnBench --skill run2_13f-fund-analysis

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

SKILL.md

2.1 KB, 578 tokens by cl100k_base, as published. Nobody here has run it

13F Fund Analysis (Improved)

Overview

Analyze individual fund holdings and compare changes between quarters.

Setup

  • Scripts: /root/.claude/skills/13f-analyzer/scripts/
  • Data format: /root/{quarter}/INFOTABLE.tsv, /root/{quarter}/COVERPAGE.tsv

Analyze Single Fund (AUM, holdings count)

python3 /root/.claude/skills/13f-analyzer/scripts/one_fund_analysis.py \
    --accession_number 0001037389-25-000064 \
    --quarter 2025-q3

Output fields:

  • Total number of holdings: all asset classes
  • Total AUM: in USD dollars (float)
  • Number of stock holdings: equities only
  • Total stock AUM: equity AUM only

Compare Fund Between Two Quarters

python3 /root/.claude/skills/13f-analyzer/scripts/one_fund_analysis.py \
    --quarter 2025-q3 \
    --accession_number 0001193125-25-282901 \
    --baseline_quarter 2025-q2 \
    --baseline_accession_number 0000950123-25-008343

Output: "Top 10 Buys" and "Top 10 Sells" ranked by Abs change (dollar value change).

IMPORTANT: holding_analysis.py Has a Bug

The script uses hardcoded /root/INFOTABLE.tsv (missing quarter subdirectory). Use this Python workaround instead:

import pandas as pd

quarter = '2025-q3'
cusip = '69608A108'
topk = 3

infotable = pd.read_csv(f'/root/{quarter}/INFOTABLE.tsv', sep='\t', dtype=str)
infotable['VALUE'] = infotable['VALUE'].astype(float)
holding_details = infotable[infotable['CUSIP'] == cusip]

top = (
    holding_details.groupby('ACCESSION_NUMBER')
    .agg(TOTAL_VALUE=('VALUE', 'sum'))
    .sort_values('TOTAL_VALUE', ascending=False)
    .head(topk)
)

coverpage = pd.read_csv(f'/root/{quarter}/COVERPAGE.tsv', sep='\t', dtype=str)

for idx, (accession_number, row) in enumerate(top.iterrows()):
    fund_info = coverpage[coverpage['ACCESSION_NUMBER'] == accession_number]
    fund_name = fund_info['FILINGMANAGER_NAME'].values[0] if not fund_info.empty else 'Unknown'
    print(f'Rank {idx+1}: {fund_name} | Value = {row["TOTAL_VALUE"]:.2f}')

What ships with it

Read from the repository

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

Keep looking

Skills are one crate of 325,949. 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.