北向资金:选股不行,择时很行
同一个数据源,拿去做横截面选股 IC 接近零,拿去做择时信号 Sharpe 0.83。这不是数据造假——是用法错了。"聪明钱"的聪明不在股票维度,在时间维度。
A 股投资者对北向资金有一种近乎宗教的信仰。每天收盘后,财经媒体头版永远是「北向净买入 XX 亿」或「北向逃离,聪明钱跑了」。仿佛这些钱比我们多一个大脑。
我不关心信仰,我关心可验证的事实。这一次我把这个问题拆成两个独立的假设分别检验:
假设 A: 北向资金持续加仓的个股,未来收益更好(选股因子)。
假设 B: 北向资金整体净流入的时段,市场未来表现更好(择时信号)。
答案是: A 几乎不成立,B 显著成立。原因藏在数据的维度里。
选股:IC 接近零,不是数据的问题
我用了 Tushare 的 hk_hold 表(北向持股明细),计算每只股票的「北向持股占比变化率」作为因子——外资加仓占比上升,因子值为正。然后按月调仓,在全 A、中证 1000、微盘池三个宇宙分别测算 IC 和分组收益。
| 宇宙 | IC | ICIR | 多空 Sharpe | 判决 |
|---|---|---|---|---|
| 全 A | -0.001 | -0.01 | -0.15 | ❌ 无效 |
| 中证 1000 | -0.004 | -0.07 | -1.02 | ❌ 反向 |
| 微盘 | -0.017 | -0.28 | -5.61 | ❌ 严重反向 |
不仅不显著,还在微盘池严重反向——外资加仓最多的微盘股反而最差。
这不是数据质量的问题。持股明细来自交易所官方披露,准确无误。问题出在逻辑:
第一,定价效率。 北向持股变化是全市场盯着看的信息。每天几百篇研报在拆北向持仓,基金经理把这当必修课。一个所有人都盯的信息,选股维度不会有 alpha——当你看到外资加仓的时候,股价已经反映了。
第二,覆盖偏差。 北向资金只买沪深港通标的(大盘+中盘),微盘池里绝大多数股票根本没有北向持股。那个 -5.61 的多空 Sharpe 本质上是「有北向覆盖 vs 无北向覆盖」的市值效应,不是真正的因子收益。
第三,统计量的欺骗性。 北向持股数据每周公布一次、再对齐到月度调仓频率,有效的截面数据点极少。中部三组的区分度接近零,收益全集中在极端组——这是噪音信号的特征,不是真因子的特征。
择时:同一个数据源,换一个维度就是另一个人
既然横截面不行,我换了一个问法:不问「外资买了什么」,问「外资整体在买还是在卖」。
用 Tushare 的 moneyflow_hsgt 日度数据(北向资金日净买入额),算 60 日滚动 Z-score。一个极其简单的规则:
Z = zscore(北向日净买入额, 60日)
Z > 0.5 → 仓位 100%(满仓)
Z < -0.5 → 仓位 0%(空仓)
|Z| ≤ 0.5 → 线性插值
标的:创业板指(399006.SZ),因为它对流动性冲击最敏感——北向资金的定价效应在成长股上最强。
回测期 2020-01 至 2026-06,1509 个交易日,结果:
| 策略 | 年化 | 波动 | 夏普 | 最大回撤 |
|---|---|---|---|---|
| 买入持有 | 11.4% | 29.8% | 0.54 | -58.9% |
| 北向择时 | 15.4% | 21.4% | 0.83 | -33.0% |
| 三门+北向复合 | 31.1% | 34.4% | 1.02 | -47.1% |
回测期 2020-01 至 2026-06,不含交易成本(仓位切换频率极低)。
夏普从 0.54 → 0.83,最大回撤从 -59% → -33%。不算惊艳,但方向极其稳定——训练期和留出期同号。
逐年拆解:2022 是关键
| 策略 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 |
|---|---|---|---|---|---|---|---|
| 买入持有 | +63.5% | +3.5% | -29.4% | -16.6% | +20.8% | +48.0% | +13.7% |
| 北向择时 | +38.4% | +12.0% | -19.0% | +2.6% | +34.2% | +47.0% | -1.3% |
| 三门+北向复合 | +72.0% | +22.7% | -18.4% | -6.8% | +75.8% | +77.5% | +10.0% |
2022 年是最有说服力的样本:创业板指跌了 -29.4%,北向择时只亏 -19.0%,少亏了三分之一。拆开看——2022 年 3-10 月北向持续大幅净流出,信号早早亮灯减仓,成功避开了最凶的一段下跌。
2020 年反过来:满仓吃到了暴涨(+63.5%),择时反而因为中途小幅流出错过了部分上行,只拿到 +38.4%。这正是择时的代价——它用上行期的部分利润换下行期的保护。如果你不能接受这个交换,就不应该用择时。
为什么择时有效而选股不行?
三个字:维度不同。
选股维度,你在比较「外资加仓 A vs 加仓 B」——这是一个横截面比较,市场在做同样的事,效率极高。择时维度,你在问「全体外资此刻在净买入还是净卖出」——这是一个时间序列问题,关注的是方向而非幅度。
关键的差异在于定价速度。横截面信息在持仓披露的那一瞬间就被量化基金拆解完了;时间序列的拐点却需要几天到几周才能确认——这就是 alpha 的窗口。
更深层的原因:A 股是一个流动性驱动的市场。北向资金是最大的边际定价者之一,它的方向性流动本身就制造了价格压力。外资净买入→被动推高股价→赚钱效应→更多资金跟入——这是一个正反馈回路。择时信号捕捉的就是这个回路的方向。
反过来,外资净卖出→流动性收缩→下跌→更多资金撤离——负反馈。2022 年就是这个负反馈的完美案例。
与三门框架复合:从择时到仓位管理
北向信号加上三门信号会发生什么?我设计了一个交叉规则:
| 北向信号 | ||
|---|---|---|
| 三门状态 | 净流入 | 净流出 |
| 宽松(≥2灯绿) | 1.5× | 0.5× |
| 中性 | 1.0× | 1.0× |
| 紧缩(≤1灯绿) | 0.5× | 0.0× |
逻辑很直觉:三门管「宏观环境对不对」,北向管「边际流动性在不在」。两者同时利好才加杠杆,同时恶化就彻底离场。其他情况维持半仓或标准仓位。
结果:复合策略把夏普从单独北向的 0.83 推到 1.02。但代价是回撤放大到 -47%——因为 1.5× 杠杆在牛市放大收益,也在闪崩时放大亏损。
这不是我推荐直接上线的版本。1.5× 杠杆需要极强的风控纪律。但方向是清楚的:北向信号的价值在于它和宏观信号几乎是正交的——三门看的是海外利率和波动率的外生冲击,北向看的是境内流动性的内生方向。两者组合,信息量是加法关系。
留出期检验
| 策略 | 训练期夏普 | 留出期夏普 | 留出期MDD |
|---|---|---|---|
| 买入持有 | 0.15 | 1.08 | -25.2% |
| 北向择时 | 0.52 | 1.20 | -18.9% |
| 三门+北向复合 | 0.67 | 1.42 | -29.3% |
训练期 2020-01 ~ 2023-12; 留出期 2024-01 ~ 2026-06。
北向择时和复合策略在留出期夏普都比训练期更高(0.83→1.20, 1.02→1.42)。这可能是留出期恰好赶上牛市——2024-2025 年成长股暴涨,任何「减仓避险」的规则在这两年都受益于踩准了节奏。需要更长的时间维持同样的夏普才能完全说服我这不是运气。
但至少一个关键信号是稳的:训练期和留出期的方向一致,没有反转。跟我们在平台上测到的其他择时信号(价格/情绪类经常翻转)比,这已经算是靠谱的了。
三个边界条件
1. 数据口径风险。 hk_hold 表在 2024 年 8 月后口径变化(沪深股通合并披露),前后可比性存疑。这是这组数据最大的结构性风险。好在 moneyflow_hsgt(日度资金流)的口径一直稳定,择时信号主要依赖后者,受影响有限。
2. 信号拥挤度。 北向资金流可能是 A 股被讨论最多的指标之一。拥挤并不自动意味着失效——广度指标(同样是人人看的)在我们的测试里是最有效的单一择时信号。但当太多人用同一个口径做同一种交易,信号衰减是迟早的事。我建议定期重跑 IC 测试,监控滚动准确率。
3. 适用范围。 这组测试全部在创业板指上完成。创业板对流动性冲击最敏感,所以北向信号在这里效果最好。如果换到沪深 300 或微盘指标,效果可能显著不同。 沪深 300 本身就是北向的核心持仓,北向流入流出跟 300 走势的相关性太高,信号区分度反而低。微盘指标则完全没有北向覆盖,信号无意义。
结论
北向资金不是「聪明钱」——至少在选股维度不是。所有人盯着的信息不会有横截面 alpha。
但它的总量方向确实有择时信息量,特别在创业板这种对边际流动性敏感的资产上。一个极其简单的 60 日 Z-score 规则就把夏普从 0.54 推到 0.83,把最大回撤砍掉近一半。
和 三门框架 复合后,两个正交的信息源叠加出夏普 1.02。方向稳定,不存在训练/留出反转。
三句话带走:
- 选股不看北向 — IC≈0,覆盖偏差严重,不是因子是噪音
- 择时看北向总量 — 日度净流入方向是有效的流动性信号, Sharpe +0.3
- 搭配宏观信号更强 — 三门+北向, 正交信息叠加, Sharpe 1.02
脚本
scripts/factor_northbound.py, 数据为 Tushare moneyflow_hsgt (日度北向资金流) + hk_hold (周度持股明细)。 选股因子: 北向持股占比周度变化, 月度调仓, 行业(板块)+市值双中性。 择时因子: 北向日净买入额 60 日 Z-score, 日度调仓。 回测标的: 创业板指(399006.SZ)。 回测期 2020-01 至 2026-06, 含息总收益, 不含交易成本(换手率极低)。 数据截至 2026-06-16。hk_hold 数据 2024-08 后口径变化, 择时信号主要依赖 moneyflow_hsgt(口径稳定), 影响有限但需注意。