QFII 跟庄策略 +32.20%:从设计到回测验证全链路
本文最后更新于 2026年7月28日 下午
港交所 2024 年 8 月取消了北向资金盘中实时数据,A 股市场上最准的”聪明钱”信号断了。我开始找替代品,最后选了 QFII 季度持仓数据,搭了一套跟庄策略。
用 8908 条历史记录做纯 SQL 批量回测,验证了”打不过就加入”的跟庄逻辑确实能赚钱。模拟账户从 10 万跑到 +32.20%。
这篇文章拆的是全链路:信号怎么采集、参数怎么优化、回测怎么跑、中间踩了什么坑。所有数据来自真实代码和回测结果,不是编的。
前置条件
这套系统站在两个已有项目的肩膀上:
- ReShare:A 股数据平台,
qfii_holdings表存全部 QFII 持仓明细(8908 条),stock_data表存全量 K 线 - AutoQuant:量化交易平台,FastAPI + React,提供账户管理和交易执行 API(端口 8100)
策略脚本本身是纯 Python,550 行,核心依赖只有 sqlite3 和 requests。不装回测框架,自己写回测逻辑——原因后面讲。
整体数据流:
1 | |

跟庄哲学:别替庄家分析
策略设计的第一步差点走歪。
最初我(韩梅梅)设计了 7 条优化规则:QFII 评分体系、分批建仓模型、机构加权系数……写到一半被用户一句话推翻——
“跟庄的本质是打不过就加入。庄家有更强的团队做分析,我们没有这个能力,所以紧跟庄家的动作就行。庄家买什么、什么时候买、买多少,我们就跟着做。我们不需要自己再分析一遍。“
7 条规则本质上是在”替庄家分析”。这恰恰是跟庄策略要避免的。全部废弃。
最终策略核心就一个字:跟。QFII 新进了什么、加仓了什么,我们照做。唯一的自主决策是风控(止损止盈)和过滤(信号质量门槛)。
信号采集:从 8908 条记录里捞买入信号
数据源是 ReShare 的 qfii_holdings 表。每条记录包含股票代码、QFII 机构名、变动类型(新进/加仓/减仓)、报告期末日、公告日。
信号采集逻辑(qfii_follow_strategy.py 第 77-129 行):
1 | |
一个股票代码格式化的细节值得提。6 开头的上交所加 .SH,0/3 开头的深交所加 .SZ,8/4 开头的北交所加 .BJ。之前北交所代码被错误映射成 sz 前缀,导致北交所 QFII 持仓的 K 线全拉不到。
三层过滤:信号不是越多越好
原始 QFII 记录几百条,直接全跟会被噪声淹没。我加了三层过滤。
第一层:新鲜度。 只保留公告日 ≤30 天的记录。QFII 季报天然滞后——3 月的一季报到 7 月已经过了 3 个月,QFII 可能早就卖了。超过 60 天的信号直接丢掉。
第二层:庄家涨幅。 只跟庄家建仓后已经涨了 ≥5% 的股票。QFII 公告日价格相对报告期末日价格的涨幅,反映庄家建仓后的动向。涨得越多,说明庄家越看好。
第三层:信号类型。 只跟”新进”和”加仓”,不跟”减仓”和”不变”。
1 | |
仓位管理也简单:单只 ≤15%,总仓位 ≤70%,按庄家涨幅排序,涨幅高的优先买。
回测:1968 笔信号,纯 SQL 秒级跑完
这是整个项目最有意思的部分,也是踩坑最多的。
方法论
回测要回答的核心问题:给定一个 QFII 买入信号(股票 + 公告日),如果公告次日买入,按止损 -5%/止盈 +10% 退出,最终能赚多少?
回测引擎的核心逻辑(/tmp/qfii_backtest_v6.py):
1 | |
T+1 规则:买入当天不卖。同一天触及止损又触及止盈,保守取止损。
结果:典型的小亏大赚
1968 笔信号(近两季度),止损 5%/止盈 10%。样本 1968 笔,胜率 42.9%,平均收益 +1.44%,盈亏比 2.00。
胜率不到 50%,但盈亏比 2:1,期望收益为正。更关键的是退出时间差——止盈的股票平均 6.4 天就到了,止损的要磨 9.5 天。赚的快,亏的慢。
庄家涨幅过滤:用户的直觉对了
回测前用户提了个假设:”庄家涨得多的再跟,应该更安全。”回测验证了这个直觉,效果显著:
| 庄家涨幅 | 样本 | 胜率 | 期望收益 |
|---|---|---|---|
| 全部 | 1899 | 42.9% | +1.42% |
| ≥5% | 781 | 54.0% | +3.10% |
| ≥10% | 484 | 58.5% | +3.77% |
| ≥20% | 256 | 62.1% | +4.32% |
从 43% 到 62%,期望收益从 1.4% 到 4.3%。5% 是分水岭。
公告新鲜度:最重要的发现
这是整个回测最有价值的结论:
| 公告滞后 | 样本 | 胜率 | 平均收益 |
|---|---|---|---|
| 0-30 天 | 1391 | 58.5% | +3.55% |
| 31-60 天 | 445 | 45.6% | +1.47% |
| 61-90 天 | 92 | 40.2% | -2.34% |
公告后 30 天内跟入能赚钱,31-90 天就是接盘区。 这条结论直接写进了策略代码的 FRESH_DAYS = 30。
DOE 参数优化:8 组全排列找到最优解
选定止损止盈参数时,我没有凭感觉拍,而是做了全排列测试。止损 5%/10% × 止盈 5%/10%/15%/20%,一共 8 组,简称 DOE(Design of Experiments):
| 止损 | 止盈 | 胜率 | 期望收益 | 特征 |
|---|---|---|---|---|
| 5% | 10% | 42.9% | +1.44% | 最均衡 |
| 5% | 15% | 31.7% | +1.30% | 期望高但胜率低 |
| 5% | 5% | 62.4% | +1.25% | 太窄 |
| 10% | 10% | 51.0% | +0.23% | 止损太松 |
核心结论:止损 5% 全面优于 10%。 止盈 10% 是最均衡的选择。止盈 15% 期望略高但胜率太低,实操体验差。
最终参数:
1 | |
踩过的坑
坑一:API 拉 K 线超时
第一版回测逐个调 ReShare API 拉每只股票的 K 线。2822 只股票,超时 300 秒,只完成 30%。
根因:每次 API 调用都要建连接、查询、序列化、传输,2822 次串行调用累积延迟太大。
解法:改用 sqlite3 直接从 stock_data 表读全部 K 线,一次查询拿完所有股票的 OHLC 数据。秒级完成。
教训:批量回测必须走数据库直读,API 只适合实时单次查询。
坑二:全局交易日历的数据空洞
V5 版回测用了所有股票合并去重的日期作为全局交易日历。问题在于不同股票上市时间不同、停牌不同,某些日期在某些股票中根本没有数据。
next_td(date) 返回的日期,在特定股票里找不到对应记录。结果 V5 从 2189 条信号暴跌到 168 条有效结果——不是信号消失了,是交易日历对不上导致大量信号被跳过。
V6 修复:每只股票用自己的 K 线日期列表做日历索引。有效结果恢复到 1968 条。
教训:回测引擎必须按 symbol 独立维护交易日历,不能用全局合并日历。
坑三:baostock 的 venv 隔离
回测需要补充历史 K 线数据,用 baostock 逐只写入 stock_data 表。系统 python3 里 import baostock 报 ModuleNotFoundError。
根因:系统 pip3 装的 baostock 只能被系统 python3 看到。ReShare 项目有自己的 venv,baostock 装在 venv 里。
解法:必须用 ReShare venv 运行,cd ~/projects/ReShare && backend/.venv/bin/python3 script.py。
坑四:安妮股份过期信号事故
2026 年 7 月 11 日分析 QFII 持仓时,我把全部 3800 条记录混在一起统计(跨 2005-2026 所有季度)。结果安妮股份 3 月一季报的”新进加仓”信号,被当作”最新信号”推荐给用户。
用户一针见血:”安妮股份新进加仓,都是 3 月份的事了。”
根因:QFII 报告天然滞后。3 月的一季报到 7 月已经滞后 3 个月,QFII 完全可能已经卖掉。
解法:任何 QFII 分析前,先按 update_date 过滤,只保留最近 30 天的报告。这条规则直接写进了策略代码和操作指南。
实盘模拟:账户 6 真实持仓
策略不只跑回测,实盘也有模拟账户。AutoQuant 平台的账户 6,初始资金 10 万,从 2026 年 7 月 9 日开始跑。
当前持仓(截至 2026-07-22):海南矿业(高盛国际,庄家涨幅 +8.1%)、岭南控股(UBS,+8.16%)、银河微电(摩根士丹利,+38.23%)、日科化学(4 家共振,+20.0%)、正泰电源(摩根大通,+6.17%)、金煤科技(3 家共振,+20.66%)。
日科化学是 4 家 QFII 共振的标的。UBS、摩根大通、摩根士丹利、高盛同时新进,庄家涨幅 +20%,完全符合策略的最优参数区间。
策略每天盘前自动运行:检查持仓止损止盈 → 扫描新候选 → 执行买入。整个流程通过 AQ API 调用,交易记录全部在 AutoQuant 平台可查。
这套策略的边界
回测和实盘都验证了跟庄策略有效,但有几个必须承认的局限。
时差是最大风险。 QFII 季报天然滞后 2-3 周。SmartMoneyDB 对美国 13F 克隆策略的研究显示,共识性新买入信号在扣除披露延迟后收益为零。我的回测用公告日(update_date)而非报告期末日作为信号触发日,最大限度压缩时差,但不能消除。
幸存者偏差。 回测只能看到 QFII 仍在持有的股票,看不到已清仓的。2025 年 Q1 有 398 只股票被 QFII 彻底清出。
市场环境敏感。 最近两季度回测中,持有 30 天以上的胜率暴跌到 41.2%,60 天更是到 36.6%。当前市场节奏快,跟庄策略必须短持有期运行。
不是稳赚不赔。 42.9% 的胜率意味着超过一半的交易会止损。策略能赚钱靠的是盈亏比 2:1 和期望收益为正,不是高胜率。
下一步的计划是接入龙虎榜数据做第二层验证——QFII 持仓确认”庄家来过”,龙虎榜确认”庄家今天还在不在”。四层雷达比单层信号靠谱得多。
参考文献
- SmartMoneyDB: Which Managers Are Worth Cloning? — 13F 克隆策略扣除披露延迟后收益为零
- Cohen, Folk, Silli. “Best Ideas” SSRN 论文 — 只有机构最高置信度持仓有 alpha
- 上海财大”聪明投资者”研究 — 按历史绩效筛选后跟随持仓 180 个交易日内持续超额收益
- 新浪财经/数据宝: QFII 长期收益统计 — 持股 10 年以上 31 家中 30 家正收益,平均 18.79 倍