feat(backtesting): wire config fields into implementation#34
Conversation
- Add _validate_config() to enforce settings constraints: - Validate n_splits <= BACKTEST_MAX_SPLITS - Validate gap <= BACKTEST_MAX_GAP - Warn if min_train_size < BACKTEST_DEFAULT_MIN_TRAIN_SIZE - Add save_results() method using BACKTEST_RESULTS_DIR - Add unit tests for config validation and result saving Closes issue with unused config fields in app/core/config.py Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Sorry @w7-mgfcode, your pull request is larger than the review limit of 150000 diff characters
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the
📝 WalkthroughWalkthroughThis PR introduces a complete backtesting vertical for time-series forecasting, featuring time-based cross-validation with expanding/sliding windows and gap support, a comprehensive metrics suite (MAE, sMAPE, WAPE, Bias, Stability Index), baseline model comparisons, data lineage tracking per fold, and API endpoints for backtesting orchestration and result retrieval. Changes
Sequence Diagram(s)sequenceDiagram
participant Client
participant API Route
participant BacktestingService
participant Database
participant TimeSeriesSplitter
participant Model
participant MetricsCalculator
Client->>API Route: POST /backtesting/run (store, product, dates, config)
API Route->>BacktestingService: run_backtest(db, config, dates)
BacktestingService->>Database: _load_series_data(store_id, product_id, date_range)
Database-->>BacktestingService: SeriesData (dates, values)
BacktestingService->>TimeSeriesSplitter: split(dates, values)
TimeSeriesSplitter-->>BacktestingService: Iterator[TimeSeriesSplit] (train/test indices per fold)
loop For each fold
BacktestingService->>Model: train(X_train, y_train)
Model-->>BacktestingService: trained_model
BacktestingService->>Model: predict(X_test)
Model-->>BacktestingService: predictions
BacktestingService->>MetricsCalculator: calculate_all(actuals, predictions)
MetricsCalculator-->>BacktestingService: fold_metrics (MAE, sMAPE, WAPE, Bias)
end
BacktestingService->>MetricsCalculator: aggregate_fold_metrics(all_fold_metrics)
MetricsCalculator-->>BacktestingService: aggregated_metrics, stability_indices
BacktestingService-->>API Route: BacktestResponse (main results, baselines, comparison summary)
API Route-->>Client: 200 OK with BacktestResponse JSON
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
- Add SIGNED_METRICS class constant to identify signed metrics (e.g., "bias") - Update _generate_comparison_summary to use absolute values for percentage improvement calculations on signed metrics - Original signed values are preserved in main/naive/seasonal_naive keys - Add 3 unit tests for signed metric handling: - test_comparison_signed_metric_uses_absolute_values - test_comparison_signed_metric_positive_values - test_comparison_signed_metric_mixed_signs Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Summary
_validate_config()method to enforce settings constraints at runtime:n_splitsdoes not exceedBACKTEST_MAX_SPLITS(default: 20)gapdoes not exceedBACKTEST_MAX_GAP(default: 30)min_train_sizeis belowBACKTEST_DEFAULT_MIN_TRAIN_SIZE(default: 30)save_results()method usingBACKTEST_RESULTS_DIRfor persisting backtest results as JSONThis wires the previously unused config fields from
app/core/config.py(lines 50-54) into the backtesting implementation.Test plan
🤖 Generated with Claude Code
Summary by CodeRabbit
Release Notes
New Features
Documentation
Tests
✏️ Tip: You can customize this high-level summary in your review settings.