第 6 章 · 05 上升趋势跌停:错杀机会的捕捉 本节摘要:本节精读 Sequoia-X 的另一类「事件形态」策略——上升趋势跌停。它与上一节的「涨停洗盘」互为镜像:涨停洗盘是「昨日涨停、今日放量阴线」(强势股回踩),上升趋势跌停是「上升趋势中、今日放量跌停」(趋势股错杀)。核心思想:在长期趋势向上、短期突发利空砸出跌停的标的,可能是主力借利空洗盘的良机。Sequoia-X 用三个条件刻画这种形态:昨日 MA20 > 昨日 MA60(上升趋势)+ 今日 close ≤ 昨日 close × 0.905(跌停)+ 今日量 ≥ 20 日均量 × 2(放量)。本节会讲清错杀机会的市场逻辑、三个条件的工程含义、与「真破位下跌」的关键区别,最后用一段可运行的代码让你亲手验证。
本节摘要:本节精读 Sequoia-X 的另一类「事件形态」策略——上升趋势跌停。它与上一节的「涨停洗盘」互为镜像:涨停洗盘是「昨日涨停、今日放量阴线」(强势股回踩),上升趋势跌停是「上升趋势中、今日放量跌停」(趋势股错杀)。核心思想:在长期趋势向上、短期突发利空砸出跌停的标的,可能是主力借利空洗盘的良机。Sequoia-X 用三个条件刻画这种形态:昨日 MA20 > 昨日 MA60(上升趋势)+ 今日 close ≤ 昨日 close × 0.905(跌停)+ 今日量 ≥ 20 日均量 × 2(放量)。本节会讲清错杀机会的市场逻辑、三个条件的工程含义、与「真破位下跌」的关键区别,最后用一段可运行的代码让你亲手验证。
内容来源:原项目上升趋势跌停策略模块精读。
⚠️ 风险提示:本策略是「逆向思维」的产物——捕捉「已经跌停的票」。它依赖「非系统性风险」的修复(错杀股会涨回来),对系统性风险(如熊市)完全失效。使用本策略必须配合大市判断。
阅读完本节,你应当能够:
错杀是 A 股操盘里的一个特殊概念——本来是好股票(长期趋势向上、基本面无问题),短期因非系统性利空(行业政策、突发消息、情绪错杀)被砸出跌停。
阶段 1:长期上升趋势 股价在 MA20 > MA60 的多头排列中稳步上行 ——「**本来是趋势股**」 │ ▼ 阶段 2:突发利空 → 跌停 非系统性利空 / 板块错杀 / 主力借势洗盘 股价放量砸出跌停 ——「**恐慌性抛售**」 │ ▼ 阶段 3:修复(看是否成立) 第二天 / 一周内股价反弹 → 错杀确认 → 机会 继续下跌 → 真破位 → 应该止损
关键点:错杀的本质是「价格被情绪砸出价值洼地」——非系统性风险的修复常常很快。
这是「逆向思维」的实践——在别人恐慌时关注「是不是机会」。
# 条件 1:上升趋势(昨日 MA20 > 昨日 MA60) uptrend = prev["ma20"] > prev["ma60"] # 条件 2:放量跌停 limit_down = today["close"] <= prev["close"] * 0.905 volume_surge = today["volume"] > today["vol_ma20"] * 2.0 if uptrend and limit_down and volume_surge: selected.append(symbol)
df["ma20"] = df["close"].rolling(20).mean() df["ma60"] = df["close"].rolling(60).mean() prev = df.iloc[-2] # 昨日 uptrend = prev["ma20"] > prev["ma60"]
为什么是「昨日」的 MA20 > MA60 而不是「今日」?
为什么不直接用「昨日 close > 30 日前 close」?
limit_down = today["close"] <= prev["close"] * 0.905
和涨停洗盘同理——A 股主板跌停 10%,用 0.905 留出微小的四舍五入容差。
volume_surge = today["volume"] > today["vol_ma20"] * 2.0
为什么必须放量?
💡 核心心法:跌停不可怕,「缩量跌停」才是真危险。「放量跌停」反而可能是「恐慌出清」。
| 维度 | 涨停洗盘 | 上升趋势跌停 |
|---|---|---|
| 关键日 | 昨日涨停 | 今日跌停 |
| 关键位置 | 短中期强势股 | 长期上升趋势股 |
| 触发事件 | 主力主动洗盘 | 非系统性利空 / 主力借势 |
| 信号方向 | 短期回踩后拉升 | 错杀后修复 |
| 投资心态 | 顺势回调买入 | 逆向恐慌买入 |
| 风险点 | 误判为「出货」 | 误判为「真破位」 |
两套策略互为镜像——都是「主力洗盘类信号」——结合大市判断一起用更可靠。
下面这段代码用合成数据演示「上升趋势跌停」的三个条件如何过滤:
# limit_down_demo.py # 可运行:上升趋势跌停策略验证 import numpy as np import pandas as pd def detect_limit_down(df: pd.DataFrame) -> tuple[bool, list[str]]: """返回 (是否错杀机会, 原因列表)""" reasons = [] if len(df) < 60: return False, [f"数据不足 60 根(当前 {len(df)})"] df["ma20"] = df["close"].rolling(20).mean() df["ma60"] = df["close"].rolling(60).mean() df["vol_ma20"] = df["volume"].rolling(20).mean() prev = df.iloc[-2] today = df.iloc[-1] if pd.isna(prev["ma20"]) or pd.isna(prev["ma60"]): return False, ["均线窗口未填满"] uptrend = prev["ma20"] > prev["ma60"] limit_down = today["close"] <= prev["close"] * 0.905 volume_surge = today["volume"] > today["vol_ma20"] * 2.0 if not uptrend: reasons.append(f"非上升趋势:MA20={prev['ma20']:.2f}, MA60={prev['ma60']:.2f}") if not limit_down: reasons.append(f"未跌停:今/昨 = {today['close']/prev['close']:.3f}(需 ≤ 0.905)") if not volume_surge: reasons.append(f"放量不足:今/均量 = {today['volume']/today['vol_ma20']:.2f}(需 > 2.0)") return uptrend and limit_down and volume_surge, reasons def make_real_case() -> pd.DataFrame: """造一个标准错杀:60 日上升趋势 + 今日放量跌停。""" np.random.seed(0) n = 65 # 前 60 日稳步上涨(趋势) close = np.concatenate([ np.linspace(10, 16, 60), # 60 日涨 60% [16, 14.5], # 第 61、62 日(昨日 + 今日) ]) close = close + np.random.normal(0, 0.05, n) high = close + 0.2 low = close - 0.2 # 今日跌停(14.5 相对昨 16 跌 9.4%,**接近跌停**) # 实际场景昨收 16, 今低 14.4, 今收 14.5(开 14.0, 收 14.5) close[-1] = 14.5 close[-2] = 16.0 low[-1] = 14.4 high[-1] = 16.2 volume = np.concatenate([ np.ones(60) * 1e6, [1e6, 2.5e6], # 昨日正常、今日放量 2.5x ]) return pd.DataFrame({"close": close, "high": high, "low": low, "volume": volume}) def make_non_cases() -> dict[str, pd.DataFrame]: np.random.seed(1) n = 65 return { "无趋势(横盘)": pd.DataFrame({ "close": np.concatenate([np.linspace(10, 11, 60), [11, 10.0]]), # 横盘 "high": np.concatenate([np.linspace(10, 11, 60), [11, 10.1]]) + 0.1, "low": np.concatenate([np.linspace(10, 11, 60), [11, 9.9]]) - 0.1, "volume": np.concatenate([np.ones(60) * 1e6, [1e6, 2.5e6]]), }), "缩量跌停(真破位)": pd.DataFrame({ "close": np.concatenate([np.linspace(10, 16, 60), [16, 14.5]]), "high": np.concatenate([np.linspace(10, 16, 60), [16, 14.6]]) + 0.1, "low": np.concatenate([np.linspace(10, 16, 60), [16, 14.4]]) - 0.1, "volume": np.concatenate([np.ones(60) * 1e6, [1e6, 1.2e6]]), # 缩量跌停 }), } if __name__ == "__main__": passed, reasons = detect_limit_down(make_real_case()) print(f"【标准错杀机会】 {'✅ 入选' if passed else '❌ 不选'}") for r in reasons: print(f" - {r}") print() for name, df in make_non_cases().items(): passed, reasons = detect_limit_down(df) print(f"【{name}】 {'✅ 入选' if passed else '❌ 不选'}") for r in reasons: print(f" - {r}") print()
预期输出:
【标准错杀机会】 ✅ 入选 【无趋势(横盘)】 ❌ 不选 - 非上升趋势:MA20=10.95, MA60=10.50 【缩量跌停(真破位)】 ❌ 不选 - 放量不足:今/均量 = 1.20(需 > 2.0)
三个条件协同过滤:「无趋势」被 MA20>MA60 过滤,「真破位」被「放量要求」过滤。
| 维度 | 错杀(机会) | 真破位(风险) |
|---|---|---|
| 长期趋势 | 向上 | 向下或横盘 |
| 跌停当日量 | 显著放量(恐慌出清) | 缩量(无人接盘) |
| 跌停原因 | 非系统性利空 | 系统性风险 / 行业困境 |
| 后续走势 | 通常 1~2 周修复 | 继续下跌 |
| 应对 | 关注 / 试探性买入 | 止损 |
「放量」是核心分水岭——放量跌停是恐慌,缩量跌停是趋势。两条信号逻辑完全相反。
_MIN_BARS = 60| 策略 | _MIN_BARS |
原因 |
|---|---|---|
| 海龟突破 | 21 | 20 日窗口 |
| 均线金叉 | 20 | 20 日均线 |
| 高窄旗形 | 40 | 40 日窗口 |
| 涨停洗盘 | 3 | 3 根 K 线 |
| 上升趋势跌停 | 60 | 60 日均线 |
| RPS | 120 | 120 日窗口 |
上升趋势跌停策略需要 60 根 K 线——为了算 MA60。如果数据不足 60 日,MA60 算不出来,趋势判断无从谈起。
| 市况 | 信号表现 |
|---|---|
| 牛市主升 | 信号质量高——错杀后快速修复 |
| 震荡市 | 错杀真假难辨——常被「真破位」打脸 |
| 熊市初跌 | 几乎全是「真破位」——「错杀」不修复 |
| 行业困境 | 即使趋势股也可能真破位——错杀失效 |
错杀机会只在「非系统性风险」场景下成立——熊市初跌/行业衰退等系统性风险下完全失效。
上升趋势跌停 ✅ ← 本节 │ ▼ 下一节(第 06 节)RPS 相对强度:全市场横向排位
_MIN_BARS = 60:需要 60 日 MA60 数据。配套教学脚本:
images/limit_down_demo.py——可用任意合成数据验证错杀识别。
下一节,我们看最后一类技术面策略——RPS 相对强度:全市场横向排位选强者。