问题描述
获取 SH 股票的流通股本:FloatVolume,返回为 0,但是 SZ 的是正常的,为什么?
解决方案
在 QMT 平台中使用 get_instrument_detail 获取沪市(SH)股票流通股本时返回 0,通常是由以下几个原因导致的。以下是详细的排查步骤和替代解决方案:
1. 检查字段拼写是否正确
首先,请注意 QMT 官方 API 文档中的字段拼写。流通股本的字段名是 FloatVolumn(注意结尾是 mn,而不是 me),总股本是 TotalVolumn。如果您在代码中使用了 FloatVolume,可能会获取不到正确的值。
2. 交易所数据推送与本地数据同步差异
get_instrument_detail 获取的是合约的静态基础信息。有时由于交易所推送规则的差异或本地基础数据未完全同步,可能会导致某些字段(如沪市的流通股本)为空或为 0。建议在 QMT 终端的【数据管理】中,重新补充一下基础数据和财务数据。
3. 推荐的替代方案(更稳定)
如果 get_instrument_detail 依然无法获取,QMT 提供了专门用于获取股本数据的 API,建议使用以下方法:
方案 A:使用 get_last_volume 函数(最直接)
QMT 提供了专门获取最新流通股本的接口 ContextInfo.get_last_volume(),该接口通常比静态详情接口更可靠。
def handlebar(ContextInfo):
# 获取浦发银行的最新流通股本
float_vol = ContextInfo.get_last_volume('600000.SH')
print(f'600000.SH 流通股本: {float_vol}')
方案 B:使用财务数据接口获取(最准确)
流通股本本质上属于财务数据中的股本结构。您可以通过 ContextInfo.get_financial_data 接口,查询股本表(CAPITALSTRUCTURE)中的已上市流通A股(circulating_capital)字段。
def handlebar(ContextInfo):
# 取股本结构中的已上市流通A股
fieldList = ['CAPITALSTRUCTURE.circulating_capital']
stockList = ['600000.SH']
startDate = '20230101'
endDate = '20231231'
# 获取财务数据
df = ContextInfo.get_financial_data(fieldList, stockList, startDate, endDate)
print(df)
(注:使用财务数据接口前,请确保在 QMT 终端的【数据管理】中下载了对应的财务数据)
方案 C:获取总股本作为参考
如果您需要的是总股本,可以使用 ContextInfo.get_total_share():
def handlebar(ContextInfo):
total_share = ContextInfo.get_total_share('600000.SH')
print(f'600000.SH 总股本: {total_share}')
总结
遇到 get_instrument_detail 返回 0 的情况,首选检查拼写是否为 FloatVolumn。如果拼写无误但依然为 0,强烈建议改用 ContextInfo.get_last_volume('代码.SH') 或 财务数据接口 来获取流通股本,这两种方式在实盘和回测中表现更为稳定。