🚀 AI 一键生成 qmt 策略代码

QMT 选股因子:如何获取股票的总股本与最新流通股本?

qmt | 发布时间: 2025/12/20
以下内容由 EasyQuant 生成。

问题描述

怎么获取股票的总股本和流通股本数据?

解决方案

在 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 年的总股本,会导致计算市值或换手率出错(即使用了“未来函数”)。财务数据接口会根据回测时间点返回当时的数据。