轻量级量化回测框架 - PTrade API本地实现
完整模拟PTrade平台API,策略可无缝迁移
SimTradeLab(深测Lab) 是一个由社区独立开发的开源策略回测框架,灵感来源于 PTrade 的事件驱动架构。它具备完全自主的实现与出色的扩展能力,为策略开发者提供一个轻量级、结构清晰、模块可插拔的策略验证环境。框架无需依赖 PTrade 即可独立运行,但与其语法保持高度兼容。所有在 SimTradeLab 中编写的策略可无缝迁移至 PTrade 平台,反之亦然,两者之间的 API 可直接互通使用。详情参考:https://github.com/kay-ou/ptradeAPI 项目。
核心特性:
- ✅ 52个核心API - 股票交易、数据查询、技术指标完整支持(34% PTrade API完成度)
- ⚡ 20-30倍性能提升 - 本地回测比PTrade平台快20-30倍
- 🚀 数据常驻内存 - 单例模式,首次加载后常驻,二次运行秒级启动
- 💾 多级智能缓存 - LRU缓存(MA/VWAP/复权/历史数据),命中率>95%
- 🧠 智能数据加载 - AST静态分析策略代码,按需加载数据,节省内存
- 🔧 生命周期控制 - 7个生命周期阶段,严格模拟PTrade的API调用限制
- 📊 完整统计报告 - 收益、风险、交易明细、持仓批次、FIFO分红税
- 🔌 模块化设计 - 清晰的代码结构,易于扩展和定制
当前版本: v2.0.0 | 开发状态: Beta - 核心功能完善,正在策略实战中持续优化
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
# 安装最新版本
pip install simtradelab
# 包含优化器(可选)
pip install simtradelab[optimizer]系统依赖:
- macOS:
brew install hdf5 ta-lib - Linux:
sudo apt-get install libhdf5-dev+ ta-lib源码编译
详细安装指南:docs/INSTALLATION.md
将PTrade数据文件放到 data/ 目录:
data/
├── ptrade_data.h5 # 股票价格、除权数据
└── ptrade_fundamentals.h5 # 基本面数据
数据获取: 推荐使用 SimTradeData 项目获取A股历史数据
创建策略文件 strategies/my_strategy/backtest.py:
def initialize(context):
"""策略初始化"""
set_benchmark('000300.SS')
context.stocks = ['600519.SS', '000858.SZ']
def handle_data(context, data):
"""每日交易逻辑"""
for stock in context.stocks:
hist = get_history(20, '1d', 'close', [stock], is_dict=True)
if stock not in hist:
continue
prices = hist[stock]
ma5 = sum(prices[-5:]) / 5
ma20 = sum(prices[-20:]) / 20
# 金叉买入
if ma5 > ma20 and stock not in context.portfolio.positions:
order_value(stock, context.portfolio.portfolio_value * 0.3)
# 死叉卖出
elif ma5 < ma20 and stock in context.portfolio.positions:
order_target(stock, 0)注意:Backtest模式严格模拟PTrade限制
- ❌ 不支持f-string(使用
.format()或%格式化) - ❌ 不支持io、sys等模块导入
- ✅ 启动时自动检查Python 3.5兼容性
# run_backtest.py
from simtradelab.backtest.runner import BacktestRunner
runner = BacktestRunner()
runner.run(
strategy_name='my_strategy',
start_date='2024-01-01',
end_date='2024-12-31',
initial_capital=1000000.0
)执行:
poetry run python run_backtest.py回测完成后,在策略目录下生成:
strategies/my_strategy/stats/
├── backtest_*.log # 详细日志
└── backtest_*.png # 4图可视化(资产曲线/每日盈亏/买卖金额/持仓市值)
SimTradeLab提供与PTrade完全兼容的Research模式,支持Jupyter Notebook交互式数据分析。
# 在Jupyter Notebook中
from simtradelab.research.api import init_api, get_price, get_history
# 初始化API(按需加载模式)
api = init_api()
# 获取历史价格
df = get_price('600519.SS', start_date='2024-01-01', end_date='2024-12-31')
# 获取历史数据
hist = get_history(20, '1d', 'close', ['600519.SS'])
# 获取指数成分股
stocks = api.get_index_stocks('000300.SS', date='2024-01-01')特点:
- ✅ 无生命周期限制 - 所有API可随时调用
- ✅ 智能按需加载 - 首次访问时自动加载相关数据集
- ✅ 数据常驻 - 单例模式,多次运行秒级启动
- ✅ 支持f-string - 不受PTrade语法限制
示例Notebook:src/simtradelab/research/notebook.ipynb
已实现52个核心API(34% PTrade API完成度),涵盖股票交易、数据查询、技术指标、策略配置等核心功能。
核心API分类:
| 类别 | 完成度 | 说明 |
|---|---|---|
| 交易API | ✅ | order, order_target, order_value, order_target_value, cancel_order |
| 数据查询 | ✅ | get_price, get_history, get_fundamentals, get_stock_info |
| 板块信息 | ✅ | get_index_stocks, get_industry_stocks, get_stock_blocks |
| 技术指标 | ✅ | get_MACD, get_KDJ, get_RSI, get_CCI |
| 策略配置 | ✅ | set_benchmark, set_commission, set_slippage, set_universe |
| 生命周期 | ✅ | initialize, before_trading_start, handle_data, after_trading_end |
| 融资融券 | ❌ | 19个API未实现 |
| 期货/期权 | ❌ | 22个API未实现 |
完整API列表和实现状态: docs/PTrade_API_Implementation_Status.md
本项目采用 双许可证 模式:
- GNU Affero General Public License v3.0 (AGPL-3.0) - 查看 LICENSE | 中文说明
- ✅ 免费用于开源项目
- ✅ 个人学习和研究
⚠️ 网络使用需开源(AGPL要求)
- 商业许可证 - 查看 LICENSE-COMMERCIAL.md | 中文说明
- ✅ 用于商业/闭源产品
- ✅ 提供技术支持和定制服务
- 📧 联系: kayou@duck.com
何时需要商业许可:
- 将SimTradeLab集成到商业产品/SaaS服务中
- 作为内部工具但不希望开源代码
- 需要技术支持和定制开发
SimTradeLab/
├── src/simtradelab/
│ ├── ptrade/ # PTrade API模拟层(52个核心API)
│ ├── backtest/ # 回测引擎(统计、优化、配置)
│ ├── research/ # Research模式(无生命周期限制)
│ ├── service/ # 核心服务(数据常驻)
│ └── utils/ # 工具模块(路径、性能、兼容检查)
├── strategies/ # 策略目录
├── data/ # 数据目录
└── docs/ # 文档
├── PTrade_API_Implementation_Status.md # API实现状态
├── ARCHITECTURE.md # 架构设计文档
├── INSTALLATION.md # 详细安装指南
├── TOOLS.md # 工具脚本说明
├── IDE_SETUP.md # IDE配置指南
└── CONTRIBUTING.md # 贡献指南
- 在
strategies/创建新目录 - 添加
backtest.py文件,实现生命周期函数 - 修改
run_backtest.py的strategy_name - 运行回测
- 在
src/simtradelab/ptrade/api.py添加新方法 - 在
src/simtradelab/ptrade/lifecycle_config.py配置阶段限制 - 更新文档
详细开发规范: docs/DEVELOPMENT_RULES.md
- ❌ 不支持分钟线数据(仅日线)
- ❌ 不支持实盘交易(仅回测)
⚠️ 测试覆盖不全面(策略驱动测试中)- ⏳ 99个PTrade API未实现(融资融券、期货、期权等)
- 🔧 命令行工具(目前需要修改Python文件)
- 🔧 内存优化(支持小内存环境<8GB)
- 🔧 SimTradeData性能优化(数据获取速度慢)
详细问题追踪: GitHub Issues
Q: 如何修改初始资金?
runner.run(initial_capital=2000000.0) # 修改这里Q: 回测太慢怎么办?
- 减少股票数量或缩短回测时间
- 数据常驻已默认启用(二次运行秒级启动)
Q: 如何查看更多日志?
日志文件位于 strategies/{strategy_name}/stats/*.log
Q: 数据从哪里获取? 使用 SimTradeData 项目获取A股历史数据
Q: 数据加载异常或回测结果不正常? 可能是缓存问题,尝试清理并重建:
cd data
rm -rf .keys_cache/ ptrade_adj_pre.h5 ptrade_dividend_cache.h5我们非常欢迎社区贡献!
参与方式:
- 🐛 报告问题
- 💻 实现缺失的API功能
- 🔧 修复Bug和性能优化
- 📚 完善文档和示例
- 💡 分享策略和使用反馈
贡献者许可协议(CLA):
- 您拥有提交代码的完整版权
- 您同意按照 AGPL-3.0 许可证发布
- 您同意项目维护者有权用于商业许可授权
详细贡献指南: docs/CONTRIBUTING.md
SimTradeLab 是一个由社区独立开发的开源策略回测框架,灵感来源于 PTrade 的事件驱动设计理念,但并未包含 PTrade 的源代码、商标或任何受保护内容。该项目不隶属于 PTrade,也未获得其官方授权。
使用本框架构建或测试策略的用户应自行确保符合所在地区的法律法规、交易平台的使用条款及数据源的合规性。项目开发者不对任何由使用本项目所引发的直接或间接损失承担责任。
- 感谢PTrade提供的API设计灵感
- 感谢所有贡献者和用户反馈
- 感谢在实际策略开发中帮助发现和修复Bug的用户
特别说明: SimTradeLab是社区驱动的开源项目,我们在实际策略开发中不断完善功能。由于时间和资源有限,测试覆盖还不够全面,欢迎社区参与,共同发现和解决问题。

