import sys import os from pathlib import Path # Add real vnpy source code to sys.path _VNPY_SRC = os.path.join(os.path.dirname(__file__), "..", "vnpy_v4.4.0") _VNPY_SRC = os.path.abspath(_VNPY_SRC) if _VNPY_SRC not in sys.path: sys.path.insert(0, _VNPY_SRC) import pandas as pd from datetime import datetime from vnpy.trader.object import BarData from vnpy.trader.constant import Exchange, Interval from vnpy.trader.database import get_database from vnpy.trader.setting import SETTINGS def read_parquet_daily(symbol: str, start: str, end: str, cfg) -> list[BarData]: daily_dir = Path(cfg.data_paths["daily_dir"]) start_dt = datetime.strptime(start, "%Y-%m-%d") end_dt = datetime.strptime(end, "%Y-%m-%d") bars: list[BarData] = [] for year in range(start_dt.year, end_dt.year + 1): f = daily_dir / str(year) / f"{symbol}.parquet" if not f.exists(): continue df = pd.read_parquet(f) for _, row in df.iterrows(): d = pd.to_datetime(row["date"]) if start_dt <= d <= end_dt: bars.append(_row_to_bar(symbol, row, Interval.DAILY)) return bars def _row_to_bar(symbol: str, row, interval: Interval) -> BarData: return BarData( symbol=symbol, exchange=guess_exchange(symbol), # Task 4 已改为 guess_exchange datetime=pd.to_datetime(row["date"]).to_pydatetime(), interval=interval, open_price=float(row["open"]), high_price=float(row["high"]), low_price=float(row["low"]), close_price=float(row["close"]), volume=float(row["volume"]), gateway_name="DATA", ) def guess_exchange(symbol: str) -> Exchange: """按代码前缀判断交易所:6/68/5x→SSE,0/3/15x→SZSE""" if symbol.startswith(("60", "68", "51", "56", "58")): return Exchange.SSE if symbol.startswith(("00", "30", "15")): return Exchange.SZSE return Exchange.SSE def read_db_daily(symbol: str, start: str, end: str, cfg) -> list[BarData]: # Configure vnpy database SETTINGS before calling get_database() SETTINGS["database.name"] = "sqlite" SETTINGS["database.database"] = cfg.data_paths["vnpy_db"] db = get_database() start_dt = datetime.strptime(start, "%Y-%m-%d") end_dt = datetime.strptime(end, "%Y-%m-%d") return db.load_bar_data( symbol=symbol, exchange=guess_exchange(symbol), interval=Interval.DAILY, start=start_dt, end=end_dt, )