3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化投资中,财务选股是基本面分析的核心。高资产负债率通常意味着企业面临较大的偿债压力和财务风险。利用 QMT (Quantitative Multi-strategy Trading) 平台的 Python API,我们可以高效地获取上市公司的资产负债表数据,计算资产负债率,并动态过滤掉高风险股票。
本文将详细介绍如何使用 get_financial_data 接口获取相关财务数据,并提供完整的选股策略源码。
在 QMT 中,获取财务数据主要依赖 ContextInfo.get_financial_data 接口。要计算资产负债率,我们有两种方法:
ASHAREBALANCESHEET.tot_assetsASHAREBALANCESHEET.tot_liabPERSHAREINDEX.gear_ratio为了展示如何深度使用资产负债表,本示例将采用 方法 A 进行手动计算和过滤。
以下是一个完整的 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)
get_financial_data 之前,请务必通过 QMT 客户端的 “数据管理” -> “补充数据” 下载对应市场的财务数据,否则接口将返回空值。report_type='announce_time'(默认):按照公告日期取数。这能保证回测时不会引入“未来函数”(即在公司实际公布财报前就使用了该数据)。report_type='report_time':按照报告期取数。适用于对比历史同期的财务表现。get_industry_name_of_stock 接口进行同行业内部对比选股。