Files
claude-scientific-skills/scientific-skills/hedgefundmonitor/references/examples.md

7.7 KiB

Code Examples

Installation

uv add requests pandas matplotlib

1. Discover Available Data

import requests
import pandas as pd

BASE = "https://data.financialresearch.gov/hf/v1"

# List all datasets
resp = requests.get(f"{BASE}/series/dataset")
for key, info in resp.json().items():
    print(f"{key}: {info['long_name']}")

# List all mnemonics for FPF with names
resp = requests.get(f"{BASE}/metadata/mnemonics", params={"dataset": "fpf"})
mnemonics = pd.DataFrame(resp.json())
print(mnemonics.head(20))

# Search for leverage-related series
resp = requests.get(f"{BASE}/metadata/search", params={"query": "*leverage*"})
results = pd.DataFrame(resp.json())
# Deduplicate to get unique mnemonics
leverage_series = results[results["mnemonic"] != "none"]["mnemonic"].unique()
print(leverage_series)

2. Fetch and Plot Hedge Fund Leverage Over Time

import requests
import pandas as pd
import matplotlib.pyplot as plt

BASE = "https://data.financialresearch.gov/hf/v1"

# Fetch overall leverage ratio
resp = requests.get(f"{BASE}/series/timeseries", params={
    "mnemonic": "FPF-ALLQHF_LEVERAGERATIO_GAVWMEAN",
    "remove_nulls": "true"
})
df = pd.DataFrame(resp.json(), columns=["date", "leverage"])
df["date"] = pd.to_datetime(df["date"])

# Get metadata
meta_resp = requests.get(f"{BASE}/metadata/query", params={
    "mnemonic": "FPF-ALLQHF_LEVERAGERATIO_GAVWMEAN",
    "fields": "description/name,schedule/observation_frequency"
})
meta = meta_resp.json()
title = meta["description"]["name"]

plt.figure(figsize=(12, 5))
plt.plot(df["date"], df["leverage"], linewidth=2)
plt.title(title)
plt.ylabel("Leverage Ratio")
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("hedge_fund_leverage.png", dpi=150)

3. Compare Strategy-Level Leverage

import requests
import pandas as pd
import matplotlib.pyplot as plt

BASE = "https://data.financialresearch.gov/hf/v1"

strategies = {
    "All Funds": "FPF-ALLQHF_LEVERAGERATIO_GAVWMEAN",
    "Equity": "FPF-STRATEGY_EQUITY_LEVERAGERATIO_GAVWMEAN",
    "Credit": "FPF-STRATEGY_CREDIT_LEVERAGERATIO_GAVWMEAN",
    "Macro": "FPF-STRATEGY_MACRO_LEVERAGERATIO_GAVWMEAN",
}

resp = requests.get(f"{BASE}/series/multifull", params={
    "mnemonics": ",".join(strategies.values()),
    "remove_nulls": "true"
})
results = resp.json()

fig, ax = plt.subplots(figsize=(14, 6))
for label, mne in strategies.items():
    ts = results[mne]["timeseries"]["aggregation"]
    df = pd.DataFrame(ts, columns=["date", "value"])
    df["date"] = pd.to_datetime(df["date"])
    ax.plot(df["date"], df["value"], label=label, linewidth=2)

ax.set_title("Hedge Fund Leverage by Strategy (GAV-Weighted)")
ax.set_ylabel("Leverage Ratio")
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("leverage_by_strategy.png", dpi=150)

4. Download Full FPF Dataset into a Wide DataFrame

import requests
import pandas as pd

BASE = "https://data.financialresearch.gov/hf/v1"

# Download entire FPF dataset, recent data only
resp = requests.get(f"{BASE}/series/dataset", params={
    "dataset": "fpf",
    "start_date": "2015-01-01",
    "remove_nulls": "false"
})
data = resp.json()

# Build a wide DataFrame with one column per series
frames = {}
for mne, series_data in data["timeseries"].items():
    ts = series_data["timeseries"]["aggregation"]
    if ts:
        s = pd.Series(
            {row[0]: row[1] for row in ts},
            name=mne
        )
        frames[mne] = s

df = pd.DataFrame(frames)
df.index = pd.to_datetime(df.index)
df = df.sort_index()
print(f"Shape: {df.shape}")  # (dates, series)
print(df.tail())

5. Stress Test Analysis

import requests
import pandas as pd

BASE = "https://data.financialresearch.gov/hf/v1"

# CDS stress test scenarios (P5 = 5th percentile fund, P50 = median fund)
stress_mnemonics = [
    "FPF-ALLQHF_CDSDOWN250BPS_P5",
    "FPF-ALLQHF_CDSDOWN250BPS_P50",
    "FPF-ALLQHF_CDSUP250BPS_P5",
    "FPF-ALLQHF_CDSUP250BPS_P50",
]

resp = requests.get(f"{BASE}/series/multifull", params={
    "mnemonics": ",".join(stress_mnemonics),
    "remove_nulls": "true"
})
results = resp.json()

frames = []
for mne in stress_mnemonics:
    ts = results[mne]["timeseries"]["aggregation"]
    name = results[mne]["metadata"]["description"]["name"]
    df = pd.DataFrame(ts, columns=["date", mne])
    df["date"] = pd.to_datetime(df["date"])
    df = df.set_index("date")
    frames.append(df)

stress_df = pd.concat(frames, axis=1)
stress_df.columns = [r["metadata"]["description"]["name"]
                     for r in [results[m] for m in stress_mnemonics]]
print(stress_df.tail(8).to_string())

6. FICC Sponsored Repo Volume Trend

import requests
import pandas as pd
import matplotlib.pyplot as plt

BASE = "https://data.financialresearch.gov/hf/v1"

resp = requests.get(f"{BASE}/series/multifull", params={
    "mnemonics": "FICC-SPONSORED_REPO_VOL,FICC-SPONSORED_REVREPO_VOL",
    "remove_nulls": "true"
})
results = resp.json()

fig, ax = plt.subplots(figsize=(12, 5))
for mne, label in [
    ("FICC-SPONSORED_REPO_VOL", "Repo Volume"),
    ("FICC-SPONSORED_REVREPO_VOL", "Reverse Repo Volume"),
]:
    ts = results[mne]["timeseries"]["aggregation"]
    df = pd.DataFrame(ts, columns=["date", "value"])
    df["date"] = pd.to_datetime(df["date"])
    # Convert to trillions
    df["value"] = df["value"] / 1e12
    ax.plot(df["date"], df["value"], label=label, linewidth=2)

ax.set_title("FICC Sponsored Repo Service Volumes")
ax.set_ylabel("Trillions USD")
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("ficc_repo_volumes.png", dpi=150)

7. Download Category CSV

import requests
import io
import pandas as pd

BASE = "https://data.financialresearch.gov/hf/v1"

# Download the leverage category as a DataFrame
resp = requests.get(f"{BASE}/categories", params={"category": "leverage"})
df = pd.read_csv(io.StringIO(resp.text))
print(df.head())

# All categories: complexity, counterparties, leverage, liquidity, risk_management, size

8. Counterparty Concentration Analysis

import requests
import pandas as pd

BASE = "https://data.financialresearch.gov/hf/v1"

# Top 8 counterparties lending to all qualifying hedge funds
party_mnemonics = [f"FPF-ALLQHF_PARTY{i}_SUM" for i in range(1, 9)]

resp = requests.get(f"{BASE}/series/multifull", params={
    "mnemonics": ",".join(party_mnemonics),
    "remove_nulls": "false"
})
results = resp.json()

# Get the most recent quarter's values
frames = []
for mne in party_mnemonics:
    ts = results[mne]["timeseries"]["aggregation"]
    df = pd.DataFrame(ts, columns=["date", "value"])
    df["date"] = pd.to_datetime(df["date"])
    df["mnemonic"] = mne
    frames.append(df)

all_data = pd.concat(frames).pivot(index="date", columns="mnemonic", values="value")
print("Most recent quarter counterparty exposure (USD billions):")
print((all_data.iloc[-1] / 1e9).sort_values(ascending=False).to_string())

9. Periodic Refresh Pattern

import requests
import pandas as pd
from datetime import datetime, timedelta

BASE = "https://data.financialresearch.gov/hf/v1"

def get_recent_fpf(days_back: int = 180) -> pd.DataFrame:
    """Fetch only the most recent FPF observations (for periodic refreshes)."""
    start = (datetime.today() - timedelta(days=days_back)).strftime("%Y-%m-%d")
    resp = requests.get(f"{BASE}/series/dataset", params={
        "dataset": "fpf",
        "start_date": start,
        "remove_nulls": "true"
    })
    data = resp.json()
    frames = {}
    for mne, series_data in data["timeseries"].items():
        ts = series_data["timeseries"]["aggregation"]
        if ts:
            frames[mne] = pd.Series({row[0]: row[1] for row in ts}, name=mne)
    return pd.DataFrame(frames)

recent = get_recent_fpf(days_back=365)
print(recent.shape)