问题描述
解决方案
在 QMT (Quantitative Trading Platform) 中,获取股票的总股本和流通股本主要有三种方式,分别适用于不同的场景(如获取最新数据、获取合约基础信息或获取历史财务数据)。
以下是具体的实现方法和代码示例。
方法一:使用专用便捷函数(推荐)
这是最直接的方法,适用于在策略运行过程中快速获取当前最新的股本数据。
- 获取总股本:
ContextInfo.get_total_share(stockcode) - 获取流通股本:
ContextInfo.get_last_volume(stockcode)
代码示例:
# -*- coding: gbk -*-
def init(ContextInfo):
# 设置股票池,这里以浦发银行为例
ContextInfo.set_universe(['600000.SH'])
def handlebar(ContextInfo):
# 获取当前主图或指定代码
stock_code = '600000.SH'
# 1. 获取总股本
total_share = ContextInfo.get_total_share(stock_code)
# 2. 获取最新流通股本
last_volume = ContextInfo.get_last_volume(stock_code)
print(f"代码: {stock_code}")
print(f"总股本: {total_share}")
print(f"流通股本: {last_volume}")
方法二:使用合约详情接口
通过 get_instrumentdetail 接口可以一次性获取合约的详细信息字典,其中包含了总股本和流通股本字段。
- 接口:
ContextInfo.get_instrumentdetail(stockcode) - 字段:
TotalVolumn:总股本FloatVolumn:流通股本
代码示例:
# -*- coding: gbk -*-
def init(ContextInfo):
pass
def handlebar(ContextInfo):
stock_code = '600000.SH'
# 获取合约详细信息
detail = ContextInfo.get_instrumentdetail(stock_code)
if detail:
# 提取股本数据
total_vol = detail.get('TotalVolumn')
float_vol = detail.get('FloatVolumn')
print(f"代码: {stock_code}")
print(f"合约详情-总股本: {total_vol}")
print(f"合约详情-流通股本: {float_vol}")
else:
print(f"未获取到 {stock_code} 的合约信息")
方法三:使用财务数据接口(适用于回测/历史数据)
如果您需要获取历史某一天的股本数据(例如回测时需要当时准确的股本),或者进行基本面分析,建议使用财务数据接口。
- 接口:
ContextInfo.get_financial_data - 表名:
CAPITALSTRUCTURE(股本表) - 字段:
CAPITALSTRUCTURE.total_capital:总股本CAPITALSTRUCTURE.circulating_capital:已上市流通A股
代码示例:
# -*- coding: gbk -*-
def init(ContextInfo):
pass
def handlebar(ContextInfo):
# 仅在最后一根K线运行,避免重复打印
if not ContextInfo.is_last_bar():
return
stock_code = '600000.SH'
# 定义需要获取的字段:总股本 和 已上市流通A股
field_list = ['CAPITALSTRUCTURE.total_capital', 'CAPITALSTRUCTURE.circulating_capital']
# 定义时间范围(例如获取最近几天的数据)
start_date = '20230101'
end_date = '20230105'
# 获取数据
# 注意:返回的数据结构取决于传入的股票数量和时间范围,单股多日返回 DataFrame
df = ContextInfo.get_financial_data(field_list, [stock_code], start_date, end_date)
print("财务数据获取结果:")
print(df)
总结
| 方法 | 接口名称 | 适用场景 | 备注 |
|---|---|---|---|
| 方法一 | get_total_share / get_last_volume |
实盘交易、简单策略 | 获取的是最新数据,调用最简单。 |
| 方法二 | get_instrumentdetail |
获取合约静态属性 | 返回字典,包含涨跌停价、上市日期等更多信息。 |
| 方法三 | get_financial_data |
历史回测、基本面分析 | 可以获取历史时间点的股本结构,数据最严谨,需要下载财务数据。 |
Q&A
Q: get_last_volume 获取的流通股本单位是什么?
A: 返回值的单位通常是股(例如返回 1000000000 表示 10 亿股)。但在某些特定计算中,请注意核对是否需要转换为“手”或“万股”。
Q: 为什么使用财务数据接口获取不到数据?
A: 财务数据接口依赖本地数据文件。请在 QMT 客户端菜单中点击【数据管理】->【数据下载】,勾选【财务数据】并补充下载对应时间段的数据。
Q: 回测时应该用哪种方法?
A: 回测时强烈建议使用 方法三 (get_financial_data)。因为方法一和方法二通常返回的是当前最新的股本数据,如果在回测历史(如 2015 年)时使用了 2023 年的总股本,会导致计算市值或换手率出错(即使用了“未来函数”)。财务数据接口会根据回测时间点返回当时的数据。