龙虎榜数据深度挖掘用Python追踪机构席位与营业部交易行为 IG50免费开源股票数据API接口
龙虎榜数据深度挖掘用Python追踪机构席位与营业部交易行为大概是在2021年的时候我开始关注龙虎榜数据。那时候市场上有个说法叫龙虎榜选股胜率翻倍虽然有点夸张但龙虎榜确实能反映出市场上最活跃资金的动向。后来我花了几个月时间把龙虎榜数据系统地研究了一遍还写了一套分析工具。这篇文章就来聊聊我是怎么用Python分析龙虎榜数据追踪机构席位和营业部交易行为的。先说一下龙虎榜数据有什么用。简单来说龙虎榜是交易所每天公布的异动股票名单包括当日涨跌幅偏离值达到7%的、换手率达到20%的、连续三个交易日涨幅偏离值累计达到20%的等等。每只上榜股票都会公布买入金额前五和卖出金额前五的营业部席位。通过分析这些席位的买卖行为我们可以大致判断出市场上的主力资金在关注哪些股票哪些营业部是涨停板敢死队哪些机构席位在默默布局。我主要用到四块数据第一块是每日龙虎榜详情也就是每天有哪些股票上榜对应的买卖席位第二块是机构席位追踪统计近几日机构席位在哪些股票上有交易第三块是营业部上榜统计看看哪些营业部最活跃第四块是机构席位成交明细近五个交易日机构席位的具体买卖情况。先从数据读取开始。龙虎榜数据都在all目录下每日详情是all/ld机构席位追踪是all/jgzz/{n}营业部统计是all/yyb/{n}机构成交明细是all/jgcj。这里的n表示近n日可以取5、10、30、60。importjsonimportosimportpandasaspdimportnumpyasnpfromcollectionsimportdefaultdictimportdatetime data_dirD:/stock_datadefread_ld(date_strNone):file_pathos.path.join(data_dir,all,ld)ifnotos.path.exists(file_path):returnNonewithopen(file_path,r,encodingutf-8)asf:datajson.load(f)returndatadefread_jgzz(n30):file_pathos.path.join(data_dir,all,jgzz,str(n))ifnotos.path.exists(file_path):returnNonewithopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[dm,mc,ljmre,mrCs,ljmce,mcCs,je]returndfdefread_yyb(n30):file_pathos.path.join(data_dir,all,yyb,str(n))ifnotos.path.exists(file_path):returnNonewithopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[yybMc,sbCs,ljmre,mrXw,ljmce,mcXw,mrQsgp]returndfdefread_jgcj():file_pathos.path.join(data_dir,all,jgcj)ifnotos.path.exists(file_path):returnNonewithopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[dm,mc,jyrq,jgMre,jgMce,lx]returndf字段名我还是用了简写dm是股票代码mc是名称ljmre是累积买入额mrCs是买入次数ljmce是累积卖出额mcCs是卖出次数je是净额。yyb相关的字段yybMc是营业部名称sbCs是上榜次数mrXw是买入席位mcXw是卖出席位mrQsgp是买入前三股票。jg相关的jyrq是交易日期jgMre是机构席位买入额jgMce是机构席位卖出额lx是上榜类型。数据读进来之后我会先做一个整体的概览分析。比如看看最近一个月机构席位主要在买哪些股票哪些营业部最活跃机构席位的净买入额排名等等。这些统计可以帮我们快速把握市场主力资金的动向。defanalyze_jgzz(df_jgzz,top_n20):ifdf_jgzzisNoneorlen(df_jgzz)0:returnNonedf_sorteddf_jgzz.sort_values(je,ascendingFalse)top_buydf_sorted.head(top_n)[[dm,mc,ljmre,ljmce,je,mrCs,mcCs]]top_selldf_sorted.tail(top_n)[[dm,mc,ljmre,ljmce,je,mrCs,mcCs]]print(机构席位净买入TOP{}.format(top_n))print(top_buy.to_string(indexFalse))print(\n机构席位净卖出TOP{}.format(top_n))print(top_sell.to_string(indexFalse))returntop_buy,top_sell机构席位追踪数据能告诉我们近一段时间机构在买什么卖什么但光看这个还不够。因为机构席位的交易有时候是建仓有时候是出货单凭一个净额很难判断。所以我会结合机构席位成交明细来看也就是近五个交易日每天的买卖情况。如果机构连续几天都在净买入某只股票那信号就比较强了。defanalyze_jgcj(df_jgcj,dm):ifdf_jgcjisNoneorlen(df_jgcj)0:returnNonedf_stockdf_jgcj[df_jgcj[dm]dm].copy()iflen(df_stock)0:returnNonedf_stock[je]df_stock[jgMre]-df_stock[jgMce]df_stockdf_stock.sort_values(jyrq)print(股票{}({})近期机构席位成交明细.format(df_stock[mc].iloc[0],dm))print(df_stock[[jyrq,jgMre,jgMce,je,lx]].to_string(indexFalse))total_mredf_stock[jgMre].sum()total_mcedf_stock[jgMce].sum()total_jetotal_mre-total_mceprint(\n近5日机构买入合计{}万卖出合计{}万净额{}万.format(total_mre,total_mce,total_je))returndf_stock接下来是营业部分析。龙虎榜上的营业部大致可以分几类一类是机构专用席位这类是基金、保险、社保这些机构在交易一类是知名游资席位比如东方财富证券拉萨团结路、中信证券上海溧阳路这些它们的特点是操作频繁、擅长打板还有一类是普通营业部偶尔上榜。我会先统计近一个月上榜次数最多的营业部看看哪些最活跃。然后看这些营业部的买入额和卖出额如果一个营业部的上榜次数多、净买入额也大说明它比较乐观。反过来如果上榜次数多但净卖出额大可能就偏谨慎了。defanalyze_yyb(df_yyb,top_n30):ifdf_yybisNoneorlen(df_yyb)0:returnNonedf_yyb[je]df_yyb[ljmre]-df_yyb[ljmce]df_sorteddf_yyb.sort_values(sbCs,ascendingFalse)print(营业部上榜次数TOP{}.format(top_n))print(df_sorted.head(top_n)[[yybMc,sbCs,ljmre,ljmce,je]].to_string(indexFalse))df_je_sorteddf_yyb.sort_values(je,ascendingFalse)print(\n营业部净买入额TOP{}.format(top_n))print(df_je_sorted.head(top_n)[[yybMc,sbCs,ljmre,ljmce,je]].to_string(indexFalse))returndf_sorted在营业部分析中我发现一个很有意思的现象有些营业部的操作风格非常鲜明。比如东方财富证券拉萨团结路几乎天天上榜买卖的都是市场上最热门的题材股而且换手率极高典型的短线游资风格。而有些机构专用席位上榜次数不多但每次买卖的金额都很大而且持有周期相对较长。为了量化营业部的风格我写了一个简单的分类函数根据营业部的上榜次数、平均买卖金额、买卖的股票类型等特征把营业部分成机构型、游资型、散户型三类。当然这个分类比较粗糙只是一个大致的判断。defclassify_yyb_style(row):sbCsrow[sbCs]avg_mrerow[ljmre]/sbCsifsbCs0else0if机构专用inrow[yybMc]:return机构型elifsbCs20andavg_mre2000:return游资型else:return普通型有了营业部风格分类之后就可以做更有针对性的分析了。比如我会专门跟踪机构型席位的动向因为机构的研究能力相对更强它们重仓买入的股票往往有基本面支撑。而游资型席位的动向可以帮助我们判断市场的热点在哪里哪些题材正在被炒作。每日龙虎榜详情的分析是另一个重点。每天的龙虎榜数据包含了多种异动类型比如涨跌幅偏离值、换手率、振幅等等。我会把每天上榜的股票按类型分类然后看每类的上榜股票有什么共同特点。defanalyze_ld_detail(ld_data):ifld_dataisNoneorlen(ld_data)0:returnNonetoday_datald_data[0]ifisinstance(ld_data,list)elseld_data date_strtoday_data.get(日期,)types{zpl7:涨幅偏离值达7%,dpl7:跌幅偏离值达7%,h20:换手率达20%,z20:连续三日涨幅偏离值累计达20%,zf15:振幅值达15%,df15:连续三日跌幅偏离值累计达20%}all_stocks[]forkey,nameintypes.items():stockstoday_data.get(key,[])forstkinstocks:stk_info{dm:stk.get(股票代码,),mc:stk.get(股票名称,),spj:stk.get(收盘价(元),0),dyz:stk.get(对应值(%),0),cjl:stk.get(成交量(万股),0),cje:stk.get(成交额(万元),0),lx:name}all_stocks.append(stk_info)dfpd.DataFrame(all_stocks)print(日期{}今日上榜股票共{}只.format(date_str,len(df)))print(\n上榜类型分布)print(df[lx].value_counts())returndf把这些分析串起来我每天盘后会做这样一个流程先看今日龙虎榜详情了解哪些股票异动、是什么类型的异动然后看机构席位成交明细看看机构在这些异动股票上的买卖情况接着看机构席位追踪和营业部统计掌握一段时间内的资金流向趋势最后把这些信息综合起来筛选出值得重点关注的股票。我还写了一个简单的选股策略基于龙虎榜数据。策略逻辑是这样的首先从近一个月的机构席位追踪数据中选出机构净买入额排名前50的股票然后从这些股票中剔除ST股和近一个月涨幅超过50%的避免追高接着结合营业部数据如果有知名游资席位也在买入的话加分最后选出综合得分最高的10只股票作为观察池。deflhb_select_strategy(df_jgzz,df_yyb,df_gp,top_n10):df_jgdf_jgzz.copy()df_mergeddf_jg.merge(df_gp[[dm,mc,isSt]],on[dm,mc],howleft)df_mergeddf_merged[df_merged[isSt]0]df_mergeddf_merged.sort_values(je,ascendingFalse)candidatesdf_merged.head(50).copy()yyb_hot_stocksset()for_,rowindf_yyb.head(20).iterrows():ifpd.notna(row[mrQsgp]):forstkinrow[mrQsgp].split(,):yyb_hot_stocks.add(stk)candidates[yyb_hot]candidates[mc].apply(lambdax:1ifxinyyb_hot_stockselse0)candidates[score]candidates[je].rank(pctTrue)*0.7candidates[yyb_hot]*0.3selectedcandidates.sort_values(score,ascendingFalse).head(top_n)print(龙虎榜策略选股结果TOP{}.format(top_n))print(selected[[dm,mc,je,yyb_hot,score]].to_string(indexFalse))returnselected当然这个策略只是一个基础版本实际用的时候还要结合其他因素。比如我会再看一下选出的股票的基本面情况如果基本面太差即使龙虎榜数据好看也不会买。还有就是技术面看看股价是不是在上升趋势中成交量有没有配合放大。实际使用下来龙虎榜数据分析有几个地方特别值得注意。第一机构席位的数据比营业部数据更有参考价值因为机构的决策更理性研究也更深入。第二不要只看单日的龙虎榜要结合一段时间的趋势来看连续多日的机构净买入信号更强。第三龙虎榜是滞后数据等你看到的时候股价可能已经涨了一截所以不能盲目追涨要结合估值和基本面来判断。还有一个坑我踩过就是有些营业部是一日游风格今天买明天卖如果你跟着买很容易被套。所以我后来加了一个过滤条件就是看营业部的平均持有周期如果持有周期太短即使它在买入我也不会轻易跟进。总的来说龙虎榜数据分析是一个非常实用的工具。它不能保证你每次都赚钱但可以帮你更清晰地理解市场资金的动向让你的投资决策多一个维度的参考。如果你也对龙虎榜感兴趣建议先从跟踪机构席位开始相对来说确定性更高一些。我用的数据来源是ig50的本地数据接口数据更新及时字段也很完整做二次开发很方便。感兴趣的朋友可以自行了解。接口说明all/ld - 每日龙虎榜详情本地路径数据存放目录/all/ld主要字段日期、涨幅偏离值达7%的证券(zpl7)、跌幅偏离值达7%的证券(dpl7)、换手率达20%的证券(h20)、连续三日涨幅偏离值累计达20%的证券(z20)、振幅值达15%的证券(zf15)等每只证券包含股票代码、股票名称、收盘价(元)、对应值(%)、成交量(万股)、成交额(万元)all/jgzz/{近n日} - 机构席位追踪本地路径数据存放目录/all/jgzz/{近n日}n可取5、10、30、60主要字段股票代码(dm)、股票名称(mc)、累积买入额(万)(ljmre)、买入次数(mrCs)、累积卖出额(万)(ljmce)、卖出次数(mcCs)、净额(万)(je)all/yyb/{近n日} - 营业部上榜统计本地路径数据存放目录/all/yyb/{近n日}n可取5、10、30、60主要字段营业部名称(yybMc)、上榜次数(sbCs)、累积获取额(万)(ljmre)、买入席位(mrXw)、累积卖出额(万)(ljmce)、卖出席位(mcXw)、买入前三股票(mrQsgp)all/jgcj - 机构席位成交明细本地路径数据存放目录/all/jgcj主要字段股票代码(dm)、股票名称(mc)、交易日期(jyrq)、机构席位买入额(万)(jgMre)、机构席位卖出额(万)(jgMce)、类型(lx)gitee开源地址github开源地址