A股量化数据工程:从 REST 接口到策略信号(第 11 篇):业绩报表、预告与快报事件
前言
前四篇把财务做成了静态因子,但财报季真正驱动股价的,是「业绩超预期」「预告扭亏」这类事件。接口hicw/yjbb(报表)、yjyg(预告)、yjkb(快报)、lr(利润细分)四张表,本篇把它们落库并自研事件标记,把财务维度从「横截面因子」升级成「事件驱动信号」。
一、接口原始字段梳理
1)业绩报表
接口地址:https://api.biyingapi.com/hicw/yjbb/{LICENCE}
| 字段 | 说明 |
|---|---|
| dm | 股票代码 |
| mc | 股票名称 |
| mgsy | 每股收益 |
| mgsytb | 每股收益同比 |
| mgjz | 每股净资产 |
| jzsy | 净资产收益率 |
| mgxjl | 每股现金流 |
| jlr | 净利润 |
| jlrtb | 净利润同比 |
| fpfa | 分配方案 |
| rdate | 报告期 |
| y, q, yq | 年 / 季 / 年季标识 |
2)业绩预告
接口地址:https://api.biyingapi.com/hicw/yjyg/{LICENCE}
| 字段 | 说明 |
|---|---|
| dm | 股票代码 |
| mc | 股票名称 |
| lx | 预告类型 |
| ggrq | 公告日期 |
| bgq | 报告期 |
| yjzy | 预计摘要 |
| qntq | 去年同期 |
| yjzf | 预计增幅 |
| y, q, yq | 年 / 季 / 年季标识 |
3)业绩快报
接口地址:https://api.biyingapi.com/hicw/yjkb/{LICENCE}
| 字段 | 说明 |
|---|---|
| dm | 股票代码 |
| mc | 股票名称 |
| mgsy | 每股收益 |
| yysr | 营业收入 |
| yysrtb | 营收同比 |
| jlr | 净利润 |
| jlrtb | 净利润同比 |
| mgjzc | 每股净资产 |
| jzcsyl | 净资产收益率 |
| zzc | 总资产 |
| rdate | 报告期 |
| y, q, yq | 年 / 季 / 年季标识 |
4)利润细分
接口地址:https://api.biyingapi.com/hicw/lr/{LICENCE}
| 字段 | 说明 |
|---|---|
| dm | 股票代码 |
| mc | 股票名称 |
| sshy | 所属行业 |
| sshyr | 所属行业收入 |
| ckcb | 存款成本(接口原始字段) |
| cklr | 存款利润 |
| lrms | 利润明细 |
| rdate | 报告期 |
二、自研衍生统计指标
- 业绩超预期标记:
jlrtb(净利润同比)高于全市场 75 分位,标记beat=1。 - 预告向好:
yjzy含「预增」「扭亏」关键词,标记guidance_up=1。 - 快报—报表差异:同一
rdate下快报jlr与报表jlr偏差 > 5%,标记revision。
关键词匹配与分位判定为自研,原始字段仅做输入。
三、数据表设计
CREATETABLEIFNOTEXISTSfin_yjbb(dmTEXT,yqTEXT,mgsyREAL,mgsytbREAL,mgjzREAL,jzsyREAL,mgxjlREAL,jlrREAL,jlrtbREAL,PRIMARYKEY(dm,yq));CREATETABLEIFNOTEXISTSfin_yjyg(dmTEXT,yqTEXT,lxTEXT,ggrqTEXT,yjzyTEXT,yjzfREAL,PRIMARYKEY(dm,yq));CREATETABLEIFNOTEXISTSfin_yjkb(dmTEXT,yqTEXT,yysrREAL,jlrREAL,jlrtbREAL,PRIMARYKEY(dm,yq));CREATETABLEIFNOTEXISTSevt_earning(dmTEXT,yqTEXT,beatINTEGER,guidance_upINTEGER,revisionINTEGER,PRIMARYKEY(dm,yq));四、完整代码
importrequestsimportsqlite3importtimeimportre LICENCE="YOUR_LICENCE"BASE="https://api.biyingapi.com"DB_PATH="quant.db"defbiying_api_get_retry(url,timeout=15,max_retry=3):foriinrange(max_retry):try:r=requests.get(url,timeout=timeout)r.raise_for_status()returnr.json()exceptExceptionase:ifi==max_retry-1:raisetime.sleep(1+i)deffetch(path):d=biying_api_get_retry(f"{BASE}/hicw/{path}/{LICENCE}")returnd.get("data",[])ifisinstance(d,dict)else[]defpct_rank(vals,v):xs=sorted(xforxinvalsifxisnotNone)ifnotxsorvisNone:return0.5below=sum(1forxinxsifx<=v)returnround(below/len(xs),3)defbuild_events(bb,yg,kb):jlrtbs=[r.get("jlrtb")forrinbbifr.get("jlrtb")isnotNone]out=[]bb_map={r["dm"]:rforrinbb}kb_map={r["dm"]:rforrinkb}yg_map={r["dm"]:rforrinyg}forrinbb:dm,yq=r["dm"],r["yq"]beat=1ifpct_rank(jlrtbs,r.get("jlrtb"))>0.75else0gy=yg_map.get(dm,{})guidance_up=1ifre.search(r"预增|扭亏",gy.get("yjzy")or"")else0rev=0ifdminkb_mapandr.get("jlr")andkb_map[dm].get("jlr"):diff=abs(r["jlr"]-kb_map[dm]["jlr"])/(abs(r["jlr"])+1e-9)rev=1ifdiff>0.05else0out.append((dm,yq,beat,guidance_up,rev))returnoutif__name__=="__main__":bb,yg,kb=fetch("yjbb"),fetch("yjyg"),fetch("yjkb")con=sqlite3.connect(DB_PATH)con.executemany("INSERT OR REPLACE INTO fin_yjbb(dm,yq,mgsy,mgsytb,mgjz,jzsy,mgxjl,jlr,jlrtb)""VALUES(?,?,?,?,?,?,?,?,?)",[[r.get("dm"),r.get("yq"),r.get("mgsy"),r.get("mgsytb"),r.get("mgjz"),r.get("jzsy"),r.get("mgxjl"),r.get("jlr"),r.get("jlrtb")]forrinbb])con.executemany("INSERT OR REPLACE INTO fin_yjyg(dm,yq,lx,ggrq,yjzy,yjzf) VALUES(?,?,?,?,?,?)",[[r.get("dm"),r.get("yq"),r.get("lx"),r.get("ggrq"),r.get("yjzy"),r.get("yjzf")]forrinyg])con.executemany("INSERT OR REPLACE INTO fin_yjkb(dm,yq,yysr,jlr,jlrtb) VALUES(?,?,?,?,?)",[[r.get("dm"),r.get("yq"),r.get("yysr"),r.get("jlr"),r.get("jlrtb")]forrinkb])con.commit()ev=build_events(bb,yg,kb)con.executemany("INSERT OR REPLACE INTO evt_earning(dm,yq,beat,guidance_up,revision) VALUES(?,?,?,?,?)",ev)con.commit();con.close()beats=[eforeinevife[2]]print(f"业绩超预期事件{len(beats)}条,示例:",beats[:5])五、关键业务说明
- 事件需同窗口:
beat用同yq全市场分位,revision用同rdate快报与报表对比,口径不能混。 - 关键词匹配保守:
guidance_up只认「预增/扭亏」等明确向好词,避免误判「预减」「续亏」。 - 事件是触发非结论:超预期不等于必涨,需结合前四篇因子看持续性。
六、拓展练习
- 把
evt_earning与第 7–10 篇四因子 Join,看「超预期 + 高现金质量」组合的后续表现(仅统计)。 - 用
revision=1公司跟踪公告后价格反应,统计下修 vs 上修的差异。 - 把
fin_lr利润细分接入,定位利润主要来自主营还是非主营。
下篇预告
A股量化数据工程:从 REST 接口到策略信号(第 12 篇):北交所列表与实时行情接入
下一篇进入差异化维度——北交所(京市),用
bj/list/all与bj/stock/real/time把京市行情接进来,开辟竞品覆盖少的独立数据战场。
免责申明:本篇全部代码、接口调用仅作为量化编程学习演示,仅为数据演示,不构成投资建议。市场有风险,投资需谨慎。