1. 资金流向数据到底在讲什么故事
2月的资金流数据出来以后,后台问得最多的一个问题就是:净流入607亿,这个数字到底该怎么用?先把话说在前面,单看一个总数意义不大,真正值得琢磨的是“转向”这两个字——1月还在净流出,2月翻成正流入,这种方向的切换往往比绝对金额更能说明问题。我平时做资金面跟踪,习惯把它拆成三层:谁在买、买了多少、买到了哪些行业。这三个问题分别对应参与者结构、量能强度和行业归因,缺一层,结论就容易跑偏。
这篇内容面向两类人:一类是想看懂财经新闻里“资金加码某行业”到底意味着什么的新手,另一类是已经在做数据跟踪、但苦于口径混乱、指标不成体系的朋友。我会把北上资金(也就是通过互联互通机制进出A股的那部分境外资金,市场习惯叫这个名字)的净流入是怎么统计的、607亿这个量级在历史上处在什么位置、行业层面的“加码”该怎么验证,一步步拆开讲。中间会给出可直接复现的字段设计、打分模型和Python代码,也会聊几个我自己踩过的坑,比如为什么两个平台显示的行业净流入能差出十几个亿。
先说结论性的判断逻辑:资金流向是结果数据,不是原因数据。它记录的是已经发生的成交,不能直接推导未来涨跌。但它有两个用处是实打实的——第一,它能反映某段时间内市场参与者的偏好迁移,帮你判断当前的主线在哪;第二,它能量化“共识强度”,当一个行业连续多日、多数个股都出现净流入时,这种广度上的扩散比单日爆量可信得多。把这两点用好了,资金流数据就是一个不错的辅助工具;用不好,就会变成追涨杀跌的加速器。
1.1 “转向”比“607亿”更值得盯
很多人看到新闻标题第一反应是记住那个数字,其实更应该关注的是方向变化发生的时间点。1月净流出、2月净流入,这种月度级别的翻转,背后通常对应着汇率预期、海外风险偏好、以及A股自身估值位置的变化。我在做月度复盘时会给“转向”单独设一个观察项:连续两个月的净流入方向是否一致,如果不一致,就去看转折那一周的日度数据,找出是哪几天贡献了主要增量。
具体怎么看?把2月的日度净流入拉成一条曲线,你会看到它大概率不是均匀分布的,而是集中在少数几个交易日。我把这种形态叫“脉冲式流入”。脉冲式流入和“细水长流式流入”的含义完全不同:前者往往对应事件驱动,比如某份宏观数据超预期、或者某个重要会议释放了信号,资金的持续性存疑;后者才是配置型资金在慢慢建仓,更值得跟踪。判断方法很简单,算一下2月净流入总额里,前三个交易日贡献了多少比例。如果超过六成,那这个607亿的“含金量”就要打个折扣。
还有一个容易被忽略的点:转向发生时,往往伴随着成交量的同步放大。如果2月的净流入是在全市场成交额萎缩的背景下发生的,说明是存量资金在调仓,行业之间的跷跷板效应会非常明显;如果成交额同步放大,那更可能是增量资金进场。这两种情况对行业选择的意义截然不同,前者你要做的是“跟着钱从哪搬到哪”,后者你可以更从容地看行业本身的景气度。我在表格里专门留了一列记录全市场日均成交额,就是为了做这个交叉判断。
1.2 607亿的三种读法:绝对量、相对量、结构量
绝对量最好理解,607亿就是2月净买入的成交额差额。但这个数字放在历史里是什么水平?我一般会拉出过去三年的月度净流入序列,算一个分位数。如果607亿落在70%分位以上,说明这个月的流入强度是偏高的;如果只有40%分位,那就只是恢复性流入,谈不上强势。这一步的意义在于给自己一个锚,避免被“607亿”这个大数字吓到或者兴奋到。
相对量是我更看重的。算法是用月度净流入除以当月末该渠道持有A股的总市值,得到一个千分比。这个指标能剔除市场规模扩张带来的干扰,做跨年度比较时更靠谱。举个例子,同样是600亿的净流入,在两三年前的市场体量下可能只占千分之三,放到现在可能只有千分之二,强度其实是下降的。我自己常用的阈值是:单月流入强度超过千分之三算强,千分之一到千分之三算中性,低于千分之一算弱。这个阈值不是标准答案,你可以根据自己的跟踪周期调整。
结构量指的是这607亿在行业和个股上的分布。这里有个经验:如果流入高度集中在两三个行业,占比超过六成,那说明这是一次主题性配置,资金有明确的进攻方向;如果分散在十几个行业,每个都不超过10%,那更像是被动型资金或者指数化配置在动。这两种结构对应完全不同的应对方式。前者你需要去研究那几个行业发生了什么,后者你只需要知道整体风险偏好在回升就够了。我在2月的数据里看到的是前者特征比较明显,所以后面重点就放在行业归因上。
1.3 为什么不同平台的口径经常对不上
这是新手最容易懵的地方:同一个交易日,A平台说净流入85亿,B平台说净流入62亿,差出来的23亿去哪了?原因通常有三类。第一类是成交口径和持仓口径的差异,前者是按当日买入卖出成交额轧差,后者是按托管持股数量变化乘以均价估算,两者在有大宗交易或者转托管的时候会出现偏离。第二类是统计范围,有的平台只统计纳入某一指数的标的,有的统计全市场。第三类是更新时间,日度数据有盘中估算和盘后结算两个版本,你看到的可能是估算值。
我的处理办法是固定一个数据源做主口径,其他源只用来做交叉验证,绝不在同一条序列里混用。这一点很重要,我见过有人把两个平台的数据拼在一起做趋势线,结果画出来的曲线在月中有一个莫名其妙的跳变,还以为是市场异动,其实是换源了。如果你确实需要多源对比,那就把每个源单独成列,分别算趋势,只在结论层面互相印证,不要在数据层面做拼接。
还有一个坑是“净流入”和“净买入”这两个词经常被混用。严格来说,净买入指的是主动买入成交额减主动卖出成交额,净流入有时包含被动成交的估算。日常看新闻不用抠这么细,但如果你要下判断,最好在笔记里标清楚用的是哪种。我自己在表格字段名上会写成net_active_buy和net_holding_chg,强制区分,这样半年后回头看不会糊涂。
2. 净流入的计算细节与数据清洗
聊完读法,得落到算法上。很多朋友做资金跟踪做不下去,不是不会写代码,而是数据一进来就脏得没法用。我见过最典型的情况是:某只个股当月有停牌,持仓数据出现断层,直接算差值会得到一个巨大的假流入或者假流出;还有分红除权导致的持仓数量变化,也被误判成买卖。所以这一节我把顺序倒过来,先讲清洗,再讲计算,因为清洗做不好,后面的模型全是垃圾进垃圾出。
清洗的核心原则是“让每一行数据都对应一个真实可比的交易日”。具体要做四件事:剔除停牌区间、处理除权除息、区分大宗交易和竞价交易、排除ETF申赎带来的份额变动。这四件事听起来琐碎,但每一件都影响最终数字的量级。我在早期做过一次回溯,发现没做除权处理的版本,月度行业净流入的误差能到5%以上,对于判断行业排序来说,这个误差足以让第一名和第三名互换位置。
清洗完之后才是计算。日度净流入的基础公式是买入成交额减卖出成交额,这个没什么争议。争议在聚合层面:算行业净流入时,是简单加总个股,还是按流通市值加权?我的做法是两个都算,简单加总用来看绝对规模,加权用来看相对强度。因为一个行业里可能有一只超大市值股票贡献了八成流入,简单加总看起来这个行业很热,但加权之后你会发现其实只有一只票在动,广度并不好。这两个指标配合看,能避开不少“伪加码”的陷阱。
2.1 成交口径:买入减卖出,但有三个细节要注意
第一个细节是主动买卖的判定。不同的数据源对主动性成交的判定规则不完全一样,常见的是按逐笔成交的价格相对于当时买一卖一的位置来判断。这个细节在个股层面影响不大,但在高频策略里很关键。日常跟踪用日度数据的话,直接用数据源给的买入额、卖出额字段就行,没必要自己重算。
第二个细节是总额口径和净额口径的区别。有些平台提供的“成交额”是买入加卖出,有些只给净额。如果你拿到的是总额,需要自己拆;如果拿到的是净额,那直接就是答案。我在建库的时候会统一存成买入额、卖出额两列,这样后面无论想看总额还是净额都能算,灵活度高一些。这个习惯是从一次数据回补的经历里养成的,当时只有一个净额字段,想做双边分析完全没办法,只能重新拉一遍历史。
第三个细节是集合竞价的处理。开盘和收盘的集合竞价成交,在不同源里的归属时点可能不一样,有的算在当日,有的算在次日。这个差异在日度序列上会造成轻微的自相关,做短周期信号时要注意。我的处理方式是把集合竞价单独打标,做长周期分析时合并,做日内分析时拆开。普通投资者用不上这么细,但如果你发现连续几天的净流入数值都有尾数异常,大概率就是这类时点归属问题。
2.2 数据清洗的四个固定动作
第一个动作是停牌标记。每只股票在每个交易日的可交易状态要单独存一列,停牌日直接置空,不参与聚合。这样做的原因是,停牌期间持仓不变,但复牌后可能一次性补跌或补涨,如果把停牌前后的持仓变化当成资金行为,会严重误判。我做行业打分时,会把停牌股从行业分母里剔除,否则广度指标会被稀释。
第二个动作是除权除息调整。分红送转会导致持仓数量变化,但这种变化不是买卖行为。处理方法是用复权因子对持仓数量做还原,或者干脆改用成交额口径来算资金流,绕开持仓数量的干扰。我个人倾向于后者,因为成交额口径天然不受除权影响,而且和价格数据的匹配度更高。缺点是它只反映交易行为,不反映持有意愿的变化,所以我会另外保留一个持仓变动序列作为补充。
第三个动作是区分大宗交易。大宗交易的成交价通常有折价,而且买卖双方往往是协议好的,把它和竞价交易混在一起算净流入,会放大短期波动。我的做法是给大宗单独打标,做常规资金流分析时排除,只在研究机构调仓时单独看。这一步能显著降低单日数据里的噪声。
第四个动作是排除ETF申赎。有些资金通过申购ETF的方式间接买入一篮子股票,这会体现在成分股的持仓变化上,但并不是主动选股行为。如果你跟踪的是行业偏好,这种被动流入应该剥离。识别方法是看ETF份额变动和成分股持仓变动的相关性,如果某段时间相关性异常高,就要警惕了。
2.3 行业归因:把个股资金映射到行业的两条路径
第一条路径是按行业分类标准直接映射,每只股票对应一个行业代码,聚合时按行业分组求和。这条路径简单直接,适合做常规的行业资金流排名。需要注意的是一致性问题:不同平台的行业分类标准可能不同,有的是三十个一级行业,有的是十几个大类,切换标准会导致排序变化。我在建库时会同时存两套分类,一套细的用于研究,一套粗的用于对外表述,避免口径打架。
第二条路径是按业务权重拆分,适合那些跨行业经营的公司。比如一家公司既有设备制造业务又有材料业务,简单归到某一类会失真。这条路径更精细,但需要额外的业务构成数据,维护成本高。我的建议是:常规跟踪用第一条路径就够了,只有在研究特定主题(比如某类上游材料)时才启用第二条。
归因做完之后,一定要做一次“反向校验”:把行业净流入加总,看是否等于全市场净流入。如果差得比较多,说明有个股没被归到任何行业里,或者有重复计算。这个小检查我每次跑完数据都会做,能抓出不少隐藏的脏数据问题。
3. 一套可复现的行业加码跟踪流程
到这一步,数据已经干净了,接下来是把它变成能用的信号。我的做法是搭一个简单的打分面板,不追求复杂模型,核心是把“流入强度、持续性、扩散广度”三个维度量化出来,再加权成一个综合分。这套东西的好处是可解释——每个行业为什么排在前面,你能一眼看出是强度高还是广度好,而不是一个黑箱给出个数字。
流程分四步:字段设计、指标计算、阈值设定、复盘记录。这四步是一套闭环,缺了复盘那一步,前面做得再精细也只是自娱自乐。我见过不少人做了一堆漂亮的可视化,但从没回看过信号发出后一周的实际表现,结果用了半年才发现某个阈值设得完全不合理。下面我把每一步的具体做法写出来,你可以直接照着搭。
代码我用Python写,pandas足够,不需要什么重型框架。数据处理部分大概五十行,打分部分二十行,跑一次全市场日度数据在普通笔记本上也就几秒钟。如果你不写代码,后面我也会给Excel的替代方案,用数据透视表加几个公式同样能做出来,只是更新起来要手动一些。
3.1 面板字段设计:至少要有这九列
一个够用的行业资金面板,我建议包含这些字段:交易日、行业代码、行业名称、当日净流入、当日行业成交额、流通市值、净流入个股数、行业个股总数、连续净流入天数。前三个是主键,中间三个是基础量,后三个是衍生量的原料。有了这九列,后面几乎所有指标都能算出来。
为什么要单独存成交额?因为强度指标要用它做分母。净流入除以成交额,得到的是“流入占交易的比例”,这个指标比绝对金额更能反映资金的坚决程度。举个例子,两个行业都流入5个亿,一个成交额是20亿,一个是200亿,前者的比例是25%,后者只有2.5%,含义完全不同。我早期只看绝对金额,结果总是被大市值行业霸榜,后来加了强度指标才看清真实情况。
连续净流入天数这个字段看着简单,实际很有用。它衡量的是持续性,能过滤掉那些“一日游”的行业。算法是从当前日往前数,遇到第一个净流出日就停止。实现上有两种写法,一种是循环,慢但直观;一种是用累积乘积的技巧,快一些。数据量不大的话用循环就行,我贴的代码里用的是分组累计的方法。
3.2 三个核心指标的计算方式
流入强度等于滚动净流入除以滚动成交额。滚动窗口我一般用5日和20日两个,5日看短期脉冲,20日看中期趋势。用比例而不是差值,是为了消除行业规模差异。计算时要注意分母不能为零,停牌多的行业要特殊处理。
扩散广度等于净流入个股数除以行业可交易个股数。这个指标的意义在于区分“龙头拉动”和“全面开花”。广度低于40%说明只有少数股票在吸金,持续性往往不好;广度高于60%说明行业内部形成共识,信号更可靠。我在实际使用中发现,广度指标对判断行情的可持续性比强度指标还管用,尤其是那些市值分布比较均匀的行业。
持续性用连续净流入天数来量化,但直接拿天数做比较会有问题,因为不同行业的波动率不同。我的处理是把天数做一次标准化,转换成同尺度后再参与打分。标准化用简单的z-score,也就是减去均值除以标准差。这一步做完,三个指标就可以加权了。
import pandas as pd import numpy as np # 读取日度个股资金数据,字段示例 # trade_date, code, industry, buy_amt, sell_amt, float_mv, is_tradable df = pd.read_csv("daily_flow.csv", parse_dates=["trade_date"]) df = df[df["is_tradable"] == 1].copy() df["net"] = df["buy_amt"] - df["sell_amt"] # 聚合到行业日度 ind = (df.groupby(["trade_date", "industry"]) .agg(net=("net", "sum"), amt=("buy_amt", "sum"), float_mv=("float_mv", "sum"), n_total=("code", "count"), n_in=("net", lambda s: int((s > 0).sum()))) .reset_index()) ind["breadth"] = ind["n_in"] / ind["n_total"] ind = ind.sort_values(["industry", "trade_date"]) # 滚动净流入与滚动成交额 for w in (5, 20): ind[f"net_{w}d"] = (ind.groupby("industry")["net"] .transform(lambda s: s.rolling(w, min_periods=w).sum())) ind[f"amt_{w}d"] = (ind.groupby("industry")["amt"] .transform(lambda s: s.rolling(w, min_periods=w).sum())) ind[f"intensity_{w}d"] = ind[f"net_{w}d"] / ind[f"amt_{w}d"].replace(0, np.nan) # 连续净流入天数 def run_len(s): out, cnt = [], 0 for v in s: cnt = cnt + 1 if v > 0 else 0 out.append(cnt) return pd.Series(out, index=s.index) ind["persist"] = ind.groupby("industry")["net"].transform(run_len)这段代码里有个细节值得说一下:transform配合rolling是按行业分组滚动,不会跨行业串数据。如果你直接对整个表做rolling,那就错了。我第一次写的时候就在这里翻过车,算出来的滚动值大得离谱,排查了半天才发现是没分组。
3.3 综合打分与阈值设定
打分用加权求和,权重我建议是强度0.5、广度0.3、持续性0.2。这个权重不是拍脑袋,而是根据我自己的复盘结果调的:强度对短期收益的解释力最强,广度次之,持续性更多是用来做过滤的。你可以根据自己的持仓周期调整,短线可以加大强度权重,中线可以加大广度权重。
def zscore(s): return (s - s.mean()) / s.std(ddof=0) ind["score"] = (0.5 * zscore(ind["intensity_5d"]) + 0.3 * zscore(ind["breadth"]) + 0.2 * zscore(ind["persist"])) # 只看最新截面 latest = ind[ind["trade_date"] == ind["trade_date"].max()] top = latest.sort_values("score", ascending=False).head(10) print(top[["industry", "net_5d", "intensity_5d", "breadth", "persist", "score"]])阈值方面,我给几个自己常用的参考值:5日强度超过8%算显著,广度超过60%算健康,连续净流入三天以上算有持续性。三个条件同时满足的行业,我才会放进重点观察池。注意这里是“观察池”不是“买入池”,两者的区别后面会讲。
用Excel的话,强度可以用SUMIFS算滚动净流入,广度用COUNTIFS数净流入个股,持续性用辅助列做递增计数,最后用STANDARDIZE做标准化。数据量在几万行以内,透视表刷新一下就能出结果,不写代码也完全可行。
3.4 复盘记录表:这是最容易被跳过的一步
我在表格里固定记录这几列:信号日、行业、综合分、强度、广度、持续性、信号发出时该行业近20日涨幅、信号后5日涨幅、信号后20日涨幅、相对基准的超额。后面三列是可选项,但强烈建议加上,因为只有这样才能验证你的阈值到底有没有效。
复盘的价值在于发现“条件性有效”。什么意思?就是同一个信号,在不同的市场环境下效果差异很大。比如资金加码信号在指数上行期胜率明显更高,在震荡期就容易失效。这种规律只能靠积累样本发现,看一两篇研报是得不到的。我自己攒了两年多的记录,最大的收获是发现广度指标在指数下跌末期的指示意义最强——那段时间资金开始试探性流入的行业,往往是下一轮修复的先行者。
记录表不需要多复杂,一个csv文件加几十行代码就能自动更新。关键是坚持,每周花十分钟把新信号补进去,半年后你就有了一份属于自己的样本库。
4. 行业加码信号的三层验证与场景落点
信号算出来之后,最危险的动作就是直接照着买。资金流只是一个维度,它的盲区很明显:被动配置、ETF申赎、指数调整带来的调仓,都会在数据里表现为“流入”,但这些流入并不代表有人看好这个行业的景气度。所以我在实际使用中会做三层验证,一层看量能,一层看价格结构,一层看产业数据。三层都过得去的行业,才值得深入研究。
这三层验证的顺序不能颠倒。先看量能是因为它最直接,数据就在手里;再看价格结构是为了排除“资金流入但价格不涨”的情况,这种背离往往意味着有更大的卖压在;最后看产业数据是最费时间的,但也是最能决定成败的。很多人在第一层就下单了,结果买在了资金派发的阶段。
顺便提一下2月这种“跨月转向”场景的处理。月度翻转有个特点:转折当月的行业分布往往比较散,因为资金还在试探。我的做法是把转折月拆成上下半月分别看,如果下半月的行业集中度明显高于上半月,说明主线在收敛,这时候跟进的确定性更高;如果一直很散,那就说明只是一次普涨式的风险偏好修复,不必急于找主线。
4.1 第一层:量能验证看的是“广度和持续性”
量能验证的核心不是金额大小,而是分布结构。我关注两个比例:一是行业内净流入个股占比,二是净流入的行业数量占全市场行业总数的比例。前者看行业内部的共识度,后者看市场的整体偏好。如果只有两三个行业在吸金,其他都在流出,那说明是存量博弈下的抱团,这种结构很脆弱;如果有七八个行业同时净流入,说明是增量环境,容错率高。
持续性方面,我会把5日强度和20日强度做对比。如果5日强度高但20日强度低,说明是近期突然启动,需要看有没有事件催化;如果两个都高,说明是趋势性的,可以更从容。最怕的是5日高、20日也高,但广度在下降,这种“缩量上涨”式的资金流入往往是行情末期的特征。
还有一个反向指标值得留意:某个行业连续大幅净流入之后,突然出现单日大额净流出,但价格没跌。这种情况通常是资金在换手,需要结合成交量看,如果成交量同步放大,那大概率是派发。
4.2 第二层:价格结构验证排除“假流入”
价格结构我主要看三个位置:20日均线、前期高点、以及最近的成交密集区。资金流入的行业如果价格站上20日均线并且均线走平向上,说明流入是有效的;如果价格还在均线下方,流入可能只是抄底行为,能不能持续要打问号。
背离信号要特别注意。资金净流入但价格创新低,这叫“量价背离”,通常意味着有更大的抛压被承接了,短期可能反弹但中期不乐观;资金净流出但价格创新高,说明筹码在从弱手转向强手,反而可能是好事。我自己的经验是,前者的欺骗性更强,因为“资金在买”这个叙事太容易让人产生安全感。
成交密集区的判断比较主观,我一般用最近20个交易日的成交量加权均价作为参考。价格在这个位置上方运行且资金持续流入,说明承接有力;在下方运行,说明套牢盘还在消化。
4.3 第三层:产业数据验证是最花时间但最值钱
这一层没有捷径。资金流入某个行业,你得去搞清楚这个行业的景气度是不是真的在改善。看什么?看价格、看订单、看库存、看产能利用率。这些数据分散在各类公开信息里,需要自己整理。我通常会建一个简单的行业景气跟踪表,每季度更新一次关键指标的方向。
举个具体的例子,如果2月资金加码的是某个上游材料行业,那我会去查这个材料的现货价格走势、港口库存变化、下游开工率。如果价格在涨、库存在降、开工率在升,三个方向一致,那这个加码就有基本面支撑;如果价格在跌但资金在买,那就要警惕是不是在博弈政策预期,这种博弈的持续性通常不超过一个月。
这一层的价值在于帮你区分“配置型流入”和“交易型流入”。前者可以拿得久,后者必须设好退出条件。区分方法也不复杂:配置型流入通常伴随着行业内部广度的持续扩散,而且是慢慢加速;交易型流入则是突然爆发、集中在少数标的上,来得快去得也快。
4.4 典型场景:月度转向时该怎么拆解
回到2月这个具体场景。月度由流出转流入,最需要判断的是这是“一次性修复”还是“趋势反转”。我的拆解方法是看三个东西:一是流入的行业是不是1月流出最多的那些,如果是,说明是回补;二是流入是否伴随着全市场成交额的放大,如果是,说明有增量;三是流入的持续时间是否跨越了月末,如果月末最后几天还在流入,说明资金对下个月有预期。
这三个问题的答案组合起来,能给出一个大致判断。比如“回补+放量+跨月持续”,那反转的概率就比较高;“回补+缩量+月末减弱”,那大概率只是技术性修复。这种拆解不需要精确的模型,但需要你每天花几分钟记录,因为很多信息是事后无法还原的。
另外提醒一点,月度数据的发布时间通常有滞后,等你看到新闻的时候,市场可能已经反应过了。所以日常跟踪要以日度数据为主,月度汇总只用来做阶段性总结,不要拿来做交易决策的触发条件。
5. 常见问题与排查实录
做了几年数据跟踪,遇到的问题翻来覆去就那么几类。我把最高频的几个整理出来,配上排查路径,你可以当成一个速查手册。这里面的每一条都对应着我实际踩过的坑,有些当时折腾了大半天,回头看其实是很基础的问题。
排查的基本原则是“先怀疑数据,再怀疑逻辑,最后怀疑市场”。绝大多数异常值都是数据问题,比如单位错了、日期错位了、分类标准换了。剩下的小部分是模型假设不成立,比如在极端行情下滚动窗口失效。真正属于“市场发生了新情况”的比例很低,但一旦遇到,往往是最有价值的发现。
5.1 数据对不上:从四个方向排查
第一个方向是时间对齐。检查两个数据源的交易日历是否一致,有没有把节假日算进去,有没有跨时区的问题。我遇到过一次,某个源用的是北京时间,另一个用的是格林尼治时间,导致日度数据错位了一天,趋势看起来完全相反。
第二个方向是标的范围。确认两个源统计的股票池是否相同,有没有包含退市股、有没有包含不可交易的部分。这个差异在小市值股票上特别明显,因为不同源的纳入标准不一样。
第三个方向是单位。亿元和万元混用是经典错误,差值刚好是一万倍。还有一种是百分比和小数混用,0.05和5%看着像但完全不同。我现在在字段名里强制写单位,比如net_amt_yi,就是为了防止这个。
第四个方向是计算口径。前面讲过的成交口径和持仓口径,还有是否包含大宗、是否包含ETF。把两个源的口径说明拿出来对一遍,通常能找到答案。
5.2 加码了但不涨:三种可能的原因
第一种是流入的是被动资金。指数调整、ETF申赎带来的买入,不代表有人主动看好。判断方法是看流入是否集中在成分股权重股上,如果是,那大概率是被动配置。
第二种是流入的规模不足以对抗卖压。这个要看强度指标,如果净流入占成交额的比例很低,比如只有2%,那说明多空力量基本均衡,价格自然不动。这种情况需要等强度提升。
第三种是流入发生在价格的高位,属于接盘。判断方法是看流入时的价格位置和成交量,如果是在放量上涨之后出现流入,而且广度在下降,那就要小心了。
5.3 常见问题速查表
| 现象 | 最可能的原因 | 排查动作 | 处理方式 |
|---|---|---|---|
| 两个平台净流入差很多 | 口径或范围不一致 | 对比统计说明和股票池 | 固定主口径,另一源只做参考 |
| 某行业单日流入异常大 | 单只大市值股票贡献 | 看个股明细分布 | 改用广度或加权指标复核 |
| 月度数据出现跳变 | 换源或分类标准变更 | 检查数据源版本 | 重建连续序列,标注断点 |
| 连续多日流入但价格不涨 | 被动配置或强度不足 | 看流入集中度和强度比例 | 降低权重,等待广度扩散 |
| 滚动指标出现空值 | 停牌或数据缺失 | 检查可交易标记 | 分母剔除,不做插值填充 |
| 打分排名频繁大幅变动 | 窗口太短或权重失衡 | 对比5日和20日窗口 | 延长窗口,降低短周期权重 |
这张表我打印出来贴在显示器边上,遇到问题先扫一眼,能省不少时间。表里的“处理方式”是经验值,不是硬规则,你可以根据自己的数据情况调整。
6. 我踩过的坑和几条硬经验
最后聊点不那么技术的东西。这几年做资金跟踪,最大的教训是不要用单一维度的数据下结论。资金流很像天气预报里的风向,它能告诉你气流往哪走,但不能告诉你明天会不会下雨。真正有用的判断,一定是资金、价格、基本面三者交叉验证之后得出的。
第二个教训是别追求数据的完美。我早期花了很多时间想把数据清洗到零误差,后来发现这是不可能的,不同源之间天然有差异,市场本身也有无法量化的部分。与其追求完美,不如接受误差,把精力放在“误差是否影响结论”上。如果一个信号在误差范围内就会翻转,那它本身就不够稳健,不值得用。
第三个是关于工具的心态。我见过不少人一上来就搭复杂系统,数据库、调度、可视化全套,结果跑了三个月发现指标设计有问题,全白费。我现在推荐的做法是先用Excel手工跑通一遍完整流程,确认逻辑没问题了再代码化。这个顺序反过来,浪费的时间会多得多。
还有一条实打实的经验:记录比分析重要。你今天算出来的信号,如果不记录当时的市场环境和后续表现,三个月后你根本想不起来当时为什么这么判断。我从开始记复盘表到现在,最有价值的不是那些成功的案例,而是失败的那些——它们清楚地告诉我,什么情况下这套方法不适用。这个边界感,是任何教程都给不了的。
如果你打算开始做这件事,我的建议是从一个行业、一个指标开始。先把5日净流入强度这一个指标跟踪一个月,记录它和价格的关系,找到感觉了再扩展。贪多求快,最后往往是不了了之。数据跟踪这件事,慢就是快。