换手率这三个字,凡是打开过行情软件的人都见过,但真把它当核心工具用的人不多。我做交易研究和策略回测这些年,见过太多人盯着成交量柱子数高低,也见过不少人把量比当成唯一参考,结果换一只标的后完全失效——成交量是绝对数,盘子一大一小就没法比。换手率不一样,它把成交量除以流通股本,做了一次标准化,让不同市值、不同板块的标的能放在同一张表里横向比较。这也是我愿意把换手率叫作“最真实的指标”的原因:不是它预测最准,而是它最不容易被单笔大单扭曲,最贴近真实可交易筹码的交换强度。这篇内容我会从计算口径讲起,说清楚不同盘子的读数差异、量价怎么配合、一套能直接复现的筛选流程,最后把踩过的坑整理成排查表。不管你是刚学看盘的新手,还是已经在写策略的老手,应该都能拿走点东西。
1. 换手率到底在衡量什么
1.1 计算口径与三种常见算法
换手率的原始定义很朴素:一段时间内的成交量除以可交易的股本,再乘100%。写成公式就是换手率 = 成交量 ÷ 流通股本 × 100%。举个具体例子,某标的流通股本8亿股,当天成交1.6亿股,换手率就是20%。这个数字的含义是:当天有相当于流通盘五分之一的筹码换了手。它跟我今天买了多少、卖了多少无关,衡量的是“筹码交换的剧烈程度”。
实际动手时你会发现市面上的口径不止一种,至少有三种:用总股本算、用流通股本算、用自由流通股本算。总股本口径基本没人用,因为限售股根本不能交易,算进去等于把分母虚增,读数会被系统性压低。流通股本口径最常见,通达信、同花顺默认给的多数是这个。自由流通股本口径最贴近真实,它把大股东长期锁仓、战略投资者持股、员工持股计划这些“事实上不参与日常交易”的股份从分母里剔掉。同一只标的,流通股本8亿股、自由流通股本4亿股,日成交量1.6亿股,前者算出20%,后者算出40%,差了整整一倍。
我的建议是:做短线情绪判断用自由流通口径更准,做长期流动性评估用流通股本口径更稳。关键是别在同一份研究里混着用,一会看这个一会看那个,最后结论自己都圆不上。
1.2 为什么“可横比”比“数值大”更重要
成交量最大的问题是不可比。某只大盘标的日成交30亿,听起来很大,但它的流通盘可能是3000亿,换手率才1%;某只小盘标的日成交3亿,看着不起眼,流通盘只有30亿,换手率10%。如果你只看成交额排序,永远会把注意力放在大盘股身上,错过真正活跃的小票。
量比也常被人拿来替代换手率,但它同样有短板。量比是当日每分钟平均成交量与过去五日每分钟平均成交量的比值,本质上是个相对自己历史的倍数,跨标的不可比。一只长期冷清的标的,量比冲到5可能也就成交了几千万,说明不了太多;一只天天爆量的标的,量比0.8也可能依然是全场最活跃的。
换手率把分母拉进来,直接解决了这个问题。10%就是10%,不管这只标的流通盘是30亿还是3000亿,这10%代表的筹码交换强度是同一个量级的概念。这就是我说的“可横比”——它是一把统一的尺子,能让你在全市场范围里做横向排序。
1.3 口径选择的陷阱:总股本、流通股本、自由流通股本
这里有个特别容易踩的坑:股本不是静态的。解禁、增发、送转、可转债转股,都会让分母在某个时点突然变化。如果你用的是本地缓存的股本数据,没跟着更新,换手率就会算出离谱的值。
我遇到过最典型的情况是某标的刚做完10转5,股本扩大了50%,我手上的流通股本字段还是老数据,结果连续一周的换手率都被高估了三分之一,筛选结果里它天天排在最前面,差点误判成有资金在持续介入。后来查公告才发现是除权导致的。所以只要涉及股本变动,第一件事就是同步分母。
次新股是另一个特殊场景。刚上市时流通盘极小,往往只有总股本的10%到25%,这时候换手率天然就高,日换手30%、50%都不稀奇。你拿这个数字去跟已经全流通的老标的比,完全没有意义。我的处理办法是给次新股单独设一档观察期,上市不满60个交易日的,不看绝对换手率,只看它自己上市以来的分位变化。
还有一个容易被忽略的点:可转债转股会持续增加股本,虽然每次增加的量不大,但累积几个月下来,分母可能已经变了百分之几。做长周期回测的时候,这种慢性漂移会悄悄污染你的结果,建议每次跑回测前都重新拉一遍股本字段,而不是图省事复用旧文件。
2. 不同盘子的换手率读数差异
2.1 按流通市值分层的经验区间
同一个换手率数字,放在不同的流通市值身上,含义完全不同。我统计过一批标的的日常换手率分布,大致可以归纳成这么一张表,这是我个人常用的参考区间,不是绝对标准,但拿来快速定位足够用:
| 流通市值区间 | 常态换手率区间 | 明显放量的门槛 | 需要警惕的极端值 |
|---|---|---|---|
| 30亿以下 | 3%~8% | 10%以上 | 25%以上 |
| 30亿~100亿 | 2%~5% | 7%以上 | 18%以上 |
| 100亿~500亿 | 1%~3% | 4%以上 | 10%以上 |
| 500亿~2000亿 | 0.5%~1.5% | 2.5%以上 | 6%以上 |
| 2000亿以上 | 0.3%~1% | 1.8%以上 | 4%以上 |
这张表最直接的用处是防止“看到10%就兴奋”。同样10%的换手率,出现在30亿流通盘的标的上属于常态波动,出现在2000亿流通盘的标的上就是极端异常,两者背后需要的资金体量差了两个数量级。很多新手拿着同一套阈值横扫全市场,结果自然是被小盘股的噪音反复打脸。
还有一个变量是板块属性。同一市值档位下,成长型板块的日常换手率普遍高于价值型板块,这是参与者结构决定的,不是什么玄学。判断的时候最好拿同板块、同市值档的标的做横向参照,而不是拿一只小盘成长标的和一只大盘价值标的直接对比。
2.2 用历史分位替代死标准
死记阈值有个致命问题:市场整体活跃度是会漂移的。行情火热的时候,全市场换手率中枢整体上移,你按老标准看什么都像放量;行情清淡的时候反过来,全市场都缩量,你的阈值一个都触发不了。
我现在更常用的是滚动分位法。取过去250个交易日(大约一年)的日换手率序列,算当前值在其中的百分位。分位超过80%就算显著放量,低于20%算显著缩量,20%到80%之间是常态区间。这个办法的好处是自动适应市场环境,不需要我手动调参数。
除了分位,我还会算一个标准分(Z-score),公式是Z = (当前换手率 - 250日均换手率) ÷ 250日换手率标准差。分位法看的是“排在第几名”,标准分看的是“偏离常态几个身位”。两个指标一起看能避免一些误判:比如某标的过去一年换手率一直很平稳,某天突然翻倍,分位可能直接冲到95%,但标准分可能只有2,说明虽然创了新高,但绝对偏离幅度不算夸张;反过来,一只波动巨大的标的,分位80%对应的标准分可能有3以上,那是真正的异常。
我的经验是:分位负责筛选,标准分负责排序。先用分位把放量的标的捞出来,再用标准分排个优先级,效率会高很多。
2.3 四种典型换手状态的市场含义
把换手率的高低位和价格位置一结合,能得到一个相当好用的二维判断框架。我常用来做快速归类的是这四种状态:
低位低换手,也就是价格处于近一年相对低位、换手率也在20%分位以下。这种状态说明筹码交换极度冷清,没人愿意在这个价位卖,也没人愿意买。它既可能是底部区域的沉淀期,也可能只是下跌中继的暂停。单看这一格不能下结论,得看它持续了多久,以及有没有量能先于价格企稳的迹象。
低位高换手,价格在低位但换手率明显放大。这是我最愿意花时间研究的一格,因为它意味着在低位区间有大量筹码易手,原有的持仓结构在松动。当然也可能是恐慌性抛售,所以必须结合价格是否创新低来判断:放量但价格不跌,和放量且价格继续破位,是两件完全不同的事。
高位高换手,价格在高位、换手率也高。这一格的风险信号最强,它意味着大量获利筹码在高位兑现,同时有大量资金在接。分歧巨大,后面往哪走取决于承接力度。我不说它一定见顶,但这一格的持仓性价比通常不高。
高位低换手,价格在高位但换手率萎缩。这一格容易被误读成“筹码锁定良好”,实际上也可能只是没人接盘导致的缩量滞涨。判断的关键看它是不是在创新高,以及上涨过程中的换手率是不是一路递减——量价背离越走越远,后面的调整往往越急。
3. 换手率与量价关系的配合
3.1 换手率与价格位置的二维矩阵
上一节我提了四种状态,实际使用中我把它细化成了一个矩阵,判断的时候直接对号入座:
| 换手率低位(<20%分位) | 换手率中位 | 换手率高位(>80%分位) | |
|---|---|---|---|
| 价格低位(<30%分位) | 无人问津,观察期 | 温和回暖,可跟踪 | 关注度上升,重点研究 |
| 价格中位 | 缩量整理,等方向 | 常态波动,不构成信号 | 突破放量,观察持续性 |
| 价格高位(>70%分位) | 无量上涨,警惕背离 | 高位震荡,谨慎 | 分歧巨大,风险区 |
这张表我只用来做初筛,不会直接拿来做决策。因为它缺少一个关键维度:时间。同样是“低位高换手”,持续一天和持续二十天,意义完全不同。前者可能只是单日事件,后者才代表资金持续介入。
所以我还会加一个持续性条件:连续N个交易日中至少有M天换手率超过80%分位。我一般设N=10、M=4,也就是十天里有四天放量。这个条件能过滤掉大部分单日脉冲,留下的往往是真有一定持续性的。
3.2 换手率均线与放大倍数
单日换手率的噪音很大,加个均线能平滑掉不少。我用两条:5日换手率均线和20日换手率均线。5日均线上穿20日均线,代表短期活跃度在抬升;反过来则是活跃度在退潮。这个用法跟价格均线类似,但作用对象是活跃度而不是价格。
比均线更直观的是放大倍数,公式是当日换手率 ÷ 过去20日换手率均值。我自己的经验分档是这样的:
| 放大倍数 | 含义 | 我的处理方式 |
|---|---|---|
| 0.5以下 | 极度缩量 | 观察是否临近变盘 |
| 0.5~1.2 | 常态 | 不构成信号 |
| 1.2~2 | 温和放量 | 留意,结合价格位置 |
| 2~4 | 明显放量 | 重点跟踪,看持续性 |
| 4以上 | 异动 | 必须查原因,可能是事件驱动 |
4倍以上这一档一定要查原因。可能是业绩公告、可能是行业消息、也可能是大额解禁当天的换手。不查清楚就当成资金介入,很容易站错位置。这里也提醒一句,上面这些倍数和分位都只是历史统计出来的观察工具,不构成任何投资建议,市场本身有风险,任何指标都有失效的时候。
3.3 累计换手率与筹码换手周期
除了单日和均线,我还经常看累计换手率。算法简单,把一段时间的日换手率加总就行。20日累计换手率达到100%,意味着流通盘理论上换了整整一遍;60日累计换手率达到200%,意味着平均每份筹码换了两次手。
这个数字的用处是估算筹码换手周期。一只标的的换手率如果长期维持在2%左右,那50个交易日左右筹码换一遍;如果某段时间换手率突然升到5%以上,换手周期直接缩短到20天。换手周期缩短往往意味着参与结构在变化,原有的持仓者退出,新的资金进来,后续的走势特征也会跟着变。
我一直觉得累计换手率比单日换手率更能反映“这波行情换了几茬人”。一轮持续两个月的行情,如果累计换手率只有120%,说明大部分人还在里面,筹码没怎么松动;如果累计换手率冲到了400%,说明已经换了好几轮,参与者的平均成本早就抬上去了,这时候再谈“低位”就不合适了。
4. 一套可直接复现的换手率筛选流程
4.1 数据准备与字段说明
整个流程的第一步是把数据准备好。我需要的字段不多,但每个都必须准确:
- 交易日
- 成交量(股,注意不是手)
- 成交额(元)
- 流通股本(股)
- 自由流通股本(股,有最好,没有就用流通股本替代)
这里最容易出错的是成交量单位。有的数据源给的是“手”,1手等于100股,忘了乘100,换手率会直接缩小100倍,筛出来的结果全是零。我吃过一次这个亏,跑出来的换手率全是0.003%这种数,排查了两个小时才发现是单位问题。
还有一个细节是停牌处理。停牌期间成交量是0,换手率也会是0,如果直接扔进滚动窗口,会把分位数算偏。我的处理是停牌日直接剔除,不参与滚动计算,只保留有成交的交易日。
4.2 筛选条件与参数设定
参数我基本固定成这样一套,你可以根据自己的风格微调:
| 参数 | 取值 | 说明 |
|---|---|---|
| 分位窗口 | 250个交易日 | 约一年,兼顾稳定性和敏感度 |
| 放量阈值 | 80%分位 | 高于此值视为放量 |
| 缩量阈值 | 20%分位 | 低于此值视为缩量 |
| 持续窗口N | 10个交易日 | 观察放量是否持续 |
| 最少放量天数M | 4天 | 10天里至少4天放量 |
| 均线周期 | 5日、20日 | 用于判断活跃度趋势 |
| 最小流通市值 | 30亿 | 过滤掉流动性过差的标的 |
| 停牌剔除 | 是 | 停牌日不进滚动窗口 |
筛完之后我一般还会加一个人工复核环节,把结果里放大倍数超过4倍的标的单独拉出来看公告,确认是不是有事件驱动。这一步没法自动化,但能过滤掉相当一部分误判。
4.3 代码实现
下面这段用pandas实现,逻辑很直白,主要就是把换手率和分位算出来:
import pandas as pd import numpy as np # df 需要包含: date, close, volume(股), float_shares(股) df = df.sort_values('date').reset_index(drop=True) # 剔除停牌日,成交量必须大于 0 df = df[df['volume'] > 0].copy() # 日换手率,单位 % df['turnover'] = df['volume'] / df['float_shares'] * 100 # 换手率均线 df['to_ma5'] = df['turnover'].rolling(5).mean() df['to_ma20'] = df['turnover'].rolling(20).mean() # 放大倍数 df['to_ratio'] = df['turnover'] / df['to_ma20'].shift(1) # 250日滚动分位(当前值在窗口内的百分位) def pct_rank(s): if len(s) < 60: return np.nan return pd.Series(s).rank(pct=True).iloc[-1] df['to_pct'] = df['turnover'].rolling(250, min_periods=60).apply(pct_rank, raw=False) # 250日 Z-score roll_mean = df['turnover'].rolling(250, min_periods=60).mean() roll_std = df['turnover'].rolling(250, min_periods=60).std() df['to_z'] = (df['turnover'] - roll_mean) / roll_std # 价格位置分位(近250日收盘价分位) df['price_pct'] = df['close'].rolling(250, min_periods=60).apply(pct_rank, raw=False) # 放量标记 df['is_high_to'] = df['to_pct'] > 0.8 df['is_low_to'] = df['to_pct'] < 0.2 # 持续性条件:10日内至少4日放量 df['high_cnt_10'] = df['is_high_to'].rolling(10).sum() df['sustained'] = df['high_cnt_10'] >= 4 # 最终筛选 result = df[(df['sustained']) & (df['to_ratio'] >= 1.5) & (df['price_pct'] < 0.7)] print(result[['date', 'turnover', 'to_pct', 'to_z', 'to_ratio', 'price_pct']].tail(20))跑这段的时候有一个点值得注意:min_periods我设的是60,意思是至少要有60个交易日的数据才开始算分位。设太小分位不稳定,设成250又会让次新股全部算不出来。60是一个我试下来比较平衡的值。
4.4 回看验证与有效性判断
筛出来的结果不能直接用,得做回看验证。我的做法是给每个信号日打上之后5日、10日、20日的价格变化,然后统计不同分位区间和不同价格位置组合下的胜率和平均收益。这一步没什么技巧,就是老老实实把历史数据跑一遍。
跑完你会发现一个很现实的情况:同样的换手率信号,在不同市场环境下表现差异巨大。所以我一般不追求一个能覆盖全时段的参数,而是观察它在什么环境下有效、什么环境下失效。比如我自己的回测里,低位放量这一格在震荡市中的表现明显好于单边下跌市,这个结论就直接写进我的使用说明里——单边下跌市中,低位放量的信号可信度要打折。
再强调一次,这些都是历史统计,不代表未来会重复。任何基于换手率的筛选,都只是把候选范围缩小,最终决策还得靠对具体标的的理解和风险控制。
5. 常见问题与排查技巧实录
5.1 数值异常排查表
换手率算出来不对,八成是数据问题。我整理了一张排查表,遇到异常先按这个顺序过一遍:
| 现象 | 最可能的原因 | 排查方法 |
|---|---|---|
| 换手率全部接近0 | 成交量单位是“手”没转成“股” | 检查是否需乘100 |
| 换手率突然翻倍 | 解禁、增发、可转债转股导致股本增加 | 查最新股本变动公告 |
| 换手率突然腰斩 | 送转除权后股本扩大 | 同步最新流通股本 |
| 某标的换手率长期偏高 | 次新股流通盘小 | 上市满60日后再纳入比较 |
| 换手率与实际成交明显不符 | 大宗交易、协议转让不计入二级市场成交 | 结合成交额与笔数交叉验证 |
| 复牌前后数值断层 | 停牌期间数据缺失 | 剔除停牌日,不参与滚动 |
| 同一标的两个软件数值不同 | 口径不一致(流通股本 vs 自由流通) | 固定用一套数据源,别混用 |
这张表里最值得多说两句的是“对倒导致换手率虚高”。单纯拉高换手率并不难,通过自买自卖反复成交就能做到。识别这类情况,我一般看三个辅助指标:单笔平均成交额是否明显偏小、成交笔数是否异常放大、价格波动是否与成交量严重不匹配。真正的资金介入通常伴随较大的单笔成交和相对连贯的价格走势,而对倒往往呈现“量大但单笔小、价格原地打转”的特征。
5.2 换手率与成交量背离怎么处理
背离是我遇到最多、也最容易判断错的情况。价格上涨但换手率持续走低,这种背离说明推动价格上涨所需的成交量在减少,参与者在变少。它不一定马上下跌,但持续性通常不好。我的处理方式是:背离出现后不急着下结论,而是设一个观察窗口,比如5个交易日内如果换手率不能重新抬升,就降低对这个走势的预期权重。
反过来,价格横盘但换手率持续在高位,这种背离往往更有意思。它说明大量筹码在同一个价格区间反复易手,原有持仓结构在被重塑。这种状态持续时间越长,后面一旦选择方向,幅度往往越大。我一般会把这类标的放进重点观察池,但不提前预判方向,等它自己走出来再说。
还有一种容易被忽略的背离是长假前后的。节前最后一个交易日往往缩量,换手率天然偏低,这时候算出来的分位会失真。我的处理是把节前节后那几个交易日单独标注出来,不纳入分位判断。
5.3 新手最容易踩的五个坑
第一个坑是死记阈值。看到换手率超过10%就觉得是放量,完全不看流通盘。这个前面说过了,同一套数字在不同市值上含义差了十万八千里。
第二个坑是混用口径。今天看软件默认的流通股本换手,明天换成自由流通换手,两套数字放在一条时间线上比较,结论必然是错的。选定一套就一直用下去。
第三个坑是只看单日不看趋势。单日换手率受事件影响太大,公告日、除权日、指数调整日都可能出异常值。至少要看5日和20日均线,看趋势而不是看单点。
第四个坑是把高换手等同于好。高换手只是说明交换剧烈,交换剧烈既可能是资金进场,也可能是资金出逃。方向得靠价格位置和价格走势来判断,指标本身给不了方向。
第五个坑是忽略流动性成本。换手率低的标的,就算信号再漂亮,实际进出时的冲击成本也可能吃掉大部分空间。我一般会设一个最低换手率门槛,比如20日均换手率不低于0.8%,低于这个数的一律不碰,不是因为信号不好,而是因为不好买也不好卖。
这些坑我基本都踩过一遍。最疼的一次是拿一套小盘股的参数直接套到大盘股上,筛出来几十个信号,回测结果惨不忍睹,后来才发现根子就在阈值上。
我个人在实际操作中的体会是,换手率最大的价值不在于给你一个买卖点,而在于帮你快速判断“这个位置有没有人在认真交易”。一个换手率长期趴在0.3%的标的,不管它的图形多好看,短期内都很难有像样的行情,因为根本没有足够的参与者来推动。反过来,一个换手率持续处在高分位的标的,至少说明它现在是被关注的,至于是往哪个方向走,那是下一步要解决的问题,不是换手率本身能回答的。把这一点想清楚,很多纠结就自然消解了。