🚀 AI 一键生成 qmt 策略代码
立即体验

QMT 平台如何获取资产负债表数据并过滤高负债率股票?(附 Python 选股源码)

qmt | 发布时间: 2026/8/7
以下内容由 EasyQuant 生成。

问题描述

qmt 财务选股:利用 get_financial_data 过滤高负债率股票
如何使用 QMT 获取上市公司的资产负债表数据并计算资产负债率进行选股?

解决方案

QMT 财务选股:利用 get_financial_data 过滤高负债率股票

在量化投资中,财务选股是基本面分析的核心。高资产负债率通常意味着企业面临较大的偿债压力和财务风险。利用 QMT (Quantitative Multi-strategy Trading) 平台的 Python API,我们可以高效地获取上市公司的资产负债表数据,计算资产负债率,并动态过滤掉高风险股票。

本文将详细介绍如何使用 get_financial_data 接口获取相关财务数据,并提供完整的选股策略源码。


1. 核心接口与财务字段解析

在 QMT 中,获取财务数据主要依赖 ContextInfo.get_financial_data 接口。要计算资产负债率,我们有两种方法:

方法 A:通过资产负债表(ASHAREBALANCESHEET)手动计算

  • 资产总计ASHAREBALANCESHEET.tot_assets
  • 负债合计ASHAREBALANCESHEET.tot_liab
  • 计算公式:$\text{资产负债率} = \frac{\text{负债合计}}{\text{资产总计}} \times 100%$

方法 B:直接获取主要财务指标(PERSHAREINDEX)

  • 资产负债比率PERSHAREINDEX.gear_ratio

为了展示如何深度使用资产负债表,本示例将采用 方法 A 进行手动计算和过滤。


2. Python 选股策略源码

以下是一个完整的 QMT 选股策略。该策略在初始化时设定股票池(如沪深300),并在运行过程中获取最新的资产负债表数据,剔除资产负债率大于 70% 的股票。

#encoding:gbk
import pandas as pd

def init(ContextInfo):
    # 1. 设定初始股票池(以沪深300成分股为例)
    # 获取当前时间戳
    now_time = ContextInfo.get_bar_timetag(0)
    ContextInfo.stock_list = ContextInfo.get_stock_list_in_sector('沪深300', now_time)
    if not ContextInfo.stock_list:
        ContextInfo.stock_list = ['600000.SH', '000001.SZ', '600036.SH', '000002.SZ'] # 备用股票池
    
    ContextInfo.set_universe(ContextInfo.stock_list)
    print(f"初始化完成,初始股票池共 {len(ContextInfo.stock_list)} 只股票")

def handlebar(ContextInfo):
    # 仅在最后一根 K 线执行选股逻辑
    if not ContextInfo.is_last_bar():
        return
        
    # 获取当前 K 线对应的时间
    bar_index = ContextInfo.barpos
    timetag = ContextInfo.get_bar_timetag(bar_index)
    # 转换时间格式为 YYYYMMDD
    date_str = timetag_to_datetime(timetag, '%Y%m%d')
    
    print(f"\n开始进行财务选股,当前计算日期: {date_str}")
    
    # 2. 定义需要获取的财务字段
    fields = [
        'ASHAREBALANCESHEET.tot_assets', # 资产总计
        'ASHAREBALANCESHEET.tot_liab'     # 负债合计
    ]
    
    # 3. 获取财务数据(取最近一期财报数据)
    # 设定一个较近的时间范围,确保能取到最新披露的财报
    start_date = '20230101'
    end_date = date_str
    
    try:
        financial_data = ContextInfo.get_financial_data(fields, ContextInfo.stock_list, start_date, end_date, report_type='announce_time')
    except Exception as e:
        print(f"获取财务数据失败: {e}")
        return

    selected_stocks = []
    
    # 4. 遍历股票计算资产负债率
    for stock in ContextInfo.stock_list:
        try:
            # 提取单只股票的财务 DataFrame
            # get_financial_data 返回 Panel 或 Dict 结构,根据返回类型提取数据
            if isinstance(financial_data, dict):
                df = financial_data.get(stock)
            else:
                df = financial_data[stock]
                
            if df is None or df.empty:
                continue
                
            # 获取最新一期的资产和负债数据
            latest_row = df.iloc[-1]
            tot_assets = latest_row['ASHAREBALANCESHEET.tot_assets']
            tot_liab = latest_row['ASHAREBALANCESHEET.tot_liab']
            
            if pd.isna(tot_assets) or pd.isna(tot_liab) or tot_assets <= 0:
                continue
                
            # 计算资产负债率
            debt_ratio = (tot_liab / tot_assets) * 100
            
            # 5. 过滤高负债率股票(阈值设为 70%)
            if debt_ratio <= 70.0:
                selected_stocks.append(stock)
                # print(f"股票 {stock} 资产负债率: {debt_ratio:.2f}% (合格)")
            else:
                print(f"剔除高负债股票 {stock},资产负债率: {debt_ratio:.2f}% (超标)")
                
        except Exception as e:
            # 规避部分无数据股票报错
            continue
            
    print(f"\n选股结束!过滤后剩余安全股票数量: {len(selected_stocks)} / {len(ContextInfo.stock_list)}")
    # 将过滤后的股票池设置为新的运行股票池
    ContextInfo.set_universe(selected_stocks)

3. 关键步骤与注意事项

  1. 数据补充:在使用 get_financial_data 之前,请务必通过 QMT 客户端的 “数据管理” -> “补充数据” 下载对应市场的财务数据,否则接口将返回空值。
  2. 公告期与报告期
    • report_type='announce_time'(默认):按照公告日期取数。这能保证回测时不会引入“未来函数”(即在公司实际公布财报前就使用了该数据)。
    • report_type='report_time':按照报告期取数。适用于对比历史同期的财务表现。
  3. 行业差异:不同行业的资产负债率标准差异巨大。例如,金融业(银行、信托)和房地产业的资产负债率普遍偏高(通常在 80% 以上),而轻资产的科技、医药行业负债率较低。在实际应用中,建议结合 get_industry_name_of_stock 接口进行同行业内部对比选股