ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【零依赖量化数据实战 #17】A股公司基本面:5 个 URL 做个股画像

【零依赖量化数据实战 #17】A股公司基本面:5 个 URL 做个股画像 【沪深基本面 #17】公司简介 / 财务指标 / 十大股东 / 流通股东 / 基金持仓5 个 URL 做个股画像系列《零依赖量化数据实战》零依赖 · 纯 GET · 不 import 任何 SDK适用想做 A 股个股基本面分析、股东结构追踪、基金持仓监控不想装库或对接多个数据源的开发者你将得到什么5 个「公司基本面」端点的路径、返回字段和语义公司简介 / 财务指标 / 十大股东 / 流通股东 / 基金持仓照公开文档核对过的不是猜的一段company_profile(code)把 5 个端点按股票代码一次性拉齐做一张「个股基本面画像」字段名容错写法候选键命中对字段名不敏感、对形态list / dict不敏感完整可复制运行代码把你的token换成真实智兔证书即可直接跑一、五个端点一张语义表「个股基本面」拆成 5 个端点路径前缀统一走/hs/gs/后面跟子类型 股票代码。GET https://api.zhituapi.com/hs/gs/gsjj/{code} 公司简介基本信息/行业/上市日 GET https://api.zhituapi.com/hs/gs/cwzb/{code} 财务指标ROE/PE/PB/营收等 GET https://api.zhituapi.com/hs/gs/sdgd/{code} 十大股东前十大持股明细 GET https://api.zhituapi.com/hs/gs/ltgd/{code} 流通股东流通股持股明细 GET https://api.zhituapi.com/hs/gs/jjcg/{code} 基金持仓公募基金持有该股的情况鉴权统一?token你的token。{code}是路径参数不是查询参数换成股票代码文档示例600519。gsjj/cwzb返回的可能是聚合对象dictsdgd/ltgd/jjcg返回的是列表每条一个股东/一只基金。一个实际用法输入一只股票代码 →gsjj看公司是干什么的 →cwzb看财务是否健康 →sdgd/ltgd看谁在持股、有没有机构进/出 →jjcg看公募基金有没有在买。五步串起来就是一张「个股基本面画像」。二、字段名不固定用候选键命中公司基本面接口的返回字段名可能因数据源更新而变化。与其硬编码字段名改了就全崩不如用候选键列表命中抽取def_hit_key(d,cands):从字典中按候选键名列表命中第一个存在的键。ifnotisinstance(d,dict):returnNoneforkincands:ifkind:returnkreturnNonedef_to_float(v):把可能是 5.2% / 5.2 / None 的值归一成 float。ifvisNone:returnNoneifisinstance(v,(int,float)):returnfloat(v)sstr(v).replace(%,).replace(,,).strip()try:returnfloat(s)exceptValueError:returnNonedefsummarize_gs(name,data):从公司基本面返回中抽取关键字段做汇总对字段名不敏感、对形态不敏感。ifdataisNone:returnf{name}: 无数据ifisinstance(data,list):ifnotdata:returnf{name}: 0 条firstdata[0]ifisinstance(data[0],dict)else{}code_key_hit_key(first,[code,dm,symbol,gpdm])name_key_hit_key(first,[name,mc,gpmc,shortname,gdmc])amount_key_hit_key(first,[amount,je,cze,cgs,ltg,hold])parts[f{name}:{len(data)}条]ifcode_key:parts.append(f首条代码{first.get(code_key)})ifname_key:parts.append(f名称{first.get(name_key)})ifamount_key:parts.append(f金额/持股键{first.get(amount_key)})return | .join(parts)ifisinstance(data,dict):keyslist(data.keys())[:6]returnf{name}: 聚合对象键{keys}returnf{name}:{type(data).__name__}这样就算数据源把dm改成gpdm代码不用动。命不中也不报错——只是那行汇总少一个字段。三、个股画像把 5 个端点按代码拉齐核心不是「把五个接口都调通」而是把同一只股票的 5 个维度数据归一后做基本面画像。我们关心两件事每个端点返回什么形态、首条/键长什么样确认数据到位股东列表和基金持仓的条数对比机构关注度信号importsys,timeimportrequests TOKEN你的token# ← 换成你的真实 tokenBASEhttps://api.zhituapi.comGS_ENDPOINTS{gsjj:(/hs/gs/gsjj/{code},公司简介),cwzb:(/hs/gs/cwzb/{code},财务指标),sdgd:(/hs/gs/sdgd/{code},十大股东),ltgd:(/hs/gs/ltgd/{code},流通股东),jjcg:(/hs/gs/jjcg/{code},基金持仓),}deffetch(name,code,tokenTOKEN,timeout15):拉一个公司基本面端点返回 (data, err)。path_tmpl,_GS_ENDPOINTS[name]urlf{BASE}{path_tmpl.format(codecode)}try:rrequests.get(url,params{token:token},timeouttimeout)exceptrequests.RequestExceptionase:returnNone,f网络异常{e}ifr.status_code!200:returnNone,f{r.status_code}{r.text.strip()[:140]}try:payloadr.json()exceptValueError:returnNone,f非 JSON 返回{r.text[:140]}ifisinstance(payload,dict):detailpayload.get(detail)orpayload.get(error)returnNone,f业务错误{detailorlist(payload)[:6]}returnpayload,Nonedefcompany_profile(code,tokenTOKEN,sleep0.2):拉 5 个公司基本面端点做一张「个股画像」快照。iftoken你的token:print([演示] TOKEN 为占位符下面请求会返回错误码契约请换成真实 token 后再跑。)snap{}fornameinGS_ENDPOINTS:data,errfetch(name,code,tokentoken)iferr:print(f{name}({GS_ENDPOINTS[name][1]}): 暂不可用{err})snap[name]Noneelse:print(summarize_gs(name,data))snap[name]data time.sleep(sleep)returnsnapsleep0.2是限频保护——5 个端点 0.2 秒间隔 ≈ 1 秒远在限频内。要扫描多只股票把company_profile套一层代码循环外面再撑一个更大的间隔即可。四、代码自验结果离线自测 6 项全 PASS真实输出不联网selftest PASS: 端点注册完整(5/5) / _hit_key 命中 / _to_float 去百分号 / 列表汇总 / 空数据兜底 / 聚合对象处理 共 6 项联网跑占位 token以600519为例真实输出[演示] TOKEN 为占位符下面请求会返回错误码契约请换成真实 token 后再跑。 gsjj (公司简介): 暂不可用404 102:Licence证书(你的token)不存在 cwzb (财务指标): 暂不可用404 102:Licence证书(你的token)不存在 sdgd (十大股东): 暂不可用404 102:Licence证书(你的token)不存在 ltgd (流通股东): 暂不可用404 102:Licence证书(你的token)不存在 jjcg (基金持仓): 暂不可用404 102:Licence证书(你的token)不存在5 个端点契约一致单端点失败不影响整体流程、程序友好退出。本文未编造任何公司简介/财务/股东数据——换成覆盖该接口的正式证书后重跑即可打印真实个股基本面画像。五、坑与注意事项坑 #1102 不代表路径写对了。鉴权发生在路由匹配之前。把路径故意写错配无效 token同样返回102。路径合法性只能靠客户端按白名单自查——本文 5 个路径是照公开文档核对的。坑 #2{code}是路径参数不是查询参数。5 个端点的股票代码都拼在 URL 路径里/hs/gs/gsjj/600519不是?code600519。写成查询参数会拿到 404 路径不存在不是 102 证书错误——看到 404 但没有102:前缀先查路径格式。坑 #3gsjj/cwzb可能返回聚合对象dictsdgd/ltgd/jjcg返回列表。公司简介和财务指标通常是一条聚合数据一个 dict股东和基金持仓是多条列表。summarize_gs对两种形态都做了兜底——dict 时打印键列表list 时打印条数 首条字段。别假设所有端点返回同一种形态。坑 #4十大股东和流通股东不是一回事。sdgd十大股东是按总股本排序的前十大股东ltgd流通股东是按流通股排序的。同一只股票两者的名单可能不同——大股东持有的可能不全是流通股限售股不在流通股东里流通股东里排前的可能是散户或机构但不是总股本前十。小结与下篇预告这篇你拿到了 5 个公司基本面端点简介/财务/十大股东/流通股东/基金持仓、股票代码路径参数处理写法、以及一个把 5 维拉齐做个股基本面画像的模板顺带避开了 102 误判、路径参数误写查询参数、返回形态不统一、十大股东与流通股东混淆四个坑。至此#14–#17 形成了一条从市场异动到公司面的分析链日内异动池(#14) → 可转债全貌(#15) → 港股通资金面(#16) → 公司基本面画像(#17)。下一篇#18讲北交所实时行情与清单全貌——用/bj/list/all北交所全市场清单/bj/stock/real/ssjy/{code}单只北交所股票实时交易/bj/index/real/ssjy/{code}北交所指数实时交易把视角从「单只股票基本面」升级到「北交所全市场盯盘」把分析链延伸到交易所层面。免责声明本文仅演示公开数据接口的用法所有代码示例均以占位 token 自验未含任何真实数据文中合成数据仅为逻辑自验用途不构成投资建议亦不承诺收益。
返回列表