diff --git a/app/services/backtesting/ui_service.py b/app/services/backtesting/ui_service.py index cb6b6e9..5803681 100644 --- a/app/services/backtesting/ui_service.py +++ b/app/services/backtesting/ui_service.py @@ -1,9 +1,11 @@ from __future__ import annotations +from copy import copy from dataclasses import dataclass from datetime import date from math import isclose +from app.backtesting.engine import SyntheticBacktestEngine from app.domain.backtesting_math import materialize_backtest_portfolio_state from app.models.backtest import ( BacktestRunResult, @@ -102,10 +104,10 @@ class BacktestPageService: ) self.template_service = template_service or base_service.template_service fixture_provider = FixtureBoundHistoricalProvider(base_service.provider) - self.backtest_service = BacktestService( - provider=fixture_provider, - template_service=self.template_service, - ) + self.backtest_service = copy(base_service) + self.backtest_service.provider = fixture_provider + self.backtest_service.template_service = self.template_service + self.backtest_service.engine = SyntheticBacktestEngine(fixture_provider) def template_options(self, symbol: str = "GLD") -> list[dict[str, str | int]]: return [ @@ -209,7 +211,10 @@ class BacktestPageService: end_date=end_date, initial_portfolio=initial_portfolio, template_refs=(TemplateRef(slug=template.slug, version=template.version),), - provider_ref=ProviderRef(provider_id="synthetic_v1", pricing_mode="synthetic_bs_mid"), + provider_ref=ProviderRef( + provider_id=self.backtest_service.provider.provider_id, + pricing_mode=self.backtest_service.provider.pricing_mode, + ), ) return BacktestPageRunResult( scenario=scenario, diff --git a/tests/test_backtest_ui.py b/tests/test_backtest_ui.py index dba7590..8d1c5a9 100644 --- a/tests/test_backtest_ui.py +++ b/tests/test_backtest_ui.py @@ -235,7 +235,31 @@ def test_backtest_page_service_does_not_mutate_injected_backtest_service() -> No history = injected_service.provider.load_history("GLD", date(2024, 1, 3), date(2024, 1, 3)) assert history[0].close == 123.0 assert page_service.template_service is injected_service.template_service + assert page_service.backtest_service is not injected_service assert page_service.backtest_service.provider.implied_volatility == 0.2 assert page_service.backtest_service.provider.risk_free_rate == 0.01 seeded_history = page_service.backtest_service.provider.load_history("GLD", date(2024, 1, 2), date(2024, 1, 8)) assert seeded_history[0].close == 100.0 + + +def test_backtest_page_service_uses_injected_provider_identity_in_provider_ref() -> None: + class CustomProvider(SyntheticHistoricalProvider): + provider_id = "custom_v1" + pricing_mode = "custom_mode" + + provider = CustomProvider(source=StaticBacktestSource(), implied_volatility=0.2, risk_free_rate=0.01) + injected_service = BacktestService(provider=provider) + page_service = BacktestPageService(backtest_service=injected_service) + + result = page_service.run_read_only_scenario( + symbol="GLD", + start_date=date(2024, 1, 2), + end_date=date(2024, 1, 8), + template_slug="protective-put-atm-12m", + underlying_units=1000.0, + loan_amount=68000.0, + margin_call_ltv=0.75, + ) + + assert result.scenario.provider_ref.provider_id == "custom_v1" + assert result.scenario.provider_ref.pricing_mode == "custom_mode"