中国A股引擎

📎 引用文件

本文引用的文件 - china_a.py - base.py - cn_adjust.py - tushare.py - eastmoney_loader.py - test_china_a_engine.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与回测特性
  8. 故障排查指南
  9. 结论
  10. 附录:配置与调优、常见陷阱

简介

本文件面向在中国A股市场进行策略回测的开发者,系统性说明本仓库中A股回测引擎的规则实现与数据处理流程。重点覆盖: - A股特有交易规则:涨跌停板(基于pre_close或pct_chg推导)、T+1制度、印花税与佣金、最低整手(100股)处理、滑点模型等。 - 数据预处理:复权因子处理(前复权)、除权除息调整、交易日历对齐与缺失值填充。 - ChinaAEngine核心方法:can_execute中的做空限制与T+1检查;round_size的100股整手处理;calc_commission的费用结构;_price_limit按代码前缀判断不同板块涨跌幅限制。 - 与真实交易所规则的对比验证思路与回测结果分析方法。

项目结构

围绕A股回测的关键代码位于以下模块: - 引擎层:BaseEngine提供通用执行循环与价格带计算;ChinaAEngine实现A股规则。 - 数据加载层:Tushare/Eastmoney加载器负责获取行情与基本面;cn_adjust提供复权因子应用。 - 测试层:针对A股引擎的交易规则、费用、涨跌停等进行单元测试。

graph TB subgraph "回测引擎" BE["BaseEngine<br/>通用执行循环/价格带"] CAE["ChinaAEngine<br/>A股规则实现"] end subgraph "数据加载" TSL["Tushare Loader<br/>日线/分钟线/基本面"] EML["Eastmoney Loader<br/>免费OHLCV"] ADJ["cn_adjust<br/>前复权因子应用"] end subgraph "测试" TST["test_china_a_engine<br/>规则与费用验证"] end BE --> CAE CAE --> BE TSL --> ADJ EML --> BE TST --> CAE

图表来源 - base.py:377-557 - china_a.py:20-93 - tushare.py:116-200 - eastmoney_loader.py:51-177 - cn_adjust.py:27-78 - test_china_a_engine.py:1-274

章节来源 - base.py:377-557 - china_a.py:20-93 - tushare.py:116-200 - eastmoney_loader.py:51-177 - cn_adjust.py:27-78 - test_china_a_engine.py:1-274

核心组件

章节来源 - base.py:377-557 - china_a.py:20-93 - cn_adjust.py:27-78 - tushare.py:116-200 - eastmoney_loader.py:51-177

架构总览

下图展示从数据加载到逐Bar执行的完整链路,以及A股规则如何嵌入执行路径。

sequenceDiagram participant User as "策略/用户" participant Loader as "数据加载器(Tushare/Eastmoney)" participant Align as "对齐与优化(_align)" participant Engine as "BaseEngine.run_backtest" participant CAE as "ChinaAEngine" participant Limit as "涨跌停检查(_blocked_by_limit)" User->>Loader : fetch(codes, start_date, end_date, interval) Loader-->>User : {symbol : DataFrame} User->>Align : generate signals + align dates Align-->>Engine : dates, close_df, target_pos, ret_df Engine->>CAE : 逐Bar执行 CAE->>CAE : can_execute(symbol, direction, bar) alt 允许交易 CAE->>Limit : _blocked_by_limit(...) Limit-->>CAE : 是否被涨跌停拦截 CAE->>CAE : round_size / calc_commission / apply_slippage CAE-->>Engine : 成交记录/持仓更新 else 拒绝交易 CAE-->>Engine : 跳过 end Engine-->>User : 指标与报告

图表来源 - base.py:647-718 - china_a.py:40-93 - china_a.py:115-172

详细组件分析

ChinaAEngine:A股规则实现

flowchart TD Start(["进入 can_execute"]) --> CheckShort{"是否做空?"} CheckShort --> |是| BlockShort["拒绝(无融券)"] CheckShort --> |否| CheckT1{"是否平仓且今日买入?"} CheckT1 --> |是| BlockT1["拒绝(T+1)"] CheckT1 --> |否| CheckLimit{"是否触及涨跌停?"} CheckLimit --> |是| BlockLimit["拒绝(涨跌停)"] CheckLimit --> |否| Allow["允许交易"]

图表来源 - china_a.py:40-68 - china_a.py:115-172

章节来源 - china_a.py:20-93 - china_a.py:115-172 - test_china_a_engine.py:56-156

涨跌停板计算与板块区分

flowchart TD In(["输入 symbol, bar, limit"]) --> Base["获取历史基准价(pre_close/前收/pct_chg)"] Base --> Band["计算价格带(lower, upper)"] Band --> Fill["计算拟成交价(open ± slippage)"] Fill --> Dir{"方向"} Dir --> |买入| BuyCheck{"fill >= upper - tol ?"} Dir --> |卖出| SellCheck{"fill <= lower + tol ?"} BuyCheck --> |是| BlockBuy["拒绝(涨停)"] BuyCheck --> |否| PassBuy["允许"] SellCheck --> |是| BlockSell["拒绝(跌停)"] SellCheck --> |否| PassSell["允许"]

图表来源 - base.py:468-557 - china_a.py:115-172 - china_a.py:174-193

章节来源 - base.py:468-557 - china_a.py:115-193 - test_china_a_engine.py:119-156

费用结构与最小整手

章节来源 - china_a.py:70-93 - test_china_a_engine.py:158-221

数据预处理:复权因子与除权除息

flowchart TD Raw["原始OHLCV(未复权)"] --> Factor["获取adj_factor并排序"] Factor --> Ratio["ratio = factor / 最新因子"] Ratio --> Scale["对O/H/L/C乘以ratio<br/>volume除以ratio"] Scale --> Out["前复权OHLCV"]

图表来源 - cn_adjust.py:27-78

章节来源 - cn_adjust.py:27-78

交易日历对齐与停牌处理

章节来源 - base.py:149-249

数据加载器与A股数据源

章节来源 - tushare.py:116-200 - eastmoney_loader.py:51-177

依赖关系分析

graph LR TSL["Tushare Loader"] --> ADJ["cn_adjust"] EML["Eastmoney Loader"] --> BE["BaseEngine"] ADJ --> BE BE --> CAE["ChinaAEngine"] TST["test_china_a_engine"] --> CAE

图表来源 - base.py:377-557 - china_a.py:20-93 - cn_adjust.py:27-78 - tushare.py:116-200 - eastmoney_loader.py:51-177 - test_china_a_engine.py:1-274

章节来源 - base.py:377-557 - china_a.py:20-93 - cn_adjust.py:27-78 - tushare.py:116-200 - eastmoney_loader.py:51-177 - test_china_a_engine.py:1-274

性能与回测特性

[本节为通用指导,不直接分析具体文件]

故障排查指南

章节来源 - china_a.py:40-93 - china_a.py:115-172 - cn_adjust.py:27-78 - tushare.py:18-80 - eastmoney_loader.py:92-110

结论

本A股回测引擎在BaseEngine的统一框架下,实现了贴合A股交易制度的规则集:涨跌停板、T+1、最低整手、费用与滑点。数据侧通过复权因子与前向填充,确保收益序列连续与对齐稳健。测试覆盖了关键分支,可作为策略开发与实盘前的可靠基线。建议在策略上线前,结合真实交易所规则进行对照验证,并对参数进行敏感性分析。

[本节为总结,不直接分析具体文件]

附录:配置与调优、常见陷阱

回测配置示例(A股)

章节来源 - china_a.py:20-39 - base.py:388-413

参数调优指南

[本节为通用指导,不直接分析具体文件]

常见陷阱与避免方法

章节来源 - base.py:468-557 - china_a.py:40-93 - cn_adjust.py:27-78