From d00ad7d81d994ca099e15cfcfbcaaff558ae54fb Mon Sep 17 00:00:00 2001 From: claude_dev Date: Tue, 25 Aug 2026 00:09:31 +0800 Subject: [PATCH] =?UTF-8?q?fix(factor):=20WARMUP=5FBARS=2060=E2=86=92120?= =?UTF-8?q?=20=E6=81=A2=E5=A4=8Dspec=E5=89=94=E6=96=B0=E5=8F=A3=E5=BE=84(?= =?UTF-8?q?=E4=BF=AE=E5=A4=B9=E5=85=B7130=E6=A0=B9=E9=A2=84=E7=83=AD?= =?UTF-8?q?=E8=80=8C=E9=9D=9E=E6=94=B9=E5=8F=A3=E5=BE=84)+evaluation=5Ffil?= =?UTF-8?q?ter=E6=94=B9datetime=E5=AF=B9=E8=B1=A1=E6=AF=94=E8=BE=83(9M?= =?UTF-8?q?=E8=A1=8C=E5=85=8D=E9=80=90=E8=A1=8Cstrftime)=20[vps]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sanguo_factor/universe.py | 9 ++++----- tests/factor/test_universe.py | 12 +++++++----- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/sanguo_factor/universe.py b/sanguo_factor/universe.py index 7194c91..b52f00a 100644 --- a/sanguo_factor/universe.py +++ b/sanguo_factor/universe.py @@ -11,7 +11,7 @@ from datetime import datetime, timedelta import polars as pl STOCK_PREFIXES = ("60", "00", "30") -WARMUP_BARS = 60 +WARMUP_BARS = 120 _CHUNK = 300 # 分块 IN 查询每块 symbol 数(控瞬时内存) _LOOKBACK_DAYS = 300 # start 前缓冲(覆盖最大 60 日窗口 + 节假日) _FORWARD_DAYS = 45 # end 后缓冲(覆盖 10 日前瞻收益) @@ -98,11 +98,10 @@ def load_universe_bars( def evaluation_filter(df: pl.DataFrame, start: str, end: str) -> pl.DataFrame: """IC 评估行集:窗口内 + 预热期已过.""" - # Convert datetime to string (YYYY-MM-DD) for string comparison - # This avoids polars Datetime comparison issues + from datetime import datetime as _dt return df.filter( - (pl.col("datetime").dt.strftime("%Y-%m-%d") >= pl.lit(start)) - & (pl.col("datetime").dt.strftime("%Y-%m-%d") <= pl.lit(end)) + (pl.col("datetime") >= _dt.strptime(start, "%Y-%m-%d")) + & (pl.col("datetime") <= _dt.strptime(end, "%Y-%m-%d")) & (pl.col("bar_idx") >= WARMUP_BARS) ) diff --git a/tests/factor/test_universe.py b/tests/factor/test_universe.py index 7a52427..31defc1 100644 --- a/tests/factor/test_universe.py +++ b/tests/factor/test_universe.py @@ -32,10 +32,12 @@ def _row(sym, ex, day, close, volume=100.0, turnover=None): @pytest.fixture() def db(tmp_path): + from datetime import date, timedelta rows = [] - # 600000:60根(2017-10~2017-12) + 评估窗内 3 根 - for i in range(60): - rows.append(_row("600000", "SSE", f"2017-10-{(i % 28) + 1:02d}", 10.0 + i * 0.01)) + # 600000:130根预热(2017-08~2017-12,唯一日期) + 评估窗内 3 根 + for i in range(130): + day = (date(2017, 8, 1) + timedelta(days=i)).isoformat() + rows.append(_row("600000", "SSE", day, 10.0 + i * 0.01)) for d in ("2018-01-02", "2018-01-03", "2018-01-04"): rows.append(_row("600000", "SSE", d, 11.0)) # 000001:只有 2 根(次新,bar_idx