91d9c36f44
- 删除 tests/data/vnpy_mock.py - conftest.py 加 vnpy_v4.4.0 源码到 sys.path(真实 vnpy import,不拉 Qt) - 5 passed(config 2 + validator 2 + datareader 1)
45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
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
|
|
|
|
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=Exchange.SSE, # 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",
|
|
)
|