# Proposal: Refactor Backtest Script ## Why 当前回测系统使用 Jupyter Notebook (`backtest.ipynb`) 手动执行,存在以下问题: - 不支持自动化批量回测,无法通过命令行调用 - 策略逻辑与数据获取混在一起,难以复用和切换 - 缺乏参数化配置,每次回测需要手动修改代码 - 无法方便地对比不同策略在同一股票、不同时间段的表现 通过将回测流程重构为命令行工具,可以实现: - 支持命令行参数化调用,便于批量执行 - 策略模块化,支持动态加载不同的策略文件 - 简化数据加载逻辑,专注于回测核心流程 - 提高代码可维护性和可扩展性 ## What Changes ### 新增文件 1. **backtest.py** - 主流程脚本 - 命令行参数解析 (`--code`, `--start-date`, `--end-date`, `--strategy-file`, `--cash`, `--commission`, `--output`) - 数据库连接与数据加载(查询复权后的价格数据) - 动态加载策略文件(通过 `importlib`) - 执行回测(使用 `backtesting` 库) - 结果输出: - 控制台中文格式化统计信息 - HTML 图表文件(可选,通过 `--output` 参数控制) 2. **strategy.py** - 策略模板文件 - `calculate_indicators(data)` 函数:计算策略所需的技术指标(如 SMA、MACD) - `get_strategy()` 函数:返回策略类 - `SmaCross` 类:继承 `backtesting.Strategy`,实现交易逻辑(金叉买入、死叉卖出) ### 主要功能特性 - **动态策略加载**:通过 `--strategy-file` 参数指定任意策略文件 - **简化的数据库访问**:直接 SQL 查询获取数据,不引入额外抽象 - **指标计算策略化**:每个策略文件自己定义需要计算的指标 - **结果输出控制**:默认控制台输出,通过 `--output` 参数生成 HTML 图表 ### 现有文件变更 - 无(新增文件,不修改现有 Notebook) ## Capabilities ### New Capabilities - **backtest-cli**: 命令行回测工具,支持通过参数化方式执行量化回测 - **strategy-loading**: 动态加载策略模块,支持从指定路径导入策略类和指标计算函数 - **data-fetching**: 从 PostgreSQL 数据库获取股票历史价格数据,自动处理复权 ### Modified Capabilities - 无(不涉及现有规范级别的需求变更) ## Impact ### 代码影响 - 新增 `backtest.py` 作为主入口文件 - 新增 `strategy.py` 作为策略模板 - 可选新增 `strategies/` 目录存放其他策略文件 ### 依赖影响 **新增依赖**: - `sqlalchemy` - 数据库连接 - `backtesting` - 回测引擎 - `pandas`, `numpy` - 数据处理(已存在于 Notebook 中) ### API/系统影响 - 无外部 API 变更 - 数据库查询逻辑从 Notebook 迁移到 Python 脚本 - 输出从 Notebook 交互式展示改为命令行 + HTML 文件 ### 用户影响 - 用户可以通过命令行执行回测,无需打开 Jupyter Notebook - 策略开发者可以独立开发策略文件,通过约定接口集成到主流程 - 回测结果以 HTML 文件形式保存,便于分享和查看