[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KD35S5Y553KS9K35JS5X66":3,"skill-same:01M6KD35S5Y553KS9K35JS5X66":53},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":26,"linkOnly":27,"markdownContent":28,"markdownBody":29,"frontMatter":30,"refName":31,"commitSha":32,"skillDirectory":33,"forksCount":34,"repositoryHtmlUrl":35,"repositoryHomepageUrl":36,"ownerHtmlUrl":37,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":38,"install":39,"resources":52},"01M6KD35S5Y553KS9K35JS5X66","portfolio-analysis",null,"Analyzing fund portfolios including AUM extraction, holdings counts, and portfolio composition","cxcscmu\u002FSkillLearnBench","cxcscmu","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F142838272?v=4","01M6KCQDFQWPDSN0MKZY96MSQP","01M6KCQDM7G70TKJ28NTSQC0RZ",92,"MIT","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fb1-one-shot-claude-haiku-4-5\u002Ffinancial-analysis\u002Fportfolio-analysis\u002FSKILL.md",[],[18,19,20,21,22,23,24,25],"portfolio analysis","analysis","portfolio","extraction","analyzing","Composition","fund","holdings","2026-11-10 10:12:30",false,"---\nname: portfolio-analysis\ndescription: Analyzing fund portfolios including AUM extraction, holdings counts, and portfolio composition\n---\n\n# Portfolio Analysis for Hedge Funds\n\n## Overview\nPortfolio analysis involves extracting fund-level information (AUM, total holdings, composition) from 13-F filings and comparing across time periods.\n\n## Key Metrics\n\n### 1. Assets Under Management (AUM)\n\n**Location**: SUMMARYPAGE.tsv\n\n```python\nimport pandas as pd\n\ndef get_fund_aum(accession_number, summarypage_df):\n    \"\"\"\n    Extract AUM for a specific fund\n    \"\"\"\n    fund_summary = summarypage_df[\n        summarypage_df['ACCESSION_NUMBER'] == accession_number\n    ]\n\n    # Look for AUM-related fields in the data\n    # Common field names: AUM, ASSETS_UNDER_MANAGEMENT, TOTALASSETS, etc.\n    # Check available columns first\n    available_cols = fund_summary.columns.tolist()\n    print(f\"Available columns: {available_cols}\")\n\n    # If found, extract and convert to numeric\n    for col in available_cols:\n        if 'AUM' in col.upper() or 'ASSET' in col.upper() or 'TOTAL' in col.upper():\n            try:\n                aum_value = pd.to_numeric(\n                    fund_summary[col].iloc[0],\n                    errors='coerce'\n                )\n                return aum_value\n            except:\n                continue\n\n    return None\n\n# Usage\nq3_summary = pd.read_csv('\u002Froot\u002F2025-q3\u002FSUMMARYPAGE.tsv', sep='\\t')\naum = get_fund_aum('specific_accession_number', q3_summary)\n```\n\n### 2. Portfolio Holdings Count\n\n```python\ndef get_holdings_count(accession_number, infotable_df):\n    \"\"\"\n    Count the number of stocks held by a fund\n    \"\"\"\n    fund_holdings = infotable_df[\n        infotable_df['ACCESSION_NUMBER'] == accession_number\n    ]\n    return len(fund_holdings)\n\n# Usage\nq3_infotable = pd.read_csv('\u002Froot\u002F2025-q3\u002FINFOTABLE.tsv', sep='\\t')\nholdings_count = get_holdings_count('specific_accession_number', q3_infotable)\nprint(f\"Renaissance Technologies holds {holdings_count} stocks\")\n```\n\n### 3. Portfolio Composition\n\n```python\ndef analyze_portfolio_composition(accession_number, infotable_df):\n    \"\"\"\n    Analyze fund's portfolio composition\n    \"\"\"\n    fund_holdings = infotable_df[\n        infotable_df['ACCESSION_NUMBER'] == accession_number\n    ].copy()\n\n    # Ensure VALUE is numeric (in thousands)\n    fund_holdings['VALUE'] = pd.to_numeric(fund_holdings['VALUE'], errors='coerce')\n\n    # Calculate statistics\n    total_portfolio_value = fund_holdings['VALUE'].sum() * 1000  # Convert to dollars\n    num_holdings = len(fund_holdings)\n    avg_position = total_portfolio_value \u002F num_holdings if num_holdings > 0 else 0\n\n    # Get top positions\n    top_10 = fund_holdings.nlargest(10, 'VALUE')[\n        ['NAMEOFISSUER', 'CUSIP', 'VALUE', 'SSHPRNAMT']\n    ]\n    top_10['VALUE_MILLIONS'] = top_10['VALUE'].astype(float) \u002F 1000\n\n    return {\n        'total_value_dollars': total_portfolio_value,\n        'num_holdings': num_holdings,\n        'avg_position_dollars': avg_position,\n        'top_10_positions': top_10,\n        'concentration': (top_10['VALUE'].sum() \u002F fund_holdings['VALUE'].sum() * 100)\n    }\n\n# Usage\ncomposition = analyze_portfolio_composition('accession_number', q3_infotable)\nprint(f\"Total Portfolio Value: ${composition['total_value_dollars']:,.0f}\")\nprint(f\"Number of Holdings: {composition['num_holdings']}\")\nprint(f\"Top 10 Positions Concentration: {composition['concentration']:.2f}%\")\nprint(\"\\nTop 10 Positions:\")\nprint(composition['top_10_positions'])\n```\n\n### 4. Finding Funds with Specific Stocks\n\n```python\ndef find_funds_holding_stock(cusip, infotable_df, coverpage_df=None):\n    \"\"\"\n    Find all funds holding a specific stock (by CUSIP)\n    \"\"\"\n    holdings = infotable_df[infotable_df['CUSIP'] == cusip].copy()\n\n    if len(holdings) == 0:\n        return pd.DataFrame()\n\n    # Optional: Enrich with fund names from coverpage\n    if coverpage_df is not None:\n        holdings = holdings.merge(\n            coverpage_df[['ACCESSION_NUMBER', 'FILINGMANAGER_NAME']],\n            on='ACCESSION_NUMBER',\n            how='left'\n        )\n\n    # Sort by value (descending)\n    holdings['VALUE'] = pd.to_numeric(holdings['VALUE'], errors='coerce')\n    return holdings.sort_values('VALUE', ascending=False)\n\n# Usage\nq3_infotable = pd.read_csv('\u002Froot\u002F2025-q3\u002FINFOTABLE.tsv', sep='\\t')\nq3_coverpage = pd.read_csv('\u002Froot\u002F2025-q3\u002FCOVERPAGE.tsv', sep='\\t')\n\n# Find who's holding Palantir (CUSIP: 69608A702)\npalantir_holders = find_funds_holding_stock('69608A702', q3_infotable, q3_coverpage)\nprint(palantir_holders[['FILINGMANAGER_NAME', 'VALUE', 'SSHPRNAMT']])\n```\n\n## Complete Fund Analysis Workflow\n\n```python\nimport pandas as pd\n\ndef comprehensive_fund_analysis(accession_number, q_infotable, q_summarypage, q_coverpage):\n    \"\"\"\n    Complete analysis of a fund for a quarter\n    \"\"\"\n    # Get fund info\n    fund_info = q_coverpage[\n        q_coverpage['ACCESSION_NUMBER'] == accession_number\n    ].iloc[0]\n\n    # Get holdings\n    holdings = q_infotable[\n        q_infotable['ACCESSION_NUMBER'] == accession_number\n    ].copy()\n\n    holdings['VALUE'] = pd.to_numeric(holdings['VALUE'], errors='coerce')\n\n    # Get AUM\n    summary = q_summarypage[\n        q_summarypage['ACCESSION_NUMBER'] == accession_number\n    ]\n\n    analysis = {\n        'fund_name': fund_info['FILINGMANAGER_NAME'],\n        'accession_number': accession_number,\n        'quarter': fund_info['REPORTCALENDARORQUARTER'],\n        'num_holdings': len(holdings),\n        'total_portfolio_value_thousands': holdings['VALUE'].sum(),\n        'top_5_positions': holdings.nlargest(5, 'VALUE')[\n            ['NAMEOFISSUER', 'CUSIP', 'VALUE']\n        ].to_dict('records')\n    }\n\n    return analysis\n\n# Usage\nq3_infotable = pd.read_csv('\u002Froot\u002F2025-q3\u002FINFOTABLE.tsv', sep='\\t')\nq3_summarypage = pd.read_csv('\u002Froot\u002F2025-q3\u002FSUMMARYPAGE.tsv', sep='\\t')\nq3_coverpage = pd.read_csv('\u002Froot\u002F2025-q3\u002FCOVERPAGE.tsv', sep='\\t')\n\nanalysis = comprehensive_fund_analysis('0000320193-25-000069', q3_infotable, q3_summarypage, q3_coverpage)\nprint(f\"Fund: {analysis['fund_name']}\")\nprint(f\"Holdings: {analysis['num_holdings']}\")\nprint(f\"Portfolio Value: ${analysis['total_portfolio_value_thousands'] * 1000:,.0f}\")\n```\n\n## Extracting AUM from SUMMARYPAGE\n\n```python\ndef extract_aum_from_summarypage(accession_number, summarypage_df):\n    \"\"\"\n    Extract AUM from summarypage with fallback methods\n    \"\"\"\n    fund_row = summarypage_df[\n        summarypage_df['ACCESSION_NUMBER'] == accession_number\n    ]\n\n    if fund_row.empty:\n        return None\n\n    fund_row = fund_row.iloc[0]\n\n    # Try different possible column names for AUM\n    possible_columns = [\n        'TABLE_OF_CONTENTS',  # Sometimes contains AUM info\n        'AUM',\n        'TOTALASSETS',\n        'VALUE'\n    ]\n\n    # Inspect all columns\n    for col in summarypage_df.columns:\n        if col in fund_row.index:\n            value = fund_row[col]\n            if pd.notna(value):\n                try:\n                    numeric_val = pd.to_numeric(value, errors='coerce')\n                    if numeric_val and numeric_val > 1000000:  # Likely an AUM value (> 1M)\n                        return numeric_val\n                except:\n                    pass\n\n    return None\n```\n\n## Performance Metrics\n\n```python\ndef calculate_performance_metrics(accession_q2, accession_q3, infotable_q2, infotable_q3):\n    \"\"\"\n    Calculate portfolio changes between quarters\n    \"\"\"\n    # Get holdings for both quarters\n    holdings_q2 = infotable_q2[infotable_q2['ACCESSION_NUMBER'] == accession_q2].copy()\n    holdings_q3 = infotable_q3[infotable_q3['ACCESSION_NUMBER'] == accession_q3].copy()\n\n    # Standardize column names and numeric types\n    for df in [holdings_q2, holdings_q3]:\n        df['VALUE'] = pd.to_numeric(df['VALUE'], errors='coerce')\n        df['SSHPRNAMT'] = pd.to_numeric(df['SSHPRNAMT'], errors='coerce')\n\n    # Merge on CUSIP\n    comparison = pd.merge(\n        holdings_q2[['CUSIP', 'NAMEOFISSUER', 'VALUE', 'SSHPRNAMT']],\n        holdings_q3[['CUSIP', 'VALUE', 'SSHPRNAMT']],\n        on='CUSIP',\n        how='outer',\n        suffixes=('_q2', '_q3')\n    ).fillna(0)\n\n    # Calculate changes\n    comparison['value_change'] = comparison['VALUE_q3'] - comparison['VALUE_q2']\n    comparison['pct_change'] = (comparison['value_change'] \u002F comparison['VALUE_q2'] * 100).replace([float('inf'), float('-inf')], 0)\n\n    return comparison.sort_values('value_change', ascending=False)\n\n# Usage\ncomparison = calculate_performance_metrics(\n    accession_q2, accession_q3,\n    q2_infotable, q3_infotable\n)\ntop_increases = comparison[comparison['value_change'] > 0].head(5)\nprint(top_increases[['NAMEOFISSUER', 'CUSIP', 'value_change']])\n```\n\n## Best Practices\n\n1. **Always convert VALUE to numeric**: `pd.to_numeric(df['VALUE'], errors='coerce')`\n2. **Remember VALUE is in thousands**: Multiply by 1000 for actual dollar amounts\n3. **Handle missing accession numbers**: Some funds may not file all quarters\n4. **Validate cusip codes**: Check for null or malformed CUSIPs\n5. **Compare matching quarters**: Q2 2025 vs Q3 2025, not Q2 2024 vs Q3 2025\n","# Portfolio Analysis for Hedge Funds\n\n## Overview\nPortfolio analysis involves extracting fund-level information (AUM, total holdings, composition) from 13-F filings and comparing across time periods.\n\n## Key Metrics\n\n### 1. Assets Under Management (AUM)\n\n**Location**: SUMMARYPAGE.tsv\n\n```python\nimport pandas as pd\n\ndef get_fund_aum(accession_number, summarypage_df):\n    \"\"\"\n    Extract AUM for a specific fund\n    \"\"\"\n    fund_summary = summarypage_df[\n        summarypage_df['ACCESSION_NUMBER'] == accession_number\n    ]\n\n    # Look for AUM-related fields in the data\n    # Common field names: AUM, ASSETS_UNDER_MANAGEMENT, TOTALASSETS, etc.\n    # Check available columns first\n    available_cols = fund_summary.columns.tolist()\n    print(f\"Available columns: {available_cols}\")\n\n    # If found, extract and convert to numeric\n    for col in available_cols:\n        if 'AUM' in col.upper() or 'ASSET' in col.upper() or 'TOTAL' in col.upper():\n            try:\n                aum_value = pd.to_numeric(\n                    fund_summary[col].iloc[0],\n                    errors='coerce'\n                )\n                return aum_value\n            except:\n                continue\n\n    return None\n\n# Usage\nq3_summary = pd.read_csv('\u002Froot\u002F2025-q3\u002FSUMMARYPAGE.tsv', sep='\\t')\naum = get_fund_aum('specific_accession_number', q3_summary)\n```\n\n### 2. Portfolio Holdings Count\n\n```python\ndef get_holdings_count(accession_number, infotable_df):\n    \"\"\"\n    Count the number of stocks held by a fund\n    \"\"\"\n    fund_holdings = infotable_df[\n        infotable_df['ACCESSION_NUMBER'] == accession_number\n    ]\n    return len(fund_holdings)\n\n# Usage\nq3_infotable = pd.read_csv('\u002Froot\u002F2025-q3\u002FINFOTABLE.tsv', sep='\\t')\nholdings_count = get_holdings_count('specific_accession_number', q3_infotable)\nprint(f\"Renaissance Technologies holds {holdings_count} stocks\")\n```\n\n### 3. Portfolio Composition\n\n```python\ndef analyze_portfolio_composition(accession_number, infotable_df):\n    \"\"\"\n    Analyze fund's portfolio composition\n    \"\"\"\n    fund_holdings = infotable_df[\n        infotable_df['ACCESSION_NUMBER'] == accession_number\n    ].copy()\n\n    # Ensure VALUE is numeric (in thousands)\n    fund_holdings['VALUE'] = pd.to_numeric(fund_holdings['VALUE'], errors='coerce')\n\n    # Calculate statistics\n    total_portfolio_value = fund_holdings['VALUE'].sum() * 1000  # Convert to dollars\n    num_holdings = len(fund_holdings)\n    avg_position = total_portfolio_value \u002F num_holdings if num_holdings > 0 else 0\n\n    # Get top positions\n    top_10 = fund_holdings.nlargest(10, 'VALUE')[\n        ['NAMEOFISSUER', 'CUSIP', 'VALUE', 'SSHPRNAMT']\n    ]\n    top_10['VALUE_MILLIONS'] = top_10['VALUE'].astype(float) \u002F 1000\n\n    return {\n        'total_value_dollars': total_portfolio_value,\n        'num_holdings': num_holdings,\n        'avg_position_dollars': avg_position,\n        'top_10_positions': top_10,\n        'concentration': (top_10['VALUE'].sum() \u002F fund_holdings['VALUE'].sum() * 100)\n    }\n\n# Usage\ncomposition = analyze_portfolio_composition('accession_number', q3_infotable)\nprint(f\"Total Portfolio Value: ${composition['total_value_dollars']:,.0f}\")\nprint(f\"Number of Holdings: {composition['num_holdings']}\")\nprint(f\"Top 10 Positions Concentration: {composition['concentration']:.2f}%\")\nprint(\"\\nTop 10 Positions:\")\nprint(composition['top_10_positions'])\n```\n\n### 4. Finding Funds with Specific Stocks\n\n```python\ndef find_funds_holding_stock(cusip, infotable_df, coverpage_df=None):\n    \"\"\"\n    Find all funds holding a specific stock (by CUSIP)\n    \"\"\"\n    holdings = infotable_df[infotable_df['CUSIP'] == cusip].copy()\n\n    if len(holdings) == 0:\n        return pd.DataFrame()\n\n    # Optional: Enrich with fund names from coverpage\n    if coverpage_df is not None:\n        holdings = holdings.merge(\n            coverpage_df[['ACCESSION_NUMBER', 'FILINGMANAGER_NAME']],\n            on='ACCESSION_NUMBER',\n            how='left'\n        )\n\n    # Sort by value (descending)\n    holdings['VALUE'] = pd.to_numeric(holdings['VALUE'], errors='coerce')\n    return holdings.sort_values('VALUE', ascending=False)\n\n# Usage\nq3_infotable = pd.read_csv('\u002Froot\u002F2025-q3\u002FINFOTABLE.tsv', sep='\\t')\nq3_coverpage = pd.read_csv('\u002Froot\u002F2025-q3\u002FCOVERPAGE.tsv', sep='\\t')\n\n# Find who's holding Palantir (CUSIP: 69608A702)\npalantir_holders = find_funds_holding_stock('69608A702', q3_infotable, q3_coverpage)\nprint(palantir_holders[['FILINGMANAGER_NAME', 'VALUE', 'SSHPRNAMT']])\n```\n\n## Complete Fund Analysis Workflow\n\n```python\nimport pandas as pd\n\ndef comprehensive_fund_analysis(accession_number, q_infotable, q_summarypage, q_coverpage):\n    \"\"\"\n    Complete analysis of a fund for a quarter\n    \"\"\"\n    # Get fund info\n    fund_info = q_coverpage[\n        q_coverpage['ACCESSION_NUMBER'] == accession_number\n    ].iloc[0]\n\n    # Get holdings\n    holdings = q_infotable[\n        q_infotable['ACCESSION_NUMBER'] == accession_number\n    ].copy()\n\n    holdings['VALUE'] = pd.to_numeric(holdings['VALUE'], errors='coerce')\n\n    # Get AUM\n    summary = q_summarypage[\n        q_summarypage['ACCESSION_NUMBER'] == accession_number\n    ]\n\n    analysis = {\n        'fund_name': fund_info['FILINGMANAGER_NAME'],\n        'accession_number': accession_number,\n        'quarter': fund_info['REPORTCALENDARORQUARTER'],\n        'num_holdings': len(holdings),\n        'total_portfolio_value_thousands': holdings['VALUE'].sum(),\n        'top_5_positions': holdings.nlargest(5, 'VALUE')[\n            ['NAMEOFISSUER', 'CUSIP', 'VALUE']\n        ].to_dict('records')\n    }\n\n    return analysis\n\n# Usage\nq3_infotable = pd.read_csv('\u002Froot\u002F2025-q3\u002FINFOTABLE.tsv', sep='\\t')\nq3_summarypage = pd.read_csv('\u002Froot\u002F2025-q3\u002FSUMMARYPAGE.tsv', sep='\\t')\nq3_coverpage = pd.read_csv('\u002Froot\u002F2025-q3\u002FCOVERPAGE.tsv', sep='\\t')\n\nanalysis = comprehensive_fund_analysis('0000320193-25-000069', q3_infotable, q3_summarypage, q3_coverpage)\nprint(f\"Fund: {analysis['fund_name']}\")\nprint(f\"Holdings: {analysis['num_holdings']}\")\nprint(f\"Portfolio Value: ${analysis['total_portfolio_value_thousands'] * 1000:,.0f}\")\n```\n\n## Extracting AUM from SUMMARYPAGE\n\n```python\ndef extract_aum_from_summarypage(accession_number, summarypage_df):\n    \"\"\"\n    Extract AUM from summarypage with fallback methods\n    \"\"\"\n    fund_row = summarypage_df[\n        summarypage_df['ACCESSION_NUMBER'] == accession_number\n    ]\n\n    if fund_row.empty:\n        return None\n\n    fund_row = fund_row.iloc[0]\n\n    # Try different possible column names for AUM\n    possible_columns = [\n        'TABLE_OF_CONTENTS',  # Sometimes contains AUM info\n        'AUM',\n        'TOTALASSETS',\n        'VALUE'\n    ]\n\n    # Inspect all columns\n    for col in summarypage_df.columns:\n        if col in fund_row.index:\n            value = fund_row[col]\n            if pd.notna(value):\n                try:\n                    numeric_val = pd.to_numeric(value, errors='coerce')\n                    if numeric_val and numeric_val > 1000000:  # Likely an AUM value (> 1M)\n                        return numeric_val\n                except:\n                    pass\n\n    return None\n```\n\n## Performance Metrics\n\n```python\ndef calculate_performance_metrics(accession_q2, accession_q3, infotable_q2, infotable_q3):\n    \"\"\"\n    Calculate portfolio changes between quarters\n    \"\"\"\n    # Get holdings for both quarters\n    holdings_q2 = infotable_q2[infotable_q2['ACCESSION_NUMBER'] == accession_q2].copy()\n    holdings_q3 = infotable_q3[infotable_q3['ACCESSION_NUMBER'] == accession_q3].copy()\n\n    # Standardize column names and numeric types\n    for df in [holdings_q2, holdings_q3]:\n        df['VALUE'] = pd.to_numeric(df['VALUE'], errors='coerce')\n        df['SSHPRNAMT'] = pd.to_numeric(df['SSHPRNAMT'], errors='coerce')\n\n    # Merge on CUSIP\n    comparison = pd.merge(\n        holdings_q2[['CUSIP', 'NAMEOFISSUER', 'VALUE', 'SSHPRNAMT']],\n        holdings_q3[['CUSIP', 'VALUE', 'SSHPRNAMT']],\n        on='CUSIP',\n        how='outer',\n        suffixes=('_q2', '_q3')\n    ).fillna(0)\n\n    # Calculate changes\n    comparison['value_change'] = comparison['VALUE_q3'] - comparison['VALUE_q2']\n    comparison['pct_change'] = (comparison['value_change'] \u002F comparison['VALUE_q2'] * 100).replace([float('inf'), float('-inf')], 0)\n\n    return comparison.sort_values('value_change', ascending=False)\n\n# Usage\ncomparison = calculate_performance_metrics(\n    accession_q2, accession_q3,\n    q2_infotable, q3_infotable\n)\ntop_increases = comparison[comparison['value_change'] > 0].head(5)\nprint(top_increases[['NAMEOFISSUER', 'CUSIP', 'value_change']])\n```\n\n## Best Practices\n\n1. **Always convert VALUE to numeric**: `pd.to_numeric(df['VALUE'], errors='coerce')`\n2. **Remember VALUE is in thousands**: Multiply by 1000 for actual dollar amounts\n3. **Handle missing accession numbers**: Some funds may not file all quarters\n4. **Validate cusip codes**: Check for null or malformed CUSIPs\n5. **Compare matching quarters**: Q2 2025 vs Q3 2025, not Q2 2024 vs Q3 2025\n",{"name":5,"description":7},"main","726e1f79b96b0cb3d729d0e55a1c847e0b5353ae","skills\u002Fb1-one-shot-claude-haiku-4-5\u002Ffinancial-analysis\u002Fportfolio-analysis",7,"https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench","https:\u002F\u002Fcxcscmu.github.io\u002FSkillLearnBench","https:\u002F\u002Fgithub.com\u002Fcxcscmu","2026-10-02 22:55:36",{"source":8,"skillName":5,"commands":40,"prompt":50,"zipAvailable":51},[41,44,47],{"tool":42,"command":43},"npx","npx skills add cxcscmu\u002FSkillLearnBench --skill portfolio-analysis",{"tool":45,"command":46},"bunx","bunx skills add cxcscmu\u002FSkillLearnBench --skill portfolio-analysis",{"tool":48,"command":49},"pnpm","pnpm dlx skills add cxcscmu\u002FSkillLearnBench --skill portfolio-analysis","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fb1-one-shot-claude-haiku-4-5\u002Ffinancial-analysis\u002Fportfolio-analysis\u002FSKILL.md",true,[],[54,72,97,115,135,147],{"skillNo":55,"name":56,"nameZh":6,"description":57,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":58,"categories":59,"keywords":65,"publishedAt":26},"01M6KM5KH175P5ABP5JMX2SBDQ","object_counter","Count occurrences of an object in the image using computer vision algorithm.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Fvideo-object-counting\u002Fobject_counter\u002FSKILL.md",[60],{"categoryNo":61,"categoryName":62,"taxonomyType":63,"taxonomyTypeDesc":64},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[66,67,68,69,70,71],"object counter","object","vision","computer","Computer Vision","image",{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":81,"publishedAt":26},"01M6KM51TMVXG79MMPCS6Y8G86","travel-planning-workflow","Invoke this skill when performing travel planning. It defines a structured workflow for generating itineraries. Following this workflow is essential to ensure the final plan satisfies user requirements.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftravel-planning\u002Ftravel-planning-workflow\u002FSKILL.md",[78],{"categoryNo":79,"categoryName":80,"taxonomyType":63,"taxonomyTypeDesc":64},"01JBSEEDCAT000000000000023","Skill与智能体开发",[82,83,84,85,86,87,88,89,90,91,92,93,94,95,96],"workflow","planning","planning workflow","travel","travel planning","travel planning workflow","structured","performing","plan","for","user","it","requirements","essential","itineraries",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":26},"01M6KM4DY820XHS9YTSK5QP5HD","bundled-dataset-search-tool","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.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftravel-planning\u002Fbundled-dataset-search-tool\u002FSKILL.md",[],[104,105,106,107,108,109,110,85,111,112,86,113,91,114,83],"search","tool","dataset","bundled dataset search tool","restaurants","Tools","up","look","flights","you","database",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":26},"01M6KM465BB9PQ0B548HQSVAWZ","glm-output","Output-processing guidance for GLM tasks. Especially useful after glm-basics and glm-calibration when you need verifier-matching metrics from output.nc and a final \u002Froot\u002Fmetrics.json.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-output\u002FSKILL.md",[],[122,123,124,91,125,126,127,128,129,130,131,132,113,133,134],"glm output","output","glm","tasks","metrics","json","basics","guidance","matching","verifier","processing","root","calibration",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":142,"publishedAt":26},"01M6KM40KY3QWDW5W97S39R2BC","glm-calibration","Calibration guidance for GLM tasks. Often most effective after glm-basics has clarified the setup; glm-output is the companion skill for exact final metric computation.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-calibration\u002FSKILL.md",[141],{"categoryNo":79,"categoryName":80,"taxonomyType":63,"taxonomyTypeDesc":64},[143,134,124,123,129,128,125,144,145,91,146],"glm calibration","setup","companion","metric",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":26},"01M6KM3VHHVSGMGHJQB3PPT6YG","glm-basics","A good starting point for GLM calibration tasks. Use to inspect glm3.nml, confirm how GLM runs, and identify the relevant files before moving on to calibration and output evaluation.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-basics\u002FSKILL.md",[],[154,124,128,155,143,134,91,123,156,157,158,159,160,161,125],"glm basics","inspect","relevant","files","good","use","how","Evaluation"]