问题描述
from xtquant import xtdatacenter as xtdc
def xtdc_init():
# 设置迅投研令牌
xtdc.set_token("xxx") # 实际运行代码之前,都会去官网拷贝最新的token,这里的‘xxx'仅是举例
xtdc.init()
xtdc_init()
xtdata.get_stock_list_in_sector('SF')
在尝试get_stock_list_in_sector('SF')时报错:
return client.get_stock_list_in_sector(sector_name, 0)
RuntimeError: { "ErrorID" : 200003, "ErrorMsg" : "timeout" }
解决方案
在使用 xtquant 或 QMT 平台调用 get_stock_list_in_sector 接口时遇到 timeout (ErrorID: 200003) 报错,通常是由以下几个原因引起的。以下是详细的排查和解决步骤:
1. 参数传入错误(最常见原因)
get_stock_list_in_sector(sector_name) 接口的参数 sector_name 必须是板块名称(通常是中文),而不是市场代码。
- 错误用法:传入了
'SF'(上期所的市场代码)。由于系统找不到名为'SF'的板块,可能会导致底层查询卡死或超时。 - 正确用法:传入具体的板块名称,例如
'沪深300'、'中证500'、'上证50'等。
如果你想获取某个市场(如上期所)的所有合约代码,不应该使用 get_stock_list_in_sector,而应该使用获取市场合约列表的专用接口(例如 xtdata.get_stock_list_in_sector('上期所'),具体取决于客户端左侧板块树中是否有“上期所”这个板块节点)。
2. 数据服务未就绪或网络问题
虽然你调用了 xtdc.init(),但数据中心可能尚未完全建立连接或同步完基础数据字典。
- 解决办法:在
init()之后,稍微等待几秒钟,或者检查网络是否能够正常访问迅投的数据服务器。
3. 客户端数据未下载(针对依赖客户端的模式)
如果你使用的是依赖 QMT 客户端运行的 xtdata 模式,超时可能是因为客户端尚未启动,或者客户端本地没有下载相应的板块数据。
- 解决办法:确保 QMT 客户端已登录,并在客户端的“数据管理”中补充了相关的基础数据和板块数据。
💡 QMT 策略中的标准用法参考
如果你是在 QMT 平台内部编写 Python 策略,获取板块成分股的标准用法如下:
def handlebar(ContextInfo):
# 获取沪深300成分股
hs300_list = ContextInfo.get_stock_list_in_sector('沪深300')
print(hs300_list)
总结建议
请将你的代码修改为查询一个确切存在的中文板块名称进行测试:
from xtquant import xtdata
# 测试查询一个常见的板块
sector_name = '沪深300'
try:
stock_list = xtdata.get_stock_list_in_sector(sector_name)
print(f"{sector_name} 成分股数量: {len(stock_list)}")
except Exception as e:
print(f"查询失败: {e}")
如果查询 '沪深300' 成功,说明你的环境配置无误,之前的报错纯粹是因为传入了不存在的板块名 'SF'。