perf(xt): get_market_data_ex 显式传六列 field_list——桥fallback快路径(FormulaServer 0.025s vs 空列RPC 0.1-5.8s/次,今晚21:00全量夜班从~3.7h回分钟级);五样本含2北交空列vs六列等值实测EQUIV,TDD断言调用一等参 [vps]
CI/CD / test (push) Successful in 27s
CI/CD / nas-deploy (push) Successful in 2s
CI/CD / nas-verify (push) Successful in 21s

This commit is contained in:
2026-09-11 13:39:40 +08:00
parent a3a752d77f
commit e478aba80f
2 changed files with 50 additions and 1 deletions
+4 -1
View File
@@ -30,6 +30,9 @@ from dbbardata_utils import normalize_daily_dt
DB = r"C:\sanguo_vnpy_v2\data\quant_trading.db"
LOOKBACK = int(__import__("os").environ.get("LOOKBACK_DAYS", "30"))
# 桥 fallback(2026-09-11 停栈后): 空 field_list 走 RPC 0.1~5.8s/次(全量 2303 只
# ≈小时级); 显式六列走 FormulaServer ~0.025s/次, 五样本含 2 北交等值实测 EQUIV
FIELDS = ["open", "high", "low", "close", "volume", "amount"]
T0 = time.time()
@@ -118,7 +121,7 @@ def main():
for i, code in enumerate(u):
sym = code.split(".")[0]
try:
r = xd.get_market_data_ex([], [code], period="1d",
r = xd.get_market_data_ex(FIELDS, [code], period="1d",
start_time=_start_of(code),
end_time=end, dividend_type="none")
df = r.get(code) if r else None
@@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
"""TDD for xt_eod get_market_data_ex field_list — 桥 fallback 快路径。
背景(2026-09-11):
mini 栈停服后 shim 落 ContextInfo fallback。空 field_list 的
get_market_data_ex 走 RPC(实测 0.1~5.8s/次, 全量 2303 只 ≈ 小时级);
显式传六列 OHLCV 走 FormulaServer(实测 ~0.025s/次, 与空列五行含
2 北交等值 EQUIV)。xt_eod 恰好只消费这六列 -> 必须显式传。
mac 上 xt_eod.xd=None, monkeypatch 假 xd + mock sqlite 后跑通 main(),
断言调用一等参恰为六列。
"""
import sys
from unittest.mock import MagicMock
import pandas as pd
import pytest
from scripts.data_platform import xt_eod
SIX = ["open", "high", "low", "close", "volume", "amount"]
def test_get_market_data_ex_passes_six_field_list(monkeypatch):
assert xt_eod.xd is None # mac 前置: 真桥环境不可得, 走 mock
df = pd.DataFrame(
{"open": [1.0], "high": [1.2], "low": [0.9], "close": [1.1],
"volume": [100.0], "amount": [110.0]},
index=[20260910])
m = MagicMock()
m.get_stock_list_in_sector = lambda name: (
["510050.SH"] if name == "沪深ETF" else ["501000.SH"])
m.get_market_data_ex = MagicMock(
return_value={"510050.SH": df, "501000.SH": df})
monkeypatch.setattr(xt_eod, "xd", m)
# sqlite: BJ 查询迭代 mock cursor 抛 TypeError 被 WARN 吞; 写路径全 mock
monkeypatch.setattr(xt_eod.sqlite3, "connect", MagicMock())
monkeypatch.setattr(sys, "argv", ["xt_eod.py", "--limit", "1"])
rc = xt_eod.main()
assert rc == 0
args, _ = xt_eod.xd.get_market_data_ex.call_args
assert list(args[0]) == SIX, (
f"field_list 应显式传六列走 FormulaServer 快路径, 实得 {args[0]!r}")