fix(pre-alpha): preserve injected provider identity

This commit is contained in:
Bu5hm4nn
2026-03-26 12:32:52 +01:00
parent 52d943e614
commit 91f67cd414
2 changed files with 34 additions and 5 deletions

View File

@@ -1,9 +1,11 @@
from __future__ import annotations from __future__ import annotations
from copy import copy
from dataclasses import dataclass from dataclasses import dataclass
from datetime import date from datetime import date
from math import isclose from math import isclose
from app.backtesting.engine import SyntheticBacktestEngine
from app.domain.backtesting_math import materialize_backtest_portfolio_state from app.domain.backtesting_math import materialize_backtest_portfolio_state
from app.models.backtest import ( from app.models.backtest import (
BacktestRunResult, BacktestRunResult,
@@ -102,10 +104,10 @@ class BacktestPageService:
) )
self.template_service = template_service or base_service.template_service self.template_service = template_service or base_service.template_service
fixture_provider = FixtureBoundHistoricalProvider(base_service.provider) fixture_provider = FixtureBoundHistoricalProvider(base_service.provider)
self.backtest_service = BacktestService( self.backtest_service = copy(base_service)
provider=fixture_provider, self.backtest_service.provider = fixture_provider
template_service=self.template_service, 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]]: def template_options(self, symbol: str = "GLD") -> list[dict[str, str | int]]:
return [ return [
@@ -209,7 +211,10 @@ class BacktestPageService:
end_date=end_date, end_date=end_date,
initial_portfolio=initial_portfolio, initial_portfolio=initial_portfolio,
template_refs=(TemplateRef(slug=template.slug, version=template.version),), 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( return BacktestPageRunResult(
scenario=scenario, scenario=scenario,

View File

@@ -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)) history = injected_service.provider.load_history("GLD", date(2024, 1, 3), date(2024, 1, 3))
assert history[0].close == 123.0 assert history[0].close == 123.0
assert page_service.template_service is injected_service.template_service 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.implied_volatility == 0.2
assert page_service.backtest_service.provider.risk_free_rate == 0.01 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)) 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 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"