From 4e541040f1e79fe0b8818fb6b9af4a0bd98babb2 Mon Sep 17 00:00:00 2001 From: claude_dev Date: Sun, 5 Jul 2026 12:36:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(data):=20DataReader=20SQLite=20+=20?= =?UTF-8?q?=E4=BA=A4=E6=98=93=E6=89=80=E5=88=A4=E6=96=AD=20+=20vnpy=204.4.?= =?UTF-8?q?0=20spike=20=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sanguo_data/datareader.py | 25 ++++++++++++++++++++++++- tests/data/test_datareader.py | 10 +++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/sanguo_data/datareader.py b/sanguo_data/datareader.py index 4dba286..bdb4718 100644 --- a/sanguo_data/datareader.py +++ b/sanguo_data/datareader.py @@ -12,6 +12,7 @@ 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"]) @@ -32,7 +33,7 @@ def read_parquet_daily(symbol: str, start: str, end: str, cfg) -> list[BarData]: def _row_to_bar(symbol: str, row, interval: Interval) -> BarData: return BarData( symbol=symbol, - exchange=Exchange.SSE, # Task 4 改为 guess_exchange + exchange=guess_exchange(symbol), # Task 4 已改为 guess_exchange datetime=pd.to_datetime(row["date"]).to_pydatetime(), interval=interval, open_price=float(row["open"]), @@ -42,3 +43,25 @@ def _row_to_bar(symbol: str, row, interval: Interval) -> BarData: 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, + ) diff --git a/tests/data/test_datareader.py b/tests/data/test_datareader.py index 3828aa1..186baa2 100644 --- a/tests/data/test_datareader.py +++ b/tests/data/test_datareader.py @@ -1,7 +1,7 @@ import pandas as pd from vnpy.trader.constant import Exchange, Interval from sanguo_data.config import DataConfig -from sanguo_data.datareader import read_parquet_daily +from sanguo_data.datareader import read_parquet_daily, guess_exchange def test_read_parquet_daily_returns_bardata(tmp_path): year_dir = tmp_path / "2026" @@ -22,3 +22,11 @@ def test_read_parquet_daily_returns_bardata(tmp_path): assert len(bars) == 2 assert bars[0].symbol == "600000" assert bars[0].open_price == 10.0 + + +def test_guess_exchange_sh(): + assert guess_exchange("600000").value == "SSE" + + +def test_guess_exchange_sz(): + assert guess_exchange("000001").value == "SZSE"