问题描述
比如inc_net_profit_year_on_year,inc_revenue_year_on_year,inc_net_profit_to_shareholders_year_on_year这些增长率指标,在
基期数据为负,报告期为正时,也就是企业扭亏为盈时,如何计算的呢?是用如下公式计算的么?:
当基期数据为负数时,公式:亏损增长率=[1-(报告期水平/基期水平)]*100%,应用于企业亏损状态或亏转盈状态。
相当于对基期数据取了绝对值。
解决方案
是的,您的理解是非常准确的。
在 JoinQuant(聚宽)的财务指标(indicator 表)中,对于各类同比增长率指标(如 inc_net_profit_year_on_year 净利润同比增长率、inc_revenue_year_on_year 营业收入同比增长率等),当遇到基期数据为负数(例如去年同期亏损,今年扭亏为盈,或者今年继续亏损但亏损减少)的情况时,为了保证计算结果在经济学上具有合理的解释意义,底层计算逻辑确实相当于对基期数据取了绝对值。
1. 公式推导与等价性
常规的增长率计算公式为:
增长率 = (报告期水平 - 基期水平) / 基期水平 * 100%
如果基期为负数,直接套用上述公式会导致符号反转(例如扭亏为盈反而算出负的增长率)。因此,量化平台和财务软件通用的修正公式为:
修正增长率 = (报告期水平 - 基期水平) / ABS(基期水平) * 100%
这与您提到的公式在数学上是完全等价的。我们可以推导一下,当基期水平 < 0 时,ABS(基期水平) = -基期水平:
修正增长率 = (报告期水平 - 基期水平) / (-基期水平)
= -(报告期水平 / 基期水平) + (基期水平 / 基期水平)
= 1 - (报告期水平 / 基期水平)
所以,您提到的公式 [1 - (报告期水平 / 基期水平)] * 100% 是完全正确的。
2. 具体案例演示
为了更直观地理解,我们来看两个常见的基期为负的场景:
场景 A:扭亏为盈
- 基期(去年同期)净利润:-100 万
- 报告期(本期)净利润:50 万
- 计算过程:(50 - (-100)) / ABS(-100) = 150 / 100 = 150%
- 使用您的公式:1 - (50 / -100) = 1 - (-0.5) = 150%
- 经济意义:企业不仅填平了 100 万的亏损,还额外赚了 50 万,业绩大幅正增长。
场景 B:亏损减少(依然亏损)
- 基期(去年同期)净利润:-100 万
- 报告期(本期)净利润:-20 万
- 计算过程:(-20 - (-100)) / ABS(-100) = 80 / 100 = 80%
- 使用您的公式:1 - (-20 / -100) = 1 - 0.2 = 80%
- 经济意义:虽然还在亏损,但亏损额减少了 80 万,业绩呈现正向改善(增长率为正)。
3. 如何在 JoinQuant 中验证?
如果您在编写策略时对某个具体的异常高增长率存疑,可以通过 get_fundamentals 函数同时拉取 income 表(利润表绝对值)和 indicator 表(财务指标)进行交叉验证:
from jqdata import *
# 查询某只股票的净利润绝对值和同比增长率
q = query(
income.code,
income.net_profit, # 净利润绝对值
indicator.inc_net_profit_year_on_year # 净利润同比增长率
).filter(
income.code == '000001.XSHE'
)
# 获取数据进行对比
df = get_fundamentals(q, statDate='2020q1')
print(df)
总结:在处理财务数据时,JoinQuant 已经为您处理好了基期为负时的数学陷阱,您可以放心地直接使用 indicator 表中的增长率字段进行选股或因子计算。