Evaluation API
Metrics, visualization, and reporting utilities.
Metrics
calculate_metrics()
Calculate standard regression metrics.
1
2
3
4
5
6
7
8
9
from privatecredit.evaluation import calculate_metrics
metrics = calculate_metrics(
predicted=predicted_losses,
actual=actual_losses
)
print(metrics)
# {'rmse': 0.015, 'mae': 0.012, 'r2': 0.85, 'mape': 8.5}
Returns:
rmse: Root mean squared errormae: Mean absolute errorr2: R-squared scoremape: Mean absolute percentage error
calculate_transition_accuracy()
Evaluate transition probability predictions.
1
2
3
4
5
6
7
8
9
from privatecredit.evaluation import calculate_transition_accuracy
accuracy = calculate_transition_accuracy(
predicted_P=predicted_matrices,
actual_transitions=observed_counts
)
print(accuracy)
# {'kl_divergence': 0.05, 'total_variation': 0.03}
Loss Distribution Metrics
calculate_risk_metrics()
Calculate portfolio risk metrics from loss distribution.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from privatecredit.evaluation import calculate_risk_metrics
metrics = calculate_risk_metrics(
losses=loss_samples,
confidence_levels=[0.95, 0.99, 0.999]
)
print(metrics)
# {
# 'expected_loss': 0.023,
# 'loss_std': 0.018,
# 'var_95': 0.045,
# 'var_99': 0.062,
# 'var_999': 0.095,
# 'cvar_95': 0.055,
# 'cvar_99': 0.078,
# 'cvar_999': 0.112
# }
calculate_tail_metrics()
Analyze tail behavior of loss distribution.
1
2
3
4
5
6
from privatecredit.evaluation import calculate_tail_metrics
tail = calculate_tail_metrics(losses, threshold=0.05)
print(tail)
# {'exceedance_prob': 0.08, 'mean_excess': 0.025, 'tail_index': 2.5}
Visualization
plot_loss_distribution()
Plot portfolio loss distribution with risk metrics.
1
2
3
4
5
6
7
8
from privatecredit.evaluation import plot_loss_distribution
fig = plot_loss_distribution(
losses=loss_samples,
var_levels=[0.95, 0.99],
title='Portfolio Loss Distribution'
)
fig.savefig('loss_dist.pdf')
plot_scenario_comparison()
Compare loss distributions across scenarios.
1
2
3
4
5
6
7
8
9
10
from privatecredit.evaluation import plot_scenario_comparison
fig = plot_scenario_comparison(
scenarios={
'Baseline': baseline_losses,
'Adverse': adverse_losses,
'Severe': severe_losses
}
)
fig.savefig('scenario_comparison.pdf')
plot_transition_matrices()
Visualize transition probability matrices.
1
2
3
4
5
6
7
8
from privatecredit.evaluation import plot_transition_matrices
fig = plot_transition_matrices(
P_matrices=transition_matrices,
months=[0, 12, 24, 36],
state_names=['Perf', '30', '60', '90', 'Def', 'Pre', 'Mat']
)
fig.savefig('transition_matrices.pdf')
plot_macro_paths()
Visualize generated macro scenarios.
1
2
3
4
5
6
7
8
from privatecredit.evaluation import plot_macro_paths
fig = plot_macro_paths(
paths=macro_paths,
variables=['gdp_growth_yoy', 'unemployment_rate', 'credit_spread_hy'],
confidence_band=0.90
)
fig.savefig('macro_paths.pdf')
plot_waterfall()
Visualize waterfall cashflow distribution.
1
2
3
4
5
6
7
8
from privatecredit.evaluation import plot_waterfall
fig = plot_waterfall(
results=simulation_results,
month=36,
scenario='mean'
)
fig.savefig('waterfall.pdf')
Reporting
StressTestReport
Generate comprehensive stress test reports.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from privatecredit.evaluation import StressTestReport
report = StressTestReport(
portfolio=loans_df,
scenarios=scenario_definitions,
results=stress_results,
sensitivities=sensitivity_analysis
)
# Generate PDF report
report.generate_pdf('stress_test_report.pdf')
# Generate HTML report
report.generate_html('stress_test_report.html')
# Export data to Excel
report.to_excel('stress_test_data.xlsx')
TrancheAnalysisReport
Generate tranche-level analysis report.
1
2
3
4
5
6
7
8
from privatecredit.evaluation import TrancheAnalysisReport
report = TrancheAnalysisReport(
simulation_results=results,
waterfall_config=waterfall_config
)
report.generate_pdf('tranche_analysis.pdf')
Reverse Stress Testing
reverse_stress_test()
Find scenarios that produce target loss levels.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from privatecredit.evaluation import reverse_stress_test
scenario = reverse_stress_test(
macro_vae=macro_vae,
transition_model=transition_model,
trajectory_model=trajectory_model,
loans_df=loans_df,
target_loss=0.10, # 10% target loss
n_iterations=100,
tolerance=0.005
)
print(scenario)
# {'gdp_growth_yoy': -0.05, 'unemployment_rate': 0.12, ...}
Model Validation
validate_macro_vae()
Validate macro VAE generation quality.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from privatecredit.evaluation import validate_macro_vae
validation = validate_macro_vae(
model=macro_vae,
historical_data=historical_macro,
n_samples=1000
)
print(validation)
# {
# 'mean_error': 0.002,
# 'covariance_error': 0.05,
# 'autocorrelation_error': 0.08,
# 'scenario_separation': 0.92
# }
validate_transitions()
Validate transition model predictions.
1
2
3
4
5
6
7
8
9
10
from privatecredit.evaluation import validate_transitions
validation = validate_transitions(
model=transition_model,
observed_transitions=test_transitions,
macro_data=test_macro
)
print(validation)
# {'accuracy': 0.85, 'calibration_error': 0.03}
validate_trajectories()
Validate loan trajectory generation.
1
2
3
4
5
6
7
8
9
10
from privatecredit.evaluation import validate_trajectories
validation = validate_trajectories(
model=trajectory_model,
observed_panel=test_panel,
n_samples=100
)
print(validation)
# {'state_accuracy': 0.88, 'payment_rmse': 50.2, 'balance_rmse': 1200.5}
Backtesting
backtest_portfolio()
Run historical backtest.
1
2
3
4
5
6
7
8
9
10
11
from privatecredit.evaluation import backtest_portfolio
results = backtest_portfolio(
model_suite={'macro_vae': ..., 'transition': ..., 'trajectory': ...},
historical_loans=historical_loans_df,
historical_panel=historical_panel_df,
historical_macro=historical_macro_df,
test_periods=24 # Hold out last 24 months
)
print(results.summary())