Files
Justin Gu f36e2d6a6c feat(screen): v1.15.0 — 强势股排名 + 修复证券类型识别与名称分批查询
新增:强势股排名(screen strength)
- 全市场按 5/20/60 日涨幅加权合成强势分,纯离线扫描
- 三种预设:steady(稳健)/breakout(妖股)/balanced(均衡)
- CLI: easy-tdx screen strength --preset steady --top 50 --table
- Web API: GET /api/v1/market/strength
- 支持自定义权重、成交额过滤、并发扫描

修复:
- _detect_security_type 代码段不全,ETF/基金/科创板/逆回购被误判为 A 股
- screen strength/rank 名称补齐超 80 只时末尾被丢弃(分批查询)

详见 CHANGELOG.md
2026-06-25 03:33:13 +08:00

97 lines
2.6 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.
# 23. 强势股排名(screen strength
按 **5 / 20 / 60 日涨幅加权**合成强势分,从全市场选出"最近最强"的股票。
## 三种预设模式
| 模式 | 性格 | 适合 |
|------|------|------|
| `steady` | 中长期稳健(60日主导 + 波动率惩罚) | 选"稳着涨"的票 |
| `breakout` | 近期妖股爆发(5日主导,纯涨幅) | 选"短期最猛"的票 |
| `balanced` | 三周期均衡 + 波动率调整 | 不确定时的安全默认 |
## 前提条件
需要本地通达信 `.day` 日线数据(扫描纯离线,无网络请求):
```bash
# 同步最新日线数据
easy-tdx offline sync
# 或用通达信客户端下载日线数据到 vipdoc/{sh,sz}/lday/
```
## 示例文件
| 文件 | 说明 |
|------|------|
| `strength_api.py` | Python API 调用(`StrengthRanker` 类) |
| `strength_cli.sh` | CLI 命令示例(`easy-tdx screen strength` |
| `strength_web_api.py` | Web API 调用(`GET /api/v1/market/strength` |
## 快速开始
### Python API
```python
from easy_tdx.screen.strength import StrengthRanker
ranker = StrengthRanker(preset="steady")
results = ranker.rank(top_n=20)
for r in results[:5]:
print(f"#{r.rank} {r.market}{r.code} 强势分={r.strength:.2f}")
```
### CLI
```bash
# 表格输出
easy-tdx screen strength --preset steady --top 50 --table
# 近期妖股 + 补齐名称
easy-tdx screen strength --preset breakout --top 20 --names --table
# 自定义权重(自动归一化)
easy-tdx screen strength --w5 0.5 --w20 0.3 --w60 0.2 --top 30 --table
```
### Web API
```bash
# 启动服务
easy-tdx serve
# 调用接口
curl "http://localhost:8000/api/v1/market/strength?preset=breakout&top_n=20"
```
## 输出字段说明
| 字段 | 类型 | 说明 |
|------|------|------|
| `rank` | int | 排名 |
| `code` | str | 6 位股票代码 |
| `market` | str | 市场(SZ/SH |
| `name` | str | 股票名称(需 `--names` 开启) |
| `last_close` | float | 最新收盘价 |
| `last_date` | int | 数据截止日(YYYYMMDD |
| `ret_5` | float | 5 日涨幅 |
| `ret_20` | float | 20 日涨幅 |
| `ret_60` | float | 60 日涨幅 |
| `vol_20` | float | 20 日波动率(对数收益率标准差) |
| `strength` | float | 强势综合分(排序依据) |
## 公式
```
ret_5 = close[-1] / close[-6] - 1
ret_20 = close[-1] / close[-21] - 1
ret_60 = close[-1] / close[-61] - 1
vol_20 = std(log_return, 20)[-1]
strength = (w5·ret_5 + w20·ret_20 + w60·ret_60) / vol_20 # vol_adjusted=True
strength = w5·ret_5 + w20·ret_20 + w60·ret_60 # vol_adjusted=False
```
权重自动归一化:`w = w / (w5 + w20 + w60)`