Files
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

161 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CLI 参考 — 策略选股扫描
## 策略选股扫描(screen
把策略翻转成选股器:给定一个策略,扫描全市场找出今天触发买入信号的股票,再对这些信号做历史回测排名。**纯离线数据**,读取本地通达信 `.day` 文件,全市场约 30-60 秒。
两步走工作流:
**第一步:信号扫描(scan**
```bash
# 扫描沪深全 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):
```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**
```bash
# 按夏普比率排名(默认)
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 放大)。
```bash
# 中长期稳健强势 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):
```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` 同步最新数据。