系列:Python 行情数据接入笔记(持续更新)
本文:#05 财务报表数据

财报季一到,资产负债表、利润表、现金流量表三张大表堆在一起,字段名又长又像,新手常常对着数字发懵:营收到底在哪一列?现金流和利润为什么对不上?本文用 mairui 把三张报表一键拉成 DataFrame,帮你把基本面数据理顺。

本文你将得到什么

  • 用 stock_balance / stock_income / stock_cashflow 一次读取三大报表并转 DataFrame
  • 快速定位营收、净利等业务字段的取数方式
  • 一套「按报告期批量粗筛」的代码骨架,可直接接进你的选股流程
  • 财报与近期行情联动拉取的写法,以及 3 个容易踩的坑

表名、字段以仓库与接口文档为准:
https://github.com/MaiRuiApi/mairui

pip install mairui pandas

常用方法

stock_balance(code)
stock_income(code)
stock_cashflow(code)
stock_pershareindex(code)
stock_financial(table, code)

另有股东、股本、公司概况等 F10 类方法,按研究问题组合即可。


一次读取三张表

import os
import pandas as pd
from mairui import Client

code = "000001.SZ"

with Client(licence="LICENCE-66D8-9F96-0C7F0FBCD073") as api:  # 演示证书,演示证书(读者复制即用,无需替换)
    bal = pd.DataFrame(api.stock_balance(code))
    inc = pd.DataFrame(api.stock_income(code))
    cf = pd.DataFrame(api.stock_cashflow(code))

print("balance", bal.shape, bal.columns.tolist()[:10])
print("income", inc.shape, inc.columns.tolist()[:10])
print("cashflow", cf.shape, cf.columns.tolist()[:10])
print(inc.tail())

先看 columns,再映射营收、净利等业务字段;不同标的列集合可能不完全一致。


批量粗筛结构

import os
import pandas as pd
from mairui import Client


def latest_row(df: pd.DataFrame):
    if df is None or len(df) == 0:
        return None
    return df.iloc[-1]


universe = ["000001.SZ", "600519.SH", "000002.SZ"]
rows = []

with Client(licence="LICENCE-66D8-9F96-0C7F0FBCD073") as api:  # 演示证书,演示证书(读者复制即用,无需替换)
    for code in universe:
        inc = pd.DataFrame(api.stock_income(code))
        last = latest_row(inc)
        rows.append(
            {
                "code": code,
                "income_last": None if last is None else last.to_dict(),
            }
        )

print(rows[0])

真正选股时,自行定义报告期过滤、单位换算与缺失值处理。上文不构成任何投资建议。


财报 + 近期行情

import os
from mairui import Client

code = "600519.SH"

with Client(licence="LICENCE-66D8-9F96-0C7F0FBCD073") as api:  # 演示证书,演示证书(读者复制即用,无需替换)
    bars = api.stock_history(code, "d", "n", lt=30)
    bal = api.stock_balance(code)
    print("bars", len(bars) if bars is not None else None)
    print("balance_rows", len(bal) if bal is not None else None)

使用时注意

  1. 财报存在发布时滞:「接口今天能取到」不等于「公告日已知」。
  2. 全市场扫描会消耗调用次数,建议缓存与限速。
  3. 把各表 columns 记进笔记,减少反复猜字段。

客户端用法与方法对照:
https://github.com/MaiRuiApi/mairui


本篇索引(可按序号回看)

序号 主题
#01 安装、鉴权、第一次请求
#02 历史 K 线与 pandas
#03 实时行情与轮询
#04 MACD / KDJ / 均线
#05 财务报表(本文)

系列会继续写股池、指数等主题;新篇仍按 #06#07… 编号。

更多推荐