news 2026/8/6 1:43:45

股东变化趋势数据挖掘:用Python追踪筹码集中度与主力动向

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
股东变化趋势数据挖掘:用Python追踪筹码集中度与主力动向

股东变化趋势数据挖掘:用Python追踪筹码集中度与主力动向

股东人数是判断筹码集中度的重要指标。股东人数减少意味着筹码在集中,可能有大户在吸筹;股东人数增加意味着筹码在分散,可能有大户在出货。我之前写了一套股东变化趋势分析工具,把全市场的股东户数数据系统地分析了一遍。

数据用的是股东变化趋势接口time/f10/gdbh/{股票代码},返回截止日期、股东户数、比上期变化情况。按截止日期倒序排列。配合十大股东接口time/f10/zygd/{股票代码}和十大流通股东接口time/f10/zygdlt/{股票代码},可以做更深入的分析。

importjsonimportosimportpandasaspdimportnumpyasnp data_dir="D:/stock_data"defread_gdbh(dm):file_path=os.path.join(data_dir,"time","f10","gdbh",dm)ifnotos.path.exists(file_path):returnNonewithopen(file_path,"r",encoding="utf-8")asf:data=json.load(f)df=pd.DataFrame(data)df.columns=["jzrq","gdhs","bsqbh"]df["jzrq"]=pd.to_datetime(df["jzrq"])returndf.sort_values("jzrq")defread_zygd(dm):file_path=os.path.join(data_dir,"time","f10","zygd",dm)ifnotos.path.exists(file_path):returnNonewithopen(file_path,"r",encoding="utf-8")asf:data=json.load(f)returndatadefread_zygdlt(dm):file_path=os.path.join(data_dir,"time","f10","zygdlt",dm)ifnotos.path.exists(file_path):returnNonewithopen(file_path,"r",encoding="utf-8")asf:data=json.load(f)returndata

字段用简写,jzrq截止日期gdhs股东户数bsqbh比上期变化情况。十大股东和十大流通股东返回的是嵌套结构,包含截止日期、公告日期、股东总数、平均持股、十大股东列表等信息。

第一个分析:股东人数变化趋势。这是最基础的分析,看股东人数是在减少还是在增加。

defanalyze_gdhs_trend(dm):df=read_gdbh(dm)ifdfisNoneorlen(df)<2:returnNonedf["gdhs"]=pd.to_numeric(df["gdhs"],errors="coerce")latest=df.iloc[-1]prev=df.iloc[-2]change_pct=(latest["gdhs"]-prev["gdhs"])/prev["gdhs"]recent_4=df.tail(4)trend="下降"ifrecent_4["gdhs"].is_monotonic_decreasingelse"上升"ifrecent_4["gdhs"].is_monotonic_increasingelse"波动"result={"dm":dm,"latest_date":latest["jzrq"],"latest_gdhs":latest["gdhs"],"change_pct":change_pct,"trend":trend}ifchange_pct<-0.15:result["signal"]="股东人数大幅减少,筹码集中"result["score"]=70elifchange_pct>0.15:result["signal"]="股东人数大幅增加,筹码分散"result["score"]=35else:result["signal"]="股东人数变化不大"result["score"]=50returnresult

第二个分析:全市场筹码集中度扫描。遍历所有股票,找出股东人数连续减少的股票。

defscan_chip_concentration(top_n=30):gplist_path=os.path.join(data_dir,"base","gplist")withopen(gplist_path,"r",encoding="utf-8")asf:gp_list=json.load(f)results=[]forgpingp_list:dm=gp["股票代码"]mc=gp["股票名称"]df=read_gdbh(dm)ifdfisNoneorlen(df)<3:continuedf["gdhs"]=pd.to_numeric(df["gdhs"],errors="coerce")recent_3=df.tail(3)ifrecent_3["gdhs"].is_monotonic_decreasing:change_2q=(recent_3["gdhs"].iloc[-1]-recent_3["gdhs"].iloc[0])/recent_3["gdhs"].iloc[0]results.append({"dm":dm,"mc":mc,"latest_gdhs":recent_3["gdhs"].iloc[-1],"change_2q":change_2q})df_result=pd.DataFrame(results).sort_values("change_2q").head(top_n)print("连续3期股东人数减少TOP{}:".format(top_n))print(df_result.to_string(index=False))returndf_result

第三个分析:十大股东变动对比。对比相邻两个季度的十大股东名单,找出新进和退出的股东。

defcompare_top10_change(dm):data=read_zygd(dm)ifnotdataorlen(data)<2:returnNonelatest=data[0]prev=data[1]latest_holders=set()forholderinlatest.get("ZygdSdgd",[]):latest_holders.add(holder.get("股东名称",""))prev_holders=set()forholderinprev.get("ZygdSdgd",[]):prev_holders.add(holder.get("股东名称",""))new_in=latest_holders-prev_holders exited=prev_holders-latest_holders result={"dm":dm,"latest_date":latest.get("截止日期",""),"prev_date":prev.get("截止日期",""),"new_holders":list(new_in),"exited_holders":list(exited)}institution_keywords=["基金","社保","保险","信托","QFII","证金","汇金","资管"]new_institutions=[hforhinnew_inifany(kwinhforkwininstitution_keywords)]ifnew_institutions:result["signal"]="机构新进十大股东:{}".format("、".join(new_institutions))result["score"]=72eliflen(new_in)==0andlen(exited)==0:result["signal"]="十大股东无变动"result["score"]=55else:result["signal"]="十大股东有变动但无机构新进"result["score"]=50returnresult

第四个分析:结合股东人数变化和股价走势。股东人数减少+股价还没大涨的股票最值得关注。

defselect_chip_concentration_strategy(top_n=20):gplist_path=os.path.join(data_dir,"base","gplist")withopen(gplist_path,"r",encoding="utf-8")asf:gp_list=json.load(f)candidates=[]forgpingp_list:dm=gp["股票代码"]mc=gp["股票名称"]df_gdbh=read_gdbh(dm)ifdf_gdbhisNoneorlen(df_gdbh)<2:continuedf_gdbh["gdhs"]=pd.to_numeric(df_gdbh["gdhs"],errors="coerce")change_pct=(df_gdbh["gdhs"].iloc[-1]-df_gdbh["gdhs"].iloc[-2])/df_gdbh["gdhs"].iloc[-2]ifchange_pct>-0.10:continuekline=read_kline(dm,"day")ifklineisNoneorlen(kline)<60:continuerecent_60=kline.tail(60)price_change=(recent_60["收盘价"].iloc[-1]-recent_60["收盘价"].iloc[0])/recent_60["收盘价"].iloc[0]ifprice_change>0.10:continuecandidates.append({"dm":dm,"mc":mc,"gdhs_change":change_pct,"price_change_60d":price_change})returnpd.DataFrame(candidates).sort_values("gdhs_change").head(top_n)

策略逻辑是:股东人数减少超过10% + 60日涨幅不超过10%。前一个条件说明筹码在集中,后一个条件排除已经大涨的股票。这种"筹码集中但股价没动"的股票,后续上涨概率较高。

几个使用经验。第一,股东人数数据是季度披露的,有滞后性,只能做中长期参考。第二,股东人数减少要配合业绩看,业绩增长的筹码集中才有意义。第三,十大股东的季度变动比静态名单更有价值,要重点看机构新进。第四,基金持股接口time/f10/jjcg也可以配合使用,看基金持仓变化。

我用的数据来源是ig50的本地数据接口,股东变化趋势、十大股东、十大流通股东这些接口配合使用,能构建一个完整的筹码集中度分析系统。


接口说明:

  1. time/f10/gdbh/{股票代码} - 股东变化趋势
    本地路径:数据存放目录/time/f10/gdbh/{股票代码}
    更新频率:每天15:30(更新完成约12小时)
    数据格式:[{}…],按截止日期倒序
    主要字段:截止日期(jzrq, yyyy-MM-dd)、股东户数(gdhs)、比上期变化情况(bsqbh)

  2. time/f10/zygd/{股票代码} - 十大股东
    本地路径:数据存放目录/time/f10/zygd/{股票代码}
    更新频率:每天15:30(更新完成约12小时)
    数据格式:[{}…],按截止日期倒序
    主要字段:截止日期、公告日期、股东说明、股东总数、平均持股、十大股东列表(含排名、股东名称、持股数量、持股比例、股本性质)

  3. time/f10/zygdlt/{股票代码} - 十大流通股东
    本地路径:数据存放目录/time/f10/zygdlt/{股票代码}
    更新频率:每天15:30(更新完成约12小时)
    数据格式:[{}…],按公告日期倒序
    主要字段:截止日期、公告日期、十大流通股东列表(含排名、股东名称、持股数量、持股比例、股本性质)

资料参考:ig50

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 1:41:22

Agent三大件全配齐,为什么一到团队协作就翻车?

聊《工具调用记忆与任务规划都配齐了&#xff0c;为什么Agent还是不好用&#xff1f;》之前&#xff0c;先说一句实在的&#xff1a;别急着背概念&#xff0c;先看它在真实项目里到底解决什么问题。 摘要 摘要&#xff1a;工具调用、记忆、规划是 Agent 的三大核心模块&#…

作者头像 李华
网站建设 2026/8/6 1:37:57

国际区号E.164标准解析:从通信原理到全球业务实践

1. 项目概述&#xff1a;不只是电话本里的数字 “世界各国国家或地区的国际区号”&#xff0c;这个标题听起来像是一张枯燥的表格&#xff0c;或者手机通讯录里那个几乎用不到的功能。但如果你只把它当成一串数字&#xff0c;那就错过了它背后一整套精密、复杂且充满历史趣味的…

作者头像 李华
网站建设 2026/8/6 1:31:30

从GPT-3到提示工程:解锁大模型能力的核心钥匙

上周和一位刚接触大模型的朋友聊天&#xff0c;他问了我一个问题&#xff1a;“都说现在是大模型时代&#xff0c;Prompt&#xff08;提示词&#xff09;是核心技能。但我看那些教程&#xff0c;不就是把问题写清楚点吗&#xff1f;这有什么难的&#xff0c;值得专门去学吗&…

作者头像 李华