Risk Analytics¶
Calculate VaR, CVaR, beta, and other risk metrics.
📋 Notebook Information
- RustyBT Version: 0.1.2+
- Last Validated: 2025-11-07
- API Compatibility: Verified ✅
- Documentation: API Reference
In [1]:
Copied!
from rustybt.analytics import setup_notebook
setup_notebook()
from rustybt.analytics import setup_notebook
setup_notebook()
✅ Notebook environment configured successfully - Async/await support enabled - Pandas display options optimized - Progress bars configured
Risk Metrics¶
- Value at Risk (VaR)
- Conditional VaR (CVaR)
- Beta to benchmark
- Maximum Drawdown
- Sortino Ratio
In [2]:
Copied!
# Import required libraries
import numpy as np
import pandas as pd
from rustybt.analytics import RiskAnalytics
# Example: Create sample backtest results for demonstration
# In practice, you would use actual backtest results from run_algorithm()
# Generate realistic sample returns (representing daily returns from a backtest)
np.random.seed(42) # For reproducibility
n_days = 252 # One year of trading days
daily_returns = np.random.normal(0.0005, 0.015, n_days) # ~12.6% annual return, ~23.8% volatility
# Create a sample backtest results DataFrame
dates = pd.date_range(start='2023-01-01', periods=n_days, freq='B')
portfolio_value = 100000 * (1 + pd.Series(daily_returns)).cumprod()
results = pd.DataFrame({
'returns': daily_returns,
'portfolio_value': portfolio_value
}, index=dates)
# Initialize risk analytics
risk = RiskAnalytics(
backtest_result=results,
confidence_levels=[0.95, 0.99]
)
# Calculate Value at Risk (VaR)
var_results = risk.calculate_var(method='historical')
print("Value at Risk (VaR):")
for level, value in var_results.items():
print(f" {level}: {float(value):.4f} ({float(value)*100:.2f}%)")
# Calculate Conditional VaR (CVaR)
cvar_results = risk.calculate_cvar(method='historical')
print("\nConditional VaR (CVaR / Expected Shortfall):")
for level, value in cvar_results.items():
print(f" {level}: {float(value):.4f} ({float(value)*100:.2f}%)")
# Calculate tail risk metrics
tail_risk = risk.calculate_tail_risk()
print("\nTail Risk Metrics:")
print(f" Skewness: {float(tail_risk['skewness']):.4f}")
print(f" Kurtosis: {float(tail_risk['kurtosis']):.4f}")
print(f" Max 1-day loss: {float(tail_risk['max_loss_1d'])*100:.2f}%")
print(f" Downside deviation: {float(tail_risk['downside_deviation'])*100:.2f}%")
# Run stress tests
stress_results = risk.run_stress_tests()
print("\nStress Test Results:")
for scenario, loss in stress_results.items():
print(f" {scenario.replace('_', ' ').title()}: ${float(loss):,.2f}")
# Import required libraries
import numpy as np
import pandas as pd
from rustybt.analytics import RiskAnalytics
# Example: Create sample backtest results for demonstration
# In practice, you would use actual backtest results from run_algorithm()
# Generate realistic sample returns (representing daily returns from a backtest)
np.random.seed(42) # For reproducibility
n_days = 252 # One year of trading days
daily_returns = np.random.normal(0.0005, 0.015, n_days) # ~12.6% annual return, ~23.8% volatility
# Create a sample backtest results DataFrame
dates = pd.date_range(start='2023-01-01', periods=n_days, freq='B')
portfolio_value = 100000 * (1 + pd.Series(daily_returns)).cumprod()
results = pd.DataFrame({
'returns': daily_returns,
'portfolio_value': portfolio_value
}, index=dates)
# Initialize risk analytics
risk = RiskAnalytics(
backtest_result=results,
confidence_levels=[0.95, 0.99]
)
# Calculate Value at Risk (VaR)
var_results = risk.calculate_var(method='historical')
print("Value at Risk (VaR):")
for level, value in var_results.items():
print(f" {level}: {float(value):.4f} ({float(value)*100:.2f}%)")
# Calculate Conditional VaR (CVaR)
cvar_results = risk.calculate_cvar(method='historical')
print("\nConditional VaR (CVaR / Expected Shortfall):")
for level, value in cvar_results.items():
print(f" {level}: {float(value):.4f} ({float(value)*100:.2f}%)")
# Calculate tail risk metrics
tail_risk = risk.calculate_tail_risk()
print("\nTail Risk Metrics:")
print(f" Skewness: {float(tail_risk['skewness']):.4f}")
print(f" Kurtosis: {float(tail_risk['kurtosis']):.4f}")
print(f" Max 1-day loss: {float(tail_risk['max_loss_1d'])*100:.2f}%")
print(f" Downside deviation: {float(tail_risk['downside_deviation'])*100:.2f}%")
# Run stress tests
stress_results = risk.run_stress_tests()
print("\nStress Test Results:")
for scenario, loss in stress_results.items():
print(f" {scenario.replace('_', ' ').title()}: ${float(loss):,.2f}")
Value at Risk (VaR): var_95: -0.0219 (-2.19%) var_99: -0.0291 (-2.91%) Conditional VaR (CVaR / Expected Shortfall): cvar_95: -0.0273 (-2.73%) cvar_99: -0.0327 (-3.27%) Tail Risk Metrics: Skewness: 0.3002 Kurtosis: 0.5796 Max 1-day loss: -3.88% Downside deviation: 0.80% Stress Test Results: 2008 Financial Crisis: $nan Covid Crash: $nan Flash Crash: $nan