量价结构选股
> ## ⚠️ 使用前必读
>
> 本技能是量化研究工具,不构成任何证券投资建议。 作者不具备证券投资咨询业务资格,与文中可能提及的任何上市公司均无利益关系。
>
> - 运行前提:本地须已安装通达信系客户端,并把日线数据下载到最新交易日。 本技能不联网抓行情,全部读自客户端安装目录下的 vipdoc/*/lday/*.day。通达信没有统一的默认安装路径——官方版常装 C:\new_tdx,券商定制版目录名各不相同(申万宏源是 zd_swhy_gm,其它券商又是别的名字)。脚本会按「同时存在 vipdoc\ 与 T0002\」这个结构特征自动探测,找不到时用 --root 手动指定。详见「先定位通达信安装目录」。
> - 技能输出的是「按固定规则筛出的清单」与「按固定公式算出的分数」,不是买卖推荐。
> - 技能只读价格与成交量,看不到公司赚不赚钱、有没有造假、公告了什么。技术形态与公司质量没有必然关系。
> - 86% 是「七年里 84 个交易日、13,207 笔模拟交易」的历史统计,未扣交易成本,不代表未来表现。
> - 窗口不开时的正确输出是「不买」。窗口关闭时强行使用第二层条件,胜率只有 51.5%,与抛硬币无异。
>
> 完整条款见 DISCLAIMER.md,共十二条,请在使用前完整阅读。
这个技能在做什么
只用量价(开高低收、成交量)和由此派生的 K 线结构,回答三个问题:
- 今天该不该买 —— 市场层择时
- 买什么 —— 个股结构筛选
- 什么时候卖 —— 卖出纪律
三层是串联的。第一层不开,第二层的票一只都不要。
一句话结论(先看这个)
> A 股随机买入 20 日胜率 46.5%。纯量价 + 结构,最高只能做到「在特定日子买一篮子票,20 日胜率 86%」。
> 这 86% 不是「每天都能赚」的意思——七年里只有 84 个交易日符合条件,一年约 12 天。
> 「精选个股」在这个策略里不提高胜率,只提高单笔涨幅。任何试图挑出「最好的 5 只」的做法都会让胜率掉到 76–80%。
三层判定
第一层 · 市场窗口(择时)
三个条件同时满足才开窗口:
| 条件 | 门槛 | 含义 |
|---|---|---|
| 20 日跌超 20% 的股票占比 | ≥ 10% | 恐慌级别(比例型指标,不随年份漂移) |
| 全市场 20 日涨幅中位数 | ≤ −3% | 普跌 |
| 上证在 250 日区间的相对位置 | < 60 | 已经从高位跌下来(这条最关键) |
第三条是全部条件里最容易被忽略、又最救命的一条。实证:
| 指数 250 日位置 | 天数 | 20 日胜率 | 中位收益 |
|---|---|---|---|
| 0–10 | 8 | 89.3% | +17.2% |
| 10–20 | 10 | 87.5% | +16.9% |
| 20–30 | 10 | 79.5% | +9.2% |
| 30–40 | 8 | 75.4% | +9.7% |
| 40–60 | 46 | 83.3% | +10.7% |
| 60 以上 | 32 | 47.2% | −5.1% |
同一套买点,在「指数还在高位」时只有 47.2%(等于抛硬币),在「已经从高位跌下来」时是 75–89%。
2026 年 6 月那一整段就是反例:连续 18 个交易日在恐慌区,但指数还在 4000 点上方刚开跌,组合胜率 21–41%、中位 −3% 到 −15%。判为「窗口关闭」的 32 天全部滤掉。
第二层 · 个股结构(选股)
四条同时满足:
| 条件 | 门槛 | 对应传统说法 |
|---|---|---|
| 20 日跌幅 | ≤ −12% | 跌透(急跌段) |
| 60 日箱体宽度 | > 45% | 这段箱体波动空间够大,确实在低位 |
| 收盘在箱体内的位置 | < 20% | 贴着箱底 |
| 当日量 / 250 日均量 | ≤ 0.6 | 缩量(卖压枯竭) |
同时剔除 20 日内价格真实波动天数 < 15 的僵尸股(这类样本 20 日收益 100% 精确为 0,会把统计带偏)。
⚠️ 这四条里只有「箱体宽度」在稳定加分。 逐参数敏感性实测(见 references/params.md):
ret20从 −8% 收到 −20%,信号级胜率只在 86.3–87.5% 之间晃 → 「跌得多」本身不是 alphabox_pos从 10% 放到 60%,只掉 0.7pp → 「贴箱底」影响收益、不影响胜率vq从 0.6 收到 0.4,胜率反而降到 84.2%;放到 1.5 倍均量升到 87.6% → 「缩量」在恐慌窗口内不成立box_w60每加 5pp 门槛稳定 +0.7–1.3pp → 唯一单调加分的个股条件
也就是说,这四条的主要作用是把篮子从 528 只压到 157 只(可执行、可分散),
alpha 几乎全部来自第一层的市场窗口。想简化时,可以只留 box_w60 > 45% 一条加 vq ≤ 0.8,结论基本不变。
第三层 · 卖出
默认纪律:持有 20 个交易日到期平仓 + −8% 硬止损。
不要加花活。实测(13,029 笔):
| 卖出方式 | 胜率 | 平均收益 | 平均持有 |
|---|---|---|---|
| 死拿 20 日 | 86.7% | +12.7% | 20.0 日 |
| 最高点回撤 8% 卖 | 76.2% | +8.3% | 14.9 日 |
| 止盈 +20% / 止损 −8% | 75.8% | +9.4% | 14.3 日 |
| 止损 −8%(唯一保留) | 75.6% | +9.7% | 17.2 日 |
| 跌破 MA10 卖(等 5 天) | 73.1% | +7.0% | 11.8 日 |
| 跌破 MA20 卖(等 5 天) | 73.1% | +6.2% | 11.2 日 |
所有技术卖点都在减损。 原因很简单:在恐慌底买入时,价格必然在 MA10/MA20 之下,均线类信号在头几天一定触发,等于刚买就卖。
五要素对照:顶 / 底 / 建仓 / 中间形态 / 卖出
技术分析的传统要素在本技能里的落点,一张表说清:
| 传统要素 | 本技能里叫什么 | 用什么算 | 实证结论 |
|---|---|---|---|
| 顶 | ⑤顶部派发 | pos250≥75 + 顶背离 / 长上影≥45% / 放量大阴 |
窗口内 37.9%,可以「不买/减仓」,不能用来给底部仓位止损 |
| 底 | ⑥破位下杀 + 底背离 + 双底/头肩底 | newlo20 + C<MA20 + MA20 下行;价格新低但 DIF 抬高;两个低点抬高 |
破位下杀窗口内 69.5%,是全表最高的买入信号 |
| 建仓 | ②筑底建仓 | box_w60≤35 + pos250≤55 + 量能 0.5–1.6 倍 + 转折点≥4 + 箱位≥30% |
窗口内只有 53.1%,比破位下杀低 16pp。横盘意味着还没跌够 |
| 中间形态 | ③突破启动 + ④上升中继 | 破 60 日箱顶且量≥1.2 倍;均线多头 + 中继旗形/收敛三角 | 35.6% / 37.9%。这是全场最差的买点 |
| 卖出 | 第三层纪律 + sell_score |
20 日到期、−8% 止损、exit.py |
死拿 20 日 86.7%/+12.7% 最优,13 种技术卖法全部减损 |
这张表最重要的一行是「中间形态」。 教科书把突破、中继、均线多头当买点,在这份数据里它们是 35–43%,
比随机买入的 46.5% 还低 3–11pp。原因不难理解:这两类形态在指数高位出现得最多,而指数高位恰好是最差的入场环境。
它们的正确用法是「识别自己在什么位置」,不是「看到就买」。
「建仓」与「底」的区别也要注意:横盘筑底不是底,破位下杀才是底。
想找底,要看的是「创新低 + 缩量」,不是「横住了不跌」。
六阶段与九形态(判据 + 实证)
技能把每只票归入一个结构阶段,用于报告判读。注意方向:数据里「好看的形态」多半是卖点。
| 阶段 | 判据 | 20 日胜率 | 窗口内胜率 |
|---|---|---|---|
| ①下跌趋势 | 默认 | 48.2% | 62.3% |
| ②筑底建仓 | 60 日箱宽 ≤35% + 250 日位置 ≤55% + 量能 0.5–1.6 倍 + 转折点 ≥4 个 + 箱位 ≥30% | 47.7% | 53.1% |
| ③突破启动 | 收盘破前 60 日箱顶且量 ≥1.2 倍均量 | 42.2% | 35.6% |
| ④上升中继 | 均线多头 + 250 日位置 ≥50% + 中继旗形 | 43.0% | 37.9% |
| ⑤顶部派发 | 250 日位置 ≥75% +(顶背离 或 长上影 ≥45 或 放量大阴) | 42.4% | 37.9% |
| ⑥破位下杀 | 创 20 日新低 + 收盘 < MA20 + MA20 下行 | 54.0% | 69.5% |
形态单条的 20 日胜率(基准 46.5%):
| 形态 | 样本 | 胜率 | 中位 | 窗口内胜率 |
|---|---|---|---|---|
| 创 60 日新高 | 345,411 | 41.4% | −2.59% | 34.0% |
| 60 日箱体突破 | 767,988 | 43.0% | −2.06% | 35.8% |
| 突破 + 放量 1.5 倍 | 329,128 | 41.2% | −2.67% | 35.2% |
| 均线多头排列 | 2,050,105 | 43.2% | −1.85% | 39.0% |
| 中继旗形 | 163,329 | 43.7% | −1.70% | 45.4% |
| 顶背离 | 134,328 | 44.3% | −1.46% | 37.7% |
| 双底颈线突破 | 239,501 | 44.3% | −1.58% | 40.3% |
| 底背离 | 264,721 | 49.9% | 0.00% | 64.4% |
| 均线空头排列 | 2,373,170 | 51.6% | +0.45% | 66.3% |
| 创 20 日新低 | 481,475 | 52.5% | +0.69% | 67.8% |
读法:这是 A 股均值回复的直接证据。教科书上的买点(突破、均线多头、创新高)在 20 日尺度上全是负 alpha;
教科书上的卖点(破位、均线空头、创新低)反而是买点。顶部结构(顶部派发 42.4%、顶背离 44.3%、创新高 41.4%)
确实可以用来「不买 / 减仓」,但不能用来给底部买入的仓位做止损。
先定位通达信安装目录
通达信系客户端没有统一的默认安装路径,同一份技能在不同人电脑上路径几乎都不一样。先确认这件事,再跑脚本。
常见安装位置
| 版本 | 典型路径 | 说明 |
|---|---|---|
| 通达信金融终端(官方,32 位) | C:\new_tdx |
官方默认路径,最常见 |
| 通达信金融终端(官方,64 位) | C:\new_tdx64 |
64 位安装包的默认路径 |
| 官方版装在 Program Files | C:\Program Files\TdxW<br>C:\Program Files (x86)\TdxW<br>C:\Program Files\Tongdaxin |
部分安装包会装到这里 |
| 自定义盘符 | D:\new_tdx、E:\new_tdx … |
装的时候改了路径,很常见 |
| 券商定制版 | C:\zd_swhy_gm(申万宏源)<br>其它券商形如 zd_<缩写>、<券商名>TdxW |
目录名由券商决定,无规律可循 |
券商定制版是最大的不确定项。它和官方版的内核、数据结构完全一样,只是目录名和界面换了皮——所以不要靠猜目录名,靠结构特征判定。
判定标准:看目录结构,不看目录名
一个目录只要是通达信安装目录,同一层下必然同时存在:
<安装目录>\
├── vipdoc\ ← 行情数据(关键)
│ ├── sh\lday\ ← 沪市日线 sh600000.day
│ ├── sz\lday\ ← 深市日线 sz000001.day
│ └── bj\lday\ ← 北交所日线(部分版本才有)
└── T0002\ ← 个人设置(关键)
└── hq_cache\ ← 股票名称表 shs.tnf / szs.tnf
vipdoc 和 T0002 两个文件夹同时存在,基本可以确定就是它。
三个查找方法(任选其一)
- 快捷方式法(最快):右键桌面上的通达信图标 → 属性 → 「快捷方式」页 → 看「目标」栏,去掉末尾的
TdxW.exe就是安装目录。 - 任务管理器法:打开客户端 →
Ctrl+Shift+Esc→ 找到TdxW.exe进程 → 右键「打开文件所在位置」。 - 客户端内查法:菜单「系统」→「盘后数据下载」,窗口左下角直接显示当前行情数据的保存路径。
找不到桌面图标就用第 2 种,券商定制版同样适用(进程名都叫 TdxW.exe)。
脚本会自动探测
三个脚本的 --root 都可以省略,省略时按以下顺序自动定位:
- 依次检查上面的常见安装位置(官方默认路径)
- 都没有,则扫描各盘符根目录(
C:到J:)下含vipdoc的文件夹,Program Files、券商目录等再往下探一层 - 仍找不到,打印上面三个查找方法并退出
探测到多个时会用第一个并打印其余候选,可以用 --root 指定想要的。探测耗时通常不到 1 秒。
--root 的写法很宽松,下面四个写法等价,都会自动归一到安装目录:
--root C:/new_tdx
--root C:/new_tdx/vipdoc
--root C:/new_tdx/vipdoc/sh
--root C:/new_tdx/vipdoc/sh/lday
注意:路径里尽量不要有中文和空格(原作者踩过读取失败的坑)。另外 --root 指向错误目录时会打印警告并列出实际探测到的目录,照着改即可。
怎么用
# 1. 今日该不该买、买什么(--root 省略即自动探测安装目录)
python scripts/screen.py
# 换一台电脑、自动探测失败时,手动指定
python scripts/screen.py --root C:/new_tdx
python scripts/screen.py --root "C:/Program Files/TdxW"
# 只要前 15 只,并导出通达信自选股
python scripts/screen.py --top 15 --ebk pick.ebk
# 查某个历史日(复盘用)
python scripts/screen.py --asof 2026-06-10
# 2. 复现全部统计(约 30 秒)
python scripts/backtest.py
# 3. 持仓卖出检查
python scripts/exit.py --holdings holdings.csv
# 4. 把研究报告渲染成 HTML(自动加红色免责横幅)
python scripts/report_html.py --md 报告.md --out 报告.html --care-ref 第六节
数据来自通达信本地目录(.day 文件),不需要联网。约 5,200 只 A 股,单次扫描 40 秒左右。运行时会打印实际使用的数据目录,方便核对有没有读到别的副本。
生成报告时的强制格式(不可省略)
只要你用本技能的结果写报告,不管是给谁看、多短、什么格式,都必须按这条来。
位置:H1 标题之后、元信息(数据日等)之前
H1 报告标题
免责横幅(独立段落,红字加粗,紧跟标题,中间不插任何东西)
元信息(数据日 / 报告日 / 使用技能 / 市场窗口)
正文第一章
不能压在标题上面,不能放文末、脚注、页脚,不能做成折叠面板或小字浅灰。
文本:一字不改
本文不构成投资建议。本文是量化筛选的过程记录与公开财务数据的机械计算,作者不具备证券投资咨询业务资格,未在持牌机构任职。“建仓/关注/满仓/等”仅为评分档位名称,不是操作指令。文中所有胜率均为历史回测统计,未扣交易成本,不代表未来表现。使用前请先读{章节}《投资谨慎要求》。
{章节} 按报告实际章节编号填写(通常「第六节」)。报告若没有「投资谨慎要求」章节,必须补一个,不能删掉这句话。
样式:整段红色加粗
#b42318 + font-weight:700,整段所有文字统一,段内若有加粗字/代码也要覆盖成红色(否则会被模板的深蓝 strong 染色)。具体 CSS 与六种禁止改法见 references/report-banner.md。
用脚本保证,不靠手写
# Word(推荐交付形态:Markdown + Word 两份)
python scripts/md2docx.py --md 报告.md --out 报告.docx
# HTML(需要网页版时)
python scripts/report_html.py --md 报告.md --out 报告.html --care-ref 第六节
report_html.py 会检查横幅是否存在、位置是否正确、样式是否生效,并在缺失时自动插入标准文本:
· MD 已有免责横幅,位置正确(H1 之后)
· 横幅已渲染为红色加粗
· 结尾免责声明已移入页脚
· 谨慎/免责章节已加视觉区隔
md2docx.py 按既有排版规范生成 .docx:标题黑体、正文宋体、1.5 倍行距、首行缩进 2 字符、表格三线表、页脚页码、标题带大纲级别(Word 导航窗格可展开)。横幅在 Word 里同样必须同时满足「红色 + 加粗」,只加粗不染红不合格。
纯文字交付时
Markdown 或聊天回复里无法显示红色,就必须在正文开头单独一段完整复述该文本并整段加粗,不得缩写成「仅供参考」之类。
铁律
- 窗口不开就报空仓,不要放宽条件凑数。窗口关闭时按同样形态买入是 51.5%,和抛硬币没区别。
- 窗口开了就买一篮子,不要只挑 5 只。全篮子 86%,挑前 5 只 79.6%。挑选只提高单笔涨幅(+13.6% vs +10.8%),降低胜率。
- 20 日到期就走。不要因为「还在涨」就拿着,20 日之后胜率开始下降(25 日 85.6%、30 日 84.1%)。
- 不要用均线做止损。要用就用固定百分比 −8%。
- 报告要写清楚这是「一年约 12 次机会」的策略,不是每天能用的。用户问「今天买什么」而窗口关闭时,答案就是「不买」。
- 不要把本技能的结论套到别的形态上。这里所有数字都标定了「恐慌窗口 + 底部结构」这一组条件,换个入口条件全部作废。
已知缺口
med_ret20 ≤ −3%这条是冗余的:从 0% 放到 −6% 结果一个数都不差(因为「跌超 20% 的股票占 10%」已蕴含普跌)。保留只是为了人能一眼读懂。要减一条条件时先减它。nz20 ≥ 15对本规则无影响(其余条件已自动排除僵尸股),但对全局单因子统计是决定性的。它是统计卫生条件,不是选股条件。- 2020 年没有样本(
gate[:260]=False剔掉了前 260 个交易日用于预热 250 日均线),实际覆盖 2021-2026。 - 2022 年只有 73.2%、2024 年 74.4%,是五年里最低的两年,其余三年 92–95%。年份间波动是真实存在的,不要把 86% 当成每年都能拿到的数。(这两个数来自
backtest.py的真实价格路径口径;references/params.md用收盘价标签,会高 1–2pp。) - 「指数位置 < 60」这条是看到 2026 年 6 月失败之后补的。它的依据是 250 日位置分桶的单调性(不是单一年份),但读者应当知道它带事后选择的成分。敏感性扫描显示 50–70 是平台,80 以上才崩,所以 60 这个具体值不敏感。
- 胜率按「信号级」和「按日」两个口径给。信号级 86% 是「随机从篮子里抽一只」的胜率;按日 81% 是「每个交易日作为一个样本」的胜率。后者更低是因为同一天几百只票同涨同跌,84 天不是 13,207 次独立试验。
- 没有考虑涨跌停无法成交、ST 股、退市整理期。实盘要自己剔除 ST 与停牌股。
免责声明
本技能不构成任何证券投资建议,不构成对任何证券的推荐、要约或投资顾问意见。作者不具备证券投资咨询业务资格。技能只读取价格与成交量,不判断公司价值,不预测股价方向,所有形态判据均为对已发生序列的事后归类。
使用时必须清楚四件事:
- 86% 是历史统计,不是收益承诺。 口径为 2021-2026 年 84 个交易日、13,207 笔模拟交易中 20 日后收盘价高于买入价的占比;未扣佣金、印花税、滑点与冲击成本;按日统计只有 81.3%;2022 年 73.2%、2024 年 74.4%。
- 回测按理论价成交。 涨停买不进、跌停卖不出、停牌不能交易。可成交性是回测与实盘之间最大的鸿沟。
- 技能对基本面完全无感知。 篮子中可能包含 ST、退市整理期、财务造假、即将暴雷的公司,实盘必须自行剔除并逐个核查公告。
- 参数带事后选择成分。 「指数位置 < 60」是看到 2026 年 6 月失败样本后补充的;
med_ret20与ret20近乎冗余;vq方向与直觉相反。策略的稳健性建立在极少数承重条件上。
不得删除本免责声明后分发;不得用于任何需要证券投资咨询资质的商业活动(收费荐股、代客理财、私募募集宣传等)。
完整条款共十二条,包括作者身份与利益关系、受托关系否认、回测固有局限、数据风险、模型风险、策略风险、使用者自身风险、责任限制、分发合规、法律适用等,见 DISCLAIMER.md。使用本技能即表示已完整阅读并接受全部条款。
据此操作,盈亏自负,风险自担。