A股量化数据工程:从 REST 接口到策略信号(第 8 篇):成长能力因子:营收与利润增速
前言
盈利能力看「现在多能赚」,成长能力看「将来能不能更赚」。营收增速、净利增速、净资产增速是景气度的三盏灯。接口 hicw/cz 给出这些同比/环比增速,本篇落库并自研成长因子,与前一篇盈利因子互补。
一、接口原始字段梳理
1)成长能力接口
接口地址:https://api.biyingapi.com/hicw/cz/{LICENCE}
| 字段 | 说明 |
|---|---|
| dm | 股票代码 |
| mc | 股票名称 |
| zyzzl | 主营业务收入增长率 |
| jlrzzl | 净利润增长率 |
| jzczzl | 净资产增长率 |
| zzczzl | 总资产增长率 |
| mgzzl | 每股增长 |
| gdzzl | 股东增长 |
| y | 年 |
| q | 季 |
| yq | 年季标识 |
二、自研衍生统计指标
- 成长综合分 :
z(zyzzl) + z(jlrzzl) + z(jzczzl)等权合成。 - 质量过滤 :
jlrzzl远高于zyzzl可能是非经常性收益,标记「利润增速异常高」供人工排查。 - 可持续性 :
jzczzl(净资产增速)为正且平稳,说明增长靠内生而非举债。
增速字段均为接口原始同比值,z-score 与合成规则为自研。
三、数据表设计
sql
CREATE TABLE IF NOT EXISTS fin_cz (
dm TEXT,
yq TEXT,
zyzzl REAL, jlrzzl REAL, jzczzl REAL,
zzczzl REAL, mgzzl REAL, gdzzl REAL,
PRIMARY KEY (dm, yq)
);
CREATE TABLE IF NOT EXISTS factor_growth (
dm TEXT,
yq TEXT,
score REAL,
profit_alert INTEGER,
PRIMARY KEY (dm, yq)
);
四、完整代码
python
import requests
import sqlite3
import time
LICENCE = "YOUR_LICENCE"
BASE = "https://api.biyingapi.com"
DB_PATH = "quant.db"
def biying_api_get_retry(url, timeout=15, max_retry=3):
for i in range(max_retry):
try:
r = requests.get(url, timeout=timeout)
r.raise_for_status()
return r.json()
except Exception as e:
if i == max_retry - 1:
raise
time.sleep(1 + i)
def fetch_cz():
data = biying_api_get_retry(f"{BASE}/hicw/cz/{LICENCE}")
return data.get("data", []) if isinstance(data, dict) else []
def zscore(vals):
xs = [v for v in vals if v is not None]
if len(xs) < 2:
return {}
mu = sum(xs) / len(xs)
var = sum((x - mu) ** 2 for x in xs) / len(xs)
sd = var ** 0.5 or 1
return {v: round((v - mu) / sd, 3) for v in xs}
def build_factor(rows):
valid = [r for r in rows if None not in
(r.get("zyzzl"), r.get("jlrzzl"), r.get("jzczzl"))]
zy = zscore([r["zyzzl"] for r in valid])
jl = zscore([r["jlrzzl"] for r in valid])
jz = zscore([r["jzczzl"] for r in valid])
out = []
for r in valid:
score = round(zy.get(r["zyzzl"], 0) + jl.get(r["jlrzzl"], 0)
+ jz.get(r["jzczzl"], 0), 3)
# 利润增速远超营收增速 -> 标记排查
alert = 1 if (r["jlrzzl"] - r["zyzzl"]) > 50 else 0
out.append((r["dm"], r["yq"], score, alert))
return out
if __name__ == "__main__":
rows = fetch_cz()
con = sqlite3.connect(DB_PATH)
con.executemany(
"INSERT OR REPLACE INTO fin_cz"
"(dm,yq,zyzzl,jlrzzl,jzczzl,zzczzl,mgzzl,gdzzl) VALUES(?,?,?,?,?,?,?,?)",
[[r.get("dm"), r.get("yq"), r.get("zyzzl"), r.get("jlrzzl"),
r.get("jzczzl"), r.get("zzczzl"), r.get("mgzzl"), r.get("gdzzl")]
for r in rows])
con.commit()
fac = build_factor(rows)
con.executemany(
"INSERT OR REPLACE INTO factor_growth(dm,yq,score,profit_alert) VALUES(?,?,?,?)",
fac)
con.commit(); con.close()
top = sorted(fac, key=lambda x: x[2], reverse=True)[:5]
print("成长因子 Top5:")
for dm, yq, s, alert in top:
print(f" {dm} 综合分={s} {'[利润增速异常高]' if alert else ''}")
五、关键业务说明
- 增速是同比口径 :
hicw/cz返回的增速为同比/环比值,比较时保证同yq窗口。 - 利润增速需甄别:净利增速远高于营收增速常来自非主营收益,因子合成时标记但不剔除。
- 与盈利因子互补:高盈利 + 高成长 = 优质;高盈利 + 低成长 = 成熟现金牛。
六、拓展练习
- 把成长因子与第 7 篇盈利因子做「盈利×成长」九宫格分类。
- 对
profit_alert=1的公司逐一看hicw/lr利润细分,定位非经常性收益来源。 - 用
jzczzl连续两季为正,筛选「内生增长」标的池(仅统计演示)。
下篇预告
A股量化数据工程:从 REST 接口到策略信号(第 9 篇):偿债与运营能力因子
下一篇用
hicw/cznl与hicw/yy拉取偿债、运营指标,自研安全因子与周转因子,补齐财务三张表的解读。
免责申明 :本篇全部代码、接口调用仅作为量化编程学习演示,仅为数据演示,不构成投资建议。市场有风险,投资需谨慎。