feat(BT-002): add historical snapshot provider

This commit is contained in:
Bu5hm4nn
2026-03-27 18:31:28 +01:00
parent 1a6760bee3
commit 477514f838
15 changed files with 822 additions and 82 deletions

View File

@@ -5,7 +5,7 @@ from math import isclose
from app.backtesting.engine import SyntheticBacktestEngine
from app.models.backtest import BacktestRunResult, BacktestScenario
from app.models.strategy_template import StrategyTemplate
from app.services.backtesting.historical_provider import SyntheticHistoricalProvider
from app.services.backtesting.historical_provider import BacktestHistoricalProvider, SyntheticHistoricalProvider
from app.services.strategy_templates import StrategyTemplateService
@@ -15,7 +15,7 @@ class BacktestService:
def __init__(
self,
provider: SyntheticHistoricalProvider | None = None,
provider: BacktestHistoricalProvider | None = None,
template_service: StrategyTemplateService | None = None,
) -> None:
self.provider = provider or SyntheticHistoricalProvider()
@@ -59,15 +59,15 @@ class BacktestService:
return BacktestRunResult(scenario_id=scenario.scenario_id, template_results=tuple(template_results))
@staticmethod
def _validate_template_for_mvp(template: StrategyTemplate) -> None:
def _validate_template_for_mvp(self, template: StrategyTemplate) -> None:
provider_label = (
"historical snapshot engine" if self.provider.pricing_mode == "snapshot_mid" else "synthetic MVP engine"
)
if template.contract_mode != "continuous_units":
raise ValueError(f"Unsupported contract_mode for synthetic MVP engine: {template.contract_mode}")
raise ValueError(f"Unsupported contract_mode for {provider_label}: {template.contract_mode}")
if template.roll_policy.policy_type != "hold_to_expiry":
raise ValueError("Unsupported roll_policy for synthetic MVP engine: " f"{template.roll_policy.policy_type}")
raise ValueError(f"Unsupported roll_policy for {provider_label}: {template.roll_policy.policy_type}")
if template.entry_policy.entry_timing != "scenario_start_close":
raise ValueError(
"Unsupported entry_timing for synthetic MVP engine: " f"{template.entry_policy.entry_timing}"
)
raise ValueError(f"Unsupported entry_timing for {provider_label}: {template.entry_policy.entry_timing}")
if template.entry_policy.stagger_days is not None:
raise ValueError("Unsupported entry_policy configuration for synthetic MVP engine")
raise ValueError(f"Unsupported entry_policy configuration for {provider_label}")