股东持股变动监控系统用Python追踪大股东增减持与筹码集中度大股东的持股变动是判断公司前景的重要信号——大股东增持通常意味着看好公司未来减持则可能意味着不看好。但手动追踪这些信息太麻烦了去年我搭建了一个股东持股变动监控系统自动从本地数据中提取大股东的增减持信息并结合筹码集中度指标做综合分析。系统主要用到以下数据接口持股变动数据在time/f10目录下包含十大股东、十大流通股东、基金持股等信息股票列表在base/gplist财务指标在time/f10/fi/{dm}。importjsonimportosimportpandasaspdimportnumpyasnpfromdatetimeimportdatetime data_dirD:/ig50_datadefread_top10_holders(dm):file_pathos.path.join(data_dir,time,f10,sdgd,dm)withopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[dm,mc,jyrq,gdMc,cgs,zltb,gdSort,gdType,zjType]df[jyrq]pd.to_datetime(df[jyrq])returndfdefread_top10_float_holders(dm):file_pathos.path.join(data_dir,time,f10,sdltgd,dm)withopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[dm,mc,jyrq,gdMc,cgs,zltb,gdSort,gdType,zjType]df[jyrq]pd.to_datetime(df[jyrq])returndfdefread_stock_list():file_pathos.path.join(data_dir,base,gplist)withopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[dm,mc,dmHk,mcHk,isAH,isSH,isSZ]returndf字段方面dm是股票代码mc是股票名称jyrq是公告日期gdMc是股东名称cgs是持股数zltb是占流通股比例gdSort是股东排名gdType是股东类型机构/个人/基金等zjType是增减类型增持/减持/不变。系统的第一个分析模块是股东持股变动追踪。通过对比连续两个季度的十大股东数据可以计算出每个股东的持股变化——新进、增持、减持、退出。defanalyze_holder_changes(dm):dfread_top10_holders(dm)iflen(df)0:returnNonedatessorted(df[jyrq].unique())iflen(dates)2:returnNonelatest_datedates[-1]prev_datedates[-2]df_latestdf[df[jyrq]latest_date].set_index(gdMc)df_prevdf[df[jyrq]prev_date].set_index(gdMc)changes[]all_holdersset(df_latest.index)|set(df_prev.index)forholderinall_holders:latest_sharesdf_latest.loc[holder,cgs]ifholderindf_latest.indexelse0prev_sharesdf_prev.loc[holder,cgs]ifholderindf_prev.indexelse0iflatest_shares0andprev_shares0:action退出change-prev_shareseliflatest_shares0andprev_shares0:action新进changelatest_shareseliflatest_sharesprev_shares:action增持changelatest_shares-prev_shareseliflatest_sharesprev_shares:action减持changelatest_shares-prev_shareselse:action不变change0ifaction!不变:changes.append({gdMc:holder,prev_shares:prev_shares,latest_shares:latest_shares,change:change,action:action,latest_ratio:df_latest.loc[holder,zltb]ifholderindf_latest.indexelse0})df_changespd.DataFrame(changes)iflen(df_changes)0:df_changesdf_changes.sort_values(change,ascendingFalse)returndf_changes第二个分析模块是筹码集中度计算。筹码集中度是判断股票筹码是否集中的重要指标。如果股东人数减少、人均持股增加说明筹码在集中可能有资金在吸筹反之则说明筹码在分散。defanalyze_chip_concentration(dm):dfread_top10_float_holders(dm)iflen(df)0:returnNonedatessorted(df[jyrq].unique())results[]foriinrange(len(dates)):datedates[i]df_perioddf[df[jyrq]date]total_sharesdf_period[cgs].sum()top10_ratiodf_period[zltb].sum()max_holder_ratiodf_period[zltb].max()hhi(df_period[zltb]**2).sum()results.append({date:date,top10_ratio:top10_ratio,max_holder_ratio:max_holder_ratio,hhi:hhi,holder_count:len(df_period)})df_resultpd.DataFrame(results)iflen(df_result)2:latestdf_result.iloc[-1]prevdf_result.iloc[-2]trend集中iflatest[top10_ratio]prev[top10_ratio]else分散concentration_changelatest[top10_ratio]-prev[top10_ratio]print(f筹码集中度趋势:{trend})print(f前十大流通股东占比变化:{concentration_change:.2f}%)print(f当前前十大占比:{latest[top10_ratio]:.2f}%)print(fHHI指数:{latest[hhi]:.4f})returndf_resultHHI指数赫芬达尔指数是衡量集中度的经典指标值越大说明筹码越集中。第三个分析模块是机构持股追踪。机构持股的变化往往比散户更有参考价值。我会从股东类型中筛选出机构股东单独追踪它们的增减持行为。defanalyze_institutional_holders(dm):dfread_top10_float_holders(dm)iflen(df)0:returnNonedf_instdf[df[gdType].isin([基金,社保,保险,QFII,信托,机构])]iflen(df_inst)0:returnNonedatessorted(df_inst[jyrq].unique())latest_datedates[-1]df_latestdf_inst[df_inst[jyrq]latest_date]total_inst_ratiodf_latest[zltb].sum()inst_countlen(df_latest)print(f机构持股数量:{inst_count}家)print(f机构合计持股比例:{total_inst_ratio:.2f}%)print(f机构明细:)print(df_latest[[gdMc,cgs,zltb,gdType]].to_string(indexFalse))returndf_latest第四个分析模块是增减持信号汇总。系统会把所有分析结果汇总成一个综合信号帮助快速判断股票的筹码面是否健康。defgenerate_holder_signal(dm):changesanalyze_holder_changes(dm)chipanalyze_chip_concentration(dm)instanalyze_institutional_holders(dm)signal{dm:dm}ifchangesisnotNoneandlen(changes)0:new_entrieslen(changes[changes[action]新进])increaseslen(changes[changes[action]增持])decreaseslen(changes[changes[action]减持])exitslen(changes[changes[action]退出])signal[new_entries]new_entries signal[increases]increases signal[decreases]decreases signal[exits]exits net_action(new_entriesincreases)-(decreasesexits)signal[net_action]net_actionifnet_action2:signal[holder_signal]积极elifnet_action-2:signal[holder_signal]消极else:signal[holder_signal]中性ifchipisnotNoneandlen(chip)2:trend集中ifchip.iloc[-1][top10_ratio]chip.iloc[-2][top10_ratio]else分散signal[chip_trend]trendreturnsignal实际运行下来这个系统每天可以处理几百只股票的股东数据。系统输出的信号帮助我避开了几只大股东大幅减持的股票也捕捉到了几只机构密集增持的机会。在使用过程中有几点经验。第一机构增持的信号比减持更有参考价值因为机构增持通常需要深入研究而减持可能只是出于资金需求。第二筹码集中是一个缓慢的过程通常需要2-3个季度才能确认趋势。第三股东数据是季度披露的有一定滞后性需要结合其他指标如资金流向来验证。做投资分析股东数据是一个非常重要但经常被忽略的维度。用数据来追踪大股东和机构的行为比看消息面更靠谱。我用的数据来自本地数据引擎十大股东、十大流通股东、持股变动等数据都有完整的接口。感兴趣的朋友可以参考这个思路构建自己的股东监控体系。接口说明time/f10/sdgd/{股票代码} - 十大股东数据本地路径数据存放目录/time/f10/sdgd/{dm}主要字段公告日期(jyrq)、股东名称(gdMc)、持股数(cgs)、占总股本比例(zltb)、股东排名(gdSort)、股东类型(gdType)、增减类型(zjType)time/f10/sdltgd/{股票代码} - 十大流通股东数据本地路径数据存放目录/time/f10/sdltgd/{dm}主要字段公告日期(jyrq)、股东名称(gdMc)、持股数(cgs)、占流通股比例(zltb)、股东排名(gdSort)、股东类型(gdType)、增减类型(zjType)base/gplist - 股票列表本地路径数据存放目录/base/gplist用于获取全市场股票代码列表time/f10/fi/{股票代码} - 财务指标本地路径数据存放目录/time/f10/fi/{dm}用于结合基本面分析股东行为资料参考ig50