# 回测代码重构说明

## 概述

本次重构将原有的单一文件 `backtest.py` 拆分为模块化架构，提升代码复用性和可维护性。

## 文件结构变化

### 新增文件

1. **config.py** - 配置管理模块
   - 数据库配置（DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD）
   - 默认回测参数（DEFAULT_CASH, DEFAULT_COMMISSION, DEFAULT_WARMUP_DAYS）
   - 图表配色（BULL_COLOR, BEAR_COLOR）

2. **backtest_core.py** - 核心回测引擎
   - `BacktestResult` 数据类：结构化回测结果
   - `load_data_from_db()`：从数据库加载历史数据
   - `load_strategy()`：动态加载策略文件
   - `apply_color_scheme()`：应用图表配色
   - `run_backtest()`：单股票回测函数
   - `run_batch_backtest()`：批量回测函数（串行执行）

3. **backtest_command.py** - 命令行界面
   - `parse_arguments()`：解析命令行参数
   - `format_single_result()`：详细格式输出（单股票）
   - `format_batch_results()`：表格格式输出（多股票，使用 tabulate）
   - `main()`：主流程编排

### 删除文件

1. **backtest.py** - 原有单一文件（284 行）

## 接口变化

### 新增 API

```python
# 单股票回测
result = backtest_core.run_backtest(
    code='000001.SZ',
    start_date='2024-01-01',
    end_date='2024-12-31',
    strategy_file='strategies/sma_strategy.py',
    cash=100000,
    commission=0.002,
    warmup_days=365,
    output_dir=None  # 可选，为 None 时不生成图表
)

# 批量回测
results = backtest_core.run_batch_backtest(
    codes=['000001.SZ', '600000.SH'],
    start_date='2024-01-01',
    end_date='2024-12-31',
    strategy_file='strategies/sma_strategy.py',
    cash=100000,
    commission=0.002,
    warmup_days=365,
    output_dir='output/',  # 可选，为每个股票生成 {code}.html
    show_progress=True  # 可选，是否显示 tqdm 进度条
)
```

### 新增数据结构

```python
@dataclasses.dataclass
class BacktestResult:
    code: str
    equity_final: float
    equity_peak: float
    return_pct: float
    buy_hold_return_pct: float
    return_ann_pct: float
    volatility_ann_pct: float
    sortino_ratio: float
    calmar_ratio: float
    max_drawdown_pct: float
    avg_drawdown_pct: float
    max_drawdown_duration: float
    avg_drawdown_duration: float
    num_trades: int
    win_rate_pct: float
    sqn: float
```

## 命令行使用方式变化

### 旧方式（已删除）

```bash
python backtest.py --code 000001.SZ --start-date 2024-01-01 --end-date 2024-12-31 --strategy-file strategy.py
```

### 新方式

```bash
uv run python backtest_command.py --codes 000001.SZ --start-date 2024-01-01 --end-date 2024-12-31 --strategy-file strategies/sma_strategy.py
```

### 参数变化

| 参数名 | 变化 | 说明 |
|--------|--------|------|
| `--code` | 改为 `--codes` | 从单一参数改为多值参数（`nargs='+'`） |
| `--output` | 改为 `--output-dir` | 指定目录而非文件路径 |

### 新增参数

- `--output-dir`：指定图表输出目录（可选）
  - 单股票时：生成 `{code}.html` 在指定目录
  - 多股票时：为每个股票生成 `{code}.html` 在指定目录
  - 不指定时不生成图表

## 输出格式变化

### 单股票输出

保持原有的详细格式输出，每个指标单独一行：

```
============================================================
股票代码: 000001.SZ
============================================================
最终收益: 100981.58
峰值收益: 103731.54
总收益率（%）: 0.98
...
============================================================
```

### 多股票输出

新增表格格式输出（使用 tabulate，grid 格式）：

```
+------------+-----------+---------+-------------+------------+-------+
| 股票代码   |   收益率% |   胜率% |   最大回撤% |   交易次数 |   SQN |
+============+===========+=========+=============+============+=======+
| 000001.SZ  |      0.98 |     100 |       -2.65 |          1 |   nan |
| 600000.SH  |      0.04 |     100 |       -1.5  |          1 |   nan |
+------------+-----------+---------+-------------+------------+-------+
```

### 进度条

多股票回测时显示 tqdm 进度条：

```
批量回测: 50%|█████     | 1/2 [00:07<00:07, 7.82s/it]
```

## 依赖变化

### 新增依赖

- `tabulate`：表格格式化
  - 版本：0.9.0
  - 用途：批量回测结果的表格化输出

- `tqdm`：进度条显示
  - 版本：4.67.1
  - 用途：批量回测时的实时进度反馈

## 特性增强

### 新增功能

1. **批量回测**：支持传入多个股票代码进行串行回测
   - 命令：`--codes 000001.SZ 600000.SH`
   - 输出：表格化结果对比
   - 进度条：实时显示回测进度

2. **图表生成**：为每个股票生成独立 HTML 图表
   - 参数：`--output-dir output/`
   - 输出：`{code}.html` 在指定目录
   - 自动创建目录：`os.makedirs(output_dir, exist_ok=True)`

3. **进度条显示**：使用 tqdm 提供实时反馈
   - 多股票时自动显示
   - 可通过 `show_progress=False` 禁用

## 兼容性说明

### BREAKING CHANGES

1. **命令行入口变化**
   - 旧：`python backtest.py`
   - 新：`uv run python backtest_command.py`

2. **参数名称变化**
   - `--code` → `--codes`（从单值改为多值）

### 兼容性保证

- 所有原有功能完整保留
- 核心回测逻辑无变化
- 策略加载方式不变
- 数据访问接口不变

## 代码行数对比

| 文件 | 旧行数 | 新行数 | 变化 |
|------|---------|---------|------|
| backtest.py | 284 | - | -284 |
| config.py | - | 20 | +20 |
| backtest_core.py | - | ~200 | +200 |
| backtest_command.py | - | ~120 | +120 |
| **总计** | **284** | **~340** | **+56** |

## 迁移指南

### 对于开发者

如果需要在其他模块中调用回测功能：

```python
from backtest_core import run_backtest, run_batch_backtest, BacktestResult

# 单股票回测
result = run_backtest(
    code='000001.SZ',
    start_date='2024-01-01',
    end_date='2024-12-31',
    strategy_file='strategies/sma_strategy.py'
)

# 批量回测
results = run_batch_backtest(
    codes=['000001.SZ', '600000.SH'],
    start_date='2024-01-01',
    end_date='2024-12-31',
    strategy_file='strategies/sma_strategy.py'
)

# 访问结果
print(result.return_pct)
print(result.win_rate_pct)
```

### 对于终端用户

**单股票回测示例：**

```bash
uv run python backtest_command.py \
  --codes 000001.SZ \
  --start-date 2024-01-01 \
  --end-date 2024-12-31 \
  --strategy-file strategies/sma_strategy.py
```

**多股票回测示例：**

```bash
uv run python backtest_command.py \
  --codes 000001.SZ 600000.SH \
  --start-date 2024-01-01 \
  --end-date 2024-12-31 \
  --strategy-file strategies/sma_strategy.py
```

**生成图表示例：**

```bash
uv run python backtest_command.py \
  --codes 000001.SZ \
  --start-date 2024-01-01 \
  --end-date 2024-12-31 \
  --strategy-file strategies/sma_strategy.py \
  --output-dir output/
```

## 错误处理

- **立即失败策略**：遇到第一个错误立即停止，不继续执行其他股票
- **友好错误提示**：捕获异常并打印清晰的错误信息
- **退出状态码**：成功返回 0，失败返回非零
- **回溯信息**：打印完整的堆栈跟踪以便调试

## 性能考虑

- **串行执行**：当前采用串行执行，确保简单可靠
- **未来扩展**：未来可改为并行执行（ThreadPoolExecutor）以提升性能
- **数据加载**：每次回测创建独立的数据库连接，避免连接池复杂度

## 总结

本次重构实现了：
- ✅ 代码模块化：核心逻辑与 CLI 界面分离
- ✅ 可复用性：提供标准化 API 供其他模块调用
- ✅ 功能增强：支持批量回测和图表生成
- ✅ 用户体验：表格化结果和进度条显示
- ✅ 代码质量：更清晰的模块划分和类型提示
