# quant_timing **Repository Path**: extradimen/quant_timing ## Basic Information - **Project Name**: quant_timing - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-08 - **Last Updated**: 2025-12-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 量化择时可视化系统 基于 AKShare + backtrader + FastAPI 的量化回测与可视化平台 ## 项目概述 本项目实现了从**数据获取 → 回测 → 可视化分析**的端到端量化交易流程,支持A股市场的特殊规则(T+1、涨跌停、交易费用等),并提供现代化的Web可视化界面。 ## 功能特性 - ✅ **数据获取**:使用AKShare拉取A股日线数据,支持动态下载 - ✅ **策略回测**:基于backtrader实现事件驱动回测 - ✅ **A股规则**:支持T+1、涨跌停、佣金、印花税、过户费、滑点 - ✅ **策略示例**:SMA交叉策略、动量策略 - ✅ **结果分析**:资金曲线、回撤分析、绩效指标、基准对比 - ✅ **Web可视化**:现代化的Web界面,支持多股票回测、动态策略加载、交互式图表 - ✅ **策略标准化**:自动发现策略,支持动态参数配置 ## 项目结构 ``` quant_mvp/ ├── api/ # API模块 │ ├── __init__.py │ └── stock_api.py # 股票数据API(支持多数据源) ├── configs/ # 配置文件 │ ├── data.yaml # 数据配置 │ ├── backtest.yaml # 回测配置 │ ├── trade.yaml # 交易配置 │ └── web.yaml # Web服务配置 ├── data/ # 行情数据 │ ├── daily/ # 日线数据 │ └── minute/ # 分钟线数据(可选) ├── engines/ # 引擎模块 │ ├── __init__.py │ ├── data_ingestor.py # 数据获取引擎 │ ├── bt_runner.py # 回测引擎(支持A股规则) │ └── vnpy_runner.py # vn.py交易引擎(框架) ├── reports/ # 报告输出 │ ├── backtest/ # 回测结果 │ └── trade_logs/ # 交易日志 ├── scripts/ # 脚本入口 │ ├── __init__.py │ ├── main_backtest.py # 命令行回测入口 │ └── main_trade.py # 交易入口 ├── strategies/ # 策略模块 │ ├── __init__.py │ ├── base_strategy.py # 基础策略类(T+1、涨跌停检查) │ ├── strategy_registry.py # 策略注册与发现 │ └── impl/ # 策略实现目录 │ ├── __init__.py │ ├── sma_cross.py # SMA交叉策略 │ └── momentum.py # 动量策略 ├── utils/ # 工具类 │ ├── __init__.py │ ├── io.py # I/O工具(数据读写) │ ├── calendar.py # 交易日历 │ └── risk.py # 风控工具(涨跌停检查) ├── web/ # Web可视化服务 │ ├── __init__.py │ └── web_app.py # FastAPI应用(主服务) ├── static/ # 静态文件目录 ├── start_web.sh # 启动Web服务脚本 ├── stop_web.sh # 停止Web服务脚本 ├── quick_start.sh # 快速启动脚本 ├── requirements.txt # 依赖包 └── README.md # 项目文档 ``` ### 目录说明 - **`api/`**: 数据获取API模块,封装了不同数据源的接口 - **`configs/`**: 所有配置文件,包括回测、交易、Web服务等配置 - **`data/`**: 存储下载的行情数据(Parquet格式) - **`engines/`**: 核心引擎模块,包括数据获取引擎和回测引擎 - **`reports/`**: 回测结果和交易日志输出目录 - **`scripts/`**: 命令行入口脚本,用于非Web方式的回测和交易 - **`strategies/`**: 策略模块 - `base_strategy.py`: 基础策略类,实现了A股特殊规则 - `strategy_registry.py`: 策略注册表,自动发现策略 - `impl/`: 策略实现目录,所有策略文件放在这里 - **`utils/`**: 工具类模块,提供数据读写、交易日历、风控等功能 - **`web/`**: Web可视化服务,FastAPI应用 - **`static/`**: 静态文件目录(由Web服务自动创建) ## 快速开始 ### 0. 项目下载 ```bash cd ~ git clone https://gitee.com/extradimen/quant_timing.git ``` ### 1. 环境准备 ```bash # 进入项目目录 cd quant_timing # 检查 Python 版本(需要 Python 3.8+) python3 --version # 创建虚拟环境 python3 -m venv venv ``` ```bash # 激活虚拟环境 source venv/bin/activate # 安装依赖(如果还未安装) pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 配置端口 # 打开 configs/web.yaml 将 port 后 xxxxx 替换为实际端口 ``` ### 2. 启动Web可视化服务 ```bash # 使用启动脚本 bash start_web.sh ``` 服务启动后(假如你设定端口为 21006),访问: - **远程访问**: http://你的服务器IP:21006 ### 3. 使用Web界面进行回测 1. 打开浏览器访问Web界面 2. 选择策略(系统会自动发现`strategies/impl`目录下的所有策略) 3. 配置策略参数(使用逗号分隔,如:`5,20`) 4. 输入股票代码(用逗号分隔,如:`600000.SH,000001.SZ`) 5. 选择数据源 6. 设置初始资金和日期范围 7. 点击"开始回测" 8. 查看结果:关键指标、资金曲线、超额收益、基准对比、交易记录等 ### 4. 命令行回测(可选) ```bash # 使用SMA交叉策略回测 python scripts/main_backtest.py --config configs/backtest.yaml --strategy sma_cross # 自定义参数 python scripts/main_backtest.py --strategy sma_cross --fast 10 --slow 30 # 使用动量策略 python scripts/main_backtest.py --strategy momentum --lookback 20 --threshold 0.05 ``` ### 5. 数据获取(自动或手动) **自动获取**:Web界面回测时会自动下载缺失的数据 **手动获取**: ```bash # 拉取指定股票的历史数据 python engines/data_ingestor.py --symbols 600000.SH 000001.SZ --outdir data/daily # 指定日期范围 python engines/data_ingestor.py --symbols 600000.SH --start 2019-01-01 --end 2024-12-31 ``` ## Web可视化界面 ### 功能特性 1. **动态策略发现** - 自动扫描`strategies/impl`目录 - 新策略文件自动出现在下拉菜单 - 无需修改前端代码 2. **可视化回测配置** - 选择策略(自动发现) - 配置策略参数(标准化输入,逗号分隔) - 选择股票代码(支持多股票) - 选择数据源(下拉菜单) - 设置回测时间范围 3. **实时回测执行** - 一键运行回测 - 实时显示进度 - 错误提示 4. **丰富的可视化结果** - 关键指标展示(初始资金、最终资金、收益率、夏普比率、最大回撤、超额收益等) - 策略收益曲线 - 超额收益曲线(相对基准) - 基准收益曲线 - 每日盈亏曲线 - 交易记录表格 - 持仓记录表格 - 性能分析报告 5. **交互式图表** - 使用Chart.js渲染 - 支持缩放、平移 - 响应式设计 ### 管理服务 #### 启动服务 ```bash cd /home/ubuntu/quant_mvp bash start_web.sh ``` #### 停止服务 ```bash cd /home/ubuntu/quant_mvp bash stop_web.sh ``` #### 查看日志 ```bash tail -f /home/ubuntu/quant_mvp/web.log ``` ### API接口 #### 1. 运行回测 ``` POST /api/backtest Content-Type: application/json { "strategy": "sma_cross", "params": "5,20", "symbols": "600000.SH,000001.SZ", "cash": 1000000, "start_date": "2019-01-01", "end_date": "2024-12-31", "data_provider": "akshare", "benchmark": "000300.SH" } ``` #### 2. 获取可用策略列表 ``` GET /api/strategies ``` 返回格式: ```json { "strategies": [ { "name": "sma_cross", "display_name": "SMA交叉策略", "description": "基于短期和长期移动平均线交叉的交易策略", "params": [ { "name": "fast_period", "type": "int", "default": 5, "description": "短期均线周期" }, { "name": "slow_period", "type": "int", "default": 20, "description": "长期均线周期" } ] } ] } ``` ## 回测库与数据获取 ### 回测库:Backtrader #### 基本信息 - **库名**: Backtrader - **版本**: >= 1.9.78 - **官网**: https://www.backtrader.com/ - **GitHub**: https://github.com/mementum/backtrader #### 特点 1. **事件驱动回测引擎** - 基于事件驱动的架构 - 支持多种时间框架(日线、分钟线等) - 支持多数据源同时回测 2. **丰富的功能** - 内置大量技术指标(SMA、EMA、RSI、MACD等) - 支持自定义指标 - 支持多种订单类型(市价、限价、止损等) - 支持佣金、滑点等交易成本模拟 3. **A股支持** - 本项目扩展了backtrader以支持A股特殊规则: - T+1交易限制 - 涨跌停限制 - A股交易费用(佣金、印花税、过户费) #### 项目中的使用 ```python # engines/bt_runner.py import backtrader as bt # 创建Cerebro引擎 cerebro = bt.Cerebro() # 添加数据 data = bt.feeds.PandasData(dataname=df) cerebro.adddata(data) # 添加策略 cerebro.addstrategy(SMACrossStrategy) # 运行回测 results = cerebro.run() ``` ### 数据获取:AKShare #### 基本信息 - **库名**: AKShare - **版本**: >= 1.12.0 - **官网**: https://akshare.readthedocs.io/ - **GitHub**: https://github.com/akfamily/akshare #### 特点 1. **免费开源** - 完全免费使用 - 开源项目,持续更新 2. **数据丰富** - A股、港股、美股数据 - 期货、期权、基金数据 - 宏观经济数据 - 新闻、公告等文本数据 3. **易于使用** - 简单的API接口 - 返回pandas DataFrame格式 - 支持多种数据频率(日线、分钟线等) #### 项目中的使用 ```python # api/stock_api.py import akshare as ak # 获取A股日线数据 df = ak.stock_zh_a_hist( symbol="600000", # 股票代码 period="daily", # 日线 start_date="20190101", end_date="20241231", adjust="" # 不复权 ) ``` ### 数据流程 ``` AKShare (数据获取) ↓ 本地存储 (Parquet/CSV) ↓ 数据加载 (utils/io.py) ↓ 转换为Backtrader格式 (PandasData) ↓ Backtrader回测引擎 ↓ 策略执行 ↓ 结果输出 ``` ### Backtrader可以获取数据吗? **答案:不能直接获取** Backtrader **本身不提供数据获取功能**,它专注于回测引擎的实现。它需要外部提供数据。 #### Backtrader支持的数据源 1. **Pandas DataFrame** (本项目使用) 2. **CSV文件** 3. **Yahoo Finance** (需要yfinance) 4. **Interactive Brokers** (需要IB API) 5. **其他数据源**(OANDA、VisualChart等) #### 本项目的数据获取方案 本项目采用 **AKShare + 本地存储** 的方案: 1. **数据获取**: 使用AKShare从网络获取数据 2. **数据存储**: 保存为Parquet格式(高效、压缩) 3. **数据加载**: 回测时从本地加载,速度快 4. **数据更新**: 可以定期更新数据 **优势**: - ✅ **数据源稳定**: AKShare提供免费、稳定的数据源 - ✅ **速度快**: 本地存储,回测时无需网络请求 - ✅ **可扩展**: 可以轻松添加其他数据源 - ✅ **成本低**: 完全免费 ## 配置说明 ### Web服务配置 (configs/web.yaml) ```yaml # Web可视化服务配置 host: "0.0.0.0" # 监听地址 port: 21006 # 监听端口 ``` ### 回测配置 (configs/backtest.yaml) ```yaml universe: ["600000.SH", "000001.SZ"] # 股票池 cash: 1000000 # 初始资金 commission_bps: 2.5 # 佣金 0.025% stamp_duty_bps: 10.0 # 印花税 0.1% slippage_bps: 2.0 # 滑点 0.02% from: "2019-01-01" # 回测开始日期 to: "2024-12-31" # 回测结束日期 ``` ### 策略参数 **SMA交叉策略**: - `fast_period`: 短期均线周期(默认5) - `slow_period`: 长期均线周期(默认20) - 参数输入格式:`5,20`(逗号分隔) **动量策略**: - `lookback`: 回看周期(默认20) - `threshold`: 买入阈值(默认0.05,即5%) - `exit_threshold`: 卖出阈值(默认-0.03,即-3%) - 参数输入格式:`20,0.05,-0.03`(逗号分隔) ## A股规则实现 ### T+1交易 - 当日买入的股票,次日才能卖出 - 回测引擎自动跟踪T+1持仓限制 - 支持多股票独立跟踪 ### 涨跌停限制 - 涨停时无法买入,跌停时无法卖出 - 基于前收盘价计算涨跌停价格 - 自动检查并拒绝无效订单 ### 交易费用 - **佣金**:可配置(默认0.025%) - **印花税**:卖出时收取(默认0.1%) - **过户费**:上交所(默认0.002%) - **滑点**:可配置(默认0.02%) ### 多股票等权重 - 支持同时回测多只股票 - 自动按等权重分配资金 - 每只股票独立执行策略逻辑 ## 策略示例 ### SMA交叉策略 - 当短期均线上穿长期均线时买入(金叉) - 当短期均线下穿长期均线时卖出(死叉) - 支持多股票同时回测 ### 动量策略 - 当N日收益率超过阈值时买入 - 当动量反转或触发止损时卖出 - 支持多股票同时回测 ## 添加新策略 ### 标准化策略接口 所有策略必须放在`strategies/impl`目录下,并继承`BaseChinaStrategy`类。 ### 策略模板 ```python from strategies.base_strategy import BaseChinaStrategy import backtrader as bt class MyStrategy(BaseChinaStrategy): # 策略显示名称(必填) _display_name = "我的策略" # 策略描述(必填) _description = "策略的详细描述" # 参数元数据(必填) _params_metadata = [ { "name": "param1", "type": "int", "default": 10, "description": "参数1的描述" }, { "name": "param2", "type": "float", "default": 0.05, "description": "参数2的描述" } ] def __init__(self): # 调用父类初始化 super().__init__() # 获取参数(从self.params获取) self.param1 = self.params.param1 self.param2 = self.params.param2 # 添加指标 self.sma = bt.indicators.SMA(self.data.close, period=self.param1) def next(self): # 策略逻辑 if self.sma[0] > self.data.close[0]: self.safe_buy() elif self.sma[0] < self.data.close[0]: self.safe_sell() ``` ### 步骤 1. 在 `strategies/impl/` 目录创建新策略文件 2. 继承 `BaseChinaStrategy` 类 3. 实现 `_display_name`、`_description`、`_params_metadata` 属性 4. 实现 `__init__` 和 `next` 方法 5. 使用 `safe_buy()` 和 `safe_sell()` 进行交易(自动处理T+1和涨跌停) 6. 保存文件后,系统会自动发现新策略 ### 注意事项 - 策略文件必须放在`strategies/impl`目录 - 必须继承`BaseChinaStrategy` - 必须定义`_display_name`、`_description`、`_params_metadata` - 使用`safe_buy()`和`safe_sell()`而不是直接调用`buy()`和`sell()` ## 扩展开发 ### 添加新数据源 1. 修改 `api/stock_api.py` 2. 实现新的数据获取函数 3. 确保输出格式符合要求(date, open, high, low, close, volume, amount) 4. 在Web界面添加数据源选项 ### 性能优化 - 使用向量化回测加速 - 数据缓存优化 - 并行回测支持 ### 可视化增强 - 添加更多图表类型 - 支持策略对比 - 添加更多分析报告 ## 注意事项 1. **数据质量**:确保数据完整,缺失日期会自动前值填充 2. **交易时段**:当前版本使用日线数据,不支持盘中交易 3. **网络连接**:数据获取需要网络连接,AKShare可能需要访问外部API 4. **实盘交易**:实盘交易前务必充分测试,建议先使用仿真环境 5. **策略测试**:新策略建议先用小资金回测,验证逻辑正确性 6. **数据更新**:定期更新数据以确保回测准确性 ## 常见问题 ### Q: 数据获取失败? A: 检查网络连接,AKShare可能需要访问外部API。可以尝试多次重试。系统已实现自动重试机制。 ### Q: 回测结果异常? A: 检查数据文件是否存在,日期格式是否正确,配置参数是否合理。查看Web界面的错误提示。 ### Q: 如何添加更多股票? A: 在Web界面输入多个股票代码(逗号分隔),系统会自动下载数据。或修改配置文件中的股票池。 ### Q: 策略不显示在列表中? A: 确保策略文件在`strategies/impl`目录下,继承`BaseChinaStrategy`,并定义了必需的元数据属性。 ### Q: Web服务无法访问? A: - 检查服务是否运行: `ps aux | grep web/web_app.py` - 检查端口是否监听: `netstat -tlnp | grep 21006` - 查看日志: `tail -f web.log` - 检查防火墙设置 ### Q: 图表不显示? A: - 检查网络连接(Chart.js需要CDN) - 查看浏览器控制台是否有JavaScript错误 - 确保回测成功完成 ## 技术栈 - **后端框架**: FastAPI - **回测引擎**: Backtrader - **数据获取**: AKShare - **前端**: HTML + JavaScript + Chart.js - **数据处理**: Pandas, NumPy - **配置管理**: YAML ## 项目统计 - 总文件数:约30个Python文件 - 代码行数:约3000行 - 支持策略:2个(SMA交叉、动量),支持动态扩展 - 支持A股规则:T+1、涨跌停、费用、滑点 - Web界面:完整的可视化回测系统 ## 许可证 本项目仅供学习和研究使用。 ## 贡献 欢迎提交Issue和Pull Request! --- **项目状态**: ✅ Quant Timing 版本完成,可用于学习和回测 **最后更新**: 2025年12月