大宗交易数据追踪系统用Python挖掘折溢价信号与机构意图大宗交易是A股市场大额股权转让的专用通道每笔交易都透露着大资金的真实意图。但大部分散户对大宗交易的理解停留在大股东在卖的层面忽略了其中丰富的信号。去年我搭建了一个大宗交易数据追踪系统用Python从大单成交数据中挖掘折溢价信号和机构意图。这篇文章分享系统的核心设计和实现。本地数据引擎提供了大单成交数据路径是time/real/trace/bigdeal/{dm}包含了每笔大单的成交时间、价格、数量和方向。实时行情数据在time/real/{dm}可以获取当日收盘价用于计算折溢价率。历史K线数据在time/history/trade/{dm}/day用于分析大宗交易后的股价走势。importjsonimportosimportpandasaspdimportnumpyasnpfromdatetimeimportdatetime,timedelta data_dirD:/ig50_datadefread_bigdeal(dm):file_pathos.path.join(data_dir,time,real,trace,bigdeal,dm)withopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[dm,mc,cjsj,cjjg,cjl,jyzd]df[cjsj]pd.to_datetime(df[cjsj])df[cje]df[cjjg]*df[cjl]returndfdefread_realtime(dm):file_pathos.path.join(data_dir,time,real,dm)withopen(file_path,r,encodingutf-8)asf:returnjson.load(f)defread_daily_kline(dm):file_pathos.path.join(data_dir,time,history,trade,dm,day)withopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[dm,cjsj,cjjg,cjl,cje,zf]df[cjsj]pd.to_datetime(df[cjsj])returndf字段方面dm是股票代码mc是股票名称cjsj是成交时间cjjg是成交价格cjl是成交量jyzd是交易方向0中性/1买入/2卖出cje是成交额。系统的第一个分析模块是折溢价率计算。大宗交易的成交价通常偏离当日收盘价折价说明买方要求补偿溢价说明买方急于建仓。defcalc_premium_discount(dm):df_bigdealread_bigdeal(dm)iflen(df_bigdeal)0:returnNonerealtimeread_realtime(dm)close_pricerealtime.get(cjjg,0)ifclose_price0:returnNoneresults[]for_,rowindf_bigdeal.iterrows():deal_pricerow[cjjg]discount(deal_price-close_price)/close_price*100results.append({cjsj:row[cjsj],deal_price:deal_price,close_price:close_price,discount_pct:discount,amount:row[cje],direction:row[jyzd],type:溢价ifdiscount0else折价ifdiscount-0.5else平价})returnpd.DataFrame(results)defclassify_bigdeal(dm):dfcalc_premium_discount(dm)ifdfisNoneorlen(df)0:returnNonetotal_amountdf[amount].sum()avg_discountdf[discount_pct].mean()has_premium(df[discount_pct]0).any()has_large_discount(df[discount_pct]-10).any()ifhas_premium:signal强烈看多score80elifavg_discount-2:signal中性偏多score55elifhas_large_discount:signal看空score25else:signal中性score50return{total_amount:total_amount,avg_discount:avg_discount,signal:signal,score:score,deal_count:len(df)}第二个分析模块是大宗交易频率追踪。如果一只股票在短时间内出现多笔大宗交易说明大额筹码在转移。defanalyze_bigdeal_frequency(dm,lookback_days30):df_bigdealread_bigdeal(dm)iflen(df_bigdeal)0:returnNonecutoffdatetime.now()-timedelta(dayslookback_days)recentdf_bigdeal[df_bigdeal[cjsj]cutoff]iflen(recent)0:returnNonedaily_dealsrecent.groupby(recent[cjsj].dt.date).agg({cje:sum,cjsj:count}).rename(columns{cjsj:deal_count})consecutive_days0max_consecutive0datessorted(daily_deals.index)foriinrange(len(dates)-1):if(dates[i1]-dates[i]).days3:consecutive_days1max_consecutivemax(max_consecutive,consecutive_days)else:consecutive_days0return{total_deals:len(recent),total_amount:recent[cje].sum(),avg_daily_deals:len(recent)/lookback_days,max_consecutive_days:max_consecutive,frequency_signal:高频iflen(recent)5else正常}第三个分析模块是大宗交易后走势分析。统计大宗交易发生后股价的表现验证信号的有效性。defanalyze_post_bigdeal_performance(dm,lookback_days60):df_bigdealread_bigdeal(dm)df_klineread_daily_kline(dm)iflen(df_bigdeal)0orlen(df_kline)0:returnNonecutoffdatetime.now()-timedelta(dayslookback_days)recent_dealsdf_bigdeal[df_bigdeal[cjsj]cutoff]results[]for_,dealinrecent_deals.iterrows():deal_datedeal[cjsj]deal_pricedeal[cjjg]post_klinedf_kline[df_kline[cjsj]deal_date].head(5)iflen(post_kline)5:continueprice_5dpost_kline[cjjg].iloc[-1]return_5d(price_5d-deal_price)/deal_price*100max_pricepost_kline[cjjg].max()min_pricepost_kline[cjjg].min()results.append({deal_date:deal_date,deal_price:deal_price,price_5d:price_5d,return_5d:return_5d,max_return:(max_price-deal_price)/deal_price*100,min_return:(min_price-deal_price)/deal_price*100})ifnotresults:returnNonedf_resultpd.DataFrame(results)return{avg_return_5d:df_result[return_5d].mean(),win_rate:(df_result[return_5d]0).mean()*100,avg_max_return:df_result[max_return].mean(),avg_min_return:df_result[min_return].mean()}第四个分析模块是大单方向汇总。通过jyzd字段判断大单是买入还是卖出计算净买入金额。defsummarize_bigdeal_direction(dm):dfread_bigdeal(dm)iflen(df)0:returnNonebuy_amountdf[df[jyzd]1][cje].sum()sell_amountdf[df[jyzd]2][cje].sum()neutral_amountdf[df[jyzd]0][cje].sum()net_flowbuy_amount-sell_amount total_amountbuy_amountsell_amountneutral_amountreturn{buy_amount:buy_amount,sell_amount:sell_amount,net_flow:net_flow,buy_ratio:buy_amount/total_amountiftotal_amount0else0,sell_ratio:sell_amount/total_amountiftotal_amount0else0,direction:净买入ifnet_flow0else净卖出}把这些模块整合起来形成完整的大宗交易分析报告。defgenerate_bigdeal_report(dm):classificationclassify_bigdeal(dm)frequencyanalyze_bigdeal_frequency(dm)performanceanalyze_post_bigdeal_performance(dm)directionsummarize_bigdeal_direction(dm)reportf大宗交易分析报告 -{dm}\nifclassification:reportf折溢价信号:{classification[signal]}(评分:{classification[score]})\nreportf平均折溢价:{classification[avg_discount]:.2f}%\nreportf交易笔数:{classification[deal_count]}\niffrequency:reportf30日内交易频率:{frequency[total_deals]}笔\nreportf频率信号:{frequency[frequency_signal]}\nifdirection:reportf大单方向:{direction[direction]}\nreportf净流入金额:{direction[net_flow]/10000:.1f}万\nifperformance:reportf大宗后5日平均收益:{performance[avg_return_5d]:.2f}%\nreportf大宗后5日胜率:{performance[win_rate]:.1f}%\nreturnreport实际运行下来这个系统帮我筛选出了几只溢价成交的股票后续表现确实不错。溢价成交是最强的看多信号——买方愿意以高于市价的价格买入大额筹码说明他们非常看好。在使用过程中有几点经验。第一大宗交易的折价是正常的因为买方要承担锁定期风险折价5%以内不用太担心。第二溢价成交是稀有信号全市场一年也出现不了几次一旦出现要重点关注。第三连续多笔大宗交易是负面信号说明有人在持续出货。大宗交易数据是大资金意图的直接体现。用数据来追踪这些信号比看消息面靠谱多了。我用的数据来自本地数据引擎大单成交数据接口完整做大宗交易分析很方便。感兴趣的朋友可以参考这个思路来构建自己的追踪系统。接口说明time/real/trace/bigdeal/{股票代码} - 大单成交数据本地路径数据存放目录/time/real/trace/bigdeal/{dm}主要字段成交时间(cjsj)、成交价格(cjjg)、成交量(cjl)、交易方向(jyzd)0中性/1买入/2卖出time/real/{股票代码} - 实时行情本地路径数据存放目录/time/real/{dm}主要字段成交价格(cjjg)、成交量(cjl)time/history/trade/{股票代码}/day - 日线历史K线本地路径数据存放目录/time/history/trade/{dm}/day主要字段成交时间(cjsj)、成交价格(cjjg)、成交量(cjl)、涨跌幅(zf)base/gplist - 股票列表本地路径数据存放目录/base/gplist用于获取全市场股票代码列表资料参考ig50