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]
This commit is contained in:
@@ -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}")
|
||||
Reference in New Issue
Block a user