【Python量化实战全攻略 #10】成长因子手册:营收、利润增速因子构建(附代码)
摘要:【Python量化实战全攻略 #10】成长因子手册:营收、利润增速因子构建(附代码) 手册定位:模块二第 2 篇。成长因子刻画「业绩在变好」——营收增速、利润增速、复合增速。与估值因子互补:便宜但停滞,不如便宜且成长
手册定位:模块二第 2 篇。成长因子刻画「业绩在变好」——营收增速、利润增速、复合增速。与估值因子互补:便宜但停滞,不如便宜且成长。
数据来源复用 #04 财务三表(利润表历年营收/净利润)。
1. 你将得到什么
- 单季/全年营收同比增速、净利润同比增速的算法;
- 用两年复合增速平滑周期波动的写法;
- 把增速整理成成长因子表并分位数打分;
- 成长因子的 4 个坑(基数效应、一次性损益、周期、亏损反转)。
2. 取数约定(复用)
| 因子 | 字段 | 来源端点 | 见 |
|---|---|---|---|
| 营收增速 | 营业总收入(历年) | 利润表 /hs/fin/income |
#04 |
| 利润增速 | 净利润(历年) | 利润表 /hs/fin/income |
#04 |
3. 数据来源(复用,不重复罗列)
详见 #04 财务三表接口手册(利润表端点 /hs/fin/income/{代码}.{市场})。
4. 核心模板函数(自包含可跑)
import pandas as pd
_MOCK = True
def build_growth(df):
out = df.copy()
out["营收增速"] = (out["营收_t1"] / out["营收_t0"] - 1) * 100
out["利润增速"] = (out["净利润_t1"] / out["净利润_t0"] - 1) * 100
return out
def run_check():
df = pd.DataFrame([
{"代码": "600519", "营收_t0": 1.30e11, "营收_t1": 1.50e11, "净利润_t0": 3.0e10, "净利润_t1": 3.5e10},
{"代码": "000001", "营收_t0": 1.20e11, "营收_t1": 1.30e11, "净利润_t0": 2.8e10, "净利润_t1": 3.0e10},
{"代码": "600036", "营收_t0": 2.80e11, "营收_t1": 3.00e11, "净利润_t0": 1.3e11, "净利润_t1": 1.4e11},
])
g = build_growth(df)
assert (g["营收增速"] > 0).all() and (g["利润增速"] > 0).all()
g["成长_score"] = g[["营收增速", "利润增速"]].mean(axis=1).rank(pct=True)
assert g["成长_score"].between(0, 1).all()
print("校验通过 | 营收增速:", g["营收增速"].round(1).tolist())
return g
if __name__ == "__main__":
run_check()
5. 跑通示例
g = run_check()
top = g.sort_values("成长_score", ascending=False).head(1)
print("成长最强:", top[["代码", "营收增速", "利润增速"]].to_dict("records"))
6. 坑与注意事项
- 基数效应:去年同期极低会让今年增速虚高,单季增速要结合两年复合增速看。
- 一次性损益:变卖资产、政府补贴会让净利润增速失真,优先用「扣非净利润」。
- 周期波动:周期股增速大起大落,成长因子要配合行业中性。
- 亏损反转:由亏转盈增速是 +∞,要单独剔除或复合打分。
7. 小结与下一篇预告
成长因子就位,与估值因子组成「便宜且成长」的经典组合。下一篇讲质量因子——ROE/毛利率/资产负债率,筛掉「虚胖」公司。
下一篇预告:《【Python量化实战全攻略 #11】质量因子手册:ROE、毛利率、资产负债率(附代码)》
8. 免责声明
本文为因子构建方法示例,演示数据为虚构,不构成投资建议。
关于数据来源:本文因子所需的财务数据来自智兔数服(www.zhituapi.com)官方文档接口(详见本系列 #04),覆盖 200+ 已验证路径,注册可领免费 token 做研究测试。
更多实战手册见技术博客:zhituapi.com/blog.html。
本系列《Python量化实战全攻略》共 32 篇,下一篇讲质量因子。
想亲自试一下?免费获取证书