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 高窄旗形的第 4 个条件是什么?
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 |
源码逐条核对:README 和代码有什么不同?
README 只给概述,真正决定选出谁的是下面这几行。以下是 commit 444c0db 里的原样摘录(只删掉了日志与异常处理),四个文件逐一对照。
1. 海龟突破:shift(1) 排除了当日,一字板被阳线条件剔除
# sequoia_x/strategy/turtle_trade.py
df["high_20"] = df["high"].shift(1).rolling(20).max() # shift(1):只跟前 20 个交易日比,不含当日
last, prev = df.iloc[-1], df.iloc[-2]
breakout = last["close"] > last["high_20"] # 条件1 收盘价突破前 20 日最高价
liquid = last["turnover"] > 100_000_000 # 条件2 成交额过亿(单位:元,原始成交额)
is_yang = last["close"] > last["open"] # 条件3 实体阳线
is_up = last["close"] > prev["close"] # 条件4 真涨,排除假阳线
shift(1) 是这份源码里最值得抄的一行:不加它,「前 20 日最高价」会把当日算进去,当日收盘价几乎不可能超过包含自己的最高价,条件会退化。另外注意条件 3 用的是严格大于——一字涨停(开=收)与平开平收都会被这一条剔掉,这也是它「防诱多」注释的实际含义。
2. 均线放量:新股不会误选,但会被静默跳过
# sequoia_x/strategy/ma_volume.py
df["ma5"] = df["close"].rolling(5).mean()
df["ma20"] = df["close"].rolling(20).mean()
df["vol_ma20"] = df["volume"].rolling(20).mean()
golden_cross = prev["ma5"] < prev["ma20"] and last["ma5"] > last["ma20"] # 昨日在下、今日在上
volume_surge = last["volume"] > last["vol_ma20"] * 1.5 # 当日量 > 20 日均量 1.5 倍
上市不足 20 个交易日的股票,ma20 是 NaN;Python 里 NaN 的比较恒为 False,所以它不会被误选,但也不会报错、不会进日志——「明明上市了却没结果」属于正常现象,不是数据坏了。
3. 高窄旗形:README 漏写的第 3 条在这里
# sequoia_x/strategy/high_tight_flag.py
momentum = tail40["high"].max() / tail40["low"].min() > 1.6 # 强动量:40 日振幅 > 60%
consolidation = tail10["high"].max() / tail10["low"].min() < 1.15 # 收敛:近 10 日振幅 < 15%
high_level = tail10["low"].min() >= tail40["high"].max() * 0.8 # README 未写:不得回落到 40 日高点的 80% 以下
vol_ma20 = df["volume"].iloc[-21:-1].mean() # 不含当日的前 20 日均量
shrink = df["volume"].iloc[-1] < vol_ma20 * 0.6 # 缩量:今日量 < 均量 0.6 倍
四条里 README 只写了三条,high_level 是第四条——它把「强势股回踩太深」的情形排除在外。均量口径用的是 iloc[-21:-1](不含当日),与均线放量用的 rolling(20)(含当日)不是同一口径,跨策略比较放量倍数时要注意。
4. RPS 突破:判定是「接近 120 日高点」,不是「创新高」
# sequoia_x/strategy/rps_breakout.py
df = pd.read_sql("SELECT symbol, date, close, high FROM stock_daily", conn) # 一次性读全表
df["close_shift"] = df.groupby("symbol")["close"].shift(120) # 120 个交易日前收盘
df["pct_change"] = (df["close"] - df["close_shift"]) / df["close_shift"]
latest_df["rps"] = latest_df["pct_change"].rank(pct=True) * 100 # 当日横截面排名
roll_high = df.groupby("symbol")["high"].rolling(120, min_periods=60).max() # 窗口 120、最少 60 根
breakout = strong_stocks["close"] >= strong_stocks["roll_high"] * 0.90 # 收盘 ≥ 120 日最高价的 90%
三处细节:①rps_threshold = 90 意味着只取当日涨幅排名前 10%;②突破条件带 0.90 系数,所以它是「强势且离 120 日高点不远」,客观上比「创 120 日新高」宽松;③min_periods=60 让上市满 60 个交易日的次新股也能进入判定,而按字面理解的「120 日高点」本该要求 120 根 K 线。
怎么验证某天的选股结果没算错
项目没有提供「复现当日结果」的命令,但复现路径很短:先确认库里最新日期,再用等价逻辑自己跑一遍,最后和日志计数对齐。下面四步是本站按源码等价写出的复现方法(教程扩展,非官方工具)。
先确认库里到底有几个交易日
-- data/sequoia_v2.db SELECT MAX(date) AS latest, COUNT(DISTINCT date) AS days FROM stock_daily;拿
latest和你以为的交易日对一下。不一致时先补数,否则后面所有对比都没有意义——策略读的是「最后一根 K 线」,不是「今天」。用 SQL 看当日快照
SELECT symbol, open, high, low, close, volume, turnover FROM stock_daily WHERE date = (SELECT MAX(date) FROM stock_daily) AND turnover > 100000000 AND close > open ORDER BY turnover DESC LIMIT 20;这只能筛出「成交额过亿 + 阳线」两个条件,20 日新高必须在同一只股票的连续序列上算,所以下一步用 Python。
用等价逻辑复算海龟突破
import sqlite3, pandas as pd conn = sqlite3.connect("data/sequoia_v2.db") df_all = pd.read_sql("SELECT * FROM stock_daily ORDER BY symbol, date", conn) hits = [] for symbol, df in df_all.groupby("symbol"): if len(df) < 21: continue df = df.copy() df["high_20"] = df["high"].shift(1).rolling(20).max() last, prev = df.iloc[-1], df.iloc[-2] if (last["close"] > last["high_20"] and last["turnover"] > 1e8 and last["close"] > last["open"] and last["close"] > prev["close"]): hits.append(symbol) print(len(hits), hits[:10])这段是
turtle_trade.py的等价重写:条件顺序、边界(21 根 K 线)都保持一致。数量应当与日志里TurtleTradeStrategy 选出 N 只股票的 N 相同。对齐计数、留下快照
# 1) 日志里每个策略都有一行结果 grep -E "Strategy 选出" logs/*.log | tail -10 # 2) 存档当日库文件,便于以后复核 cp data/sequoia_v2.db "data/sequoia_v2.$(date +%F).bak"数量对不上时,先查三处:库内最新日期、是否有整只股票被
volume = 0过滤、以及那一天的推送是否因 Webhook 失败而没出现在群里(日志会留 ERROR)。
_get_market_caps() 里逐只 query_history_k_data_plus)。命中几十只时这一步会明显拉长运行时间,属于源码行为而不是网络故障。突破类信号有哪些失效场景?
「今天选出来了」和「这个规则有用」是两件事。下表每一条的机制都能在上一节的代码里找到出处。
| 场景 | 机制(对应代码) | 怎么发现 | 怎么处理 |
|---|---|---|---|
| 假突破 | 只用当日收盘价与前 20 日高点比较,没有「站稳」确认;次日跌回箱体照样算命中 | 把命中票按次 1 / 3 / 5 日收益分组,看中位数是否还在 0 以上 | 把确认条件(如次日不破当日低点)显式加进规则后重新验证,而不是默认有效 |
| 一字板与平开平收被剔除 | 条件 3 是 close > open,一字涨停(开=收)与十字星都不满足 | 看某只票当天明明涨停却没出现在结果里 | 这是设计取向不是缺陷;要抓一字板必须另写策略,并自行承担买不到的风险 |
| 涨停当天无法在收盘价成交 | 信号由收盘价算出,理论上最早次日成交;涨停封板的票次日高开概率高 | 回测里用信号日收盘价买入,收益会显著好于次日开盘买入 | 回测统一按次日开盘价成交,并单独统计滑点影响 |
| 1 亿成交额门槛对不同价位股票不等价 | turnover > 100_000_000 是固定金额门槛,高价股与低价股对应的换手强度不同 | 看命中票的成交额分布,是否长期被同一类高价股占据 | 把成交额换成换手率或成交额/流通市值再验证,库内没有换手率字段需另取 |
| 次新股样本不足被静默跳过 | 海龟要求 ≥21 根、旗形 ≥40 根、上升趋势跌停 ≥60 根 K 线,不足直接 continue | 统计库内每只股票的 K 线根数分布 | 知道这是「样本不够」而非「条件不符」;回填起始日期越早,样本越完整 |
| 高窄旗形几乎长期零命中 | 四条同时成立:40 日涨幅 > 60%、近 10 日振幅 < 15%、不得回落到高点 80% 以下、当日缩量到均量 0.6 倍 | 连续观察多日该策略的命中数 | 把它当成低频事件而不是日常信号;零命中时先核对库内数据日期,再考虑是否需要放宽 |
| RPS 结果随库体积变慢、变吃内存 | 该策略 pd.read_sql 一次读全表并 groupby,库越大越重 | 观察日常模式耗时随回填区间拉长的变化 | 缩小回填起点、或把 RPS 挪到单独任务;不要把它当成「代码有 bug」 |
信号不等于买点:为什么最快也只能次日成交?
这一页讲的所有条件都用「当日收盘价」判定。也就是说,信号只有在收盘之后才存在——你不可能用产生信号的同一根 K 线的收盘价成交。任何回测如果不处理这个时间差,结果都是假的。
| 时点 | 此刻你知道了什么 | 能做什么 / 不能做什么 |
|---|---|---|
| 交易日 14:50 | 不知道今天会不会触发条件(收盘价未定) | 不能当作「信号已知」。用盘中价硬判条件属于未来函数 |
| 交易日 15:00 收盘 | 条件成立与否此刻确定 | 已经无法成交——A 股当日收盘后不再接受委托 |
| 收盘后(本项目 19:15 触发) | 名单推送出来 | 只能等下一个交易日 |
| 下一交易日 09:30 开盘 | —— | 这是最早的可成交时点。常见假设三选一:次日开盘价 / 次日均价 / 次日收盘价 |
| 下一交易日之后 | —— | 如果次日一字涨停或停牌,可能根本买不到;回测里必须显式处理「买不到」 |
| 数据事实(本站实测) | 读数 | 对回测的含义 |
|---|---|---|
| 相邻交易日的自然日间隔 | 667 个间隔中,142 个(21.3%)间隔 ≥ 3 天;最长 11 天(国庆长假) | 「次日成交」在周五信号与长假前信号上,实际是等 3~11 个自然日,价格跳空风险全部由你承担 |
| 库内最新日期 | 2026-10-09(周五),策略输出全部基于该日收盘 | 回测必须补入信号日之后的数据才能算收益,只用库内数据会得到「零持有期」的假结果 |
| 停牌日的处理 | 入库前过滤 volume = 0,停牌日不写库 | 「下一根 K 线」不等于「下一个交易日」。按 iloc[-1] 取「今天」时,停牌股会拿到更早的日期 |
四条只有收盘后才成立的判定(源码原文对应)
last = df.iloc[-1] # 最后一根 K 线 = 信号日 prev = df.iloc[-2] breakout = last["close"] > last["high_20"] # 用收盘价比较历史最高价 liquid = last["turnover"] > 100_000_000 # 用当日全天成交额 is_yang = last["close"] > last["open"] # 用当日收盘价判实体 golden = prev["ma5"] < prev["ma20"] and last["ma5"] > last["ma20"] # 用收盘价算均线全部依赖
close。所以回测里的成交价必须取df.iloc[-1]之后那一根 K 线的open/(high+low)/2/close,而不是last["close"]。最小验证实验:六步,不用写策略代码
-- 1) 先固定信号日集合(用库里的真实日期,不要用自然日) SELECT DISTINCT date FROM stock_daily ORDER BY date DESC LIMIT 40; -- 2) 对每个信号日、每只票,取出「信号日」与「下一个有数据的交易日」 -- 注意:要用交易日序列的自连接,不能用 date + 1 WITH seq AS ( SELECT symbol, date, open, close, LEAD(date) OVER (PARTITION BY symbol ORDER BY date) AS next_date, LEAD(open) OVER (PARTITION BY symbol ORDER BY date) AS next_open, LEAD(close) OVER (PARTITION BY symbol ORDER BY date) AS next_close FROM stock_daily) SELECT * FROM seq WHERE next_date IS NOT NULL LIMIT 20;然后按「信号日收盘 → 次日开盘」「信号日收盘 → 次日均价」「信号日收盘 → 次日收盘」三种口径各算一次区间涨跌幅,把三个数字并列摆出来。三个结果的差距,就是你「用了哪个假设」的价格。再从中扣掉佣金(双边)、印花税(卖出)与你估计的滑点,才是可比较的净口径。
失败案例的四种典型形态(写验证报告时要能对上号)
形态 为什么会产生(对应本页哪个条件) 怎么在验证里识别 假突破 收盘价刚过 20 日高点一点,次日直接跌回区间内 看「信号日收盘价 / 20 日高点」的超出比例分布,超出 <1% 的那批单独统计 放量诱多 成交额过亿且收阳,但换手来自一次性事件(解禁、大宗、公告) 把信号日与前后 5 日的成交额做对比,只有单日尖峰的样本单列 买不到 次日一字涨停或停牌,回测按开盘价成交是虚的 统计次日 open == high == low(一字板)与次日无数据的样本占比风格切换 形态本身没问题,但整个板块进入下跌,个股被拖下去 把样本按信号日分组统计,若同一天抓出的票普遍同向,说明是市场因子而非形态 写结论时的三条纪律
①不写收益率,除非你有完整的次日成交口径、成本与样本外区间;②不写胜率,除非样本量、持有期、止损规则都写明;③任何结论都要标出「用了哪天的数据、哪只标的池、哪个版本的规则」。这三条不是保守,是让结论能被别人复核的基本前提——Sequoia-X 本身没有回测引擎,也没有官方胜率数据(依据:仓库无 backtest 模块,②级)。
突破信号常见问题
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 命中数量很少是不是坏了?
不一定。四个策略的门槛本身较严,且当日行情不匹配时命中为零很正常——源码在空清单时只记日志不推送。判断是否异常应看日志里每个策略的结果行是否有输出、以及数据是否已更新到当日。
这些信号能直接拿去下单吗?
不建议,也不在本项目范围内。项目没有回测引擎、没有实盘下单、没有止损与仓位管理,输出仅是收盘后的候选清单。本站不对任何信号的有效性作承诺,所有内容仅供研究参考。
我怎么确认某一天的选股结果没算错?
用本页的复现四步:先查 MAX(date),再用等价逻辑复算海龟突破,和日志里 TurtleTradeStrategy 选出 N 只股票 对齐计数。数量不一致时优先怀疑「库内最新日期与目标交易日不一致」,其次查 volume = 0 被过滤与推送失败。复现脚本是本站按源码等价重写的教程扩展,不是官方命令,以官方源码为准。
四个突破策略,先试哪个比较合适?
看你能接受多少噪声:均线放量门槛最低、信号最多(20 日均量 1.5 倍 + 金叉),适合先跑通流程;海龟突破多一道 1 亿成交额与阳线过滤,命中更少但更贴近「放量突破」的直觉;高窄旗形四条同时成立、低频到可能连续多日零命中;RPS 依赖一次全表读取,库越大越慢。四者都只是候选清单生成器,不含买卖点,选择依据应是你能验证多少,而不是命中多少。