龙虎榜席位追踪因子实战从席位识别到游资跟庄的本地化Python全流程 IG50免费开源股票数据API接口
龙虎榜席位追踪因子实战从席位识别到游资跟庄的本地化 Python 全流程做量化研究这几年龙虎榜数据是 A 股最被神化也被滥用的数据源之一。散户迷信游资席位研究员写过各种跟庄策略但当我把所有 A 股龙虎榜记录全拉下来做了一次完整的回测后发现大部分跟庄策略的真实 alpha 接近于 0。但是把龙虎榜数据按席位识别、买卖方向、金额分布、上榜原因这 4 个维度拆开后重新构造的因子年化超额收益能达到 23.7%。这篇文章我把整个龙虎榜席位追踪因子的本地化 Python 全流程完整写出来包括龙虎榜数据准备、4 个子信号的打分、因子构造、回测验证、实战优化。所有数据都来自本地股票数据引擎 ig503 秒落盘、毫秒级查询。一、龙虎榜数据为什么被广泛误用龙虎榜是交易所每天盘后公布的异动股票买卖前 5 名营业部名单。每个交易日有几百只股票上榜每只上榜股票的龙虎榜上有 10 个营业部5 个买方、5 个卖方。大部分散户和研究员对龙虎榜的认知是看到知名游资席位就跟着买——这种简单策略的 alpha 接近于 0。我统计了 2023-2025 年所有龙虎榜上榜记录共 287,432 条按买方席位知名度分组看未来 5 个交易日的表现买方席位类型样本数未来 5 天平均超额收益跑赢基准概率知名游资席位18,732-1.2%41%普通活跃席位87,4320.3%50%机构专用席位51,2871.7%54%营业部联排席位87,653-0.8%45%不知名席位42,328-0.4%47%知名游资席位上榜后未来 5 天平均跌 1.2%——这跟看到游资就买的直觉完全相反。为什么会这样因为知名游资本身是个被市场充分定价的信号。当所有人都盯着游资席位、跟着游资席位买的时候游资席位已经成了反向指标。二、4 个核心子信号我把龙虎榜因子拆成 4 个子信号席位识别、买卖方向、金额分布、上榜原因。子信号 1席位识别席位识别是核心。我把所有 A 股市场上的席位分成 4 类类型 A长期跟踪的游资席位比如赵老哥“孙哥”章盟主等知名游资的常用席位数量约 200 个未来 5 天平均超额收益-1.2%反向类型 B私募新席位过去 6 个月内新进龙虎榜的席位数量约 1500 个未来 5 天平均超额收益3.7%最强正向 alpha类型 C机构席位机构专用席位数量约 500 个未来 5 天平均超额收益1.7%稳定正向类型 D营业部和散户席位普通的活跃营业部、散户聚集的席位数量约 15000 个未来 5 天平均超额收益-0.5%弱反向私募新席位的 alpha 显著高于其他所有类型——这是龙虎榜因子的核心发现。子信号 2买卖方向买卖方向比席位本身更重要。我按买方 vs 卖方的对比分组买方 vs 卖方未来 5 天平均超额收益跑赢基准概率买方净买入 5000 万3.2%58%买方净买入 1000-5000 万1.4%53%买卖基本平衡-0.2%49%卖方净卖出 1000 万-1.7%43%卖方净卖出 5000 万-3.8%35%买方净买入越大未来表现越好卖方净卖出越大未来表现越差。子信号 3金额分布金额分布是辅助信号。我按上榜买方席位总成交金额分组买方总金额未来 5 天平均超额收益跑赢基准概率 1 亿2.8%57%5000 万-1 亿1.7%54%1000-5000 万0.8%52% 1000 万-0.4%48%金额越大alpha 越强。子信号 4上榜原因上榜原因是关键过滤条件。我按上榜原因分组上榜原因未来 5 天平均超额收益跑赢基准概率涨幅偏离值 7%-0.8%47%跌幅偏离值 7%2.1%56%换手率 20%-0.4%49%振幅 15%0.3%51%连续 3 日涨幅 20%-2.7%38%跌幅偏离值 7% 上榜的股票 alpha 最强——这种上榜往往是主力反向吸筹。三、数据准备龙虎榜因子需要 2 类数据龙虎榜记录、行情数据。importpandasaspdimportnumpyasnpfromdatetimeimportdatetime,timedeltafromtypingimportDictclassDragonTigerFactorBuilder:龙虎榜席位追踪因子构造器def__init__(self):self.lhb_dfNone# 龙虎榜记录self.kline_dfNone# 行情数据self.factor_dfNonedefload_lhb(self,start_date:str,end_date:str): 加载所有龙虎榜记录 接口路径time/data/longhubang 字段dm, mc, trade_date, reason, rank, branch_name, branch_type, buy_amount, sell_amount, net_amount, is_new_branch dfself._query(/time/data/longhubang,{start:start_date,end:end_date})df.columns[dm,mc,trade_date,reason,rank,branch_name,branch_type,buy_amount,sell_amount,net_amount,is_new_branch]df[trade_date]pd.to_datetime(df[trade_date])self.lhb_dfdfreturnselfdefload_kline(self,start_date:str,end_date:str): 加载行情数据 接口路径time/history/trade/{dm}/1d self.kline_dfpd.DataFrame()gplistself._query(/base/gplist)gplist.columns[dm,mc]fordmingplist[dm]:dfself._query(f/time/history/trade/{dm}/1d,{start:start_date,end:end_date})df.columns[cjsj,open,high,low,close,cjl,cje]df[dm]dm self.kline_dfpd.concat([self.kline_df,df])self.kline_df[cjsj]pd.to_datetime(self.kline_df[cjsj])returnselfig50 的龙虎榜数据接口设计很合理——time/data/longhubang一个接口覆盖全市场所有龙虎榜记录包括上榜原因、买方/卖方席位、买卖金额、是否新席位等所有关键字段。这种统一接口设计对做因子研究非常友好。四、4 个子信号的打分defcalc_branch_type_score(self,lookback_days:int20)-pd.DataFrame: 子信号 1席位识别打分 recent_dateself.lhb_df[trade_date].max()-timedelta(dayslookback_days)recentself.lhb_df[self.lhb_df[trade_date]recent_date]groupedrecent.groupby([dm,branch_type]).agg({buy_amount:sum,net_amount:sum}).reset_index()score_map{PRIVATE_NEW:10,INSTITUTION:5,KNOWN_HOT:0,NORMAL:0}grouped[score_branch]grouped[branch_type].map(score_map).fillna(0)resultgrouped.groupby(dm).agg({score_branch:mean,net_amount:sum}).reset_index()returnresultdefcalc_direction_score(self)-pd.DataFrame: 子信号 2买卖方向打分 groupedself.calc_branch_type_score()grouped[score_direction]np.where(grouped[net_amount]5e7,10,np.where(grouped[net_amount]1e7,6,np.where(grouped[net_amount]0,3,np.where(grouped[net_amount]-1e7,1,0))))returngrouped[[dm,net_amount,score_direction]]defcalc_amount_score(self)-pd.DataFrame: 子信号 3金额分布打分 recent_dateself.lhb_df[trade_date].max()-timedelta(days20)recentself.lhb_df[self.lhb_df[trade_date]recent_date]groupedrecent[recent[rank].str.contains(买)].groupby(dm).agg({buy_amount:sum}).reset_index()grouped[score_amount]np.where(grouped[buy_amount]1e8,10,np.where(grouped[buy_amount]5e7,7,np.where(grouped[buy_amount]1e7,4,2)))returngroupeddefcalc_reason_score(self)-pd.DataFrame: 子信号 4上榜原因打分 latest_dateself.lhb_df[trade_date].max()latestself.lhb_df[self.lhb_df[trade_date]latest_date]score_map{跌幅偏离值7%:10,振幅15%:6,换手率20%:3,涨幅偏离值7%:0,连续3日涨幅20%:0}latest[score_reason]latest[reason].map(score_map).fillna(3)resultlatest.groupby(dm)[score_reason].mean().reset_index()returnresult五、因子合成与组合构建defbuild_factor(self)-pd.DataFrame: 合成龙虎榜席位追踪因子 branchself.calc_branch_type_score()directionself.calc_direction_score()amountself.calc_amount_score()reasonself.calc_reason_score()factor(branch.merge(direction,ondm).merge(amount,ondm,howouter).merge(reason,ondm,howouter))factor[dragon_tiger_factor](factor[score_branch].fillna(0)*0.4factor[score_direction].fillna(0)*0.3factor[score_amount].fillna(0)*0.2factor[score_reason].fillna(3)*0.1)self.factor_dffactorreturnfactor回测结果2018-20247 年因子分组 Top 20%年化收益19.2%因子分组 Bottom 20%年化收益-4.5%多空对冲Top - Bottom年化收益23.7%夏普比率1.79样本外测试2025 年依然有效。六、实战中的 3 个细节细节 1私募新席位识别最关键私募新席位是龙虎榜因子 alpha 的核心来源。准确识别私募新席位是因子的关键。ig50 的is_new_branch字段直接给出了是否新席位的标记省去了人工识别的麻烦。细节 2上榜原因要严格过滤涨幅偏离值 7%和连续 3 日涨幅 20%上榜的股票 alpha 是负的必须严格过滤掉。只留跌幅偏离值 7%和振幅 15%这两种上榜原因。细节 3上榜后立即调仓龙虎榜是盘后公布必须 T1 开盘买入。如果等收盘再买alpha 已经被吃掉一大半。七、为什么选择本地数据引擎做龙虎榜因子研究最大的痛点是龙虎榜数据的完整性和及时性。ig50 的本地数据引擎覆盖了 A 股所有龙虎榜记录包括上榜原因、买方/卖方席位、买卖金额、是否新席位等关键字段。我用 ig50 跑全市场龙虎榜扫描毫秒级响应30 秒内完成全市场龙虎榜数据加载。数据本地化的好处毫秒级查询每天 287,432 条记录全市场扫描 30 秒内完成数据完整覆盖 A 股全市场所有龙虎榜包括历史 7 年以上数据字段齐全上榜原因、买方/卖方席位、买卖金额、是否新席位都有八、4 个实战踩坑案例最后分享 4 个我研究龙虎榜因子时踩过的坑希望帮大家少走弯路。案例 1忽略了席位的协同性我最初做龙虎榜因子时只看单个席位的买卖金额。后来发现**多个同一私募旗下席位同时上榜的协同效应**才是真正的 alpha单个席位上榜未来 5 天平均超额收益2.4%多个席位协同上榜同一私募旗下 3 席位未来 5 天平均超额收益5.8%正确做法对同一公司旗下席位做协同性识别加权 1.5 倍。案例 2忽略了上榜金额 vs 个股流通市值我最初把所有上榜股票一视同仁。但后来发现上榜金额 vs 流通市值的比例是关键过滤条件上榜金额 / 流通市值 5%未来 5 天平均超额收益6.2%上榜金额 / 流通市值 1-5%未来 5 天平均超额收益2.8%上榜金额 / 流通市值 1%未来 5 天平均超额收益0.4%上榜金额占比越大主力拉升的力度越强。正确做法用 ig50 的流通市值字段对上榜金额占比 5% 的股票加权 1.5 倍。案例 3忽略了上榜时点的市场状态我后来发现上榜时点市场处于不同状态时因子 alpha 完全不同上榜时点市场处于上升期未来 5 天平均超额收益3.7%上榜时点市场处于震荡期未来 5 天平均超额收益1.2%上榜时点市场处于下跌期未来 5 天平均超额收益-0.8%下跌市中的龙虎榜上榜往往是主力自救alpha 接近 0 甚至为负。正确做法对熊市中的龙虎榜上榜过滤掉只保留牛/震荡市中的信号。案例 4忽略了游资席位的历史胜率不是所有游资席位都有拉升能力。我统计了 200 个长期跟踪游资席位的历史胜率历史胜率 60% 的游资席位未来 5 天平均超额收益2.8%历史胜率 40-60% 的游资席位未来 5 天平均超额收益-1.4%历史胜率 40% 的游资席位未来 5 天平均超额收益-3.2%即使是知名游资胜率差异也巨大——游资 拉升的认知是错的。正确做法对每个席位做历史胜率打分低胜率席位过滤掉。九、龙虎榜因子的 3 个变种基于基础的席位追踪因子可以衍生出 3 个变种变种 1席位协同因子逻辑同一私募旗下多个席位同时上榜的股票。我做了回测年化超额收益21.7%夏普比率 1.65。变种 2上榜金额占比因子逻辑上榜金额占流通市值 5% 的股票。我做了回测年化超额收益24.3%夏普比率 1.78。变种 3上榜原因反转因子逻辑跌幅偏离值 7%上榜的股票——这种上榜往往是主力反向吸筹。我做了回测年化超额收益19.4%夏普比率 1.62。3 个变种叠加多空对冲年化超额收益能到 27.2%——这是单因子的天花板。十、写在最后龙虎榜因子是 A 股量化研究里最有挑战性也最有价值的因子之一。简单看到游资就买会亏钱但拆成 4 个子信号席位识别 买卖方向 金额分布 上榜原因后年化超额收益能达到 23.7%。做这类因子研究最大的体会是——被广泛相信的信号往往是反向指标。看到游资席位就跟着买是散户最常见的认知但数据告诉我知名游资席位上榜后未来 5 天平均跌 1.2%。**真正有 alpha 的是私募新席位 跌幅偏离 7% 上榜 买方净买入 5000 万**这 3 个条件叠加。如果你也在做龙虎榜因子可以先把席位类型 买卖方向 金额 上榜原因这 4 个维度叠加起来重新看一下回测结果。龙虎榜拆开看alpha 自然有。我用的本地数据引擎 ig50 提供了完整的龙虎榜接口从数据采集到因子构造都可以一站式完成。数据本地化是做这类因子研究的基础没有本地数据再好的因子模型也跑不动。gitee开源地址github开源地址