Files
easy_tdx_max/docs/cli-screen.md
T
awayingsandClaude bfb8789ae8 docs: README CLI 章按域拆至 docs/cli*.md + chanlun/data-local(含参数表去重合并)
- cli.md 命令总览(补 chanlun/zhuoyao/bias-signal 漏项)+ 按域导航
- cli-market / cli-finance / cli-indicators / cli-screen / cli-backtest 按域拆分
- cli-backtest 吸收 backtest_usage CLI 章的 backtest/optimize 参数表与 --indicators 说明
- chanlun.md(CLI+Python)、data-local.md(warehouse+offline)按主题合一
- 策略 demo 图复制至 docs/images/demo/,图片与内联链接路径改写为 docs 内相对路径

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-08 23:21:26 +08:00

7.1 KiB
Raw Blame History

CLI 参考 — 策略选股扫描

策略选股扫描(screen

把策略翻转成选股器:给定一个策略,扫描全市场找出今天触发买入信号的股票,再对这些信号做历史回测排名。纯离线数据,读取本地通达信 .day 文件,全市场约 30-60 秒。

两步走工作流:

第一步:信号扫描(scan

# 扫描沪深全 A,找出 RSI 超卖触发的股票
easy-tdx screen scan --strategy strategies/rsi_reversal.py --output signals.json

# 缩小范围
easy-tdx screen scan --strategy strategies/macd_cross.py --universe sz --output signals.json

# 从自定义股票列表扫描
easy-tdx screen scan --strategy strategies/bollinger_breakout.py --universe my_stocks.txt --output signals.json

# 并发扫描(推荐 4-8 进程,速度提升 4-8 倍)
easy-tdx screen scan --strategy strategies/rsi_reversal.py --workers 4 --output signals.json

# 增量扫描(缓存未修改的 .day 文件,跳过重复计算)
easy-tdx screen scan --strategy strategies/rsi_reversal.py --cache scan_cache.json --output signals.json

输出示例(JSON):

{
  "scan_time": "2026-06-10T18:30:00",
  "strategy": "RSIStrategy",
  "total_scanned": 4832,
  "total_signals": 37,
  "signals": [
    {"code": "000001", "market": "SZ", "signal_date": 20260610, "last_close": 12.35},
    {"code": "600519", "market": "SH", "signal_date": 20260610, "last_close": 1800.0}
  ]
}

第二步:回测排名(rank

# 按夏普比率排名(默认)
easy-tdx screen rank --from signals.json --sort sharpe --top 20 --table

# 按最大回撤排名(越小越好,用 --sort-reverse
easy-tdx screen rank --from signals.json --sort max_drawdown --sort-reverse --table

# 管道模式:一步到位
easy-tdx screen scan --strategy strategies/rsi_reversal.py | easy-tdx screen rank --from - --table

# 补齐股票名称(需要网络)
easy-tdx screen rank --from signals.json --sort sharpe --top 10 --table --names

输出示例(--table):

[*] 信号排名 (按 sharpe 降序, 共 37 只)
══════════════════════════════════════════════════════════════════════════
排名  代码       名称      总收益率  年化收益  最大回撤  夏普   胜率   交易
 *1   SZ300308  中际旭创   45.23%   18.72%   12.35%   1.85  62.5%    16
 *2   SH600519  贵州茅台   38.10%   15.90%    8.21%   1.62  58.3%    12
参数 说明
--universe all(默认,沪深全 A/ sh / sz / 文件路径(每行 "市场 代码"
--vipdoc 离线数据目录(默认自动检测通达信安装路径)
--workers 并发进程数:0 串行(默认)/ 2+ ProcessPoolExecutor 并发(推荐 4-8
--cache 增量扫描缓存文件路径(JSON,mtime 未变的文件自动跳过)
--sort 排序指标:sharpe(默认)/ total_return / max_drawdown / win_rate
--sort-reverse 升序(用于回撤等越小越好的指标)
--names 在线补齐股票名称(默认关闭,只查排名中的几十只)
--count rank 使用最近 N 条 K 线(0=全部,默认 0)

强势股排名(strength

5 / 20 / 60 日涨幅加权合成强势分,从全市场选出"最近最强"的股票。纯离线数据,读取本地通达信 .day 文件,全市场约 30-60 秒(并发可压到 10 秒内)。

三种预设模式:

模式 性格 权重 (w5/w20/w60) 波动率惩罚 适合
steady(默认) 中长期稳健 0.2 / 0.3 / 0.5 除以 vol_20 选"稳着涨"的票,妖股被高波动压低
breakout 近期妖股爆发 0.6 / 0.3 / 0.1 纯加权涨幅 选"短期最猛"的票,妖股本身就是高波动
balanced 三周期均衡 等权 + vol 调整 除以 vol_20 不确定时的安全默认

💡 为什么 breakout 不除波动率? 妖股本质高波动,除以 vol 会把它压下去,与"找妖股"目标矛盾。steady 除以 vol 是为了奖励"稳着涨"的票(vol 小,score 放大)。

# 中长期稳健强势 Top 50(默认 steady 模式)
easy-tdx screen strength --preset steady --top 50 --table

# 近期妖股爆发 Top 20(补齐股票名称)
easy-tdx screen strength --preset breakout --top 20 --names --table

# 三周期均衡
easy-tdx screen strength --preset balanced --top 30 --table

# 自定义权重(自动归一化,5:3:2 = 0.5:0.3:0.2
easy-tdx screen strength --w5 0.5 --w20 0.3 --w60 0.2 --top 30 --table

# 并发扫描(推荐 4-8 进程)
easy-tdx screen strength --preset steady --top 100 --workers 4 --table

# 过滤低流动性(最近 5 日日均成交额 ≥ 5000 万)
easy-tdx screen strength --preset breakout --top 30 --min-amount 50000000 --table

# 缩小范围 + 输出到文件
easy-tdx screen strength --universe sz --top 30 --output sz_strength.json

输出示例(--table):

[*] 强势股排名 [steady] 共 50 只
    数据截止: 2026-06-24 | 中长期稳健强势:权重偏 60 日,波动率惩罚,选出稳着涨的票
════════════════════════════════════════════════════════════════════════════════
排名  代码       名称     现价       5日     20日     60日   波动率   强势分
 *1   SZ300308  中际旭创     85.20    8.12%   15.34%   30.21%  0.0180     9.52
 *2   SH600519  贵州茅台  1800.00    3.25%    5.10%   10.05%  0.0120     6.21

输出示例(JSON):

{
  "scan_time": "2026-06-25T10:30:00",
  "preset": "steady",
  "preset_desc": "中长期稳健强势:权重偏 60 日,波动率惩罚...",
  "data_date": 20260624,
  "total_ranked": 50,
  "ranking": [
    {"rank": 1, "code": "300308", "market": "SZ", "name": "中际旭创",
     "last_close": 85.20, "last_date": 20260624,
     "ret_5": 0.0812, "ret_20": 0.1534, "ret_60": 0.3021,
     "vol_20": 0.0180, "strength": 9.52}
  ]
}
参数 说明
--preset 预设模式:steady(默认)/ breakout / balanced
--w5 --w20 --w60 自定义三周期权重(覆盖预设,自动归一化)
--vol-adjusted / --no-vol-adjusted 波动率惩罚开关(覆盖预设)
--top 返回前 N 名(默认 50
--universe all(默认)/ sh / sz / 文件路径
--min-listed-days 最小上市天数(默认 65,保证能算 60 日涨幅)
--min-amount 最近 5 日日均成交额下限(元,默认 0 不过滤)
--workers 并发进程数:0 串行 / 4+ 并发(推荐 4-8
--names 在线补齐股票名称(默认关闭)
--output 输出 JSON 文件(默认 stdout

⚠️ 数据时效strength 依赖本地 .day 文件。输出中的 data_date / last_date 字段标注数据截止日,请先用 easy-tdx offline sync 同步最新数据。