作 者:老余捞鱼
原创不易,转载请标明出处及原作者。

文中示例仅用于技术讨论,不构成任何操作建议。
量化策略开发应以学习和技术交流为目的。
本号不荐股、不卖课、不承诺收益。
市场有风险,请合法合规投资。
本文约 5000 字 | 预计阅读 12分钟,后有验证源代码,建议先收藏。
10月9日上午(上周四的V型),创业板指盘中一度跌超3%,3000点没守住。11点14分砸到2933点,这是全天最低。下午拉了回来,收盘翻红在3043点。全天全市场成交19167亿,比前一天多了2224亿。
盯着那条分时线看了很久。上午砸出去的钱,是真想跑;下午拉回来的钱,也是真想买。同一天、差不多的点位,两种完全相反的动作挤在一起。
下午两点半开始一直在想:拉回3000点的那些钱,到底是接盘,还是抢反弹?
这事没标准答案,但有一样东西能看。
市场里有句老话:新手死于追高,老手死于低吸。
会不会有人觉得这就是句正确的废话,说的人太多,跟没说一样。后来把这两种死法拆进4174个样本里看,才发现它们死在同一个地方:没看懂承接。
一、承接不是成交量
其实这个定义很简单:价格往下砸时,有没有资金愿意主动把抛压吃掉,把价托住。有,就是承接。
很多人一看下跌有量,就说有人在接。我第一反应也是这样。多数低吸翻车,就翻在这个理解上。
大家可以尝试把10月9日那天的成交量和承接来回捋一下,看能不能想通这一点:成交量只是结果,承接看的是力量对比。
一笔成交,可能是买方主动吃卖单,也可能是卖方主动砸买单。都是放量,恐慌盘不计成本地互砍是放量,大资金在下面张着口袋接货也是放量。屏幕上的量柱一模一样,性质差远了。

盘中同样砸下去5%,收盘位置不一样,是承接还是踩踏,基本就写在脸上了。
区分也不复杂。有承接的盘面,筹码一砸出来就有人吃,价格跌不动,很快收回去。没承接的盘面,只要有人卖,价格就往下滑,越跌越没人进场,最后就成了踩踏。
说到底,承接就是看砸下去之后,价格还能不能站回来。这一条我也是摔了跟头才学会的。以前总以为,盯成交量就够了。
二、追高的人,死在高处的承接是假的
先说追高。
上涨的时候盘面最热闹,大单不断,量柱窜高。热闹劲儿太容易让人当成资金强。可上涨途中的大单,可能是存量资金左手倒右手倒出来的。考验在大资金开始兑现那一刻,上方抛压涌出来,下方还有没有人接。
你可以翻翻自己的持仓,看看有没有这种形态。我差点也这样,看到第三天才反应过来。
我从历史数据里把“盘中冲高3%以上、收盘又回落回去、还放着巨量”的形态单独拉了一组,535个样本。这组之后20个交易日内,95.3%跌破当天最低点,20日超额收益-1.72%,四组里最差的一组。
冲高回落还放量,翻译过来就是:上面有人借着热度往外倒货,下面接的人不够用了。
这种级别的亏法我身边没见过,媒体报道里倒是有一个。2021年新能源行情最热的时候,据多家媒体公开报道,一名在校大学生用生活费买进某新能源头部企业,两个月赚了120%。他误以为自己摸到了财富密码,把全部积蓄砸进去,还借了3万元网贷加码。板块见顶后这只票从最高点跌了75%,利润亏光,倒欠两万多,最后休学打工还债。
他不是输在选错了股票。他输在最高点那几天,盘面上的承接早就断了,他没看。
这种事不是散户专属。上交所资本市场研究所施东辉、清华五道口张晓燕和哥伦比亚大学的Charles M. Jones合作过一篇论文,用的是上交所2016到2019年超过5300万个账户的日度交易数据。结论是账户10万元以下的散户年均亏损20.53%,行为特征排第一位的就是追涨杀跌。
方向做反了还越做越勤快,是大多数账户的常态。同期机构投资者平均收益11.22%,这组数字我盯了半天,才接受一个事实,亏钱的主因不是运气,是动作。
三、低吸的人,死在把放量当成了承接
再看低吸。老手翻车主要死在这里。
拿2024年2月的微盘股流动性危机当案例最合适。那几天把“放量不等于承接”演了个遍。
先看数字。2024年1月1日到2月8日,沪深300只跌了1.93%,中证500跌5.14%,中证1000跌15.19%,中证2000跌27.49%,万得微盘股指数跌了40%以上。同一段时间,同一个市场,越小的票跌得越狠。

那几天每天都有天量成交。我当时对着量柱发了会儿呆,越看越慌,这么多资金在换手,居然没一笔是接盘。
那些量到底是什么。雪球产品集中敲入,券商交易台被迫对冲,四倍杠杆的DMA产品被强平,中性产品夺路而逃。卖方不计成本,买方被动挨打,每一笔成交都是恐慌盘在互砍。
量化机构世纪前沿在给持有人的说明里写过一组数字,中证2000与沪深300的收益率差距多次超过3个标准差,2月5日那一天达到7个标准差。用他们的话说,已经进入黑天鹅行情。
我第一次读这段说明的时候,把那组标准差数字看了好几遍。3个标准差已经是极端,7个相当于把十年的极端行情压进一天。
经济观察报那段采访,我印象最深。一家上海量化私募的从业者说,春节前两周经历了史无前例的超额回撤,老板决定研发团队春节集体加班,退掉了回老家的票。一位干了十几年的量化人,那几天每天只睡几个小时,反复问自己是不是把客户的资金配置在了无法控制的境地。
老手们不是不知道危险。很多人是在2月5日、6日看到巨量成交,判断底部到了,进去了。然后微盘股又跌了两天。可这承接2月8日才第一次露面,国家队开始买中证2000ETF,当天指数涨8.75%,接近500只个股涨停,危机解除。
从2月5日到2月8日,中间隔着三天。这三天里所有的放量,都不是承接。
往前翻一百年,同样的剧本利弗莫尔演过。1908年他听信棉花大佬的建议做多棉花,最初只有6万包的头寸,为了托住价格不断加码,最后滚到44万包,300万美元的本金亏掉270万。这位当时世界上最顶尖的投机者,不是不懂盘口,是在“我已经投了这么多,价格不能再跌了”的执念里,把加码扛单当成了承接。
后来我才想明白,那时候他眼里已经没有盘面了,只剩自己的仓位。价格跌下去之后有没有人接,市场说了算,仓位说了不算。
四、我自己跑了一遍
用腾讯行情接口拉了217只A股2021年1月到2026年10月的前复权日线,一共136044根K线。代码是随机抽的,主板、创业板、科创板都有。然后设了一个统一的入场条件,盘中一度跌超3%,成交量不低于前5日均量的1.5倍。满足条件的样本一共4174个。
这4174个样本,我按收盘位置分成几组。分完有点意外。我一开始以为真承接能占三成,结果一百个里不到6个。真承接那组,收盘拉回到前收负0.5%以内,还留了根明显的长下影。无承接那组,收盘仍跌超3%,收在全日最低点附近,1657个样本。剩下的是中间地带。
收益算法是按信号日收盘价虚拟进场,持有20个交易日按收盘价结算,超额收益用同期全部样本的等权平均收益做基准。脚本放在文末,这张表可以自己跑一遍。

| 组别 | 样本数 | 5日平均收益 | 20日平均收益 | 20日内跌破当日最低 |
|---|---|---|---|---|
| A 真承接,砸深后收回 | 211 | +2.73% | +4.42% | 63.0% |
| B 无承接,砸深收地板 | 1657 | +0.98% | +2.51% | 89.3% |
| C 跌深放量全部样本 | 4174 | +0.40% | +1.59% | 82.0% |
| D 高位冲高回落放量 | 535 | -0.09% | +0.59% | 95.3% |
这张表最要紧的是收盘位置。同样是砸深3%加放量,收盘能收回来的一组,之后20日内再创新低的概率63.0%,收在地板上的一组89.3%,差了26个百分点。信号日进场,后面会不会还有更低的价,信号日在收盘那一秒就已经告诉你一大半。
还有一个结果我一开始没想通。我本来以为只要收盘能拉回就算承接,又跑了一个宽口径,不要求长下影,只要收盘拉回。结果这一组反而是最差的之一,20日超额-1.33%。去查了数据才明白,混进来了大量低开高走的小反抽,盘中根本没砸深,反弹也没有量。承接的前提是先有真实的抛压,然后才谈得上接住。没有砸下去,就谈不上接。
最泼冷水的是真承接那一组,20日超额收益只有0.09%,几乎就是零。也就是说,看到承接信号冲进去,长期看并不能让你多赚钱。它的价值不在进攻,在排雷。它告诉你这根K线下面有没有坑,至于能不能涨,要看后面的量能不能跟上来。
说实话,跑出这个结果的时候愣了一下。把A组这211个样本的日线又翻了一遍,确认不是分组的时候算错了。以前总觉得讲承接的文章,多半把它讲成进场信号。承接真有那么灵吗?数据给的面目要朴素得多,我更愿意把它看成一张体检单,不是一张奖券。
五、三个能落地的判断
能直接用的有三个,都是盘中盯一眼就能问自己的。
第一,砸下去多久爬回来
这是承接最直接的形态。真承接的盘面,急跌之后几分钟到几十分钟内止跌,然后买盘把价格推回均价甚至前价附近,日线上留一根长下影。没承接的盘面是另一种样子,砸下去就趴着,每次抬头都被压回去,低点一个比一个低。

判断标准不是跌了多少,是跌完之后收回来多少、用了多久。我一开始只盯跌幅,后来才反应过来,收复速度才是真信号。真承接组之后5日平均收益+2.73%,无承接组只有+0.98%。同样的跌幅,收回来的速度就是多空力量最诚实的投票。
第二,量放在了哪一段
下跌放量只说明有人卖,反弹放量才说明有人愿意在更高的价位接。
下跌放量、反弹缩量,这是抛压出逃。一反弹就有人卖,资金只想走不想来。有效承接是另一种样子,下跌放量承接,反弹时量能跟得上,抛盘被吃掉之后还有人继续往上推。

我那个宽口径组为什么差,差在量上。收盘拉回但反弹无量的样本,后面20日超额是负的。
第三,关键位置有没有人防守
所谓的支撑,从来不是画出来的。一个价格之所以成为支撑,是因为真的有资金愿意在那个位置花钱防守。
2024年2月19日早上有个细节。百亿私募灵均投资的程序在开盘1分钟内抛出沪深两市股票合计25.67亿元,深证成指和上证指数应声下挫,两天后沪深交易所对它限制交易并公开谴责。一分钟25亿的卖单,任何支撑在它面前都是纸糊的,因为那一刻整个市场没有人来得及承接。这个数字让我第一次意识到,支撑这个词在极端时刻有多脆弱。
我盯了很多次盘口才发现,支撑是守出来的,不是跌出来的。跟25.67亿那一分钟是一个道理。看到关键位置被一根大阴线直接击穿,毫无抵抗,不用找理由,那个位置没有资金愿意守。支撑要等资金用盘面证明它有效,不能提前埋伏去赌它一定起作用。
六、承接也会说谎,也会失效
把承接讲成包治百病,是这类内容最常见的坑。有两件事得说清楚。
盘口的承接可以造假。买1、买2、买3挂出大托单,看起来像有人护盘,但挂单不等于成交。承接是主动吃单,挂在那里给你看的是布景。高位的大托单尤其要警惕,价格一路阴跌、托单却频繁撤换,多半是演戏。低位砸下去能快速收回的承接,比任何托单都可信,因为那需要真金白银成交出来。
承接信号本身也会被极端行情反杀。杭州龙旗基金在2024年2月7日下午评估行情过于极端,出于风控收紧了选股域和风格因子,结果2月8日国家队拉中证2000ETF,中小票报复性反弹,中位数上涨7.35%,他们前一晚的风控动作恰好错过了最大的反弹。专业机构按纪律做事,也会被承接信号的突然反转打一闷棍。说实话那两天我挺替他们可惜的,风控没错,行情也没错,只是没撞上。那承接还算数吗?算,但它有自己的保质期。
承接这个东西,只能回答一个问题,此刻此刻多空谁占上风。它回答不了明天会不会有利空,也回答不了板块逻辑会不会崩。如果你现在正等一个承接信号进场,我建议你先把止损线写下来。0.09%的超额摆在那儿,赌不起。
七、总结起来就四句话
这一轮跑下来,我把有用的东西压缩成四句话,前后改了两天,可以贴在显示器边上。

砸下去有没有人接,看收盘位置,不看盘中跌多深。
放量不是承接,反弹时的量才是承接。
支撑不是画出来的,是资金守出来的。
承接只说明当下,不承诺明天,止损照旧。
这四句话救不了收益。说不好能帮上多少,但能少踩坑。20日超额0.09%这个数摆在那儿,承接救不了你。它们不构成任何进场依据,就是一张排雷清单,帮我避开那些看起来便宜、底下没有人的坑。
下次价格砸下来,手先停一下,看一眼收盘收在哪儿。这个数骗不了人。
#资金承接 #盘口语言 #放量下跌 #低吸陷阱 #量价关系 #A股 #交易纪律 #量化实证 #止损 #老余捞鱼
风险提示:本文为盘面现象与公开数据的个人复盘,所有统计均为历史数据回测,不构成任何投资建议,不承诺任何收益。历史规律不代表未来表现,承接信号在极端行情中可能失效。市场有风险,入市需谨慎。
完整脚本
本文实证分两段脚本,均用Python标准库实现,可复跑。
repro_fetch.py,随机抽500只A股代码(seed=42),并发请求腾讯行情fqkline接口拉2021-01-01至2026-10-10前复权日线,存repro_data/kline.csv(实际成功217只,136044根K线;其余代码不存在或长期无成交)。
repro_analyze.py,读入kline.csv,按以下口径分组统计。信号条件为盘中最低价较前收跌超3%,且当日成交量不低于前5日均量1.5倍。A组要求收盘拉回至前收-0.5%以内且下影线占全日振幅一半以上;B组要求收盘仍跌超3%且收在全日振幅最低20%区域;D组要求盘中冲高3%以上、收盘回落至前收+0.5%以内、上影线占振幅一半以上且放量。收益以信号日收盘价虚拟进场,持有1/5/10/20个交易日按收盘价结算,超额收益为个股收益减同期全部样本等权平均收益。输出repro_results.json。
# -*- coding: utf-8 -*-
# 资金承接实证(精简版,分组统计核心逻辑)
# 数据:repro_data/kline.csv,列code,date,open,close,high,low,vol
import csv, json, statistics, collections
HOLD = [1, 5, 10, 20]
data = collections.defaultdict(list)
with open("repro_data/kline.csv", encoding="utf-8") as f:
for row in csv.DictReader(f):
data[row["code"]].append((row["date"], float(row["open"]), float(row["close"]),
float(row["high"]), float(row["low"]), float(row["vol"])))
for c in data:
data[c].sort(key=lambda r: r[0])
# 未来N日收益与同期样本池等权基准
fwd = {}
pool = collections.defaultdict(lambda: collections.defaultdict(list))
for code, rows in data.items():
n = len(rows)
for i in range(n):
fwd[(code, i)] = {}
for k in HOLD:
if i + k < n:
r = rows[i + k][2] / rows[i][2] - 1.0
fwd[(code, i)][k] = r
pool[rows[i][0]][k].append(r)
bench = {d: {k: statistics.mean(v) for k, v in kv.items()} for d, kv in pool.items()}
groups = collections.defaultdict(list)
for code, rows in data.items():
n = len(rows)
for i in range(5, n - max(HOLD)):
d, o, c, h, l, v = rows[i]
pre = rows[i - 1][2]
rng = h - l
if pre <= 0 or rng <= 0:
continue
vol5 = statistics.mean(rows[i - k][5] for k in range(1, 6))
low_drop = l / pre - 1.0
vr = v / vol5 if vol5 > 0 else 0
rec = {"code": code, "date": d, "new_low20": any(rows[j][4] < l for j in range(i + 1, min(i + 21, n)))}
for k in HOLD:
rec["r%d" % k] = fwd[(code, i)].get(k)
b = bench.get(d, {}).get(k)
rec["e%d" % k] = rec["r%d" % k] - b if (rec["r%d" % k] is not None and b is not None) else None
if low_drop <= -0.03 and vr >= 1.5:
groups["C"].append(rec)
if c >= pre * 0.995 and (min(o, c) - l) / rng >= 0.5:
groups["A"].append(rec)
elif c <= pre * 0.97 and (c - l) / rng <= 0.2:
groups["B"].append(rec)
if (h / pre - 1.0) >= 0.03 and c <= pre * 1.005 and vr >= 1.5 and (h - max(o, c)) / rng >= 0.5:
groups["D"].append(rec)
out = {}
for g in "ABCD":
rs = groups[g]
out[g] = {
"样本数": len(rs),
"5日平均收益%": round(statistics.mean(r["r5"] for r in rs) * 100, 2),
"20日平均收益%": round(statistics.mean(r["r20"] for r in rs) * 100, 2),
"20日超额%": round(statistics.mean(r["e20"] for r in rs) * 100, 2),
"20日内跌破当日最低%": round(sum(r["new_low20"] for r in rs) / len(rs) * 100, 1),
}
print(json.dumps(out, ensure_ascii=False, indent=2))
Be First to Comment