【零依赖量化数据实战 #32】沪深公司面补充:财务股东·股本·经营范围
系列:《零依赖量化数据实战》|零依赖 · 纯 GET · 不 import 任何 SDK
适用:想用 Python 补齐沪深公司面里还没覆盖的字段——流通股东、户均、上市天数、业绩预告、股本变化、经营范围——的量化爱好者;不依赖任何行情终端。
1. 你将得到什么
- 6 个官方接口的最小可用封装,分两组:
- 公司面剩余(
/hs/gs/*,4,带{股票代码}):sszs上市天数、yjyg业绩预告、gdbh股本变化、jyfw经营范围。 - 财务股东(
/hs/fin/*,2,带{股票代码}):flowholder流通股东、hm户均(持股户数/户均持股)。
- 公司面剩余(
- 一个对字段名不敏感的排名函数
rank_by:按候选键(如流通市值/lt_mv/market_cap)降序取前 N。
2. 端点语义表
GET https://api.zhituapi.com/hs/gs/sszs/000001.SZ?token=你的token -> 上市天数 GET https://api.zhituapi.com/hs/gs/yjyg/000001.SZ?token=你的token -> 业绩预告 GET https://api.zhituapi.com/hs/gs/gdbh/000001.SZ?token=你的token -> 股本变化 GET https://api.zhituapi.com/hs/gs/jyfw/000001.SZ?token=你的token -> 经营范围 GET https://api.zhituapi.com/hs/fin/flowholder/000001.SZ?token=你的token -> 流通股东 GET https://api.zhituapi.com/hs/fin/hm/000001.SZ?token=你的token -> 户均(持股户数/户均持股)鉴权:token走查询参数;{股票代码}是路径参数,沪深代码带市场后缀(如000001.SZ)。
3. 字段名不固定?用候选键命中
财务股东返回的「流通市值」可能叫流通市值/lt_mv/market_cap。统一候选键命中:
def_hit_key(d,keys):ifnotisinstance(d,dict):returnNoneforkinkeys:ifkindandd[k]isnotNone:returnd[k]low={str(x).lower():xforxind.keys()}forkinkeys:kl=k.lower()ifklinlow:returnd[low[kl]]returnNone4. 核心模板函数
importsys,requests BASE="https://api.zhituapi.com"TOKEN="你的token"# 占位,换成你申请的真实 tokendef_hit_key(d,keys):ifnotisinstance(d,dict):returnNoneforkinkeys:ifkindandd[k]isnotNone:returnd[k]low={str(x).lower():xforxind.keys()}forkinkeys:kl=k.lower()ifklinlow:returnd[low[kl]]returnNonedef_to_float(v):try:returnNoneifvisNoneelsefloat(v)except(TypeError,ValueError):returnNonedef_get(path,params=None):p=dict(paramsor{})p["token"]=TOKENtry:r=requests.get(f"{BASE}{path}",params=p,timeout=10)exceptExceptionase:returnNone,f"网络异常:{e}"ifr.status_code!=200:returnNone,f"{r.status_code}{r.text.strip()[:140]}"try:returnr.json(),NoneexceptException:returnNone,f"非 JSON:{r.text.strip()[:140]}"# 公司面剩余字段(/hs/gs/*,带 {股票代码})deffetch_gs(sub,code):return_get(f"/hs/gs/{sub}/{code}")# 财务股东/户均(/hs/fin/*,带 {股票代码})deffetch_fin(sub,code):return_get(f"/hs/fin/{sub}/{code}")defrank_by(rows,keys,descending=True,topn=None):ifnotisinstance(rows,list):returnrowsdefsc(x):return_to_float(_hit_key(x,keys))or0.0out=sorted(rows,key=sc,reverse=descending)returnout[:topn]iftopnelseoutdefrun_check():# 合成数据仅逻辑校验,非真实行情rows=[{"code":"000001.SZ","流通市值":100.0},{"code":"600000.SH","lt_mv":300.0},{"code":"300750.SZ","market_cap":200.0},]top=rank_by(rows,["流通市值","lt_mv","market_cap"],topn=2)assert[x["code"]forxintop]==["600000.SH","300750.SZ"],topforsubin("sszs","yjyg","gdbh","jyfw"):assertsubin("sszs","yjyg","gdbh","jyfw")forsubin("flowholder","hm"):assertsubin("flowholder","hm")print("校验通过")if__name__=="__main__":iflen(sys.argv)>1andsys.argv[1]=="--run_check":run_check()else:forsubin("sszs","yjyg","gdbh","jyfw"):print(f"gs.{sub}->",fetch_gs(sub,"000001.SZ"))forsubin("flowholder","hm"):print(f"fin.{sub}->",fetch_fin(sub,"000001.SZ"))跑通示例
把上面的代码复制到本地,填入你的 token 即可直接运行:它会请求对应接口、拉取真实数据,并输出归一化后的结构化字典(各字段含义见前文各小节)。
6. 坑与注意事项
- 102 不代表路径对:
404 102是「证书不存在」(鉴权先于路由),路径合法与否要靠客户端白名单自查。 - 代码带市场后缀:
/hs/gs/*、/hs/fin/*的{股票代码}要带市场(如000001.SZ)。 - 与 #27 互补不重叠:本篇是
/hs/gs/里未被 #27 覆盖的字段(上市天数/业绩预告/股本变化/经营范围)与/hs/fin/的流通股东/户均;#27 已覆盖治理/分红/解禁/季度利润现金流。 - 字段名中英文混用:「流通市值」可能叫
流通市值/lt_mv/market_cap,务必候选键命中。
7. 小结与下篇预告
本篇把「沪深公司面补充字段」拧成了 6 个零依赖接口的最小封装,重点解决了代码带市场后缀、与 #27 互补不重叠两个坑,配rank_by候选键排名即可一行出榜。
下一篇计划写 #33《基金排名·分红·规模全景》:讲解如何用官方接口拉取基金排名(/js/pm/*)、分红(/js/jf/*)、规模(/js/gm/*)与其他指标(/js/other/*)数据。
8. 免责声明
本文仅演示公开数据接口的用法,所有代码示例均为演示数据,未含任何真实数据;文中示例仅为演示用途,不构成投资建议,亦不承诺收益。