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

QMT 财报选股:如何基于现金流量表 (ASHARECASHFLOW) 提取经营现金流并进行股票筛选

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: QMT 财报选股:基于现金流量表 (ASHARECASHFLOW) 提取经营现金流

Question: 如何在 QMT 中提取上市公司的现金流量表数据并筛选经营现金流为正的股票?

解决方案

QMT 财报选股:基于现金流量表提取经营现金流

在基本面量化投资中,经营活动产生的现金流量净额net_cash_flows_oper_act)是衡量公司主营业务盈利质量与现金造血能力的核心指标。QMT(迅投量化交易系统)提供了丰富的财务数据接口,可以直接读取本地下载的现金流量表数据进行高效选股。


1. 核心 API 接口

QMT 中使用 ContextInfo.get_financial_data 获取财务数据。

接口语法

ContextInfo.get_financial_data(fieldList, stockList, startDate, endDate, report_type='announce_time')

参数说明

  • fieldList: 财报字段列表,格式为 表名.字段名。现金流量表的表名为 ASHARECASHFLOW,经营活动产生的现金流量净额字段为 net_cash_flows_oper_act
  • stockList: 待查询的股票代码列表(如 ['600000.SH', '000001.SZ'])。
  • startDate / endDate: 检索的时间范围,格式为 'YYYYMMDD'
  • report_type: 报表取数类型,默认 'announce_time'(按公告日期,可有效防止回测预知未来数据);可选 'report_time'(按报告期)。

2. 现金流量表相关常用字段

中文字段 国信/QMT字段 示例调用路径
经营活动产生的现金流量净额 net_cash_flows_oper_act ASHARECASHFLOW.net_cash_flows_oper_act
销售商品、提供劳务收到的现金 goods_sale_and_service_render_cash ASHARECASHFLOW.goods_sale_and_service_render_cash
投资活动产生的现金流量净额 net_cash_flows_inv_act ASHARECASHFLOW.net_cash_flows_inv_act
筹资活动产生的现金流量净额 net_cash_flows_fnc_act ASHARECASHFLOW.net_cash_flows_fnc_act

3. Python 策略源码示例

以下策略展示了如何在 QMT 的 inithandlebar 中提取股票池内各标的的经营现金流,并筛选出经营现金流大于 0 的优质股票:

#coding:gbk
import pandas as pd

def init(ContextInfo):
    # 1. 设置目标股票池(以沪深300成分股或自定义股票池为例)
    stocks = ['600000.SH', '000001.SZ', '600519.SH', '000002.SZ']
    ContextInfo.set_universe(stocks)

def handlebar(ContextInfo):
    # 仅在最后一根 Bar 执行选股计算(避免重复计算)
    if not ContextInfo.is_last_bar():
        return
    
    stock_list = ContextInfo.get_universe()
    start_date = '20230101'
    end_date = '20231231'
    
    # 2. 定义需提取的财报字段:现金流量表中的经营现金流净额
    field_list = ['ASHARECASHFLOW.net_cash_flows_oper_act']
    
    # 3. 获取财务数据(按公告日取数以防止未来函数)
    fin_data = ContextInfo.get_financial_data(field_list, stock_list, start_date, end_date, report_type='announce_time')
    
    print("成功获取财务数据:")
    print(fin_data)
    
    # 4. 筛选经营现金流为正的股票
    positive_cash_stocks = []
    
    if isinstance(fin_data, pd.DataFrame):
        # 针对单时间点多股票的情况
        for stock in fin_data.index:
            val = fin_data.loc[stock, 'ASHARECASHFLOW.net_cash_flows_oper_act']
            if pd.notnull(val) and val > 0:
                positive_cash_stocks.append(stock)
    elif isinstance(fin_data, dict):
        # 针对多时间点多股票 Panel/Dict 数据结构
        for stock, df in fin_data.items():
            if not df.empty:
                latest_val = df['ASHARECASHFLOW.net_cash_flows_oper_act'].iloc[-1]
                if pd.notnull(latest_val) and latest_val > 0:
                    positive_cash_stocks.append(stock)
                    
    print("经营活动现金流量净额为正的股票列表:", positive_cash_stocks)

4. 注意事项与使用建议

  1. 补充本地数据:在运行策略前,请确保已通过 QMT 客户端的 “数据管理” -> “补充数据” 下载并更新了本地的财务数据,否则接口可能返回空值。
  2. 未来函数规避:回测时强烈建议设置 report_type='announce_time',确保使用的是当前时点已实际披露的财报数据,避免使用未来数据导致回测失真。
  3. 数据结构处理get_financial_data 返回的数据格式会根据传入的股票数量和时间区间自动调整(Series / DataFrame / Dict),在代码中应做好类型判断与异常处理。