# AutoStock **Repository Path**: camraw/autostock ## Basic Information - **Project Name**: AutoStock - **Description**: ETF量化交易工具 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2026-02-26 - **Last Updated**: 2026-04-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: ETF, 股票, 量化 ## README # ETF量化交易工具 一套专业的ETF量化交易工具,支持数据获取、策略编写、回测验证、战法测试和模拟/实盘交易。 ## 功能特性 - **数据获取**:ETF基础数据、历史行情、净值数据自动采集与存储 - **策略编写**:策略基类、丰富的技术指标库、信号生成器 - **战法测试**:自定义战法配置、批量测试、参数优化、可视化报告 - **回测验证**:历史数据回测、绩效分析、详细报告生成 - **交易执行**:模拟交易与实盘交易、风险控制机制 - **T+1规则**:严格遵循ETF T+1交易规则 - **日志审计**:完整的日志记录与审计跟踪 ## 项目结构 ``` stock/ ├── config/ # 配置文件目录 │ ├── config.yaml # 主配置文件 │ ├── logging.yaml # 日志配置 │ ├── strategy_config.yaml # 策略配置 │ └── strategies/ # 战法配置目录 │ ├── builtin_strategies.yaml # 内置战法 │ └── custom_strategies.yaml # 自定义战法 ├── data/ # 数据存储目录 │ ├── db/ # 数据库文件 │ │ ├── etf_quant.db # SQLite数据库 │ │ └── etf_quant_calendar.json # 交易日历 │ ├── results/ # 测试结果存储 │ └── cache/ # 缓存数据 ├── lib/ # 依赖库目录 ├── logs/ # 日志文件目录 │ ├── trade/ # 交易日志 │ ├── system/ # 系统日志 │ └── audit/ # 审计日志 ├── src/ # 源代码目录 │ ├── core/ # 核心模块 │ │ ├── engine.py # 交易引擎 │ │ ├── event.py # 事件系统 │ │ └── context.py # 上下文管理 │ ├── data/ # 数据模块 │ │ ├── fetcher.py # 数据获取 │ │ ├── cleaner.py # 数据清洗 │ │ ├── storage.py # 数据存储 │ │ └── loader.py # 数据加载 │ ├── strategy/ # 策略模块 │ │ ├── base.py # 策略基类 │ │ ├── indicators.py # 技术指标库 │ │ ├── signals.py # 信号生成 │ │ └── templates/ # 策略模板 │ ├── backtest/ # 回测模块 │ │ ├── engine.py # 回测引擎 │ │ ├── portfolio.py # 组合管理 │ │ ├── order.py # 订单管理 │ │ └── report.py # 报告生成 │ ├── tester/ # 战法测试模块 │ │ ├── config_loader.py # 战法配置加载 │ │ ├── condition_parser.py # 条件解析器 │ │ ├── strategy_factory.py # 策略工厂 │ │ ├── runner.py # 测试运行器 │ │ ├── batch_runner.py # 批量测试 │ │ ├── optimizer.py # 参数优化 │ │ ├── visualizer.py # 可视化 │ │ ├── report_enhanced.py # 增强报告 │ │ ├── result_storage.py # 结果存储 │ │ └── cli.py # 命令行接口 │ ├── trade/ # 交易模块 │ │ ├── broker.py # 券商接口 │ │ ├── executor.py # 交易执行 │ │ ├── position.py # 持仓管理 │ │ └── risk.py # 风险控制 │ └── utils/ # 工具模块 │ ├── logger.py # 日志工具 │ ├── config.py # 配置加载 │ ├── calendar.py # 交易日历 │ └── helpers.py # 辅助函数 ├── scripts/ # 脚本目录 │ ├── init_db.py # 初始化数据库 │ ├── update_data.py # 数据更新脚本 │ └── run_backtest.py # 运行回测 ├── tests/ # 测试目录 ├── pyproject.toml # 项目配置 ├── requirements.txt # 依赖文件 └── README.md # 项目说明 ``` ## 快速开始 ### 1. 安装依赖 ```bash pip install -r requirements.txt --target=./lib ``` 或单独安装核心依赖: ```bash pip install pandas numpy pyyaml pydantic loguru sqlalchemy akshare --target=./lib ``` ### 2. 初始化数据库 ```bash python scripts/init_db.py ``` 这将: - 创建SQLite数据库 - 初始化ETF列表 - 下载交易日历 ### 3. 更新数据 ```bash python scripts/update_data.py ``` 这将更新指定ETF的历史行情数据。 ### 4. 运行回测 ```bash python scripts/run_backtest.py ``` ## 战法测试工具 战法测试工具是一个专门的ETF战法验证系统,支持自定义战法、批量测试和参数优化。 ### 命令行使用 ```bash # 列出可用战法 python -m src.tester list strategies # 列出可用ETF python -m src.tester list etfs # 运行单次测试 python -m src.tester run -s ma_cross -e 510300 -c 100000 # 运行批量测试 python -m src.tester batch -s ma_cross,trend_follow -e 510300,510500 # 参数优化 python -m src.tester optimize -s ma_cross -e 510300 -p fast_period=5,10,20 -p slow_period=30,60 # 查看测试结果 python -m src.tester info result TEST_20240101120000_0001 # 生成报告 python -m src.tester report TEST_20240101120000_0001 --charts ``` ### Python API使用 ```python from src.tester import StrategyTester # 创建测试器 tester = StrategyTester(initial_capital=100000) # 运行单次测试 result = tester.run( strategy="ma_cross", etf="510300", start_date="2020-01-01" ) # 查看结果 print(f"总收益率: {result.total_return:.2%}") print(f"夏普比率: {result.sharpe_ratio:.3f}") print(f"最大回撤: {result.max_drawdown:.2%}") ``` ### 批量测试 ```python from src.tester import BatchRunner runner = BatchRunner() # 测试多个战法在多个ETF上的表现 result = runner.run( strategies=["ma_cross", "rsi_oversold", "bollinger_breakout"], etfs=["510300", "510500", "159915"], start_date="2020-01-01", initial_capital=100000 ) # 查看汇总 print(f"平均收益率: {sum(r.total_return for r in result.results) / len(result.results):.2%}") ``` ### 参数优化 ```python from src.tester import ParamOptimizer optimizer = ParamOptimizer() # 网格搜索最优参数 result = optimizer.optimize( strategy_id="ma_cross", etf="510300", param_ranges={ "fast_period": [5, 10, 15, 20], "slow_period": [30, 40, 50, 60] }, metric="sharpe_ratio" ) print(f"最优参数: {result.best_params}") print(f"最优夏普比率: {result.best_metric_value:.3f}") ``` ### 自定义战法 编辑 `config/strategies/custom_strategies.yaml`: ```yaml strategies: my_strategy: name: "我的自定义战法" description: "战法描述" # 买入条件 buy_conditions: - type: "indicator_cross" indicator1: "EMA" params1: [12] indicator2: "EMA" params2: [26] direction: "up" # 上穿 - type: "indicator_compare" indicator: "RSI" params: [14] operator: "<" value: 70 # RSI < 70 # 卖出条件 sell_conditions: - type: "indicator_cross" indicator1: "EMA" params1: [12] indicator2: "EMA" params2: [26] direction: "down" # 风控参数 risk: stop_loss: 0.05 # 止损 5% take_profit: 0.15 # 止盈 15% trailing_stop: 0.03 # 移动止损 3% # 仓位管理 position: mode: "fixed_ratio" ratio: 0.2 # 20% 仓位 ``` ### 内置战法 | 战法ID | 名称 | 说明 | |--------|------|------| | ma_cross | 双均线交叉 | EMA快线上穿慢线买入 | | macd_cross | MACD交叉 | MACD金叉买入 | | rsi_oversold | RSI超卖反弹 | RSI<30买入,>70卖出 | | bollinger_breakout | 布林带突破 | 突破布林带上轨买入 | | trend_follow_ma | 趋势跟踪均线 | 均线趋势跟踪 | | volume_breakout | 放量突破 | 成交量放大+价格突破 | | kdj_cross | KDJ金叉死叉 | KDJ超买超卖 | ### 支持的条件类型 | 条件类型 | 说明 | 示例 | |----------|------|------| | indicator_cross | 指标交叉 | EMA上穿/下穿 | | indicator_compare | 指标比较 | RSI < 30 | | price_compare | 价格比较 | 价格 > BOLL上轨 | | volume_compare | 成交量比较 | 成交量 > 均量*1.5 | | price_breakout | 价格突破 | 突破20日高点 | ## 配置说明 ### 主配置文件 (config/config.yaml) ```yaml app: name: "ETF量化交易工具" version: "0.1.0" debug: true data: source: "akshare" # 数据源 db_path: "data/db/etf_quant.db" update_time: "18:00" backtest: initial_capital: 1000000 # 初始资金 commission_rate: 0.0003 # 佣金费率 slippage_rate: 0.0001 # 滑点费率 benchmark: "510300" # 基准ETF trade: mode: "simulation" # 交易模式: simulation/live position_limit: single_max: 0.30 # 单标的最大仓位 total_max: 0.95 # 总仓位上限 risk_control: daily_loss_limit: 0.03 # 日止损限制 max_drawdown_limit: 0.10 # 最大回撤限制 t1_enabled: true # 启用T+1规则 strategy: default_params: ma_short: 20 ma_long: 60 stop_loss: 0.05 take_profit: 0.15 ``` ## 策略开发 ### 策略基类 所有策略需继承 `BaseStrategy` 并实现 `on_bar` 方法: ```python from src.strategy.base import BaseStrategy, Bar class MyStrategy(BaseStrategy): def __init__(self): super().__init__(name="MyStrategy") def on_bar(self, bar: Bar) -> None: # 计算指标 ma20 = self.indicators.MA(bar.code, 20) ma60 = self.indicators.MA(bar.code, 60) # 获取持仓 position = self.get_position(bar.code) # 交易逻辑 if ma20 > ma60 and (position is None or position.volume == 0): volume = self.calc_position_size(bar.close, position_ratio=0.2) self.buy(bar.code, bar.close, volume) elif ma20 < ma60 and position and position.volume > 0: self.sell(bar.code, bar.close, position.volume) ``` ### 内置技术指标 | 指标 | 方法 | 说明 | |------|------|------| | MA | `MA(code, period)` | 简单移动平均 | | EMA | `EMA(code, period)` | 指数移动平均 | | MACD | `MACD(code, fast, slow, signal)` | MACD指标 | | RSI | `RSI(code, period)` | 相对强弱指标 | | KDJ | `KDJ(code, n, m1, m2)` | KDJ指标 | | BOLL | `BOLL(code, period, std_dev)` | 布林带 | | ATR | `ATR(code, period)` | 真实波幅 | | ADX | `ADX(code, period)` | 平均趋向指标 | | OBV | `OBV(code)` | 能量潮指标 | ### 策略模板 项目内置两个策略模板: 1. **TrendFollowStrategy** - 趋势跟踪策略 - 基于均线和成交量的趋势跟踪 - 支持止损止盈 2. **MACrossStrategy** - 均线交叉策略 - 经典的快慢均线交叉策略 - 支持移动止损 ## 回测系统 ### 运行回测 ```python from datetime import date from src.backtest.engine import BacktestEngine, BacktestConfig from src.strategy.templates import TrendFollowStrategy # 配置回测参数 config = BacktestConfig( initial_capital=1000000, commission_rate=0.0003, slippage_rate=0.0001, t1_enabled=True ) # 创建回测引擎 engine = BacktestEngine(config=config) # 创建策略 strategy = TrendFollowStrategy( ma_short=20, ma_long=60, stop_loss=0.05, take_profit=0.15 ) # 运行回测 result = engine.run( strategy=strategy, codes=["510300", "510500"], start=date(2023, 1, 1), end=date(2024, 12, 31) ) # 生成报告 engine.generate_report(result, "logs/backtest_report.txt") ``` ### 绩效指标 回测结果包含以下关键指标: | 指标 | 说明 | |------|------| | 总收益率 | 整体收益表现 | | 年化收益率 | 标准化收益比较 | | 最大回撤 | 最大亏损幅度 | | 夏普比率 | 风险调整后收益 | | 卡玛比率 | 收益回撤比 | | 胜率 | 交易成功率 | | 盈亏比 | 单笔收益风险比 | ## 交易系统 ### 模拟交易 ```python from src.trade.executor import TradeExecutor, TradeMode # 创建交易执行器 executor = TradeExecutor(mode=TradeMode.SIMULATION) executor.initialize() # 提交订单 result = executor.buy("510300", 4.0, 1000) # 查询持仓 positions = executor.get_positions() # 查询账户 account = executor.get_account() ``` ### 风险控制 系统内置多层风险控制: | 规则 | 说明 | |------|------| | T+1规则 | 当日买入次日才能卖出 | | 单标的仓位限制 | 单只ETF不超过总资金30% | | 总仓位限制 | 总仓位不超过95% | | 日止损限制 | 单日亏损超过3%暂停交易 | | 最大回撤限制 | 回撤超过10%降低仓位 | ### T+1规则实现 ```python from src.trade.risk import T1Validator validator = T1Validator() # 记录买入 validator.record_purchase("510300", date(2024, 1, 1)) # 检查是否可卖出 can_sell, msg = validator.can_sell("510300", date(2024, 1, 1)) # can_sell = False, 当日不可卖出 can_sell, msg = validator.can_sell("510300", date(2024, 1, 2)) # can_sell = True, 次日可卖出 ``` ## 日志系统 ### 日志分类 | 类型 | 目录 | 内容 | |------|------|------| | 系统日志 | logs/system/ | 系统启动、异常、性能 | | 交易日志 | logs/trade/ | 订单提交、成交、持仓变化 | | 策略日志 | logs/strategy/ | 信号生成、决策过程 | | 审计日志 | logs/audit/ | 关键操作、权限变更 | ### 使用日志 ```python from src.utils.logger import get_logger, trade_logger logger = get_logger("my_module") logger.info("信息日志") logger.warning("警告日志") logger.error("错误日志") # 交易日志 trade_logger.log_order({"order_id": "001", "code": "510300"}) trade_logger.log_fill({"order_id": "001"}, 4.0, 1000) ``` ## 数据库表结构 ### etf_basic - ETF基础信息 | 字段 | 类型 | 说明 | |------|------|------| | code | VARCHAR(10) | ETF代码 (主键) | | name | VARCHAR(50) | ETF名称 | | type | VARCHAR(20) | 类型 | | fund_company | VARCHAR(100) | 基金公司 | | list_date | DATE | 上市日期 | ### etf_daily - 日线行情 | 字段 | 类型 | 说明 | |------|------|------| | id | INTEGER | 主键 | | code | VARCHAR(10) | ETF代码 | | date | DATE | 日期 | | open | FLOAT | 开盘价 | | high | FLOAT | 最高价 | | low | FLOAT | 最低价 | | close | FLOAT | 收盘价 | | volume | FLOAT | 成交量 | | amount | FLOAT | 成交额 | ### trade_calendar - 交易日历 | 字段 | 类型 | 说明 | |------|------|------| | date | DATE | 日期 (主键) | | is_open | BOOLEAN | 是否开市 | | is_trading | BOOLEAN | 是否交易日 | ## 扩展开发 ### 添加新策略 1. 在 `src/strategy/templates/` 创建策略文件 2. 继承 `BaseStrategy` 类 3. 实现 `on_bar` 方法 4. 在 `__init__.py` 中导出 ### 添加新指标 在 `src/strategy/indicators.py` 中添加新方法: ```python def MyIndicator(self, code: str, param: int) -> pd.Series: series = self._get_series(code, "close") # 计算逻辑 return result ``` ### 添加新数据源 1. 在 `src/data/fetcher.py` 添加数据源初始化方法 2. 实现数据获取接口 3. 在配置文件中切换数据源 ## 常见问题 ### Q: 如何添加新的ETF到监控列表? 修改 `config/strategy_config.yaml`: ```yaml etf_pool: index: - "510300" - "510500" - "你的ETF代码" ``` ### Q: 如何修改风险控制参数? 修改 `config/config.yaml`: ```yaml trade: position_limit: single_max: 0.30 # 修改单标的仓位限制 total_max: 0.95 # 修改总仓位限制 risk_control: daily_loss_limit: 0.03 # 修改日止损限制 ``` ### Q: 如何查看回测详情? 回测完成后,查看 `logs/backtest_report.txt` 获取详细报告。 ### Q: 如何创建自定义战法? 编辑 `config/strategies/custom_strategies.yaml`,按照内置战法的格式添加自己的战法配置。 ## 技术栈 - **Python 3.10+** - **pandas** - 数据处理 - **numpy** - 数值计算 - **sqlalchemy** - 数据库ORM - **akshare** - 数据源 - **pydantic** - 配置管理 - **loguru** - 日志系统 - **matplotlib** - 可视化(可选) - **plotly** - 交互式图表(可选) ## 版本历史 - **v0.2.0** (2024-03) - 新增战法测试工具 - 支持自定义战法配置 - 批量测试和参数优化 - 可视化报告生成 - **v0.1.0** (2024-02) - 初始版本 - 实现数据获取、策略编写、回测验证、模拟交易 - 支持T+1规则和风险控制 ## 许可证 MIT License ## 联系方式 如有问题或建议,请提交 Issue。