技术分析选股-周线 · A/B/H 三档版(H 为唯一买入信号)
把「看图找形态」的经验翻译成可执行的通达信公式,再用本地真实行情验证它到底赚不赚钱。公式负责把感觉变成规则,回测负责把规则变成证据。
> ## ⚠️ 投资免责声明(必读)
>
> 本技能仅用于技术形态筛选与量化研究,不构成任何证券投资建议。作者不具备中国证监会证券投资咨询业务资格。
>
> 回测收益不等于实盘收益,所有数字都未扣交易成本与冲击成本;历史胜率不保证未来表现。据此操作,风险自担。
这一版做了什么
v3.1.0 只保留 A / B / H 三档,其余全部删除(含 v3.0.0 曾保留的 P1 系列)。
原因是实测:把各版本新增的档位混进候选池,胜率是一路下滑的——
| 混合池 | 1.9.2(A/B/H/ALL/G) | 2.3.0(+波浪+F) | 2.6.0(+P1-L) | 2.9.1(+偏离窗口) |
|---|---|---|---|---|
| 8 周胜率 | 53.1% | 50.2% | 49.0% | 48.9% |
拉低它的是这几个档位(同期同口径,随机基准 47.5%):
| 档位 | 信号数 | 8 周胜率 | 相对基准 |
|---|---|---|---|
| P1-L 降级档 | 3,556 | 35.5% | −11.9pp |
| 3 浪回调 / 突破 / 早期 | 2,461 / 2,549 / 3,178 | 37.3 / 37.5 / 40.0% | −7.5 ~ −10.2pp |
| 偏离窗口 18~24% / 18~26% | 885 / 1,170 | 40.0 / 40.1% | −7.4 ~ −7.5pp |
| 洗盘档 W2(日线) | — | 20 日 EV −1.15pp | 负 alpha |
而唯一拿得出手的是 H:
| 档位 | 信号数 | 8 周胜率 | 相对基准 |
|---|---|---|---|
| H 档 | 340 | 77.6% | +30.2pp |
| B 档(H 的母集) | 2,560 | 57.2% | +9.8pp |
所以本版只留 A / B / H。A 档和 B 档作为潜伏池与母集保留,用来对照和观察,不当作买入信号。
何时用
- 每周收盘后想出一份「本周可以买」的清单 →
pick_h.py - 想知道 H 档到底多能打、真实胜率多少 → 读
references/h-guide.md - 想验证某个新条件能不能提高胜率 →
tdx_backtest.py+winrate_lab.py - 想在技术信号上再做一次基本面复筛 →
pick_full.py - 想拿通达信公式自己选 →
assets/sel_h.txt
不建议用它的场合:想要每天都有票(H 档 77% 的周是空的)、想要短线(这是周线、8 周持有)、大资金(日均成交额中位 1.1 亿)。
铁律(每条都有实测支撑)
- 按 60~65% 的胜率预期使用,不要按 78%。 77.6% 是名义值,2024-09-27 一周就出了 130 个信号(占 38.2%)。剔除该两周后 61.4%,剔除 2024 全年 60.5%。
- 不要挑股票。 H 档内部没有可用排序因子。周内排名前 1/3 是 87.0%、后 1/3 是 80.0%,但换成绩效口径后差异消失:每周取前 1~3 只的周均胜率 60~63%,全买是 66.2%,倒序对照也有 64.6%。当周出几只就等权买几只。
- 当周只有 1 只时别做。 历史 36 次、胜率 52.8%、中位 +1.7%;≥2 只时 65.0%。
- 不要改阈值。
1.7 亿卡在 68.9%→61.9% 的断层上,9.5%卡在 50.8%→65.3% 的跳变点上,上下移动都会掉档。 - ST / 退市股必须人工剔除。 本地数据没有历史 ST 标记,回测剔不掉。
- 回测价拿不到。 信号周涨幅中位 10.1%,58% 的信号周已经涨了近一个板,实盘成交价大概率高于回测用的周五收盘价。
快速开始
# 0. 盘后补数据(周末跑之前必做,否则末周只有 4 天,量能与涨幅判据全部失真)
python scripts/patch_day.py --root C:/zd_swhy_gm
# 1. 体检数据(最新交易日距今超过 3 天就别急着出票)
python scripts/check_data.py --root C:/zd_swhy_gm
# 2. 出当周 H 档清单(默认带周内信号数提示,导出 csv + ebk)
python scripts/pick_h.py --root C:/zd_swhy_gm
python scripts/pick_h.py --root C:/zd_swhy_gm --market-filter # 加大盘闸门(历史 82.7%)
python scripts/pick_h.py --root C:/zd_swhy_gm --loose # 空仓时看最接近的 B 档候选
# 3. 一键跑完(体检 → 出票)
python scripts/run_week.py --root C:/zd_swhy_gm
# 4. 验证这套规则的历史成绩
python scripts/tdx_backtest.py --root C:/zd_swhy_gm --mode H --exclude-bj --start 2021-01-04
python scripts/tdx_backtest.py --root C:/zd_swhy_gm --mode H --exclude-bj --market-filter
# 5. 下半段:技术信号 → 基本面复筛 → 分层名单 + 报告
python scripts/pick_full.py --root C:/zd_swhy_gm
通达信手工选股:把 assets/sel_h.txt 全文粘进「公式管理器 → 条件选股公式 → 新建」,选股时分析周期必须选周线。
三个档位:同一套底部结构,三个松紧层级
三档不是三种策略,是同一段行情的三个观察位置——A 是潜伏点,B 是启动点,H 是启动点里挑小盘。
| 档 | 含义 | 比上一档多什么 | 信号数 | 8 周胜率 | 定位 |
|---|---|---|---|---|---|
| A | 跌透、横住缩量、MACD/KDJ 翻红、站上 5 周线 | —(最松) | 10,858 | 51.9% | 左侧潜伏池,不是买入信号 |
| B | A 档 + 当周放量突破 | 量 >1.2 倍 5 周均量 且 周涨 >5% | 2,560 | 57.2% | H 的母集,观察池 |
| H | B 档 + 小盘 + 已确认启动 | 20 周日均额 ≤1.7 亿 且 两周涨 ≥9.5% | 340 | 77.6%(真实 60~65%) | 唯一买入信号 |
两者差距的来源很干脆:A→B 的放量确认只值 +5.3pp,B→H 的两条过滤值 +20.4pp。
所以保留 A/B 的价值不在胜率,而在看清一支票走到了哪一步:在 A 里就该建观察池,进 B 说明放量了,进 H 才是买点。
python scripts/pick_h.py --root C:/zd_swhy_gm --mode A # 左侧潜伏池(一周几十到上百只)
python scripts/pick_h.py --root C:/zd_swhy_gm --mode B # 母集(一周 5~15 只)
python scripts/pick_h.py --root C:/zd_swhy_gm --mode H # 买入信号(默认,一年 59 个)
H 档是什么
H = B 档六条
AND MA(AMOUNT,20) <= 170000000 {20 周日均成交额 ≤ 1.7 亿,只留小盘}
AND C/REF(C,2) >= 1.095 {近两周累计涨幅 ≥9.5%,只要已确认启动}
底层六条(B 档):距 60 周高点回撤 ≥25% → 20 周振幅 ≤45% 且缩量(5 周均量/20 周均量 <0.95)→ MACD 柱连增或金叉(3 周内)→ KDJ 低位金叉(前值 K<45,3 周内)→ 站上 MA5 且 MA5 上行,或 MA5 上穿 MA10 → 放量 1.2 倍且周涨 >5%。
一句话:在「底部横盘缩量 + 指标翻红 + 放量突破」的票里,只挑「小盘 + 已经真涨起来」的那一小撮。
完整拆解、五组对照实验、逐条归因见 references/h-guide.md。
真实成绩单
8 周持有,2021-01 ~ 2026-10,5,273 只沪深 A 股,未扣成本:
| 口径 | 信号数 | 8 周胜率 | 均值 |
|---|---|---|---|
| 名义值(逐笔) | 340 | 77.6% | +12.80% |
| 按信号周聚类 | 69 周 | 65.2% | +7.17% |
| 剔除 2024-09 两周 | 184 | 61.4% | — |
| 剔除 2024 全年 | 167 | 60.5% | — |
| 加大盘闸门 | 249 | 82.7% | +14.44% |
| 全市场基准(同期) | — | 46.7% | +6.78% |
逐年(逐笔):2021 62.5% / 2022 57.1% / 2023 62.1% / 2024 94.2%(占 50.9% 信号) / 2025 66.7% / 2026 40.0%。
但它不是纯 beta:与同日全市场比,全部 69 周超额 +10.9pp,剔除 2024-09 两周后仍 +11.1pp,六年六正(+6.2 / +10.9 / +20.0 / +7.9 / +28.4 / +16.0pp)。
工作日流
第一步:确认数据新鲜
python scripts/check_data.py --root C:/zd_swhy_gm
最新交易日距今超过 3 天,先用 patch_day.py 补齐。末周不满 5 个交易日时,pick_h.py 会提示「成交额/涨幅按 N 天折算,数值偏小」——这时候出的票要打折看。
第二步:出票
python scripts/pick_h.py --root C:/zd_swhy_gm
输出三层:
数据最新周:2026-10-22
B 档母集命中 41 只 → H 档(两条过滤全过)3 只
【正常】当周 3 只,落在 2~3 只档(历史 63.6%)。等权买入即可。
code date close amt20 chg2 dd amp vr score
sh600xxx 2026-10-22 ...
当周 0 只就是空仓,不是故障——H 档一年只出 59 个信号,77% 的周是空的。
第三步:要不要加闸门
| 大盘状态 | 信号数 | 胜率 |
|---|---|---|
| 上证站上 20 周线 | 249 | 82.7% |
| 上证跌破 20 周线 | 91 | 63.7% |
闸门提高胜率的方式是减少出票(2022 年那种年份几乎不出票),不是选股变准。想少做但做更准就加 --market-filter。
第四步:基本面复筛(可选)
python scripts/pick_full.py --root C:/zd_swhy_gm
技术信号 → 东财公开财报五维打分 → 核心 / 观察 / 剔除三层名单 + 七节报告。硬否决项一票出局:ST、TTM 亏损、低价小市值没成交、追高、深跌且周线趋势未修复。
想改条件时怎么验证
不要凭感觉调阈值。本包的方法论是先诊断再调参 + 三重验收:
# ① 单指标分桶,看这个变量到底有没有区分度
python scripts/winrate_lab.py --root C:/zd_swhy_gm attrib --horizon 8
# ② 改一个阈值,复测,与基准对比
python scripts/tdx_backtest.py --root C:/zd_swhy_gm --mode H --exclude-bj --start 2021-01-04
# ③ 三重验收:训练/样本外对照、walk-forward、剔除牛市年份
python scripts/winrate_lab.py --root C:/zd_swhy_gm search --horizon 8 --target 80
python scripts/winrate_lab.py --root C:/zd_swhy_gm verify --horizon 8
三个数字同时改善才留下。只改善一个的,是过拟合。
本包已经用这套流程毙掉一批看起来很美的发现:
| 伪发现 | 训练期 | 样本外 | 问题 |
|---|---|---|---|
| rs4 ≤ 0(4 周跑输指数·补涨) | 89.7% | 44.4% | 方向反了 |
| 启动周涨幅 ≥13% | 72.7% | 42.3% | 追高 |
| chg2 ≥ 13% | 71.6% | 40.0% | 阈值过头 |
| 周内排序因子(综合分取前 1/3) | 93.9% | 87.0% | 时间混淆,换成绩效口径后消失 |
| 3 浪结构三种触发 | — | 37~40% | 全部负 alpha |
文件清单
| 文件 | 用途 |
|---|---|
assets/sel_h.txt |
H 档条件选股公式(主推,粘贴即用) |
assets/sel_b.txt |
B 档母集公式(B = A + 放量突破,观察池) |
assets/sel_a.txt |
A 档公式(五条件底部结构,左侧潜伏池) |
assets/main.txt |
主图指标(均线 + 箱体 + 信号标记) |
assets/score.txt |
0–100 评分副图 |
scripts/pick_h.py |
三档选股器(--mode A/B/H,默认 H;带周内信号数提示、大盘闸门、ebk 导出) |
scripts/run_week.py |
一键:体检 + 出票 |
scripts/tdx_backtest.py |
周线回测(--mode A/B/H,默认 H),分年、分周期、最大回撤 |
scripts/winrate_lab.py |
高胜率实验台(分桶归因、参数搜索、三重验收) |
scripts/pick_full.py |
下半段:技术 → 基本面复筛 → 分层名单 + 报告 |
scripts/fundamental.py |
东财财报抓取与五维打分 |
scripts/datasource.py |
四源行情适配(通达信 / 腾讯 / 东财 / 新浪) |
scripts/check_data.py |
数据体检 |
scripts/patch_day.py |
盘后补日线 |
scripts/diagnose.py |
六条件逐条诊断(为什么没出票) |
scripts/indicator_audit.py |
指标有效性审计 |
references/h-guide.md |
H 档完全手册:公式、归因、真实胜率、两条实战规则、删档依据 |
references/winrate-research.md |
H 档的发现过程(分桶归因 + 三重验收) |
references/backtest-method.md |
回测口径与常见陷阱 |
references/tdx-syntax.md |
通达信公式语法 |
references/data-sources.md |
各数据源差异与本地文件格式 |
references/indicator-audit.md |
指标族有效性结论 |
边界与已知缺陷
- 样本只覆盖一轮完整牛熊(2021-02 ~ 2026-10:2024 涨、2022/2026 跌)。换市场结构,胜率会变。
1.7 亿是绝对值,按当前 A 股成交额分布定的。市场整体放量或缩水后需要重定,届时改成分位数更稳。- 偏小盘,流动性差。日均成交额中位 1.11 亿,千万级资金要分批,冲击成本会吃掉不少。
- ST / 退市股剔不掉,本地数据无历史 ST 标记。
- 信号密度低:59 个/年、23% 的周有票。不能当主力策略,只能当机会来了打一把的卫星策略。
- 2026 年至今 5 个信号、胜率 40%、中位 −11%,说明当前小盘动量环境不在状态。连续几个月不出票、或者出票后成批亏损,就该停手。
- 所有数字未扣交易成本与冲击成本。