Financial Analysis Tools
The quantammsim.simulator_analysis_tools.finance module provides comprehensive financial analysis capabilities for evaluating simulation results.
Risk-Adjusted Return Metrics
Jensen’s Alpha
from quantammsim.simulator_analysis_tools.finance.financial_analysis_functions import (
calculate_jensens_alpha
)
alpha = calculate_jensens_alpha(
portfolio_returns=daily_returns,
rf_values=risk_free_rates,
benchmark_returns=benchmark_daily_returns
)
Calculates annualized Jensen’s Alpha, measuring risk-adjusted excess return over the benchmark.
Sortino Ratio
from quantammsim.simulator_analysis_tools.finance.financial_analysis_functions import (
calculate_sortino_ratio
)
sortino = calculate_sortino_ratio(
portfolio_returns=daily_returns,
rf_values=risk_free_rates
)
Measures risk-adjusted return using only downside deviation.
Tracking and Information Ratios
from quantammsim.simulator_analysis_tools.finance.financial_analysis_functions import (
calculate_tracking_error_and_information_ratio
)
result = calculate_tracking_error_and_information_ratio(
portfolio_returns=daily_returns,
benchmark_returns=benchmark_returns
)
print(f"Tracking Error: {result['tracking_error']}")
print(f"Information Ratio: {result['information_ratio']}")
Drawdown Analysis
Drawdown Statistics
from quantammsim.simulator_analysis_tools.finance.financial_analysis_functions import (
calculate_drawdown_statistics
)
stats = calculate_drawdown_statistics(
daily_returns=daily_returns,
rf_values=risk_free_rates
)
Returns a dictionary containing:
max_drawdown- Maximum peak-to-trough declinemax_drawdown_duration- Longest drawdown periodaverage_drawdown- Mean drawdown across all periodsdrawdown_timeseries- Full drawdown series for plotting
Maximum Daily Drawdown
from quantammsim.simulator_analysis_tools.finance.financial_analysis_functions import (
calculate_max_daily_drawdown
)
# Calculate weekly maximum drawdowns
weekly_max_dd = calculate_max_daily_drawdown(
daily_returns=daily_returns,
period="weekly"
)
Periods can be: "daily", "weekly", "monthly", "yearly"
Risk Metrics
Ulcer Index
from quantammsim.simulator_analysis_tools.finance.financial_analysis_functions import (
calculate_ulcer_index,
calcuate_period_ulcer_index
)
# Overall ulcer index
ulcer = calculate_ulcer_index(daily_returns)
# Period-based ulcer index
monthly_ulcer = calcuate_period_ulcer_index(
daily_returns=daily_returns,
period="monthly"
)
Measures downside risk by penalizing depth and duration of drawdowns.
Sterling Ratio
from quantammsim.simulator_analysis_tools.finance.financial_analysis_functions import (
calculate_sterling_ratio,
calcuate_period_sterling_index
)
sterling = calculate_sterling_ratio(
returns=daily_returns,
rf=risk_free_rates
)
Risk-adjusted return relative to average drawdown.
Value at Risk (VaR) Metrics
from quantammsim.simulator_analysis_tools.finance.financial_analysis_functions import (
calculate_return_on_VaR,
calculate_cdar,
calculate_monthly_cdar
)
# Return on VaR
rovar = calculate_return_on_VaR(
portfolio_returns=daily_returns,
rf_values=risk_free_rates,
confidence_level=0.95
)
# Conditional Drawdown at Risk
cdar = calculate_cdar(
portfolio_returns=daily_returns,
confidence_level=0.95
)
Omega Ratio
from quantammsim.simulator_analysis_tools.finance.financial_analysis_functions import (
calculate_omega_ratio
)
omega = calculate_omega_ratio(
portfolio_returns=daily_returns,
rf_values=risk_free_rates,
threshold=0 # Threshold return
)
Ratio of probability-weighted gains to losses.
Benchmark Comparison
Capture Ratios
from quantammsim.simulator_analysis_tools.finance.financial_analysis_functions import (
calculate_capture_ratios
)
capture = calculate_capture_ratios(
portfolio_returns=daily_returns,
benchmark_returns=benchmark_returns
)
print(f"Upside Capture: {capture['upside_capture']}")
print(f"Downside Capture: {capture['downside_capture']}")
print(f"Capture Ratio: {capture['capture_ratio']}")
Measures how much of the benchmark’s up/down moves the portfolio captures.
Distribution Statistics
from quantammsim.simulator_analysis_tools.finance.financial_analysis_functions import (
calculate_distribution_statistics
)
stats = calculate_distribution_statistics(daily_returns)
print(f"Mean: {stats['mean']}")
print(f"Std: {stats['std']}")
print(f"Skewness: {stats['skewness']}")
print(f"Kurtosis: {stats['kurtosis']}")
Complete Analysis Pipeline
For a complete financial analysis, use the high-level calculator:
from quantammsim.simulator_analysis_tools.finance.param_financial_calculator import (
run_financial_analysis
)
results = run_financial_analysis(
portfolio_daily_returns=daily_returns,
startDateString="2023-01-01 00:00:00",
endDateString="2024-01-01 00:00:00",
bechmark_names=["BTC", "ETH"],
benchmarks_returns=benchmark_returns_dict
)
This returns a comprehensive analysis including all metrics and time series data.
Using with Simulation Results
After running a simulation with do_run_on_historic_data:
from quantammsim.runners.jax_runners import do_run_on_historic_data
from quantammsim.utils.post_train_analysis import calculate_period_metrics
# Run simulation
result = do_run_on_historic_data(
run_fingerprint=fingerprint,
params=params
)
# Calculate metrics
metrics = calculate_period_metrics(result)
print(f"Sharpe: {metrics['sharpe']}")
print(f"Return: {metrics['return']}")
print(f"Ulcer Index: {metrics['ulcer']}")
print(f"Calmar Ratio: {metrics['calmar']}")
print(f"Sterling Ratio: {metrics['sterling']}")
Available Metrics
Metric |
Description |
|---|---|
Jensen’s Alpha |
Risk-adjusted excess return vs benchmark (annualized) |
Sharpe Ratio |
Risk-adjusted return (daily and annualized) |
Sortino Ratio |
Downside risk-adjusted return |
Tracking Error |
Standard deviation of active returns |
Information Ratio |
Active return per unit tracking error |
Max Drawdown |
Maximum peak-to-trough decline |
Ulcer Index |
Depth and duration weighted drawdown measure |
Sterling Ratio |
Return relative to average drawdown |
Return on VaR |
Return relative to Value at Risk |
CDaR |
Conditional Drawdown at Risk |
Omega Ratio |
Probability-weighted gains vs losses |
Capture Ratios |
Upside/downside benchmark capture |
Post-Training Analysis
The quantammsim.utils.post_train_analysis module provides utilities for analyzing results after training.
Period Metrics
Calculate comprehensive metrics for a simulation period:
from quantammsim.utils.post_train_analysis import calculate_period_metrics
# After running a simulation
result = do_run_on_historic_data(fingerprint, params)
# Calculate all metrics
metrics = calculate_period_metrics(result)
Returns a dictionary with:
sharpe- Daily Sharpe ratio (annualized)jax_sharpe- JAX-computed Sharpe ratioreturn- Total returnreturns_over_hodl- Return relative to holding initial portfolioreturns_over_uniform_hodl- Return relative to uniform holdannualised_returns- Annualized total returnannualised_returns_over_hodl- Annualized return vs HODLannualised_returns_over_uniform_hodl- Annualized return vs uniform HODLulcer- Ulcer indexcalmar- Calmar ratiosterling- Sterling ratio
Continuous Test Metrics
For walk-forward analysis with separate train and test periods:
from quantammsim.utils.post_train_analysis import calculate_continuous_test_metrics
# Assuming continuous_results spans train + test
test_metrics = calculate_continuous_test_metrics(
continuous_results=full_results,
train_len=train_period_length,
test_len=test_period_length,
prices=price_data
)
# Returns metrics prefixed with 'continuous_test_'
print(test_metrics['continuous_test_sharpe'])
print(test_metrics['continuous_test_return'])
This extracts only the test period from a continuous simulation and calculates metrics on that portion.