跳转至

CLXS0017 支撑/阻力区间反转(笔级别)

模型定位:S0016 的笔级别变种——把「分型区间支撑/阻力反转」从线段级别下沉到笔级别,更早进场、更近观察。

为什么需要笔级别

S0016 的交易单位是线段——一个线段至少包含 5 笔,走完需要不短的时间。等线段确认结束、最低价进入历史支撑区间,反弹可能已经启动了一段。

但支撑区间的博弈不是只在线段级别才发生:一笔下跌到达前低附近,同样会遭遇多空争夺,只是尺度更小、反应更快。打个比方:S0016 是看整个战役的攻防线,S0017 是看一场巷战的据点争夺——战场大小不同,「守住据点 = 反转信号」的逻辑是一样的。

一句话说清 S0017 赚什么钱:价格回到历史笔低点支撑区间后反转的钱;不赚趋势延续、不赚突破、不赚震荡市的来回手续费。

形态定义与判定条件

S0017 与 S0016 共享同一套核心逻辑框架,区别在操作级别。买入条件:

  1. 当前是一个向下笔,且包含至少 5 个 SWING(保证这笔下跌不是毛刺,而是充分展开的走势);
  2. 这笔的最低价,进入了前 2 个向下笔的支撑区间(分型区间)——历史支撑被触及;
  3. 收盘价高于前序笔的低点——空头没有完全掌控;
  4. 出现反转确认信号(pinbar、MACD 金叉、MA5 拐头等)——不是到了就买,是等市场确认。

卖出条件完全镜像:向上笔最高价进入前 2 个向上笔的阻力区间,收盘价低于前序笔高点,出现反转信号。

与 S0016 的参数对照

维度 S0016(线段级) S0017(笔级别)
操作单位 线段(stretch) 笔(bi)
信号序列 stretch_sigs wave_sigs
最少内部结构 5 笔 5 个 SWING
参考历史 前 2 个同方向线段 前 2 个同方向笔
支撑定义 分型区间 分型区间
最大回踩次数 3 次 3 次
信号确认 SignalUtils SignalUtils

核心逻辑(伪代码)

// 收集所有向下笔(包含 ≥5 个 SWING 的才算有效笔)
for each 笔 in down_bis[2:]:
    if 笔.swing_count < 5: 跳过        // 下跌不够充分
    if not 笔.has_zone: 跳过           // 没找到分型区间

    // 对比前 2 个向下笔的支撑区间
    for prev in [笔-1, 笔-2]:
        if 笔.最低价 > prev.区间上沿: 跳过   // 没进入支撑区

        // 从最低价开始,逐根K线检查
        for K线 in 笔.最低价..当前:
            if 开始向上走: 停止
            if 跌破区间下沿-1ATR: 停止(破位)
            if 收盘价 <= prev.极端价: 继续(空头仍强)
            if 反转确认信号: → 生成买入信号

信号值与参数

信号值编码方式与 S0016 一致,occurrence 表示同一区间的第几次回踩(最多 3 次):

信号值 = 方向 × (17 × 1000 + 回踩次数 × 100 + 入场点类型)
信号值 含义
17101 买入,第 1 次回踩,结构信号
17207 买入,第 2 次回踩,MACD 交叉
17305 买入,第 3 次回踩,MA5 拐头
-17101 ~ -17307 卖出侧对称(数值取负)

三次回踩的信号类型可能不同——第 1 次 pinbar、第 2 次 MACD 金叉、第 3 次 MA5 拐头——市场在用不同的方式说同一件事:这个价位有人守。

参数说明:

参数 默认值 说明
WAVEOPT 1560 笔控制参数
STRETCHOPT 0 线段控制参数
TRENDOPT 0 走势控制参数
MODELOPT 17 模型参数,低位数字 17 表示 CLXS0017

一个隐蔽 Bug 的修复(2026-05-27)

S0017 上线后修复过一个扫描边界的隐蔽 Bug。缠论中笔的形成有两个阶段:信号值 0.5 表示笔已初步成立(半确认),1.0 表示笔完全确认。

修复前的代码在扫描买入信号时,只在向上笔「完全确认」(1.0)时才停止扫描:

// BUG:只在向上笔完全确认时才停止扫描
if (wave_sigs[i] == 1.0f)
    break;

这导致向上笔已经初步成立(0.5)但还没走完时,代码不会停止——向上笔已成立的 K 线被错误地当作当前向下笔的延续来检查,可能产生不该出现的买入信号(注意:不是信号缺失,而是多余信号)。修复后停止条件补上半确认状态(卖出侧同理补上 -0.5f):

// FIX:向上笔成立(无论半确认还是全确认)就停止扫描
if (wave_sigs[i] == 1.0f || wave_sigs[i] == 0.5f)
    break;

这个 Bug 的教训值得记住:代码只处理了「确认」状态,遗漏了「半确认」状态。单独看确认状态的处理逻辑完全正确,但「逻辑正确」和「业务完整」之间,差了一个中间状态。边界差一格,信号就可能多一个。

适用与失效环境

  • 适合品种:流动性好、波动有节奏的品种——A 股个股、指数 ETF、商品期货。流动性差的品种笔结构不清晰,分型区间缺乏参考意义。
  • 适合周期:30 分钟线以上。太小周期的笔结构太碎,支撑区间反复被穿透,信号质量下降。
  • 失效环境一:单边趋势市——笔的低点不断下移,历史支撑区间很快被甩在后面,没有信号(也不该有)。
  • 失效环境二:极度窄幅震荡——分型区间重叠模糊,信号频繁但反转幅度极小,赚不到钱白交手续费。
  • 失效环境三:跳空缺口频发——缺口直接跳过区间,「进入区间」这个核心条件失效。

与 S0016 怎么选

维度 S0016 S0017
级别 线段 笔
信号频率 低 较高
进场时机 线段确认后 笔确认后
信号可靠性 较高(结构更大) 较灵敏(结构更小)
适合风格 稳健、中长线 灵活、短中线

简单说:看大结构用 S0016,想更早进场用 S0017。两个可以叠加使用——S0017 先出信号试探,S0016 确认后再加仓。

形态示意

场景 A:笔级别快速反转——向下笔(7 个 SWING)最低价进入前两个向下笔的分型区间,pinbar 确认触发买入;此时 S0016 还在等线段走完:

场景 C:假信号过滤——向下笔只有 3 个 SWING,虽然价格回到了前低区间,但下跌结构不完整,不触发信号。5 个 SWING 的门槛过滤了大量噪声:

原文另有「场景 B:区间多次测试」(同一区间三次回踩、三种不同确认方式)的示意图,因图床失效未能收录。

调用示例

命令行选股:

python -m fqlite.screen.clxs --model-opt 17
fqctl stock screen clxs --model-opt 17

Python 端函数签名与其他 CLXS 模型一致:

highs = stock_day_data.high.to_list()
lows = stock_day_data.low.to_list()
opens = stock_day_data.open.to_list()
closes = stock_day_data.close.to_list()
volumes = stock_day_data.volume.to_list()
length = len(highs)
model_opt = 17  # CLXS0017
sigs: list[float] = fq_clxs(
    length, highs, lows, opens, closes, volumes,
    wave_opt, stretch_opt, trend_opt, model_opt)

建议先用历史数据回测,观察信号在你关注的品种上的分布和表现,再决定是否用于实盘。量化策略的第一步永远是验证,不是信任。

知识来源

  • 公众号文章《FqCopilot 新模型 S0017:S0016 的笔级别变种——更早进场,更近观察》(2026-05-10)——判定条件、参数对照、场景示意、适用与失效环境
  • 公众号文章《FqCopilot缠论插件:S0017 形态的一个隐蔽 Bug,今天被修了》(2026-05-27)——半确认状态边界修复
  • 《fqcopilot 选股模型信号值规范》——信号值编码