fix(pre-alpha): preserve injected provider identity
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user