3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在基本面量化投资中,经营活动产生的现金流量净额(net_cash_flows_oper_act)是衡量公司主营业务盈利质量与现金造血能力的核心指标。QMT(迅投量化交易系统)提供了丰富的财务数据接口,可以直接读取本地下载的现金流量表数据进行高效选股。
QMT 中使用 ContextInfo.get_financial_data 获取财务数据。
ContextInfo.get_financial_data(fieldList, stockList, startDate, endDate, report_type='announce_time')
表名.字段名。现金流量表的表名为 ASHARECASHFLOW,经营活动产生的现金流量净额字段为 net_cash_flows_oper_act。['600000.SH', '000001.SZ'])。'YYYYMMDD'。'announce_time'(按公告日期,可有效防止回测预知未来数据);可选 'report_time'(按报告期)。| 中文字段 | 国信/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 |
以下策略展示了如何在 QMT 的 init 或 handlebar 中提取股票池内各标的的经营现金流,并筛选出经营现金流大于 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)
report_type='announce_time',确保使用的是当前时点已实际披露的财报数据,避免使用未来数据导致回测失真。get_financial_data 返回的数据格式会根据传入的股票数量和时间区间自动调整(Series / DataFrame / Dict),在代码中应做好类型判断与异常处理。