68 lines
2.2 KiB
Python
68 lines
2.2 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
|
||
from vnpy.trader.database import get_database
|
||
|
||
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]:
|
||
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,
|
||
)
|