"""股票池加载:前缀过滤/时间缓冲/vwap/bar_idx/显式symbols/limit抽样.""" import sqlite3 import sys, os sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "vnpy_v4.4.0"))) import pytest from sanguo_factor.universe import load_universe_bars, evaluation_filter, WARMUP_BARS _DDL = """ CREATE TABLE dbbardata( symbol TEXT, exchange TEXT, datetime TEXT, interval TEXT, volume REAL, turnover REAL, open_interest REAL, open_price REAL, high_price REAL, low_price REAL, close_price REAL) """ def _mk_db(tmp_path, rows): db = str(tmp_path / "qt.db") conn = sqlite3.connect(db) conn.execute(_DDL) conn.executemany("INSERT INTO dbbardata VALUES(?,?,?,?,?,?,?,?,?,?,?)", rows) conn.commit(); conn.close() return db def _row(sym, ex, day, close, volume=100.0, turnover=None): return (sym, ex, f"{day} 00:00:00", "d", volume, turnover if turnover is not None else close * volume, 0, close, close, close, close) @pytest.fixture() def db(tmp_path): from datetime import date, timedelta rows = [] # 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