大宗交易策略系统实战:用Python构建折溢价信号与机构意图识别 大宗交易策略系统实战用Python构建折溢价信号与机构意图识别大宗交易是A股一个特殊的数据普通散户接触不多但对专业投资者来说价值极高。我之前做过一个大宗交易统计把过去3年所有大宗交易数据拉下来分析发现了几个反常识的规律。这篇文章把整套系统的实现分享出来。大宗交易数据主要分三块。第一块是大宗交易统计概览路径all/dzjyTj包含每天全市场大宗交易的折溢价分布、买卖方席位分布、行业分布等。第二块是大宗交易个股明细路径time/dzjy/{股票代码}返回个股所有大宗交易记录。第三块是大宗交易营业部明细路径time/dzjyYsbb/{营业部代码}返回该营业部作为买方或卖方的所有交易。我把这三块数据全部沉到本地。先说大宗交易数据怎么读。我把字段都做了简写方便后续计算。importjsonimportosimportpandasaspdimportnumpyasnp data_dirD:/stock_datadefread_dzjy_total():file_pathos.path.join(data_dir,all,dzjyTj)ifnotos.path.exists(file_path):returnNonewithopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[rq,cjsl,cjje,zjcjsl,zjcjje,yjpfxs,ejpfxs,pjzf]returndfdefread_dzjy_detail(dm):file_pathos.path.join(data_dir,time,dzjy,dm)ifnotos.path.exists(file_path):returnNonewithopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[rq,dm,mc,spj,cjjg,cjsl,cjje,zjfy,bjmc,sjmc,bjxz,bjjb]returndf字段简写rq交易日期dm股票代码mc股票名称spj收盘价cjjg成交价格cjsl成交数量cjje成交金额zjfy折价幅度bjmc买方营业部sjmc卖方营业部bjxz买方席席性质bjjb买方级别。折价幅度单位是百分比负数表示折价正数表示溢价。买方级别jjb是核心字段可以区分是机构专用、营业部还是个人。第一步是统计全市场大宗交易概览。每天盘后我会跑一遍全市场数据看折溢价分布是否正常。defanalyze_dzjy_daily(date_str):dfread_dzjy_total()ifdfisNone:returnNonedf[rq]pd.to_datetime(df[rq],errorscoerce)targetdf[df[rq].dt.strftime(%Y-%m-%d)date_str]iflen(target)0:returnNonerowtarget.iloc[0]print(日期{}.format(date_str))print(成交笔数{}.format(row[cjsl]))print(成交金额{:.2f}亿.format(row[cjje]/1e8))print(折价成交占比{:.2f}%.format(row[yjpfxs]))print(溢价成交占比{:.2f}%.format(row[ejpfxs]))print(平均折溢价{:.2f}%.format(row[pjzf]))returnrow.to_dict()第二步是分析个股的大宗交易信号。什么样的个股大宗交易值得重点关注我把数据按折价幅度、买方席位性质分组统计次日股价表现发现了几个核心规律。defanalyze_stock_dzjy_signals(dm,days30):dfread_dzjy_detail(dm)ifdfisNoneorlen(df)0:returnNonedf[zjfy]pd.to_numeric(df[zjfy],errorscoerce)df[cjje]pd.to_numeric(df[cjje],errorscoerce)df[bjxz]df[bjxz].astype(str)df[rq]pd.to_datetime(df[rq],errorscoerce)recentdf.head(days)small_discountrecent[(recent[zjfy]0)(recent[zjfy]-5)]big_discountrecent[(recent[zjfy]-10)(recent[zjfy]-15)]premiumrecent[recent[zjfy]0]org_buyrecent[recent[bjxz].str.contains(机构)]print(股票{}近{}日大宗交易信号分析.format(dm,days))print(0-5%折价交易{}笔金额{:.2f}亿.format(len(small_discount),small_discount[cjje].sum()/1e8iflen(small_discount)0else0))print(10-15%折价交易{}笔金额{:.2f}亿.format(len(big_discount),big_discount[cjje].sum()/1e8iflen(big_discount)0else0))print(溢价交易{}笔金额{:.2f}亿.format(len(premium),premium[cjje].sum()/1e8iflen(premium)0else0))print(机构买入交易{}笔.format(len(org_buy)))signals[]iflen(small_discount)0andlen(org_buy)0:signals.append(小幅折价机构买入可能是协议转让或调仓看涨信号)iflen(big_discount)0:signals.append(大幅折价可能是战略入股或主力出货需结合席位判断)iflen(premium)0:signals.append(溢价交易警惕主力出货高位接盘风险)returnsignals第三步是识别机构席位动向。我把买方席位按性质分组统计机构席位的买卖情况。机构买入的标的质量明显更高。deftrack_org_seat_activity(dm):dfread_dzjy_detail(dm)ifdfisNoneorlen(df)0:returnNonedf[cjje]pd.to_numeric(df[cjje],errorscoerce)df[bjxz]df[bjxz].astype(str)org_buydf[df[bjxz].str.contains(机构)]org_selldf[df[sjmc].str.contains(机构)]org_buy_amountorg_buy[cjje].sum()/1e8org_sell_amount0print(股票{}机构席位大宗交易.format(dm))print(机构买入笔数{}金额{:.2f}亿.format(len(org_buy),org_buy_amount))netorg_buy_amount-org_sell_amountprint(机构净买入{:.2f}亿.format(net))return{org_buy_count:len(org_buy),org_buy_amount:org_buy_amount,net:net}第四步是构建连续大宗交易预警。连续多天大宗交易折价才是真正的危险信号单日大宗交易折价不能简单判断为利空。defcontinuous_dzjy_warning(dm,threshold_days3):dfread_dzjy_detail(dm)ifdfisNoneorlen(df)0:returnNonedf[zjfy]pd.to_numeric(df[zjfy],errorscoerce)df[cjje]pd.to_numeric(df[cjje],errorscoerce)df[rq]pd.to_datetime(df[rq],errorscoerce)dfdf.sort_values(rq,ascendingFalse).reset_index(dropTrue)recentdf.head(threshold_days)discount_countlen(recent[recent[zjfy]0])total_amountrecent[cjje].sum()/1e8warningNoneifdiscount_countthreshold_daysandtotal_amount0.5:warning连续{}天大宗交易折价累计金额{:.2f}亿建议警惕.format(threshold_days,total_amount)returnwarning这套大宗交易系统跑了一年我用它避开了很多主力出货的陷阱。以前看到大宗交易折价就跑结果经常卖在最低点。现在能分辨折价的性质反而能在主力悄悄建仓的时候跟着进场。接口说明大宗交易全市场统计all/dzjyTj个股大宗交易明细time/dzjy/{dm}营业部大宗交易明细time/dzjyYsbb/{营业部代码}资料参考ig50