Risk analytics toolkit for crypto, stocks, and forex trading. Extracted from the Nydar trading platform.
- Value at Risk (VaR) -- Historical, parametric, and Monte Carlo methods
- CVaR / Expected Shortfall -- Average loss beyond the VaR threshold
- Drawdown analysis -- Max drawdown, recovery time, peak-to-trough periods
- Risk ratios -- Sharpe, Sortino, Calmar, Treynor, Information Ratio
- Beta & Alpha -- Systematic risk and Jensen's Alpha vs any benchmark
- Correlation analysis -- Pearson/Spearman/Kendall, NxN matrices, rolling windows
- Regime detection -- Identify correlation regime shifts and anomalies
- Diversification tools -- Find low-correlation assets and potential hedges
- Position sizing -- Kelly Criterion and fixed-risk models
- Multi-asset support -- Crypto (365-day), stock (252-day), and forex (260-day) annualisation
pip install crypto-risk-toolkitimport pandas as pd
from crypto_risk_toolkit import RiskAnalyzer
analyzer = RiskAnalyzer(risk_free_rate=0.05)
# From any price series (pandas Series)
prices = pd.Series([100, 102, 99, 105, 103, 107, 110, 108, 112])
returns = analyzer.calculate_returns(prices)
# Individual metrics
sharpe = analyzer.calculate_sharpe_ratio(returns)
var = analyzer.calculate_var(returns, confidence_level=0.95)
drawdown = analyzer.calculate_drawdown(returns)
# Or get everything at once
metrics = analyzer.calculate_all_metrics(returns, asset_class="crypto")
print(metrics.to_dict())from crypto_risk_toolkit import CorrelationAnalyzer
analyzer = CorrelationAnalyzer()
# Build correlation matrix from price data
price_data = {"BTC": btc_prices, "ETH": eth_prices, "SOL": sol_prices}
matrix = analyzer.build_correlation_matrix(price_data, period_days=90)
# Find diversifying assets
diversifiers = analyzer.find_diversifiers(price_data, "BTC")
# Rolling correlation with regime detection
rolling = analyzer.calculate_rolling_correlation(
btc_prices, eth_prices, "BTC", "ETH", window_days=30
)
regime = analyzer.detect_correlation_regime(rolling)from crypto_risk_toolkit import kelly_criterion, fixed_risk_position_size
# Kelly Criterion
kelly_f = kelly_criterion(win_rate=0.55, avg_win=0.03, avg_loss=0.02)
# Fixed-risk position sizing
position = fixed_risk_position_size(
capital=100_000,
risk_pct=0.02, # Risk 2% per trade
entry_price=50.0,
stop_loss_price=48.0,
)
print(f"Buy {position.units} units (${position.position_size:,.0f})")
# Buy 1000.0 units ($50,000)| Method | Description |
|---|---|
calculate_returns(prices) |
Simple or log returns from prices |
calculate_volatility(returns) |
Annualised volatility |
calculate_sharpe_ratio(returns) |
Annualised Sharpe ratio |
calculate_sortino_ratio(returns) |
Sortino ratio (downside deviation) |
calculate_calmar_ratio(returns) |
Calmar ratio (return / max drawdown) |
calculate_var(returns, confidence) |
Value at Risk (historical/parametric/MC) |
calculate_cvar(returns, confidence) |
Conditional VaR (Expected Shortfall) |
calculate_drawdown(returns) |
Drawdown analysis |
calculate_beta(asset, benchmark) |
Beta vs benchmark |
calculate_alpha(asset, benchmark) |
Jensen's Alpha |
calculate_information_ratio(asset, benchmark) |
Information Ratio |
calculate_treynor_ratio(asset, benchmark) |
Treynor Ratio |
calculate_all_metrics(returns) |
All metrics in one call |
assess_risk_level(metrics) |
Risk score and warnings |
| Method | Description |
|---|---|
calculate_correlation(r1, r2) |
Pearson/Spearman/Kendall correlation |
calculate_pairwise_correlation(p1, p2) |
Correlation from price series |
build_correlation_matrix(price_data) |
NxN correlation matrix |
calculate_rolling_correlation(p1, p2) |
Rolling window correlation |
detect_correlation_regime(rolling) |
Regime detection with trend analysis |
get_cross_asset_correlations(data, classes) |
Intra/inter-class correlations |
find_diversifiers(data, target) |
Find low-correlation assets |
find_hedges(data, target) |
Find negatively correlated assets |
| Function | Description |
|---|---|
kelly_criterion(win_rate, avg_win, avg_loss) |
Kelly optimal fraction |
fixed_risk_position_size(capital, risk_pct, entry, stop) |
Fixed % risk sizing |
kelly_position_size(capital, win_rate, ...) |
Kelly-based position size |
- Python >= 3.9
- numpy >= 1.24
- pandas >= 1.5
- scipy >= 1.10
Ryan Clinton -- GitHub | Nydar Trading Platform
MIT