3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
这是一个非常专业且切中要害的问题!在 JoinQuant(聚宽)平台中,balance/income/cashflow 与 STK_BALANCE_SHEET/STK_INCOME_STATEMENT/STK_CASHFLOW_STATEMENT 确实都代表了上市公司的三大财务报表,但它们在数据深度、设计初衷以及调用方式上有着本质的区别。
简单来说:前者是为量化回测高度定制的标准化数据,后者是原汁原味的深度财务数据库。
以下是详细的区别解析:
balance / income / cashflow(基础财务表):
finance.STK_BALANCE_SHEET 等(高级财务表):
finance(金融数据库)模块的一部分。这与两个数据库在底层设计时如何处理**“未来函数(Look-ahead Bias)”**有关。
为什么用 get_fundamentals 获取基础表?
get_fundamentals 是专门为量化回测设计的 API。当你传入 date 参数(例如 date='2015-10-15')时,引擎在底层会自动帮你寻找在该日期之前(含当日)上市公司最新发布的那一份财报。为什么用 finance.run_query 获取高级表?
finance 模块是一个通用的关系型数据库查询接口。finance.run_query 只是执行一条 SQL 查询。finance.run_query 时,系统不会自动帮你规避未来函数。你需要自己在 query().filter() 中严格限制 pub_date <= context.current_dt,否则很容易取到当时尚未发布的财报数据,导致回测结果虚高。| 特性 | 基础表 (balance等) + get_fundamentals |
高级表 (STK_BALANCE_SHEET等) + finance.run_query |
|---|---|---|
| 数据丰富度 | 常用核心字段,高度标准化 | 极度详尽,包含所有细分会计科目及追溯调整数据 |
| 防未来函数 | 自动防范(通过 date 参数) |
需手动防范(需过滤 pub_date) |
| 查询速度 | 极快,适合大规模回测 | 相对较慢,适合特定深度研究 |
| 适用场景 | 90% 的常规量化策略、多因子选股 | 深度基本面分析、特定行业(如银行/保险)的特殊财务指标提取 |
建议:
如果你只是需要用到净利润、营业收入、总资产、现金流净额等常规指标来构建多因子策略,强烈建议使用 get_fundamentals + balance/income/cashflow,因为代码更简洁,且绝对安全(无未来函数)。
只有当你发现基础表中找不到你需要的某个冷门财务科目时,再去使用 finance.run_query 查询 STK_... 系列表,并务必记得在 filter 中加上对 pub_date 的时间限制!