ワンクリックで
fuzzy-fund-search
Fuzzy matching techniques for finding hedge funds by name when exact names are unknown
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Fuzzy matching techniques for finding hedge funds by name when exact names are unknown
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Handles reading, populating, and saving .docx files using the python-docx library. Use this skill for any tasks involving template filling or modifying Word documents.
Perform various data analysis on SEC 13-F and obtain some insights of fund activities such as number of holdings, AUM, and change of holdings between two quarters.
This skill includes search capability in 13F, such as fuzzy search a fund information using possibly inaccurate name, or fuzzy search a stock cusip info using its name.
A comprehensive PDF toolkit for advanced data extraction and document analysis. Beyond text and table extraction, this tool is optimized for visual layout reasoning: it can map graphical elements to coordinates (such as determining appointment times based on their position on a calendar timeline) and identify color-coded features (e.g., distinguishing high-priority blocks from flexible blue-colored entries). Use this skill when the task requires interpreting schedule layouts, calculating durations from visual spans, or resolving scheduling conflicts based on the spatial and color properties of a PDF document.
Build deterministic, verifiable data visualizations with D3.js (v6). Generate standalone HTML/SVG (and optional PNG) from local data files without external network dependencies. Use when tasks require charts, plots, axes/scales, legends, tooltips, or data-driven SVG output.
invoke this skill when you need to perform database search for travel planning. This skill provides some useful pre-packaged tools to look up accommodations, attractions, cities, driving distance, flights, and restaurants from the bundled dataset.
| name | fuzzy-fund-search |
| description | Fuzzy matching techniques for finding hedge funds by name when exact names are unknown |
Fund names in the COVERPAGE.tsv may not match exactly what you're searching for. Fuzzy matching helps find the best match when you have approximate or partial names.
pip install fuzzywuzzy python-Levenshtein
No installation needed - Python standard library
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
import pandas as pd
def fuzzy_search_fund(search_term, coverpage_df, threshold=70):
"""
Find funds matching a search term using fuzzy matching
Args:
search_term: Partial or approximate fund name (e.g., "renaissance technologies")
coverpage_df: DataFrame from COVERPAGE.tsv
threshold: Minimum match score (0-100)
Returns:
DataFrame of matches sorted by score (highest first)
"""
fund_names = coverpage_df['FILINGMANAGER_NAME'].tolist()
# Use extractBests to get multiple matches
matches = process.extractBests(
search_term,
fund_names,
scorer=fuzz.token_sort_ratio, # Good for finding partial matches
score_cutoff=threshold
)
# Build result dataframe
results = []
for matched_name, score in matches:
fund_row = coverpage_df[coverpage_df['FILINGMANAGER_NAME'] == matched_name].iloc[0]
results.append({
'FILINGMANAGER_NAME': matched_name,
'ACCESSION_NUMBER': fund_row['ACCESSION_NUMBER'],
'match_score': score,
'REPORTCALENDARORQUARTER': fund_row['REPORTCALENDARORQUARTER']
})
return pd.DataFrame(results).sort_values('match_score', ascending=False)
# Usage Example
q3_coverpage = pd.read_csv('/root/2025-q3/COVERPAGE.tsv', sep='\t')
matches = fuzzy_search_fund("renaissance technologies", q3_coverpage, threshold=70)
print(matches.head())
# Get best match
best_match = matches.iloc[0]
accession_number = best_match['ACCESSION_NUMBER']
fund_name = best_match['FILINGMANAGER_NAME']
from difflib import SequenceMatcher
import pandas as pd
def simple_fuzzy_search(search_term, coverpage_df, threshold=0.6):
"""
Simple fuzzy search using difflib (no external dependencies)
"""
search_term_lower = search_term.lower()
fund_names = coverpage_df['FILINGMANAGER_NAME'].tolist()
matches = []
for name in fund_names:
similarity = SequenceMatcher(None, search_term_lower, name.lower()).ratio()
if similarity >= threshold:
fund_row = coverpage_df[coverpage_df['FILINGMANAGER_NAME'] == name].iloc[0]
matches.append({
'FILINGMANAGER_NAME': name,
'ACCESSION_NUMBER': fund_row['ACCESSION_NUMBER'],
'similarity': similarity
})
return pd.DataFrame(matches).sort_values('similarity', ascending=False)
def substring_search(search_term, coverpage_df, case_sensitive=False):
"""
Simple substring matching (works for known partial names)
"""
if case_sensitive:
matches = coverpage_df[coverpage_df['FILINGMANAGER_NAME'].str.contains(search_term, na=False)]
else:
matches = coverpage_df[coverpage_df['FILINGMANAGER_NAME'].str.contains(
search_term, case=False, na=False
)]
return matches[['FILINGMANAGER_NAME', 'ACCESSION_NUMBER']]
| Algorithm | Use Case | Pros | Cons |
|---|---|---|---|
token_sort_ratio | Handles reordered words | "technologies renaissance" ≈ "renaissance technologies" | Slower |
token_set_ratio | Handles subset words | "Renaissance Tech" ≈ "Renaissance Technologies" | Slower |
fuzz.ratio | Exact character match | Fast, simple | Sensitive to word order |
SequenceMatcher | Quick approximate match | Built-in, no deps | Less sophisticated |
| Substring match | Known partial names | Fastest | Only works with exact substrings |
# For very fuzzy matches
matches = fuzzy_search_fund("berkshire", coverpage_df, threshold=50)
# For tighter matches
matches = fuzzy_search_fund("berkshire hathaway", coverpage_df, threshold=80)
def clean_search_term(term):
"""Remove extra whitespace and punctuation"""
return ' '.join(term.lower().strip().split())
search = clean_search_term(" RENAISSANCE TECHNOLOGIES ")
# Result: "renaissance technologies"
matches = fuzzy_search_fund("warren buffett", coverpage_df)
if len(matches) > 0:
best = matches.iloc[0]
print(f"Found: {best['FILINGMANAGER_NAME']}")
print(f"Match Score: {best['match_score']}")
print(f"Accession: {best['ACCESSION_NUMBER']}")
# Manual verification
assert 'berkshire' in best['FILINGMANAGER_NAME'].lower(), "Match doesn't contain expected keyword"
else:
print("No matches found")
# Search for famous fund managers
q3_data = pd.read_csv('/root/2025-q3/COVERPAGE.tsv', sep='\t')
# Renaissance Technologies (Jim Simons)
renaissance = fuzzy_search_fund("renaissance technologies", q3_data)
# Berkshire Hathaway (Warren Buffett)
berkshire = fuzzy_search_fund("berkshire hathaway", q3_data)
# Citadel
citadel = fuzzy_search_fund("citadel", q3_data)
# Tiger Global
tiger = fuzzy_search_fund("tiger global", q3_data)
import pandas as pd
from fuzzywuzzy import process, fuzz
def find_and_verify_fund(search_term, coverpage_df, expected_keywords=None):
"""
Find a fund and verify the match
"""
# Fuzzy search
fund_names = coverpage_df['FILINGMANAGER_NAME'].tolist()
matches = process.extractBests(
search_term,
fund_names,
scorer=fuzz.token_sort_ratio,
score_cutoff=70,
limit=3
)
# Verify with expected keywords
for matched_name, score in matches:
if expected_keywords is None or all(
keyword.lower() in matched_name.lower()
for keyword in expected_keywords
):
fund_row = coverpage_df[
coverpage_df['FILINGMANAGER_NAME'] == matched_name
].iloc[0]
return {
'fund_name': matched_name,
'accession_number': fund_row['ACCESSION_NUMBER'],
'quarter': fund_row['REPORTCALENDARORQUARTER'],
'match_score': score
}
return None
# Usage
result = find_and_verify_fund(
"renaissance",
q3_data,
expected_keywords=['renaissance', 'tech']
)
threshold=50 instead of 80coverpage_df['FILINGMANAGER_NAME'].str.contains(partial_name, case=False).any()threshold=85 instead of 70limit=5 to get multiple options and review manually