| name | hyperliquid-leaderboard-analytics |
| description | Terminal analytics dashboard for tracking Hyperliquid DEX top traders by PnL, ROI, and performance metrics |
| triggers | ["analyze hyperliquid leaderboard data","track top traders on hyperliquid","export hyperliquid trader statistics","filter hyperliquid leaderboard by roi","compare hyperliquid trader performance","visualize hyperliquid trading metrics","build terminal dashboard for crypto trading analytics","scrape hyperliquid public leaderboard"] |
Hyperliquid Leaderboard Analytics Skill
Skill by ara.so — Data Skills collection.
Terminal-based analytics dashboard for Hyperliquid perpetual DEX leaderboard data. Track top traders, filter by performance metrics (PnL, ROI, win rate, Sharpe ratio), visualize equity curves, and export data for quantitative analysis. Built with Textual for rich terminal UI and uses the public Hyperliquid info API (read-only, no authentication required).
Installation
git clone https://github.com/lassepaladin/hyperliquid-leaderboard-analytics.git
cd hyperliquid-leaderboard-analytics
pip install -r requirements.txt
Dependencies (from requirements.txt):
textual>=0.47.0 - Terminal UI framework
rich>=13.7.0 - Rich text formatting
httpx>=0.26.0 - Async HTTP client
toml>=0.10.2 - Configuration parsing
CLI Usage
Basic Commands
python main.py
python main.py --demo
python -m hl_leaderboard_analytics
python main.py --config ~/.custom-hl-config.toml
Keyboard Navigation
Once launched, the TUI accepts these keybindings:
| Key | Action |
|---|
1-6 | Switch tabs (Board/Detail/Filters/Compare/Export/Settings) |
/ | Filter current table |
s | Cycle sort column |
w | Cycle time window (7d/30d/90d/all) |
Enter | Open trader detail view |
c | Compare selected trader |
e | Export current view |
t | Cycle theme |
q | Quit |
Configuration
Config file location: ~/.hl-leaderboard/config.toml
[network]
api_url = "https://api.hyperliquid.xyz"
timeout = 30
max_retries = 3
[board]
default_window = "90d"
default_sort = "roi"
page_size = 100
refresh_interval = 300
[export]
format = "csv"
out_dir = "./exports"
include_timestamp = true
[ui]
theme = "monokai"
show_help = true
vim_bindings = true
Python API Usage
Fetching Leaderboard Data
from hl_leaderboard_analytics.core.api_client import HyperliquidAPIClient
import asyncio
async def fetch_leaderboard():
client = HyperliquidAPIClient(base_url="https://api.hyperliquid.xyz")
leaderboard = await client.get_leaderboard()
traders_90d = await client.get_leaderboard(window="90d")
trader = await client.get_trader_detail("0x7f3a...c4e1")
return leaderboard
leaderboard_data = asyncio.run(fetch_leaderboard())
Data Models
from hl_leaderboard_analytics.core.models import Trader, TraderMetrics
trader = Trader(
address="0x7f3a...c4e1",
alias="quant_kappa",
account_value=125000.50,
pnl_90d=51600.20,
roi_90d=0.4128,
roi_30d=0.0582,
volume_90d=4810000.0,
win_rate=0.713,
sharpe_ratio=1.82,
profit_factor=2.31,
max_drawdown=0.15,
num_trades=847,
avg_trade_size=5682.0
)
print(f"ROI (90d): {trader.roi_90d * 100:.1f}%")
print(f"Win Rate: {trader.win_rate * 100:.1f}%")
print(f"Sharpe: {trader.sharpe_ratio:.2f}")
Filtering and Ranking
from hl_leaderboard_analytics.core.analytics import LeaderboardAnalytics
analytics = LeaderboardAnalytics(leaderboard_data)
high_roi_traders = analytics.filter_by_roi(min_roi=0.50, window="90d")
btc_traders = analytics.filter_by_asset("BTC")
low_lev_traders = analytics.filter_by_leverage(min_lev=1, max_lev=5)
top_traders = analytics.rank_by(
sort_key="sharpe_ratio",
ascending=False,
min_trades=100,
min_account_value=10000
)
stats = analytics.get_percentile_stats(metric="roi_90d")
print(f"P50 ROI: {stats['p50'] * 100:.1f}%")
print(f"P90 ROI: {stats['p90'] * 100:.1f}%")
Exporting Data
from hl_leaderboard_analytics.core.export import DataExporter
exporter = DataExporter(output_dir="./exports")
exporter.to_csv(
traders=top_traders,
filename="top_traders_90d.csv",
columns=["alias", "address", "roi_90d", "sharpe_ratio", "win_rate"]
)
exporter.to_json(
traders=high_roi_traders,
filename="high_roi_traders.json",
pretty=True
)
exporter.to_markdown(
traders=btc_traders,
filename="btc_specialists.md",
title="BTC Perp Specialists"
)
Period Comparison
from hl_leaderboard_analytics.core.analytics import ComparisonAnalyzer
analyzer = ComparisonAnalyzer()
comparison = analyzer.compare_periods(
trader_address="0x7f3a...c4e1",
period_1="30d",
period_2="90d"
)
print(f"ROI delta: {comparison.roi_delta * 100:.1f}%")
print(f"Rank change: {comparison.rank_change}")
print(f"Volume change: {comparison.volume_delta:.0f}")
movers = analyzer.get_top_movers(period="24h", limit=10)
for trader, delta in movers:
print(f"{trader.alias}: {delta * 100:+.1f}%")
Building Custom TUI Components
from textual.app import App, ComposeResult
from textual.widgets import DataTable, Header, Footer
from hl_leaderboard_analytics.core.api_client import HyperliquidAPIClient
class CustomLeaderboardApp(App):
CSS = """
DataTable {
height: 100%;
}
"""
def compose(self) -> ComposeResult:
yield Header()
yield DataTable()
yield Footer()
async def on_mount(self) -> None:
table = self.query_one(DataTable)
table.add_columns("Rank", "Alias", "ROI (90d)", "Sharpe")
client = HyperliquidAPIClient()
leaderboard = await client.get_leaderboard(window="90d")
for i, trader in enumerate(leaderboard[:50], 1):
table.add_row(
str(i),
trader.alias,
f"{trader.roi_90d * 100:.1f}%",
f"{trader.sharpe_ratio:.2f}"
)
if __name__ == "__main__":
app = CustomLeaderboardApp()
app.run()
Common Patterns
1. Track Consistent Performers
from hl_leaderboard_analytics.core.analytics import ConsistencyAnalyzer
analyzer = ConsistencyAnalyzer(leaderboard_data)
consistent = analyzer.find_consistent_performers(
periods=["7d", "30d", "90d"],
min_roi=0.05,
min_sharpe=1.0
)
one_hit = analyzer.find_one_hit_wonders(
short_period="7d",
long_period="90d",
short_roi_min=0.50,
long_roi_max=0.10
)
2. Asset Specialization Analysis
from hl_leaderboard_analytics.core.analytics import AssetAnalyzer
asset_analyzer = AssetAnalyzer(leaderboard_data)
breakdown = asset_analyzer.get_asset_breakdown("0x7f3a...c4e1")
for asset, metrics in breakdown.items():
print(f"{asset}: PnL ${metrics['pnl']:,.0f}, ROI {metrics['roi']*100:.1f}%")
btc_specialists = asset_analyzer.find_specialists(asset="BTC", min_concentration=0.80)
eth_specialists = asset_analyzer.find_specialists(asset="ETH", min_concentration=0.80)
3. Real-time Dashboard Updates
from textual.reactive import reactive
from textual.widgets import Static
import asyncio
class LiveMetricsWidget(Static):
total_traders = reactive(0)
avg_roi = reactive(0.0)
async def on_mount(self) -> None:
self.update_metrics_loop()
async def update_metrics_loop(self) -> None:
client = HyperliquidAPIClient()
while True:
leaderboard = await client.get_leaderboard()
self.total_traders = len(leaderboard)
self.avg_roi = sum(t.roi_90d for t in leaderboard) / len(leaderboard)
await asyncio.sleep(300)
def render(self) -> str:
return f"Traders: {self.total_traders} | Avg ROI: {self.avg_roi*100:.1f}%"
4. Batch Export for Analysis
import pandas as pd
def export_for_analysis(leaderboard_data, output_dir="./analysis"):
df = pd.DataFrame([
{
"address": t.address,
"alias": t.alias,
"roi_90d": t.roi_90d,
"roi_30d": t.roi_30d,
"sharpe": t.sharpe_ratio,
"win_rate": t.win_rate,
"volume": t.volume_90d,
"max_dd": t.max_drawdown
}
for t in leaderboard_data
])
df.to_csv(f"{output_dir}/leaderboard_full.csv", index=False)
df.to_parquet(f"{output_dir}/leaderboard_full.parquet")
top_50 = df.nlargest(50, "roi_90d")
top_50.to_excel(f"{output_dir}/top_50_roi.xlsx", index=False)
stats = df.describe()
stats.to_csv(f"{output_dir}/summary_stats.csv")
return df
Troubleshooting
API Connection Issues
from hl_leaderboard_analytics.core.api_client import HyperliquidAPIClient
import logging
logging.basicConfig(level=logging.DEBUG)
client = HyperliquidAPIClient(
base_url="https://api.hyperliquid.xyz",
timeout=60,
max_retries=5
)
try:
leaderboard = await client.get_leaderboard()
except Exception as e:
print(f"API Error: {e}")
from hl_leaderboard_analytics.core.mock_data import load_demo_data
leaderboard = load_demo_data()
Memory Issues with Large Datasets
def export_large_dataset_streaming(traders, output_file):
import csv
with open(output_file, 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['address', 'roi_90d', 'sharpe'])
writer.writeheader()
for trader in traders:
writer.writerow({
'address': trader.address,
'roi_90d': trader.roi_90d,
'sharpe': trader.sharpe_ratio
})
TUI Rendering Issues
export TERM=xterm-256color
python main.py
python main.py --no-unicode
python -m hl_leaderboard_analytics.cli export --format csv --output ./data.csv
Rate Limiting
import asyncio
from hl_leaderboard_analytics.core.api_client import HyperliquidAPIClient
client = HyperliquidAPIClient()
async def fetch_with_rate_limit(addresses):
results = []
for addr in addresses:
trader = await client.get_trader_detail(addr)
results.append(trader)
await asyncio.sleep(0.5)
return results
Advanced Use Cases
Correlation Analysis
import numpy as np
from scipy.stats import pearsonr
def analyze_metric_correlation(leaderboard_data):
roi_values = [t.roi_90d for t in leaderboard_data]
sharpe_values = [t.sharpe_ratio for t in leaderboard_data]
win_rate_values = [t.win_rate for t in leaderboard_data]
corr_roi_sharpe, p_value = pearsonr(roi_values, sharpe_values)
print(f"ROI-Sharpe correlation: {corr_roi_sharpe:.3f} (p={p_value:.4f})")
corr_roi_wr, p_value = pearsonr(roi_values, win_rate_values)
print(f"ROI-WinRate correlation: {corr_roi_wr:.3f} (p={p_value:.4f})")
Time Series Analysis
from hl_leaderboard_analytics.core.time_series import EquityCurveAnalyzer
analyzer = EquityCurveAnalyzer()
snapshots = await client.get_historical_snapshots(
trader_address="0x7f3a...c4e1",
period="90d",
interval="1d"
)
max_dd = analyzer.calculate_max_drawdown(snapshots)
cagr = analyzer.calculate_cagr(snapshots)
volatility = analyzer.calculate_volatility(snapshots)
print(f"Max Drawdown: {max_dd*100:.1f}%")
print(f"CAGR: {cagr*100:.1f}%")
print(f"Volatility: {volatility*100:.1f}%")