backtrader
Event-driven backtesting with bar-by-bar execution, complex order types, multiple analyzers,…
Cross-asset correlation analysis including rolling correlation, hierarchical clustering, tail dependence, and regime-dependent correlation
$ npx -y skills add agiprolabs/claude-trading-skills --skill correlation-analysis --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/correlation-analysisContext preview
The summary Claude sees to decide when to auto-load this skill.
Cross-asset correlation analysis including rolling correlation, hierarchical clustering, tail dependence, and regime-dependent correlation
name: correlation-analysis description: Cross-asset correlation analysis including rolling correlation, hierarchical clustering, tail dependence, and regime-dependent correlation
Cross-asset correlation analysis for diversification assessment, risk management, pairs trading signal generation, and portfolio construction.
Correlation measures how assets move together. In crypto markets this is critical for:
Linear correlation assuming normality. Most common but least robust for crypto.
import pandas as pd import numpy as np # Always compute on returns, never on prices returns_a = prices_a.pct_change().dropna() returns_b = prices_b.pct_change().dropna() pearson_corr = returns_a.corr(returns_b) # default is Pearson
Converts values to ranks, then computes Pearson on ranks. Captures monotonic (not just linear) relationships.
spearman_corr = returns_a.corr(returns_b, method='spearman')
Counts concordant vs discordant pairs. Most robust to outliers.
kendall_corr = returns_a.corr(returns_b, method='kendall')
Static correlation hides regime changes. Rolling correlation reveals how relationships evolve.
# Rolling Pearson correlation
rolling_corr = returns_a.rolling(window=60).corr(returns_b)
# Multiple windows for different time horizons
windows = {
'short': 20, # ~1 month of trading days
'medium': 60, # ~3 months
'long': 120, # ~6 months
}
for label, w in windows.items():
df[f'corr_{label}'] = returns_a.rolling(w).corr(returns_b)Exponentially weighted — more responsive to recent changes.
def ewma_correlation(x: pd.Series, y: pd.Series, span: int = 60) -> pd.Series:
"""Compute EWMA correlation between two return series."""
cov_xy = x.mul(y).ewm(span=span).mean() - x.ewm(span=span).mean() * y.ewm(span=span).mean()
std_x = x.ewm(span=span).std()
std_y = y.ewm(span=span).std()
return cov_xy / (std_x * std_y)| Window | Days | Use Case | |--------|------|----------| | Short | 20 | Tactical trading, pairs entry/exit | | Medium | 60 | Strategy allocation, regime detection | | Long | 120 | Portfolio construction, strategic allocation |
# Build return matrix for multiple assets
returns = pd.DataFrame({
'BTC': btc_returns,
'ETH': eth_returns,
'SOL': sol_returns,
'AVAX': avax_returns,
})
# Correlation matrix (Pearson)
corr_matrix = returns.corr()
# Spearman (better for crypto)
spearman_matrix = returns.corr(method='spearman')Decompose the correlation matrix to identify driving factors.
eigenvalues, eigenvectors = np.linalg.eigh(corr_matrix.values) # Sort descending idx = eigenvalues.argsort()[::-1] eigenvalues = eigenvalues[idx] eigenvectors = eigenvectors[:, idx] # First eigenvalue = market factor (explains most variance) # Subsequent eigenvalues = sector/style factors market_factor_pct = eigenvalues[0] / eigenvalues.sum() * 100
from numpy.linalg import inv cov_matrix = returns.cov() ones = np.ones(len(cov_matrix)) inv_cov = inv(cov_matrix.values) # Minimum variance weights weights = inv_cov @ ones / (ones @ inv_cov @ ones)
Group assets by correlation similarity to identify natural clusters.
from scipy.cluster.hierarchy import linkage, fcluster from scipy.spatial.distance import squareform # Convert correlation to distance dist_matrix = np.sqrt(2 * (1 - corr_matrix.values)) np.fill_diagonal(dist_matrix, 0) # Hierarchical clustering condensed = squareform(dist_matrix) linkage_matrix = linkage(condensed, method='ward') # Cut at threshold to get clusters clusters = fcluster(linkage_matrix, t=1.0, criterion='distance')
**Applications**:
Normal correlation understates co-movement during crashes. Tail dependence measures how often assets experience extreme returns simultaneously.
def tail_dependence(x: pd.Series, y: pd.Series, quantile: float = 0.05) -> float:
"""Estimate lower tail dependence coeffA comprehensive collection of 68 ready-to-use trading, DeFi, and quantitative finance Agent Skills. Works with Claude Code, Cursor, Codex, Gemini CLI, and 30+ other tools.
Repo: agiprolabs/claude-trading-skills
Event-driven backtesting with bar-by-bar execution, complex order types, multiple analyzers,…
Solana token market data via Birdeye — prices, OHLCV, trades, token metadata, security…
Broad crypto market data from CoinGecko covering 13,000+ tokens. Global market stats,…
Cointegration testing for pairs trading using Engle-Granger, Johansen, and rolling stability…
Wallet evaluation, monitoring, and copy-trade strategy design for Solana DEX trading
Multi-method cost basis computation including specific identification, FIFO, LIFO, HIFO, and…