Sequoia-X 项目研究站 · 突破信号
Sequoia-X 突破信号:四套条件的阈值逐条摊开
四个突破类策略覆盖不同的入场逻辑:海龟突破盯 20 日新高并要求成交额过亿,均线放量盯 MA5 上穿 MA20 且量能放大到 1.5 倍,高窄旗形先要求 40 日出现强动量、再看最近 10 天是否极度收敛并缩量,RPS 突破则在全市场做 120 日涨幅排名、只取前 10% 且接近区间高点的那批。下面每一条都对着源码,标出最小 K 线数、排序规则和想改阈值该动哪一行。
Sequoia-X 四套突破条件的横向对照
先看它们各自要多少根 K 线、命中后怎么排序,再逐条看细节。
| 策略类 | 核心判定 | 最少 K 线 | webhook_key | 命中后排序 |
|---|---|---|---|---|
| TurtleTrade | 突破前 20 日最高价 + 成交额过亿 + 阳线且真涨 | 21 根 | turtle | 按流通市值降序 |
| MaVolume | MA5 上穿 MA20 金叉 + 放量 1.5 倍 | 20 根 | ma_volume | 源码未另行排序 |
| HighTightFlag | 40 日强动量 + 10 日极度收敛 + 高位抗跌 + 缩量 | 40 根 | flag | 源码未另行排序 |
| RpsBreakout | 120 日涨幅全市场排名前 10% + 靠近 120 日高点 | 滚动最高按 60 根起算 | rps | 按 RPS 过滤后输出 |
| 共同数据源 | 前三个走 engine.get_ohlcv(symbol) 逐只读本地 SQLite | — | — | 第四个例外,见下文 |
| 异常处理 | 单只股票计算失败写 WARNING 日志后跳过,不影响其他标的 | — | — | — |
| 数据频率 | 全部基于日 K(后复权)计算,不使用分钟数据 | — | — | — |
Sequoia-X 海龟突破:20 日新高 + 流动性门槛
sequoia_x/strategy/turtle_trade.py,四条件同时成立才入选。
| 条件 | 源码判定 | 适用场景 | 注意点 |
|---|---|---|---|
| 突破新高 | last["close"] > last["high_20"],其中 high_20 = high.shift(1).rolling(20).max() | 捕捉放量突破形态 | 窗口先 shift(1) 再滚动,比较基准不含当日,避免「自己突破自己」 |
| 流动性 | last["turnover"] > 100_000_000(成交额过亿) | 过滤成交清淡标的 | 阈值写死在源码里;想放宽就改这个数字,同时会影响命中数量 |
| 实体阳线 | last["close"] > last["open"] | 拒绝高开低走的大阴线 | 源码注释写明这是为拒绝「郑州煤电式」诱多走势加的防守条件 |
| 真涨 | last["close"] > prev["close"] | 排除假阳线(收盘仍在昨收之下) | 与上一条同时成立才算,两条都在源码里 |
| 流通市值排序 | 对命中标的按流通市值降序 | 让大市值标的排在前面 | 四个策略里只有它会额外联网:用 baostock 不复权数据(adjustflag="3")现场算流通市值 |
| 流通市值算法 | 流通股本 = 成交量 ÷(换手率 ÷ 100);流通市值 = 流通股本 × 不复权收盘价 | 缺少市值数据时的替代算法 | 换手率为 0 或解析失败时该股不参与排序(取默认 0) |
Sequoia-X 均线放量:金叉当日必须有量能确认
sequoia_x/strategy/ma_volume.py,两个条件同时成立。
| 条件 | 源码判定 | 适用场景 | 注意点 |
|---|---|---|---|
| 金叉 | 昨日 ma5 < ma20 且今日 ma5 > ma20 | 捕捉趋势由弱转强的时点 | 必须用「昨天在下、今天在上」两行数据判断,只看今天无法确认是穿越而非持续在上 |
| 放量 | volume > vol_ma20 × 1.5(20 日均量的 1.5 倍) | 要求资金配合,过滤无量金叉 | 倍数写死在源码中,改 1.5 会显著影响命中数量 |
| 均线口径 | 收盘价的 rolling(5) 与 rolling(20) 简单均值 | 标准日均线口径 | 三条均线(ma5、ma20、vol_ma20)都用 rolling 计算,都包含当日这一根;与高窄旗形里按 iloc[-21:-1] 取「不含当日」均量的写法不同,对照源码时别混用 |
| 最小样本 | 少于 20 根 K 线直接跳过 | 次新股与数据不足的标的 | 回填起始日期越早,可用标的越多 |
| 计算方式 | 全部列向量化(rolling),不逐行遍历 | 全市场逐只计算时的性能保障 | 受影响的标的仍逐只读库,整体耗时与标的数量成正比 |
| 输出 | 返回命中代码列表,日志记「MaVolumeStrategy 选出 N 只股票」 | 对接飞书推送 | 空清单不推送,只记日志 |
Sequoia-X 高窄旗形:README 只提到三个条件
sequoia_x/strategy/high_tight_flag.py,注意第 3 条没有出现在 README 的描述里。
| 条件 | 源码判定 | 适用场景 | 注意点 |
|---|---|---|---|
| 强动量 | 过去 40 天 high40 / low40 > 1.6(区间振幅超 60%) | 先确认有过一波拉升 | 区间最低价为 0 的记录会被跳过,避免除零 |
| 极度收敛 | 最近 10 天 high10 / low10 < 1.15(振幅低于 15%) | 确认已经进入窄幅整理 | 窗口是最近 10 根 K 线,横盘时间长短直接影响命中 |
| 高位抗跌(README 未提) | low10 >= high40 × 0.8 | 确保整理发生在高位而不是回落途中 | 这条是形态成立的关键,去掉它会把「跌下来横住」也算进旗形 |
| 缩量 | 今日成交量 < 前 20 日均量的 0.6 倍 | 量能收敛确认 | 均量用 iloc[-21:-1] 取值,不含当日;想确认口径要对着源码看切片 |
| 最小样本 | 少于 40 根 K 线跳过 | 保证 40 日窗口有值 | 四个条件里门槛最高,通常是命中数量最少的策略之一 |
| 排序 | 源码未按振幅或涨幅排序,按遍历顺序输出 | 需要排序时自行在推送侧处理 | 服务端不做二次加工,清单顺序等于本地库遍历顺序 |
Sequoia-X RPS 突破:直连数据库的策略
sequoia_x/strategy/rps_breakout.py,它不走 engine.get_ohlcv,而是一次性读全表。
| 环节 | 源码实现 | 适用场景 | 注意点 |
|---|---|---|---|
| 取数 | sqlite3.connect(engine.db_path) + pd.read_sql("SELECT symbol, date, close, high FROM stock_daily") | 需要全市场横向排名 | 只取四列,是它与逐只读库策略主要的实现差异 |
| 涨幅窗口 | rps_period = 120,按 symbol 分组 shift(120) 后算涨跌幅 | 欧奈尔式相对强度口径 | 只有单个交易日的数据时算不出涨幅,会被 dropna 剔除 |
| 排名 | 对最新交易日做横截面 rank(pct=True) × 100,取 >= 90 | 只保留全市场相对强度排名最靠前的一档 | 阈值 rps_threshold = 90 是可改类属性,放宽会明显增加命中数 |
| 接近高点 | close >= roll_high × 0.90,滚动最高 min_periods = 60 | 排除已经明显回落的强势股 | 这是「允许距离高点 10% 以内」,不是严格创新高 |
| 排序 | 按最新交易日筛选后输出 symbol 列表 | 结果已是强势股集合 | 与海龟策略不同,这里不做市值排序 |
| 空库行为 | 读取失败记 error 并返回空列表;数据为空同样返回空 | 未回填就跑日常模式时 | 不会抛异常中断主流程,但会静默没有结果,需对照日志判断 |
stock_daily 全表读进内存做分组计算。库越大内存占用越高,这是它与其他策略在资源表现上的主要区别;数据量增长后如果出现内存压力,先看这一条。想调 Sequoia-X 阈值:放宽或收紧改哪里
阈值全部写在策略源码里,没有配置文件;改完需要重新运行日常模式生效。
| 想达到的效果 | 改哪个值 | 直接后果 | 注意点 |
|---|---|---|---|
| 海龟命中更多 | 下调成交额阈值 100_000_000,或放宽 rolling(20) 窗口 | 纳入更多小成交额标的 | 只改数字不改比较符时,注意别把阳线与真涨条件一起删掉 |
| 均线放量更敏感 | 把放量倍数 1.5 调低 | 无量金叉也会入选 | 这就是「量能确认」这道门槛的作用,改之前先想清楚 |
| 旗形更容易成型 | 把 10 日振幅上限 1.15 或 40 日动量下限 1.6 放宽 | 更多整理形态被纳入 | 高位抗跌条件 low10 >= high40 × 0.8 也应同步复核 |
| RPS 门槛放松 | 下调 rps_threshold(当前 90) | 从「前 10%」放宽到更大比例 | 改动只影响排名门槛,窗口长度仍是 120 日 |
| 策略被临时停用 | 从 main.py 的策略列表里移除该行 | 该策略不再执行与推送 | 这属于结构性改动,建议在版本管理下进行,便于回溯 |
| 历史窗口不足 | 调小 START_DATE 后重跑回填 | 可用标的与窗口值都增加 | 回填耗时随区间拉长上升,且默认起始日期为 2024-01-01 |
突破信号常见问题
Sequoia-X 的策略条件会随版本变化吗?
会。阈值目前全部硬编码在策略源码里(如 1 亿成交额、1.5 倍量、1.6 与 1.15 的振幅比、90 的 RPS 门槛、120 的窗口),项目 V2 是一次重写,后续版本可能调整。以仓库当前源码为准。
Sequoia-X 四个策略会同时命中同一只股票吗?
会。策略之间相互独立、各自返回清单,main.py 按顺序执行并分别推送,源码没有做跨策略去重或合并。同一只股票同时出现在多条飞书卡片里属于正常现象。
Sequoia-X 为什么高窄旗形多一个条件?
README 只写了强动量、极度收敛和缩量三条,源码里还有一条「近 10 日最低价不低于 40 日最高价的 80%」的高位抗跌判断。按源码为准,本站把这条如实补上。
Sequoia-X 的 RPS 为什么直接读整张表?
因为相对强度需要全市场横截面排名:rank(pct=True) 只有在拿到所有股票的同期涨幅之后才有意义。逐只读库无法完成横向比较,所以它用 pd.read_sql 一次取全表。
Sequoia-X 命中数量很少是不是坏了?
不一定。四个策略的门槛本身较严,且当日行情不匹配时命中为零很正常——源码在空清单时只记日志不推送。判断是否异常应看日志里每个策略的结果行是否有输出、以及数据是否已更新到当日。
这些信号能直接拿去下单吗?
不建议,也不在本项目范围内。项目没有回测引擎、没有实盘下单、没有止损与仓位管理,输出仅是收盘后的候选清单。本站不对任何信号的有效性作承诺,所有内容仅供研究参考。