# A股超短期选股系统

基于机器学习 + 大语言模型的A股超短线（T+0/T+1）量化选股工具。

## 一、项目简介

本系统从全市场A股中，通过技术指标、资金流向、市场环境等多维度特征，利用 LightGBM + XGBoost 集成模型进行量化打分，再结合 DeepSeek 大语言模型对新闻情绪和市场环境进行分析，最终输出每日推荐股票列表。

### 核心特点

- **ML选股**：LightGBM（60%权重）+ XGBoost（40%权重）集成打分
- **47个技术指标**：RSI、MACD、布林带、ATR、OBV、量比等
- **资金流向分析**：主力净流入、大单占比、资金趋势
- **LLM辅助分析**：DeepSeek API 自动生成选股报告，含技术分析和风险提示
- **自动风控**：过滤ST股、停牌股、新股、低流动性股票
- **买入概率预测**：每只股票给出ML预测的买入概率和操作建议

## 二、每日操作流程（重要）

### 操作时间表

| 时间 | 操作 | 说明 |
|------|------|------|
| 9:00-9:25 | 运行选股 | `python3 cli.py screen --top 10` |
| 9:25-9:30 | 选择股票 | 从前5名中选2-3只买入 |
| 9:30 | 开盘买入 | 挂单买入选中的股票 |
| 次日9:30 | 观察卖出 | 高开>3%止盈，低开>2%止损 |

### 操作步骤

```bash
# 第1步：每天9:00运行选股
python3 cli.py screen --top 10

# 第2步：查看结果中的「买入概率」列
# 概率 > 65%：强烈推荐买入
# 概率 55-65%：可以考虑买入
# 概率 < 55%：建议观望

# 第3步：分析感兴趣的股票
python3 cli.py analyze -s 600519

# 第4步：第二天卖出
# 高开 > 3%：止盈卖出
# 低开 > 2%：止损卖出
# 平开：持有到收盘再决定
```

### 风险控制规则

1. **仓位控制**：每只股票不超过总资金的30%
2. **止损线**：亏损 > 5% 立即卖出
3. **止盈线**：盈利 > 5% 考虑卖出
4. **大盘过滤**：大盘暴跌时不买入
5. **分散投资**：每次选2-3只股票，不要全仓一只

## 二、环境要求

| 项目 | 要求 |
|------|------|
| Python | 3.10+ |
| 内存 | 2GB+ |
| 网络 | 需要访问新浪财经API |
| DeepSeek API | 可选，用于LLM分析报告生成 |

## 三、安装部署

### 1. 安装依赖

```bash
# 如果是系统Python，需要加 --break-system-packages
pip3 install --break-system-packages -r requirements.txt

# 或手动安装
pip3 install --break-system-packages akshare pandas numpy scikit-learn lightgbm xgboost ta openai click httpx
```

### 2. 配置 DeepSeek API（可选）

设置环境变量：

```bash
export DEEPSEEK_API_KEY="sk-你的API密钥"
```

或在 `config.py` 中直接修改默认值。

### 3. 验证安装

```bash
python3 cli.py --help
```

## 四、使用方法

### 查看使用技巧

```bash
python3 cli.py tips
```

输出完整的操作流程、命令说明、风险控制规则。

### 每日选股（核心命令）

```bash
# 完整选股流程（含LLM分析报告）
python3 cli.py screen --top 10

# 仅ML模型选股（跳过LLM，更快更省）
python3 cli.py screen --top 10 --no-llm

# 保存结果到JSON文件
python3 cli.py screen --top 10 -s
```

**输出示例**：

```
========================================================================
  A股超短期选股 Top 10 — 建议9:25前买入，次日卖出
========================================================================
  排名   代码       名称         买入概率       涨跌幅        建议
------------------------------------------------------------------------
  1    600519   贵州茅台       72.3%       +1.5%    强烈推荐
  2    000858   五粮液         68.1%       +2.1%    强烈推荐
  3    601318   中国平安       61.5%       +0.8%    可以买入
  4    000333   美的集团       58.2%       +1.2%    可以买入
  5    601888   中国中免       52.7%       +0.5%    观望
========================================================================
  操作：从前5名选2-3只买入 | 止损：亏5%卖 | 止盈：赚5%卖
========================================================================
```

**买入概率解读**：
- **> 65%**：强烈推荐买入（★★★）
- **55-65%**：可以考虑买入（★★☆）
- **45-55%**：建议观望（★☆☆）
- **< 45%**：不建议买入（☆☆☆）

**执行流程**：
1. 获取全市场实时行情（Sina Finance）
2. 过滤ST股、停牌股、涨跌停股、低流动性股
3. 获取Top股票的K线数据，计算技术指标
4. ML模型打分（LightGBM + XGBoost）
5. 综合排名输出
6. （可选）LLM生成分析报告

### 分析单只股票

```bash
python3 cli.py analyze -s 000001           # 分析平安银行
python3 cli.py analyze -s 600519           # 分析贵州茅台
python3 cli.py analyze -s 000001 --no-llm  # 跳过LLM分析
```

**输出示例**：

```
╔══════════════════════════════════════════════════════════════╗
║                   000001 平安银行 分析报告
╚══════════════════════════════════════════════════════════════╝

【ML预测】
  买入概率: 65.0%
  预测评级: ★★★ 强烈推荐买入

【当前价格】
  最新价: 11.73
  涨跌幅: 1.21%

【技术指标】
  RSI(14):     70.0  (中性)
  MACD差值:    0.0287  (多头，看涨)
  布林带位置:  0.97  (接近上轨，注意回调)
  5日量比:     1.08  (正常)
  ATR波动率:   0.0158  (正常波动)
  ADX趋势:    25.4  (趋势一般)

【综合建议】
  ML模型看好该股票；MACD看涨

【操作建议】
  买入条件: 当前或回调至5日均线附近买入
  止损位:   11.14 (亏损5%)
  止盈位:   12.32 (盈利5%)
```

### 查看历史结果

```bash
python3 cli.py top              # 查看最近一次选股结果
python3 cli.py top -n 5         # 查看前5只
```

### 缓存管理

```bash
python3 cli.py cache-info       # 查看缓存文件数量和大小
python3 cli.py cache-clear      # 清除所有缓存数据
```

### 训练模型

```bash
python3 train.py
```

训练流程：
1. 从Sina Finance获取80只蓝筹股近120天历史数据
2. 计算51个特征（技术指标 + 市场环境）
3. 生成标签（T+1收益率 > 2% 为正样本）
4. 训练 LightGBM + XGBoost 集成模型
5. Walk-forward 验证
6. 模型保存到 `saved_models/` 目录

## 五、项目结构

```
gupiao/
├── cli.py                  # 命令行入口（Click框架）
├── main.py                 # 主流程编排
├── config.py               # 配置文件（API Key、过滤阈值等）
├── train.py                # 模型训练脚本
├── requirements.txt        # Python依赖列表
│
├── data/                   # 数据层
│   ├── sina_fetcher.py     # Sina Finance API（主数据源）
│   ├── fetcher.py          # akshare封装（备选数据源）
│   ├── cache.py            # 本地pickle缓存（避免频繁请求）
│   └── preprocessor.py     # 数据清洗、ST/涨跌停过滤
│
├── features/               # 特征工程
│   ├── technical.py        # 47个技术指标
│   ├── money_flow.py       # 资金流向特征
│   └── market_context.py   # 大盘环境、板块强弱
│
├── models/                 # ML模型
│   ├── lgbm_model.py       # LightGBM模型 + Walk-Forward训练
│   ├── xgb_model.py        # XGBoost模型
│   └── ensemble.py         # 模型融合（加权平均）
│
├── llm/                    # LLM集成
│   ├── client.py           # DeepSeek API客户端
│   └── analyzer.py         # 新闻情绪分析、报告生成
│
├── strategy/               # 策略层
│   ├── screener.py         # 风控过滤 + 综合排名
│   └── backtest.py         # 回测框架 + 标签生成
│
├── cache/                  # 运行时数据缓存（自动创建）
├── saved_models/           # 训练好的模型文件
└── training_data/          # 训练数据缓存
```

## 六、配置说明

`config.py` 中的关键配置：

```python
# LLM配置
LLM_API_KEY = "sk-xxx"          # DeepSeek API密钥
LLM_BASE_URL = "https://api.deepseek.com"
LLM_MODEL = "deepseek-chat"

# 数据缓存
DATA_CACHE_HOURS = 4            # 缓存有效期（小时）

# 股票过滤规则
STOCK_FILTER = {
    "exclude_st": True,         # 排除ST/*ST股
    "exclude_new_days": 60,     # 排除上市不足60天的新股
    "min_turnover": 50_000_000, # 最低成交额5000万
    "exclude_suspended": True,  # 排除停牌股
}

# 选股数量
SCREENER_TOP_N = 20
```

## 七、模型说明

### 训练数据

- 数据源：Sina Finance
- 股票池：80只A股蓝筹股
- 时间跨度：近120个交易日
- 标签定义：T+1日收益率 >= 2% 为正样本

### 模型性能

| 模型 | AUC |
|------|-----|
| LightGBM | 0.7273 |
| XGBoost | 0.7209 |
| Walk-forward均值 | 0.6851 |

### 重要特征（Top 10）

| 特征 | 含义 |
|------|------|
| upper_shadow | 上影线长度 |
| lower_shadow | 下影线长度 |
| atr_ratio | ATR波动率占比 |
| ret_20 | 20日收益率 |
| ret_10 | 10日收益率 |
| vol_ratio_20 | 20日量比 |
| macd_signal | MACD信号线 |
| vol_10 | 10日波动率 |
| vol_20 | 20日波动率 |
| open_close_ratio | 开盘收盘比 |

## 八、数据源说明

| 数据源 | 用途 | 限制 |
|--------|------|------|
| Sina Finance | 实时行情、K线数据 | ~3 req/s，需缓存 |
| akshare（东方财富） | 备选数据源 | 云服务器可能被封IP |

缓存机制：本地pickle文件缓存，日线数据缓存4小时，分钟数据缓存1小时。

## 九、维护指南

### 日常维护

1. **每日运行选股**：建议交易日 9:30 后运行
   ```bash
   python3 cli.py screen --top 10 -s
   ```

2. **定期清理缓存**：
   ```bash
   python3 cli.py cache-clear
   ```

3. **定期重新训练模型**：建议每月一次
   ```bash
   python3 train.py
   ```

### 常见问题

**Q: 数据获取失败怎么办？**
A: 检查网络连接。如果东方财富API被封，系统会自动切换到Sina Finance。如果Sina也不可用，等待一段时间后重试。

**Q: LLM分析不工作？**
A: 检查 `DEEPSEEK_API_KEY` 是否正确设置，以及API余额是否充足。不配置LLM也可以使用纯ML选股。

**Q: 如何提高选股准确率？**
A: 1) 定期重新训练模型；2) 增加训练数据量；3) 调整 `config.py` 中的过滤阈值；4) 在 `ensemble.py` 中调整模型权重。

**Q: 模型文件在哪里？**
A: `saved_models/` 目录下：
- `ensemble_lgbm.txt` - LightGBM模型
- `ensemble_xgb.json` - XGBoost模型
- `*_meta.json` - 模型元数据

### 系统监控

```bash
# 查看缓存使用情况
python3 cli.py cache-info

# 查看模型文件大小
ls -lh saved_models/

# 查看训练数据
ls -lh training_data/
```

## 十、注意事项

1. **风险提示**：本工具仅供学习和研究使用，不构成投资建议。股市有风险，入市需谨慎。
2. **数据延迟**：实时数据可能存在几秒延迟，不适合高频交易。
3. **模型局限**：历史表现不代表未来收益，模型需要定期重新训练。
4. **API费用**：DeepSeek API 按token计费，日常使用成本很低（约0.1元/天）。
5. **合规使用**：请遵守相关法律法规，不得用于非法用途。

## 十一、技术栈

- **语言**：Python 3.10+
- **ML框架**：LightGBM、XGBoost、scikit-learn
- **数据处理**：pandas、numpy
- **技术分析**：ta（Technical Analysis Library）
- **数据源**：Sina Finance API、akshare
- **LLM**：DeepSeek API（OpenAI兼容接口）
- **CLI**：Click

## 十二、许可证

本项目仅供学习和研究使用。
