README.md

# QTrading 量化选股系统

QTrading 是一套完整的量化选股系统,严格按照工程化规范实现,所有模块独立分离、结构清晰、可直接运行。

## 项目架构(模块化)

QTrading 采用模块化架构设计,所有功能分到独立模块:

```
QTrading/
├── config/        # 配置文件
├── data/          # 数据获取与存储
├── strategy/      # 策略基类与具体策略
├── engine/        # 选股核心引擎
├── backtest/      # 回测模块
├── web/           # Web GUI 界面
├── utils/         # 工具函数
├── main.py        # 主入口文件
└── requirements.txt # 依赖包列表
```

## 核心功能

### 数据模块(Tushare + SQLite 缓存)
- 从 Tushare 读取原始不复权日线数据
- 存入 SQLite 做本地缓存,支持增量更新
- 数据库只存原始数据,不预先做复权

### 复权功能(核心灵活设计)
- 支持三种模式:前复权 / 后复权 / 不复权
- 在策略基类中统一实现复权计算函数
- Web 界面可选择复权方式,所有指标自动按选择计算

### 策略模块(高度解耦)
- 抽象基类 BaseStrategy,内置通用指标:MA、EMA、波动率、回撤、突破、量价、涨幅等
- 所有指标基于用户选择的复权方式动态计算
- 策略只做一件事:输入单只股票K线数据 → 输出 0~100 分
- 策略不循环、不读库、插件化设计,新增策略只需加类

### 选股引擎
- 遍历股票池 → 从 SQLite 取数据 → 运行用户选中的单个策略
- 按分数从高到低排序输出结果

### 回测功能
- 支持历史回测,按时间滚动选股
- 计算回测指标:年化收益、最大回撤、胜率、盈亏比
- 回测与策略完全解耦

### Web GUI
- 提供简洁可用的 Web 界面
- 支持:选择策略、选择复权方式、启动选股、查看结果、运行回测

## 快速开始

### 安装依赖

```bash
cd QTrading
pip install -r requirements.txt
```

### 配置 Tushare Token

在 `config/config.py` 中配置你的 Tushare Token:

```python
@dataclass
class TushareConfig:
    """Tushare 配置"""
    token: str = "YOUR_TUSHARE_TOKEN"  # 替换为你的 Token
    retry_count: int = 3
    pause: float = 0.1
```

### 运行系统

#### 1. Web 模式(推荐)

启动 Web 服务器:

```bash
python main.py --mode web --host 0.0.0.0 --port 8050 --debug
```

然后在浏览器中访问:`http://localhost:8050`

#### 2. 命令行模式

**选股:**

```bash
python main.py --mode cli --strategy MA20Strategy --adjust-method qfq --top-n 10 --update-data
```

**回测:**

```bash
python main.py --mode cli --strategy RSIStrategy --adjust-method qfq --backtest --start-date 20200101 --end-date 20241231
```

## 使用说明

### 策略开发

在 `strategy` 目录下创建新的策略文件,继承自 `BaseStrategy`,实现 `score` 方法即可:

```python
from strategy.base_strategy import BaseStrategy

class MyStrategy(BaseStrategy):
    """自定义策略"""

    name: str = "MyStrategy"
    description: str = "我的自定义策略"

    def score(self, data: pd.DataFrame) -> float:
        """计算股票得分(0~100)"""
        # 策略逻辑
        return score
```

### 配置股票池

在 `config/config.py` 中配置股票池:

```python
@dataclass
class StockPoolConfig:
    """股票池配置"""
    stock_list: list = [
        "000001", "000002", "000004", "000005", "000006",
        # ... 更多股票代码
    ]
    start_date: str = "20000101"
    end_date: str = "20241231"
```

## 工程化要求

- **配置与代码分离**:所有配置放在 `config/config.py` 中
- **日志、异常处理、数据校验齐全**:每个模块都有完善的日志和异常处理
- **代码规范、注释完整**:遵循 Python 开发规范,代码注释完整
- **结构清晰、易于长期扩展**:模块化设计,新增功能只需添加新模块

## 技术栈

- **核心语言**:Python 3.8+
- **数据获取**:Tushare 数据接口
- **数据存储**:SQLite 数据库
- **Web 框架**:Dash (基于 Flask)
- **可视化**:Plotly、Dash Bootstrap Components
- **数据分析**:Pandas、Numpy、Scipy
- **项目管理**:Black (代码格式化)、Flake8 (代码检查)

## 贡献者

本项目遵循工程化规范,严格按照模块化设计实现。

## 许可证

MIT License