Skip to content

SimTradeLab is an open-source backtesting framework inspired by PTrade’s event-driven architecture. It features a lightweight, modular design and full syntax compatibility, enabling seamless strategy development and validation.

License

Notifications You must be signed in to change notification settings

kay-ou/SimTradeLab

Repository files navigation

📈 SimTradeLab

轻量级量化回测框架 - PTrade API本地实现

Python License License: Commercial Version PyPI PyPI - Downloads

完整模拟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图可视化(资产曲线/每日盈亏/买卖金额/持仓市值)

🔬 Research模式(交互式探索)

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


📚 API文档

已实现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要求)

💼 商业使用

何时需要商业许可:

  • 将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                       # 贡献指南

🔧 开发指南

添加新策略

  1. strategies/ 创建新目录
  2. 添加 backtest.py 文件,实现生命周期函数
  3. 修改 run_backtest.pystrategy_name
  4. 运行回测

扩展API

  1. src/simtradelab/ptrade/api.py 添加新方法
  2. src/simtradelab/ptrade/lifecycle_config.py 配置阶段限制
  3. 更新文档

详细开发规范: 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

详见 INSTALLATION.md - Q7


🤝 贡献指南

我们非常欢迎社区贡献!

参与方式:

  • 🐛 报告问题
  • 💻 实现缺失的API功能
  • 🔧 修复Bug和性能优化
  • 📚 完善文档和示例
  • 💡 分享策略和使用反馈

贡献者许可协议(CLA):

  • 您拥有提交代码的完整版权
  • 您同意按照 AGPL-3.0 许可证发布
  • 您同意项目维护者有权用于商业许可授权

详细贡献指南: docs/CONTRIBUTING.md


⚖️ 免责声明

SimTradeLab 是一个由社区独立开发的开源策略回测框架,灵感来源于 PTrade 的事件驱动设计理念,但并未包含 PTrade 的源代码、商标或任何受保护内容。该项目不隶属于 PTrade,也未获得其官方授权。

使用本框架构建或测试策略的用户应自行确保符合所在地区的法律法规、交易平台的使用条款及数据源的合规性。项目开发者不对任何由使用本项目所引发的直接或间接损失承担责任。


🙏 致谢

  • 感谢PTrade提供的API设计灵感
  • 感谢所有贡献者和用户反馈
  • 感谢在实际策略开发中帮助发现和修复Bug的用户

特别说明: SimTradeLab是社区驱动的开源项目,我们在实际策略开发中不断完善功能。由于时间和资源有限,测试覆盖还不够全面,欢迎社区参与,共同发现和解决问题。


⭐ 如果这个项目对您有帮助,请给我们一个星标!

🐛 报告问题 | 💡 功能请求 | 📚 完整文档


💖 赞助支持

如果这个项目对您有帮助,欢迎赞助支持开发!

微信赞助 支付宝赞助

您的支持是我们持续改进的动力!

About

SimTradeLab is an open-source backtesting framework inspired by PTrade’s event-driven architecture. It features a lightweight, modular design and full syntax compatibility, enabling seamless strategy development and validation.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Sponsor this project

Packages

No packages published