问题描述
解决方案
在 QMT (Quant Maker Trading) 平台中,查询一只股票的总股本主要有两种方式,取决于您是需要获取当前最新的总股本,还是需要获取历史回测中某一天对应的财务数据总股本。
方法一:使用 get_total_share (最简便)
如果您只需要获取指定股票的总股数(通常用于获取当前基础信息),可以使用 ContextInfo.get_total_share(stockcode) 接口。
- 函数:
ContextInfo.get_total_share(stockcode) - 参数:
stockcode(字符串),例如'600000.SH'。 - 返回:
number(数值),即总股数。
方法二:使用 get_financial_data (适用于回测/历史数据)
如果您在进行历史回测,并且需要获取历史上某一天的总股本(例如计算当时的市值),建议使用财务数据接口 ContextInfo.get_financial_data 读取股本结构表。
- 表名:
CAPITALSTRUCTURE(股本表) - 字段:
total_capital(总股本)
代码示例
以下代码展示了如何在策略中通过这两种方式查询浦发银行(600000.SH)的总股本。
# -*- coding: gbk -*-
def init(ContextInfo):
# 在初始化中设置股票池,这里以浦发银行为例
ContextInfo.stock = '600000.SH'
print("策略初始化完成")
def handlebar(ContextInfo):
# 获取当前周期对应的K线索引
index = ContextInfo.barpos
# 获取当前K线的时间戳
timetag = ContextInfo.get_bar_timetag(index)
# 将时间戳转换为易读的日期格式
date_str = timetag_to_datetime(timetag, '%Y%m%d')
stock_code = ContextInfo.stock
# --- 方法一:使用 get_total_share (简单直接) ---
# 注意:此函数通常返回的是基础信息中的总股本
total_share_simple = ContextInfo.get_total_share(stock_code)
# --- 方法二:使用 get_financial_data (财务数据,适合回测) ---
# 获取股本表(CAPITALSTRUCTURE)中的总股本(total_capital)
# 参数说明:表名, 字段名, 市场, 代码, 报告期类型(默认), 当前bar索引
total_share_financial = ContextInfo.get_financial_data(
'CAPITALSTRUCTURE',
'total_capital',
'SH',
'600000',
'report_time',
index
)
# 打印结果
print(f"日期: {date_str} | 股票: {stock_code}")
print(f"方法1 (get_total_share) 获取的总股本: {total_share_simple}")
print(f"方法2 (财务数据) 获取的总股本: {total_share_financial}")
# 仅在最后一根K线打印,避免历史K线刷屏(如果是回测,可注释掉此行以查看历史变化)
if not ContextInfo.is_last_bar():
return
注意事项
- 单位问题:返回的数值通常是股数(例如 10亿股),而不是金额。在计算市值时,需要乘以股价。
- 数据补充:使用
get_financial_data前,请确保在 QMT 客户端的【数据管理】中补充了财务数据。 - 代码格式:股票代码必须包含市场后缀,例如
'600000.SH'或'000001.SZ'。
Q&A
Q: get_total_share 和 get_last_volume 有什么区别?
A: get_total_share 获取的是总股本(包含流通股和限售股),而 get_last_volume 获取的是最新流通股本(仅包含在市场上自由交易的股份)。
Q: 为什么回测时建议使用 get_financial_data?
A: 公司的总股本会因为增发、送股、回购等事件发生变化。get_financial_data 是基于历史财务报表的,能准确反映回测当时那个时间点的股本情况,避免使用当前股本去计算历史指标(即避免“未来函数”)。
Q: 如何计算当前的总市值?
A: 总市值 = 最新价 (close) × 总股本 (total_share)。您可以通过 ContextInfo.get_market_data_ex 获取最新价,再结合上述方法获取总股本进行计算。