Files
sanguo_vnpy_v2/sanguo_portfolio/__init__.py
T
claude_dev b270faf4b9 feat(portfolio): 本地数据 provider 层(baostock/local_parquet)
- BaostockProvider: 读 VPS daily_baostock_full(本地,不调online,守 provider-local-data-only 铁律)
- LocalParquetProvider: 读 parquet 兜底,回测117交易日0.4s/月出JSON
- all_weather 策略 + runner_backtest 适配
- 数据源融合使用层(单 Provider 内部路由,见 data-fusion spec §6)
2026-07-22 10:35:23 +08:00

47 lines
2.1 KiB
Python

"""sanguo_portfolio:聚宽全天候轮动策略搬到 BulletTrade 框架。
子模块:
- ``factors`` 纯函数估值/ROIC 因子(无外部依赖)
- ``filters`` ST/停牌/科创北交/次新/涨跌停 过滤(无外部依赖)
- ``providers`` BaostockProvider(Mac/回测,历史成分股+TTM) /
SanguoMiniQmtProvider(VPS 实盘,继承 bullet-trade MiniQMTProvider)
- ``strategies`` AllWeatherStrategy(聚宽 post48819 翻译)
ENV GUARD(bullet-trade 0.9.2 坑):
- ``import bullet_trade`` 时 default provider 是 jqdata,会强制 ``import jqdatasdk``,
本地/服务器都没装(用户铁律不用 jqdata 付费)。
- 在任何 ``import bullet_trade`` **之前**设 ``DEFAULT_DATA_PROVIDER``,
default provider 切到非 jqdata provider,跳过 jqdatasdk。
- 实际数据走 ``set_data_provider(...)`` 覆盖。
"""
import os
import sys as _sys
from unittest.mock import MagicMock as _MagicMock
# ENV + mock 必须早于任何 bullet_trade import(providers 子模块会触发 bullet_trade):
# miniqmt → import xtquant(周六休市 miniQMT 客户端不响应→卡死)
# jqdata → import jqdatasdk(用户铁律不装→ModuleNotFoundError)
# 方案: ENV 设 jqdata + 预插 mock jqdatasdk(@jq.utils.assert_auth 装饰器 passthrough),
# 让 bullet_trade import 走 jqdata 分支拿 mock 不崩不卡;真实 provider 由
# set_data_provider 运行时注入覆盖(local/baostock/miniqmt)。
# 必须在包 __init__ 顶部(providers import 触发 bullet_trade 之前),runner_backtest 顶部太晚。
os.environ.setdefault("DEFAULT_DATA_PROVIDER", "jqdata")
if "jqdatasdk" not in _sys.modules:
_m = _MagicMock()
_m.utils.assert_auth = lambda func: func # jqdata.py 用 @jq.utils.assert_auth 装饰器
_sys.modules["jqdatasdk"] = _m
from . import factors, filters
from .providers import BaostockProvider, SanguoMiniQmtProvider
from .strategies import AllWeatherConfig, AllWeatherStrategy, BrokerFacade
__all__ = [
"factors",
"filters",
"BaostockProvider",
"SanguoMiniQmtProvider",
"AllWeatherStrategy",
"AllWeatherConfig",
"BrokerFacade",
]