Support for Hedge Fund Monitor from the Office of Financial Research

This commit is contained in:
Timothy Kassis
2026-02-23 13:32:09 -08:00
parent 86b5d1d30b
commit 5490490294
11 changed files with 1229 additions and 6 deletions

View File

@@ -0,0 +1,287 @@
# Code Examples
## Installation
```bash
uv add requests pandas matplotlib
```
## 1. Discover Available Data
```python
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
```python
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
```python
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
```python
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
```python
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
```python
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
```python
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
```python
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
```python
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)
```