From b89eb0f941bad8baad836c7c419d350d74103e02 Mon Sep 17 00:00:00 2001 From: claude_dev Date: Thu, 23 Jul 2026 08:13:32 +0800 Subject: [PATCH] =?UTF-8?q?feat(portfolio):=20=E6=8E=A5=E7=BA=BF=20LocalUn?= =?UTF-8?q?ifiedProvider=20=E5=88=B0=20runner(Task5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sanguo_portfolio/providers/__init__.py | 8 +++++++- sanguo_portfolio/runner_backtest.py | 15 +++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/sanguo_portfolio/providers/__init__.py b/sanguo_portfolio/providers/__init__.py index 06c53af..1ea81dc 100644 --- a/sanguo_portfolio/providers/__init__.py +++ b/sanguo_portfolio/providers/__init__.py @@ -1,6 +1,12 @@ """sanguo_portfolio 数据 provider 层。""" from .baostock_provider import BaostockProvider from .local_parquet_provider import LocalParquetProvider +from .local_unified_provider import LocalUnifiedProvider from .sanguo_fundamentals import SanguoMiniQmtProvider -__all__ = ["SanguoMiniQmtProvider", "BaostockProvider", "LocalParquetProvider"] +__all__ = [ + "SanguoMiniQmtProvider", + "BaostockProvider", + "LocalParquetProvider", + "LocalUnifiedProvider", +] diff --git a/sanguo_portfolio/runner_backtest.py b/sanguo_portfolio/runner_backtest.py index 3ef3b7d..46a61e0 100644 --- a/sanguo_portfolio/runner_backtest.py +++ b/sanguo_portfolio/runner_backtest.py @@ -50,8 +50,8 @@ def parse_args() -> argparse.Namespace: p.add_argument("--max-pool", type=int, default=0, help="限制选股池前N只(0=不限,MVP验证用)") p.add_argument("--frequency", default="day", help="回测频率 day/minute") p.add_argument( - "--provider", default="local", choices=["local", "baostock", "miniqmt"], - help="数据 provider:baostock(默认,Mac/跨平台,历史成分股+TTM) / miniqmt(VPS 实盘,需 xtquant)", + "--provider", default="local", choices=["local", "baostock", "miniqmt", "unified"], + help="数据 provider:local(parquet,旧) / baostock(Mac 跨平台) / miniqmt(VPS 实盘) / unified(方案A 权威层)", ) p.add_argument( "--provider-config", default="{}", @@ -76,7 +76,12 @@ def build_provider(provider_name: str, config_str: str) -> Any: config_str: provider 配置 JSON 字符串 """ import json - from .providers import BaostockProvider, LocalParquetProvider, SanguoMiniQmtProvider + from .providers import ( + BaostockProvider, + LocalParquetProvider, + LocalUnifiedProvider, + SanguoMiniQmtProvider, + ) cfg: Dict[str, Any] = {} if config_str and config_str != "{}": @@ -93,7 +98,9 @@ def build_provider(provider_name: str, config_str: str) -> Any: return BaostockProvider(cfg) if name == "local": return LocalParquetProvider(cfg) - raise ValueError(f"未知 provider: {name}(支持: local / baostock / miniqmt)") + if name == "unified": + return LocalUnifiedProvider(cfg) + raise ValueError(f"未知 provider: {name}(支持: local / baostock / miniqmt / unified)") def build_broker_facade(engine: Any) -> Any: