用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/cxcscmu/SkillLearnBench --skill run2-fund-analysis命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
基于 SOC 职业分类
| name | run2_fund_analysis |
| description | Analyze individual fund holdings, AUM, and portfolio composition from 13-F data |
Analyze specific hedge funds or asset managers using 13-F filings to answer questions about AUM, holdings count, and portfolio composition.
When you know the exact manager name:
import pandas as pd
coverpage = pd.read_csv('/root/2025-q3/COVERPAGE.tsv', sep='\t')
fund = coverpage[coverpage['FILINGMANAGER_NAME'] == 'Renaissance Technologies LLC']
accession = fund['ACCESSION_NUMBER'].values[0]
When name might be slightly different:
# Use case-insensitive contains search
fund = coverpage[coverpage['FILINGMANAGER_NAME'].str.contains('Renaissance', case=False, na=False)]
accession = fund['ACCESSION_NUMBER'].values[0]
python3 scripts/search_fund.py --keywords "renaissance technologies" --quarter 2025-q3 --topk 10
Best Practice: Start with exact name search in raw data, then use fuzzy search if not found.
Method: Use INFOTABLE VALUE sum (more reliable than SUMMARYPAGE)
accession = "0001037389-25-000064" # Renaissance Technologies LLC
infotable = pd.read_csv('/root/2025-q3/INFOTABLE.tsv', sep='\t', low_memory=False)
fund_holdings = infotable[infotable['ACCESSION_NUMBER'] == accession]
# AUM = sum of all holdings values (VALUE is in dollars)
aum = fund_holdings['VALUE'].sum()
print(f"AUM: ${aum:,.0f}")
Note: The VALUE column is in actual dollars (not thousands). This can be verified by comparing with SUMMARYPAGE.TABLEVALUETOTAL which should match exactly.
Method: Count distinct CUSIPs
fund_holdings = infotable[infotable['ACCESSION_NUMBER'] == accession]
# Count unique securities (CUSIPs)
num_holdings = fund_holdings['CUSIP'].nunique()
print(f"Number of holdings: {num_holdings}")
# Alternative: Count rows (if no duplicate CUSIPs per accession)
num_holdings = len(fund_holdings)
Method: Group by CUSIP and sort by VALUE
fund_holdings = infotable[infotable['ACCESSION_NUMBER'] == accession]
# Group by CUSIP and aggregate
top_holdings = fund_holdings.groupby('CUSIP').agg({
'NAMEOFISSUER': 'first',
'VALUE': 'sum',
'SSHPRNAMT': 'sum'
}).reset_index()
# Sort by value descending
top_holdings = top_holdings.sort_values('VALUE', ascending=False)
print(top_holdings[['NAMEOFISSUER', 'VALUE']].head(10))
When you have an accession number and want the fund name:
coverpage = pd.read_csv('/root/2025-q3/COVERPAGE.tsv', sep='\t')
fund_info = coverpage[coverpage['ACCESSION_NUMBER'] == accession]
fund_name = fund_info['FILINGMANAGER_NAME'].values[0]
# What % of AUM is in top 10 holdings
fund_holdings = infotable[infotable['ACCESSION_NUMBER'] == accession]
top_10_value = fund_holdings.nlargest(10, 'VALUE')['VALUE'].sum()
total_value = fund_holdings['VALUE'].sum()
concentration = (top_10_value / total_value) * 100
print(f"Top 10 concentration: {concentration:.1f}%")
# Group holdings by sector (requires additional sector mapping)
# This requires matching CUSIP to sector data from another source
# Left as exercise based on available data
# Check when fund last reported
coverpage = pd.read_csv('/root/2025-q3/COVERPAGE.tsv', sep='\t')
fund_info = coverpage[coverpage['ACCESSION_NUMBER'] == accession]
report_date = fund_info['REPORTCALENDARORQUARTER'].values[0]
print(f"Last reported: {report_date}")
For a given accession number:
INFOTABLE[ACCESSION].VALUE.sum()INFOTABLE[ACCESSION].CUSIP.nunique()nlargest(5, 'VALUE')COVERPAGE[ACCESSION].FILINGMANAGER_NAMECOVERPAGE[ACCESSION].REPORTCALENDARORQUARTER