AI 原生量化投研平台AI-native quantitative research platform
正在加载…Loading…
页面仍在加载,可以继续等待,或重新加载。The page is still loading. You can keep waiting or reload.
部分页面资源未能加载,请重新加载。Some page resources could not load. Please reload.
设备当前处于离线状态,恢复连接后可以继续等待或重新加载。Your device is offline. Once connected, you can keep waiting or reload.
该表存储了一般企业利润表相关的PIT财务数据;对于PIT的解释,详见文档。
82 个字段
请注意:该表不是日频数据,不能直接作为因子使用。该表适合对财务数据有深入研究的用户,日频财务数据的加工方法见文末“通用文档”。
利润表是反映企业在一定会计期间的经营成果的财务报表,主要显示了企业的收入、支出和利润等信息。利润表可以帮助分析企业的盈利能力、成本控制、费用结构等方面。利润表的基本公式是:收入-支出=利润。本表的表结构采用常用的“多步式”的方法呈现利润表的财务科目,即通过对当期的收入、支出项目按性质加以归类,按利润形成的主要环节列示一些中间性利润指标,分步计算当期利润的方式。
| 关键字 | 释意 |
|---|---|
| date | 公告日,即该财报首次披露或更正公告的日期,不是报告期(报告期见 report_date),可能不是交易日;与 cn_stock_financial_changedate 中的 changedate 对应,详见文末“通用文档” |
| instrument | 股票代码 |
| report_date | 财务报告期,规则见文末“通用文档” |
| change_type | 0 表示首次披露的财务数据,1 表示非首次披露或有更改的财务数据 |
| fs_quarter_index | 对应季度,1 指一季报,2 指半年报,3 指三季报,4 指年报 |
Q:为什么财务数据并没有更改,但会有一条 change_type=1 的数据?
A:一般来说,每次出财报(一季报、半年报、三季报、下一年年报等)时,除了公布本期数值,也会附有期初数或上年同期数值,因此统一把前期数值视作 change_type=1 的数据。
Q:为什么银行股的某些字段没有体现在上述表中?
A:目前本表只收录了一般企业的相关财务字段,针对金融类企业的特殊字段后续会逐渐加入。
Q:表中有母公司利润表的数据吗?
A:目前只收录了合并报表的数据。
下面读取华润微(688396.SH)从 2020-01-01 到 2021-05-30 公告的利润表数据,只看 net_profit 一个字段:
| date | instrument | report_date | change_type | fs_quarter_index | net_profit |
|---|---|---|---|---|---|
| 2020-01-31 | 688396.SH | 2016-12-31 | 1 | 4 | -302249732.88 |
| 2020-01-31 | 688396.SH | 2017-12-31 | 1 | 4 | -102688060 |
| 2020-01-31 | 688396.SH | 2018-09-30 | 1 | 3 | 541831000 |
| 2020-01-31 | 688396.SH | 2018-12-31 | 1 | 4 | 537562074.28 |
| 2020-01-31 | 688396.SH | 2019-06-30 | 1 | 2 | 212885369.68 |
| 2020-01-31 | 688396.SH | 2019-09-30 | 1 | 3 | 354609489.45 |
| 2020-04-23 | 688396.SH | 2018-12-31 | 1 | 4 | 537562074.28 |
| 2020-04-23 | 688396.SH | 2019-03-31 | 0 | 1 | 36184852.26 |
| 2020-04-23 | 688396.SH | 2019-12-31 | 0 | 4 | 512426548.38 |
| 2020-04-23 | 688396.SH | 2020-03-31 | 0 | 1 | 125609986.33 |
| 2020-04-24 | 688396.SH | 2019-03-31 | 1 | 1 | 36184852.26 |
| 2020-04-24 | 688396.SH | 2020-03-31 | 1 | 1 | 125609986.33 |
| 2020-07-29 | 688396.SH | 2019-06-30 | 1 | 2 | 212885369.68 |
| 2020-07-29 | 688396.SH | 2020-06-30 | 0 | 2 | 446735348.17 |
| 2020-10-20 | 688396.SH | 2019-09-30 | 1 | 3 | 354609489.45 |
| 2020-10-20 | 688396.SH | 2020-09-30 | 0 | 3 | 757549644.05 |
| 2021-04-30 | 688396.SH | 2019-12-31 | 1 | 4 | 512426548.38 |
| 2021-04-30 | 688396.SH | 2020-03-31 | 1 | 1 | |
| 2021-04-30 | 688396.SH | 2020-12-31 | 0 | 4 | 1059708487.82 |
| 2021-04-30 | 688396.SH | 2021-03-31 | 0 | 1 | 407247392.27 |
从上表可以看出:
| 字段 | 释意 |
|---|---|
total_operating_revenue | 营业总收入 |
operating_revenue | 营业收入 |
interest_income | 利息收入 |
insurance_premium_income | 已赚保费 |
fee_and_commission_income | 手续费及佣金收入 |
spec_diff_of_operating_revenue | 营业总收入差额(特殊报表科目) |
totbal_diff_of_operating_revenue | 营业总收入差额(合计平衡科目) |
total_operating_costs | 营业总成本 |
operating_costs | 营业成本 |
interest_costs | 利息支出 |
fee_and_commission_costs | 手续费及佣金支出 |
surrenders | 退保金 |
net_insurance_claims_paid | 赔付支出净额 |
net_amount_of_insurance_reserve | 提取保险合同准备金净额 |
expense_on_policy_dividends | 保单红利支出 |
reinsurance_premium_expense | 分保费用 |
taxes_and_levies | 税金及附加 |
selling_epense | 销售费用 |
administrative_expense | 管理费用 |
research_and_development_expense | 研发费用 |
finance_expense | 财务费用 |
fin_interest_expense | 财务费用:利息费用 |
fin_interest_income | 财务费用:利息收入 |
asset_impairment_loss | 资产减值损失 |
credit_impairment_loss | 信用减值损失 |
spec_diff_of_operating_costs | 营业总成本差额(特殊报表科目) |
totbal_diff_of_operating_costs | 营业总成本差额(合计平衡科目) |
fair_value_chg_gain | 公允价值变动收益 |
invest_income | 投资收益 |
invest_income_of_jv_and_associates | 对联营企业和合营企业的投资收益 |
income_derecognition_of_fin_assets_at_amortized_cost | 以摊余成本计量的金融资产终止确认收益 |
net_income_of_open_hedge | 净敞口套期收益 |
exchange_gain | 汇兑收益 |
asset_disposal_income | 资产处置收益 |
other_income | 其他收益 |
spec_diff_of_operating_profit | 营业利润差额(特殊报表科目) |
totbal_diff_of_operating_profit | 营业利润差额(合计平衡科目) |
operating_profit | 营业利润 |
nonoperating_income | 营业外收入 |
noncurr_assets_dispose_gain | 非流动资产处置利得 |
nonoperating_costs | 营业外支出 |
noncurr_assets_dispose_loss | 非流动资产处置损失 |
spec_diff_of_total_profit | 利润总额差额(特殊报表科目) |
totbal_diff_of_total_profit | 利润总额差额(合计平衡科目) |
total_profit | 利润总额 |
income_tax_expense | 所得税费用 |
spec_diff_of_net_profit | 净利润差(特殊报表科目) |
totbal_diff_of_net_profit | 净利润差额(合计平衡科目) |
net_profit | 净利润 |
continuing_operation_net_profit | (一)持续经营净利润 |
discontinued_operation_net_profit | (二)终止经营净利润 |
net_profit_to_parent_shareholders | 归属于母公司所有者的净利润 |
net_profit_to_minority | 少数股东损益 |
eps_basic | 基本每股收益 |
eps_diluted | 稀释每股收益 |
income_othcom_income | 其他综合收益 |
othcom_income_to_parent_shareholders | 归属母公司所有者的其他综合收益 |
othcom_income_cannt_reclass | 以后不能重分类进损益的其他综合收益 |
chg_by_remeasurements | 重新计量设定受益计划净负债或净资产的变动 |
othcom_income_cannt_reclass_under_equity_method | 权益法下在被投资单位不能重分类进损益的其他综合收益中享有的份额 |
other_cannt_reclass | 其他以后不能重分类进损益 |
other_equity_instruments_fair_value_chg | 其他权益工具投资公允价值变动 |
own_credit_risk_fair_value_chg | 企业自身信用风险公允价值变动 |
othcom_income_reclass | 以后将重分类进损益的其他综合收益 |
othcom_income_reclass_under_equity_method | 权益法下在被投资单位以后将重分类进损益的其他综合收益中享有的份额 |
available_for_sale_fin_assets_fair_value_chg | 可供出售金融资产公允价值变动损益 |
gains_or_losses_from_htm_to_afs | 持有至到期投资重分类为可供出售金融资产损益 |
effective_of_gains_or_losses_on_cashflow_hedge | 现金流量套期损益的有效部分 |
income_translation_diff_of_foreign_currency | 外币财务报表折算差额 |
other_reclass | 其他以后将重分类进损益 |
other_debt_investments_fair_value_chg | 其他债权投资公允价值变动 |
othcom_income_from_reclass_of_fin_assets | 金融资产重分类计入其他综合收益的金额 |
credit_impairment_of_other_debt_investments | 其他债权投资信用减值准备 |
cashflow_hedge_reserve | 现金流量套期储备 |
othcom_income_to_minority | 归属于少数股东的其他综合收益 |
total_comprehensive_income | 综合收益总额 |
total_comprehensive_income_to_parent_shareholders | 归属于母公司股东的综合收益总额 |
2026-10-26 至 2026-11-02 的数据,字段较多,只展示 6 个字段,按日期、股票代码、报告期排序,展示前 5 行和后 5 行。
| date | instrument | report_date | change_type | fs_quarter_index | net_profit |
|---|---|---|---|---|---|
| 2026-10-26 | 000020.SZ | 2025-09-30 | 1 | 3 | 21266931.43 |
| 2026-10-26 | 000020.SZ | 2026-09-30 | 0 | 3 | 11303728.1 |
| 2026-10-26 | 000090.SZ | 2025-09-30 | 1 | 3 | -18725032.05 |
| 2026-10-26 | 000090.SZ | 2026-09-30 | 0 | 3 | -512169839.65 |
| 2026-10-26 | 000155.SZ | 2025-09-30 | 1 | 3 | 438933929.23 |
| 2026-10-31 | 688819.SH | 2026-09-30 | 0 | 3 | 212751635.6 |
| 2026-10-31 | 688825.SH | 2025-09-30 | 1 | 3 | -5980261959.41 |
| 2026-10-31 | 688825.SH | 2026-09-30 | 0 | 3 | 196532288837.68 |
| 2026-11-02 | 001381.SZ | 2025-09-30 | 1 | 3 | 244299228.79 |
| 2026-11-02 | 001381.SZ | 2026-09-30 | 0 | 3 | 225035402.5 |
平台的财务数据分四类,从原始披露到加工指标逐层派生:
| 类别 | 数据表 | 说明 |
|---|---|---|
| 原始数据 | 资产负债表、利润表、现金流量表 PIT(cn_stock_financial_*_pit),财报变更日期(cn_stock_financial_changedate),财务附注(cn_stock_financial_note_*) | 公司披露什么就记录什么,只在披露财报时有记录,不是日频 |
| 衍生数据 | cn_stock_financial_lf_shift、ly_shift、mrq_shift、ttm_shift、notes_shift | 把原始数据加工成最新一期(LF)、最新年报(LY)、单季度(MRQ)、滚动十二期(TTM),并用 shift 带出历史各期 |
| 财务分析 | cn_stock_financial_profitability、growth、operating、debt_repay、capital、cash_flow、earning_quality、xps、derivative | 在衍生数据的基础上做加减乘除得到的财务指标 |
| 盈利预期 | cn_stock_financial_earnings_preview、cn_stock_financial_forecast_consensus_rolling | 业绩快报和机构一致预期,口径独立,见各表文档 |
以上财务表都不是日频数据,不能直接当作每日因子使用,需要先按公告日对齐到交易日,做法见本文五。衍生数据和财务分析适合对财务数据有较深了解、希望构建复杂财务因子的用户。
财务表里有两个时间概念,含义不同,使用时不要混淆:
date:公告日,即这条财务数据对外公布(首次披露或更正)的日期,也是这条数据可以被使用的最早日期。date 不是报告期。report_date:报告期,即这条数据属于哪一期财报。关于 date 的几点说明:
date 就是公告日,原样记录,公告日不是交易日(周末、节假日)时也不会顺延,所以 date 可能不是交易日。按交易日使用时,用 date <= 交易日 取最新的记录即可(见本文五的 ASOF JOIN)。date 来自 cn_stock_financial_changedate 的 changedate,二者约等于同一个日期。数据入库时会去重,所有字段的取值完全相同的记录只保留一条。report_date 首次披露和后来更正,会有不同的 date。date 同样是公告日,表里只有公司有公告的日期。站在这一天,shift = 0 是当时能看到的最新一期,shift = 1, 2… 是更早的各期,数值是当时能看到的版本,示例见本文四。报告期的取值:
上市公司一年内披露四次财务报告,披露时限如下:
判断某一天能看到哪些数据要用 date,不能用 report_date,否则会用到当时还没有公布的数据。
上市公司除了正常披露财务报表外,后续会时常对历史财务数据进行修正。因此在量化投资领域,加工财务数据时不能只用最新修正后的数据,而要基于历史时间节点获取当时能获取的最新数据。PIT(Point In Time)数据指的是在某个时间点上,基于已公布的财务报表获取的某个财务指标的取值。
以 002473.SZ 的财务数据为例,在平台上调用以下代码:
import daiimport pandas as pdpd.set_option('display.float_format', '{:.2f}'.format)
dai.query("""SELECT date, instrument, report_date, change_type, total_current_assetsFROM cn_stock_financial_balance_general_pitWHERE instrument='002473.SZ'AND report_date='2019-12-31'AND date>'2020-01-01'""").df()运行上述代码,能得到以下数据:
| date | instrument | report_date | change_type | total_current_assets |
|---|---|---|---|---|
| 2020-04-30 | 002473.SZ | 2019-12-31 | 0 | 223449880.95 |
| 2020-08-27 | 002473.SZ | 2019-12-31 | 1 | 228470428.90 |
| 2020-10-26 | 002473.SZ | 2019-12-31 | 1 | 228470428.90 |
| 2021-04-29 | 002473.SZ | 2019-12-31 | 1 | 228470428.90 |
该公司于 2020 年 4 月 30 日首次公布 2019 年年报,披露的流动资产(total_current_assets)为 223449880.95,又于 2020 年 8 月 27 日对 2019 年年报的流动资产进行修正,修正为 228470428.90,因此 2019 年年报在表中有多条记录。
date 为 2020-08-27、2020-10-26、2021-04-29 的 total_current_assets 取值相同,这些重复记录是必要的:公司每披露某一期财报,都会附带上年同期或上年年末的数据作对比,极少部分公司即使不发布修正公告,也会通过这种方式修改历史财务数据,所以每次披露都保留一条记录。
原始数据表里与此相关的字段:
| 字段 | 释意 |
|---|---|
| change_type | 0 表示首次披露的财务数据,1 表示非首次披露或有更改的财务数据 |
| fs_quarter_index | 对应季度,1 指一季报,2 指半年报,3 指三季报,4 指年报,仅报表 PIT 表有 |
原始财务数据只在公司披露财报时才有记录,这类非规整的数据很难直接用于量化投资。衍生数据把原始数据加工成四类,字段名就是原始财务字段加上对应的后缀。要查具体字段,先在原始财报的文档里找到财务字段,再加上后缀,比如利润表的 net_profit 对应 net_profit_lf、net_profit_ttm。
cn_stock_financial_lf_shiftcn_stock_financial_ly_shiftcn_stock_financial_mrq_shiftcn_stock_financial_ttm_shift在平台加工的“衍生数据”和“财务分析”两大类财务数据中,我们同样进行 PIT 处理,以 002473.SZ 这只股票的流动资产(total_current_assets)数据举例:
import daiimport pandas as pdpd.set_option('display.float_format', '{:.2f}'.format)
dai.query("""SELECT date, instrument, report_date, shift, total_current_assets_lfFROM cn_stock_financial_lf_shiftWHERE instrument='002473.SZ'AND shift < 3AND ((date='2020-04-30')OR (date='2020-08-27'))""").df().sort_values("date")通过上述代码,我们得到以下数据,可以看出,站在 2020 年 4 月 30 日这一天,我们能获取到的 2019 年年报的流动资产为 223449880.95,但站在 2020-08-27 这一天时,我们能获取到的 2019 年年报的流动资产为 228470428.90。
| date | instrument | report_date | shift | total_current_assets_lf |
|---|---|---|---|---|
| 2020-04-30 | 002473.SZ | 2019-09-30 | 2 | 268546184.69 |
| 2020-04-30 | 002473.SZ | 2019-12-31 | 1 | 223449880.95 |
| 2020-04-30 | 002473.SZ | 2020-03-31 | 0 | 213964081.16 |
| 2020-08-27 | 002473.SZ | 2019-12-31 | 2 | 228470428.90 |
| 2020-08-27 | 002473.SZ | 2020-03-31 | 1 | 233220236.75 |
| 2020-08-27 | 002473.SZ | 2020-06-30 | 0 | 222315509.19 |
衍生数据按公告日存储,不是日频。要得到日频数据,把财务表按公告日对齐到交易日:某一天只使用当天及之前已经公告的最新一期(shift = 0),在下一次公告之前沿用上一期的值。DAI SQL 用 ASOF JOIN 完成。
下面以日频 ROE 为例,ROE = 滚动十二期归属母公司股东的净利润 / 最新一期归属母公司股东的所有者权益:
import dai
df = dai.query("""SELECT b.date, b.instrument, t.net_profit_to_parent_shareholders_ttm / l.total_equity_to_parent_shareholders_lf AS roe_ttmFROM cn_stock_bar1d bASOF JOIN (SELECT * FROM cn_stock_financial_ttm_shift WHERE shift = 0) t ON b.instrument = t.instrument AND b.date >= t.dateASOF JOIN (SELECT * FROM cn_stock_financial_lf_shift WHERE shift = 0) l ON b.instrument = l.instrument AND b.date >= l.dateWHERE b.date >= '2024-01-01'ORDER BY b.date, b.instrument""", filters={"date": ["2023-01-01", "2024-12-31"]}).pl()filters 的起点要早于第一个需要的交易日,这里提前一年,这样起点之前已经公告的财报也能取到。cn_stock_financial_profitability 的 roe_avg_ttm、roe_period_ttm 等字段。平台还提供过已按日频处理好的财务表 cn_stock_factors_financial_items,以 002473.SZ 的流动资产(total_current_assets)数据举例(该表已不建议使用,建议基于衍生数据自行计算):
import daiimport pandas as pdpd.set_option('display.float_format', '{:.2f}'.format)
dai.query("""SELECT date, instrument, total_current_assets_lyFROM cn_stock_factors_financial_itemsWHERE instrument='002473.SZ'AND ((date>'2020-04-25' and date<'2020-05-05')OR (date>'2020-08-25' and date<'2020-09-01'))""").df().sort_values("date")通过上述代码,我们得到以下数据。可以看出,当日期来到 2020 年 4 月 30 日这一天时,我们能获取到最新的流动资产(年报)数据是 223449880.95,这个数值一直保持到 2020 年 8 月 27 日,最新一期年报的流动资产变为了 228470428.90,符合预期。
| date | instrument | total_current_assets_ly |
|---|---|---|
| 2020-04-27 | 002473.SZ | 330113974.90 |
| 2020-04-28 | 002473.SZ | 330113974.90 |
| 2020-04-29 | 002473.SZ | 330113974.90 |
| 2020-04-30 | 002473.SZ | 223449880.95 |
| 2020-08-26 | 002473.SZ | 223449880.95 |
| 2020-08-27 | 002473.SZ | 228470428.90 |
| 2020-08-28 | 002473.SZ | 228470428.90 |
| 2020-08-31 | 002473.SZ | 228470428.90 |
shift 的含义都与衍生数据相同,字段名带 _lf、_mrq、_ttm 后缀。各指标的计算公式见各表文档的“字段说明”。report_date 的月份筛选出 06-30 和 12-31 的记录。非经常性损益等少数科目在一季报、三季报中也有数据。import daidf = dai.query(""" SELECT instrument, report_date, total_profit, net_profit FROM cn_stock_financial_income_general_pit WHERE instrument IN ('000001.SZ', '000002.SZ') AND report_date = '2023-03-31'""", filters={"date": ["2023-01-01", "2023-12-31"]}).df()import daidf = dai.query(""" SELECT date, instrument, report_date, total_profit, net_profit FROM cn_stock_financial_income_general_pit WHERE instrument = '000001.SZ' ORDER BY date DESC LIMIT 1""", filters={"date": ["2020-01-01","2024-05-01"]}).df()import daidf = dai.query(""" SELECT date,instrument,report_date, cn_stock_financial_balance_general_pit.total_owner_equity, net_profit, net_profit / cn_stock_financial_balance_general_pit.total_owner_equity AS roe FROM cn_stock_financial_income_general_pit JOIN cn_stock_financial_balance_general_pit USING (instrument, date, report_date, change_type) ORDER BY date""", filters={"date": ["2020-01-01", "2023-12-31"]}).df()SELECT date, instrument, fs_quarter_index, report_date, change_type, total_operating_revenue, operating_revenue FROM cn_stock_financial_income_general_pit WHERE date >= '2026-10-06' ORDER BY date LIMIT 100
SELECT date, instrument, fs_quarter_index, report_date, change_type, total_operating_revenue, operating_revenue FROM cn_stock_financial_income_general_pit WHERE date >= '2026-10-06' ORDER BY date LIMIT 100