diff --git a/tests/test_research_pipeline.py b/tests/test_research_pipeline.py index 98eb37e..b41ff88 100644 --- a/tests/test_research_pipeline.py +++ b/tests/test_research_pipeline.py @@ -233,3 +233,35 @@ def test_factor_backtest_research_requires_matching_daily_calendars() -> None: execution_price_field="open", valuation_price_field="close", ) + + +def test_factor_backtest_starts_at_first_signal_instead_of_price_warmup() -> None: + """因子预热行情不能作为空仓日混入研究绩效区间。""" + dates = pd.date_range("2026-01-05", periods=5, freq="B") + scores = pd.DataFrame({"A": [1.0]}, index=dates[2:3]) + opens = pd.DataFrame({"A": [1.0, 1.0, 1.0, 10.0, 10.0]}, index=dates) + closes = pd.DataFrame({"A": [100.0, 200.0, 300.0, 11.0, 12.0]}, index=dates) + config = ExecutionConfig( + commission_bps=0, + stamp_tax_bps=0, + slippage_bps=0, + min_trade_amount=0, + ) + + result = run_factor_backtest_research( + scores, + execution_prices=opens, + valuation_prices=closes, + top_k=1, + execution_price_field="open", + valuation_price_field="close", + initial_cash=1_000.0, + config=config, + ) + + assert result.nav.index.equals(dates[2:]) + pd.testing.assert_series_equal( + result.nav, + pd.Series([1.0, 1.1, 1.2], index=dates[2:], name="nav"), + ) + assert result.stats()["n_days"] == 3