mirror of
https://ghfast.top/https://github.com/aeroxw/easy-tdx.git
synced 2026-09-12 21:34:16 +08:00
新增:强势股排名(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
97 lines
2.6 KiB
Markdown
97 lines
2.6 KiB
Markdown
# 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)`。
|