Skip to content

perf: 简化 QMTSource.is_available(),避免每次数据请求都探测 xtdata#31

Open
DrIsDr wants to merge 3 commits into
quant-king299:mainfrom
DrIsDr:fix-qmt-is-available-performance
Open

perf: 简化 QMTSource.is_available(),避免每次数据请求都探测 xtdata#31
DrIsDr wants to merge 3 commits into
quant-king299:mainfrom
DrIsDr:fix-qmt-is-available-performance

Conversation

@DrIsDr

@DrIsDr DrIsDr commented Jul 11, 2026

Copy link
Copy Markdown

问题描述

QMTSource.is_available() 每次被调用时都会执行一次真实的 xtdata.get_market_data_ex() API 探测:

# 修改前
if not self.is_connected:
    return False

try:
    from xtquant import xtdata
    test_data = xtdata.get_market_data_ex(
        ['000001.SZ'],
        period='1d',
        start_time='20230101',
        end_time='20230101'
    )
    return True
except Exception:
    return False

HybridDataManager 在每次获取价格、基本面、交易日历前都会调用 source.is_available()hybrid_manager.py 第 164、279、390 行等)。当 QMT 未启动、未安装或响应较慢时,每次数据请求都会先阻塞在 QMT 探测上,失败后再 fallback 到 Tushare,造成明显的卡顿。

实际运行日志表现为:

[HybridDataManager] 尝试从 qmt 获取交易日历...
[HybridDataManager] 尝试从 tushare 获取交易日历...
[HybridDataManager] [OK] 从 tushare 获取交易日历成功
[HybridDataManager] 尝试从 qmt 获取基本面数据...
[HybridDataManager] 尝试从 tushare 获取基本面数据...
[HybridDataManager] [OK] 从 tushare 获取基本面数据成功
...

每次请求都要等待 QMT 探测超时/失败后才会继续,严重影响回测和策略运行体验。

改动内容

QMTSource.is_available() 简化为只返回连接状态:

def is_available(self) -> bool:
    return self.is_connected

connect() 方法在初始化时已经做过真实的连接探测并设置 self.is_connected,因此 is_available() 无需重复探测。

为什么这是安全的

  1. 语义一致is_available() 在其他数据源中都是轻量状态检查:

    • DuckDBSource.is_available() -> return self.connection is not None
    • TushareSource.is_available() -> 检查 is_connected 和 token
      QMT 原本的实现与该方法的轻量语义不符。
  2. fallback 机制健全HybridDataManager 对实际数据调用有 try-except 保护:

    try:
        df = source.get_price(...)
    except Exception as e:
        print(f"[HybridDataManager] [FAIL] {source_name} 获取价格数据失败: {e}")
        continue

    即使 QMT 在运行中突然断开,is_available() 返回 True 后实际调用失败,也会被捕获并 fallback 到下一个数据源,行为与当前一致。

  3. 性能收益:消除每次数据请求前的多余 API 探测,QMT 不可用时可立即进入 fallback,策略运行更流畅。

验证

  • python -m py_compile core/data_manager/sources/qmt_source.py 通过
  • from core.data_manager.sources.qmt_source import QMTSource 导入正常
  • 修改范围仅涉及 QMTSource.is_available(),不影响其他数据源或 HybridDataManager 的数据获取逻辑

Copilot AI review requested due to automatic review settings July 11, 2026 01:13

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

本 PR 旨在优化 HybridDataManager 在优先尝试 QMT 数据源时的性能表现,通过将 QMTSource.is_available() 从“每次真实探测 xtdata API”改为“轻量连接状态检查”,避免在 QMT 不可用/响应慢时反复阻塞后才进入 fallback 逻辑。

Changes:

  • QMTSource.is_available() 简化为直接返回 self.is_connected,移除每次调用的 xtdata.get_market_data_ex() 探测。
  • 补充 is_available() 的说明,明确该变更的性能动机与 fallback 行为背景。

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread core/data_manager/sources/qmt_source.py
@DrIsDr DrIsDr force-pushed the fix-qmt-is-available-performance branch from b8ed87a to ba1697d Compare July 11, 2026 03:04
- 验证 is_available() 仅依据 is_connected 返回状态
- 验证 is_available() 不再调用 xtdata API 做真实探测
- 验证 close() 正确重置连接状态、清空缓存、重置 _last_used
- 配置 pytest 入口:pyproject.toml [tool.pytest.ini_options]
- gitignore 保留 unit_tests/ 目录,忽略 .worktrees/
@DrIsDr DrIsDr force-pushed the fix-qmt-is-available-performance branch from ba1697d to 52e974f Compare July 11, 2026 03:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants