fix: use selected data source for backtest historical prices
The backtest engine was always using fixture data (limited to 2024-01-02 through 2024-01-08) regardless of the data_source selection. The fix fetches historical prices using the specified data source (Databento, Yahoo Finance, or synthetic) and passes them directly to the engine.
This commit is contained in:
@@ -323,15 +323,20 @@ class BacktestPageService:
|
|||||||
margin_call_ltv=normalized_inputs.margin_call_ltv,
|
margin_call_ltv=normalized_inputs.margin_call_ltv,
|
||||||
)
|
)
|
||||||
|
|
||||||
# CRITICAL: The backtest engine uses a fixture provider (synthetic_v1),
|
# Fetch historical prices using the specified data source
|
||||||
# regardless of the data_source used for price fetching.
|
history = self.get_historical_prices(normalized_symbol, start_date, end_date, data_source)
|
||||||
# We must use the fixture provider's ID for the scenario, not the data source's ID.
|
if not history:
|
||||||
# The data_source parameter only affects price data fetching, not the backtest engine.
|
raise ValueError("No historical prices found for scenario window")
|
||||||
|
if history[0].date != start_date:
|
||||||
|
raise ValueError(
|
||||||
|
"Scenario start date must match the first available historical close for entry-at-start backtests"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Use the fixture provider's ID for the scenario (for pricing mode)
|
||||||
|
# The actual price data comes from the specified data_source
|
||||||
provider_id = self.backtest_service.provider.provider_id
|
provider_id = self.backtest_service.provider.provider_id
|
||||||
pricing_mode = self.backtest_service.provider.pricing_mode
|
pricing_mode = self.backtest_service.provider.pricing_mode
|
||||||
|
|
||||||
# For now, always use the synthetic engine (which uses fixture data for demo)
|
|
||||||
# In a full implementation, we would create different engines for different providers
|
|
||||||
scenario = BacktestScenario(
|
scenario = BacktestScenario(
|
||||||
scenario_id=(
|
scenario_id=(
|
||||||
f"{normalized_symbol.lower()}-{start_date.isoformat()}-{end_date.isoformat()}-{template.slug}"
|
f"{normalized_symbol.lower()}-{start_date.isoformat()}-{end_date.isoformat()}-{template.slug}"
|
||||||
@@ -353,9 +358,14 @@ class BacktestPageService:
|
|||||||
if data_source == "databento":
|
if data_source == "databento":
|
||||||
data_cost_usd = self.get_cost_estimate(normalized_symbol, start_date, end_date, data_source)
|
data_cost_usd = self.get_cost_estimate(normalized_symbol, start_date, end_date, data_source)
|
||||||
|
|
||||||
|
# Run the backtest engine directly with pre-fetched history
|
||||||
|
# This bypasses the fixture provider in BacktestService.run_scenario
|
||||||
|
template_result = self.backtest_service.engine.run_template(scenario, template, history)
|
||||||
|
run_result = BacktestRunResult(scenario_id=scenario.scenario_id, template_results=(template_result,))
|
||||||
|
|
||||||
return BacktestPageRunResult(
|
return BacktestPageRunResult(
|
||||||
scenario=scenario,
|
scenario=scenario,
|
||||||
run_result=self.backtest_service.run_scenario(scenario),
|
run_result=run_result,
|
||||||
entry_spot=entry_spot,
|
entry_spot=entry_spot,
|
||||||
data_source=data_source,
|
data_source=data_source,
|
||||||
data_cost_usd=data_cost_usd,
|
data_cost_usd=data_cost_usd,
|
||||||
|
|||||||
Reference in New Issue
Block a user