Sequoia-X 高而窄旗形量化选股策略:手把手跑通强势股旗形形态识别,收盘后自动推送飞书
【免费下载链接】Sequoia-XA股自动选股系统 — 多种技术形态自动扫描,收盘后自动运行并推送飞书项目地址: https://gitcode.com/GitHub_Trending/se/Sequoia-X
你盯盘时发现一只 A 股两个月涨了 70%,随后缩量趴了十天,是歇脚还是出货?手工翻五千只票不现实,你需要一套算得出来的规则替你筛。
📌 这个模块到底在解决什么问题
高而窄的旗形策略解决的是"从全市场系统性找出处于高位盘整阶段的强势股"这个形态识别问题。它处在 Sequoia-X 每日流水线的中段:上游数据引擎先把当日 K 线同步进本地 SQLite,下游推送模块把选中代码路由到专属飞书机器人。
说白了,整条流水线就是"同步数据 → 7 个内置策略并行扫描 → 结果推飞书",HighTightFlag 是其中专管"旗形"的那一个,选中结果由 main.py 统一调度。
🔍 判断逻辑拆解:它凭什么给你信号
策略 high_tight_flag.py 用 4 个硬条件加 1 个样本门槛做判断:
- 强动量(旗杆要够高):近 40 天最高价/最低价 > 1.6。大白话:40 天内至少涨过 60%,没有旗杆谈不上旗形。
- 极度收敛(旗面要够窄):近 10 天最高价/最低价 < 1.15。大白话:最近 10 天振幅压在 15% 以内,横得越窄,越像抛压消化完。
- 高位抗跌(盘整得发生在高位):近 10 天最低点 ≥ 40 天最高价的 80%。大白话:回落不能太深,跌掉两成就不是歇脚而是出货。
- 缩量确认(旗面要安静):今日成交量 < 20 日均量 × 0.6。大白话:盘整必须配缩量,"横而不缩"的旗面不算数。
- 样本量门槛:K 线不足 40 根直接跳过,次新股和数据不全的票进不了候选池。
核心判断就是几行向量化运算,拿这一段看:
tail40, tail10 = df.tail(40), df.tail(10) momentum = tail40["high"].max() / tail40["low"].min() > 1.6 consolidation = tail10["high"].max() / tail10["low"].min() < 1.15 high_level = tail10["low"].min() >= tail40["high"].max() * 0.8 shrink = df["volume"].iloc[-1] < df["volume"].iloc[-21:-1].mean() * 0.6 if momentum and consolidation and high_level and shrink: selected.append(symbol)关键参数都能按行情调:
| 参数 | 默认值 | 通俗解释 |
|---|---|---|
| 动量阈值 | 1.6 倍 | "旗杆"多高才算:40 天高低点之比要超过它 |
| 收敛阈值 | 1.15 倍 | "旗面"多窄才算:近 10 天振幅上限 |
| 高位抗跌下限 | 80% | 旗面最低点不得低于 40 天最高价的这个比例 |
| 缩量倍数 | 0.6 倍 | 今日量要小于 20 日均量的这个比例 |
| 最少 K 线 | 40 根 | 样本量门槛,不够数的票直接跳过 |
📊 数据从哪来,中间做了哪些清洗
数据源是 baostock(免费、免注册、无限流),拉取的是后复权日 K:开盘、最高、最低、收盘、成交量、成交额,统一落在本地 SQLite。所有取数逻辑集中在 engine.py,分两个入口:
- backfill() 全量回填:单线程保守拉取,每 200 只自动重连防长连接超时,单只失败重试 3 次、间隔递增,中断重跑会自动跳过已入库的;
- sync_today_bulk() 日常增量:8 进程并行,每只股票只拉"最后入库日 + 1 天"到今天的缺口,全市场更新 2~3 分钟。
入库前还有三道清洗:
to_numeric统一转数值,收盘价缺失的行直接丢弃;- 只保留 volume > 0 的行,停牌无成交的交易日不会污染窗口统计;
- 表级 UNIQUE(symbol, date) 约束 + 先删后插,杜绝重复脏数据。
选后复权而不是前复权,是因为历史价格不变、增量追加不会全库重算,除权除息也不会让旧数据错乱。
🚀 从克隆到出结果:最小可运行路径
四步出信号,时间大头在首次回填:
- 克隆仓库:
git clone https://gitcode.com/GitHub_Trending/se/Sequoia(需 Python ≥ 3.10); - 装依赖:
uv sync(或pip install .); - 配环境:
cp .env.example .env,填入必填的feishu_webhook_url; - 回填 + 日常跑:
python main.py --backfill(约 12 分钟,约 5200 只),之后每天python main.py(2~3 分钟),配 crontab 在每周五 15:15 收盘后执行即可。
回测与调参方向:
- 默认回填起点 2024-01-01(.env 里 start_date 可改),回测建议至少覆盖一段完整牛熊,两年到三年的日线数据起步;
- 动量阈值 1.6:热闹行情抬到 1.8 压信号,冷清行情放到 1.45 放宽;收敛阈值 1.15 收紧到 1.1 能拿到更硬的旗面;缩量倍数 0.6 调 0.5 信号更敏感。
脱敏案例,某年某新能源龙头:
- 信号出现:40 天高低点之比超过 1.7,急涨后进入 10 天窄幅盘整,量能缩到 20 日均量的一半左右;
- 确认:4 个条件同时命中,收盘后代码被推送到 flag 专属飞书群;
- 后续走势:6 天后放量阳线突破旗面上沿,同期海龟 20 日新高策略也选中了它,双重信号重叠提高了这笔操作的胜率。
和哪些模块搭配效果最好
高而窄旗形本质是"埋伏型"信号(盘整期),和"确认型"策略互补后胜率更高:
- TurtleTrade(turtle_trade.py):20 日新高 + 成交额过亿 + 实体阳线,旗形负责找盘整股、海龟负责确认突破,一伏一跟形成接力;
- RpsBreakout(rps_breakout.py):RPS-120 相对强度排序 ≥ 90,拿它做全市场强度过滤,验证旗形股相对大盘是不是真强;
- LimitUpShakeout(limit_up_shakeout.py):涨停后次日放量收阴但不破支撑,突破后若出现回踩,它提供二次上车参考。
⚠️ 踩过的坑 & 一句话解法
- 现象:第一次跑全策略 0 选股,日志提示"本地无股票数据"。原因:策略只读本地 SQLite,数据库是空的自然选不出票。解法:先执行
python main.py --backfill回填,中断可重跑续传,已入库的自动跳过。 - 现象:周末跑一遍,日志显示"无新数据",但推送的还是前一个交易日的票。原因:非交易日 baostock 没有数据,增量同步返回 0,策略照旧按最后交易日计算。解法:用 crontab 只在工作日收盘后运行,或先看日志里的同步条数再判断推送是否有效。
- 现象:拿软件里的价格和算出来的涨幅对不上。原因:库存的是后复权价,和不复权的行情软件绝对值不同。解法:策略判断全部用价格比率,不受复权方式影响;手工核对时改用同源的复权数据。
这个模块把"找高位盘整的强势股"从盘感变成了 4 个可计算条件。后续版本计划接入盘中数据,把突破时点提前确认,信号从收盘推送升级为盘中预警。
【免费下载链接】Sequoia-XA股自动选股系统 — 多种技术形态自动扫描,收盘后自动运行并推送飞书项目地址: https://gitcode.com/GitHub_Trending/se/Sequoia-X
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考