特别声明
零依赖、轻量级,一行命令跑回测,PTrade策略本地化验证方案全解析。
一、痛点:券商PTrade说挂就挂
做量化交易的朋友应该都有这种经历——
辛辛苦苦写完一个策略,兴冲冲登录券商PTrade准备回测,结果:
"系统维护中,预计2小时后恢复" "当前计算容器已满" 偶尔还会遇到,下午3点收盘后直接登不上,第二天开盘前才恢复
券商PTrade是云端环境,登录、回测、调参全部依赖券商服务器。 服务器一挂,你的策略调试进度直接归零。周末想调个策略?不好意思,不开市服务器也不开。
有没有办法在本地电脑上搭建一套PTrade环境,随时随地写策略、跑回测、看绩效,等策略成熟了再一键部署到券商端?
有的,这就是今天要介绍的 MiniPTrade。
二、MiniPTrade 是什么
MiniPTrade 是一个轻量级本地PTrade回测引擎,核心特点:
零依赖:不依赖任何第三方回测框架(如Zipline、Backtrader等),直接从DuckDB数据库加载行情数据 API兼容:完全模拟PTrade标准API( initialize、handle_data、order、get_history等),策略代码几乎不需要修改就能在真实PTrade上运行秒级出结果:纯内存计算,日线级别回测几秒钟跑完一整年 本地离线:不需要联网,不需要登录,随时随地跑
一句话概括:PTrade策略的本地沙盒环境。
三、核心架构
MiniPTrade 的设计非常简洁,主要由四层组成:
run_backtest.py ← CLI入口,解析命令行参数 │engine/backtester.py ← 回测主事件循环 │engine/api.py ← PTrade API兼容层(25+个函数) │engine/data_loader.py ← DuckDB数据加载层3.1 回测事件循环
MiniPTrade 完全模拟PTrade的回测执行流程:
1. 加载策略文件,编译执行2. 调用 initialize(context) —— 策略初始化3. 遍历每个交易日: ├── before_trading_start(context, data) ├── handle_data(context, data) └── after_trading_end(context, data)4. 生成绩效报告3.2 API兼容层
engine/api.py 是核心中的核心,它创建了一个包含 25+个PTrade标准函数 的命名空间,注入到策略运行环境中:
| 行情数据 | get_history() | |
get_price() | ||
get_Ashares() | ||
get_fundamentals() | ||
| 交易下单 | order() | |
order_target() | ||
order_value() | ||
order_target_value() | ||
| 仓位查询 | get_position() | |
get_positions() | ||
get_trades() | ||
| 参数配置 | set_benchmark() | |
set_slippage() | ||
set_commission() | ||
| 工具函数 | log.info/warning/error() | |
g |
3.3 交易执行引擎
内置完整的成交模拟逻辑:
滑点模型:按比例计算买入/卖出滑点 手续费:默认万三,可自定义 涨跌停限制:检查 high_limit/low_limit资金校验:买入前检查现金是否充足 持仓成本:加权平均法计算成本价
四、快速上手
4.1 环境准备
唯一的外部依赖是一个 DuckDB数据库文件,其中包含A股日线行情数据。
DuckDB表结构要求:
stock_code | 000001.SZ) | |
date | ||
open | ||
high | ||
low | ||
close | ||
volume | ||
amount | ||
period | '1d') | |
symbol_type | 'stock') |
4.2 运行第一个回测
# 基本用法:跑双均线策略python run_backtest.py strategies/ma_cross_demo.py# 自定义参数python run_backtest.py strategies/ma_cross_demo.py \ --start 2024-01-01 \ --end 2024-12-31 \ --capital 200000 \ --duckdb-path D:/StockData/stock_data.ddb# 指定基准指数python run_backtest.py strategies/my_strategy.py --benchmark 000905.SS4.3 编写一个策略
来看一个完整的双均线策略(MA5上穿MA20买入,下穿卖出):
definitialize(context): set_benchmark('000300.SS') g.max_hold = 5 g.short_window = 5 g.long_window = 20 g.positions_list = []defbefore_trading_start(context, data): current_date = context.blotter.current_dt.strftime("%Y%m%d") g.all_stocks = get_Ashares(current_date)defhandle_data(context, data):# 卖出:死叉for stock inlist(g.positions_list): hist = get_history(g.long_window + 1, '1d', ['close'], [stock]) closes = hist[stock]['close'] ma_short = closes.rolling(g.short_window).mean() ma_long = closes.rolling(g.long_window).mean()if ma_short.iloc[-1] < ma_long.iloc[-1]: order_target(stock, 0) g.positions_list.remove(stock)# 买入:金叉iflen(g.positions_list) >= g.max_hold:returnfor stock in g.all_stocks[:200]: hist = get_history(g.long_window + 1, '1d', ['close'], [stock]) closes = hist[stock]['close'] ma_short = closes.rolling(g.short_window).mean() ma_long = closes.rolling(g.long_window).mean()if ma_short.iloc[-1] > ma_long.iloc[-1]: order_target_value(stock, context.portfolio.portfolio_value / g.max_hold) g.positions_list.append(stock)是不是和你在券商PTrade上写的代码一模一样?没错,API完全兼容。
五、回测报告
跑完回测后,MiniPTrade会自动输出完整的绩效报告:
初始资金: 100,000.00最终净值: 123,456.78总收益: 23.46%年化收益: 21.83%最大回撤: 15.32%Sharpe: 1.52交易次数: 47 (买24 / 卖23)总佣金: 58.32胜率: 56.5%基准收益: 8.21%超额收益: 15.25%涵盖核心指标:总收益率、年化收益率、最大回撤、夏普比率、交易次数、胜率、基准对比、超额收益。
六、配套工具链
MiniPTrade不仅仅是一个回测引擎,还附带了一套完整的数据工具链:
6.1 Tushare数据下载
# 下载行业分类、基本面数据python download_tushare_data.py --token YOUR_TUSHARE_TOKEN# 下载策略专用数据(daily_basic、stk_limit等)python download_strategy_data.py --start 2024-01-01 --end 2024-12-31自动从Tushare拉取申万行业分类、成分股、财务指标、市值PE/PB等补充数据。
6.2 DuckDB本地数据导出
python export_duckdb_data.py不依赖Tushare API,直接从DuckDB导出策略所需的各类数据(daily_basic、bak_basic、stk_limit、dv_ttm等)。
七、适用场景
适合
PTrade策略的原型开发和快速验证 周末/节假日想调策略但券商服务器关停 批量参数优化(本地跑得快,不受云端排队限制) 策略代码调试(本地IDE打断点,比云端print大法好用一百倍) 从聚宽/米筐等平台迁移策略到PTrade
不适合
需要分钟级/Tick级数据的策略(目前仅支持日线) 需要实时行情驱动的日内交易 需要完整财务数据库的基本面策略( get_fundamentals返回空值)
九、与真实PTrade的差异
十、部署建议
推荐的工作流:
1. 本地MiniPTrade → 策略开发、调试、参数优化 │ ▼2. 本地确认策略逻辑正确、绩效达标 │ ▼3. 复制策略代码 → 券商PTrade云端回测验证 │ ▼4. 券商PTrade模拟盘 → 实盘上线这样既享受了本地开发的便利性(速度快、随时可用、IDE调试),又保证了最终上线的策略经过了券商环境的验证。
十一、总结
MiniPTrade 解决了一个非常实际的痛点:券商PTrade不稳定时,策略开发不能停。
核心优势就三点:
API完全兼容:写的策略代码不改就能上券商PTrade 零依赖秒启动:不需要配环境、装框架,Python + DuckDB就能跑 本地离线随时用:凌晨3点灵感来了也能立刻跑回测
目前在 code_converter/ptrade_local/ 目录下开箱即用,配合 DuckDB 数据库就能搭建完整的本地PTrade回测环境。
本文基于 MiniPTrade 本地回测引擎编写,项目地址见 code_converter/ptrade_local/
如有疑问,欢迎在评论区留言交流。
📱 关注我们
欢迎扫码持续关注公众号,会持续分享
🔍 公众号名称: 王者quant📚 分享内容: 量化交易、Python编程、投资策略🎯 更新频率: 持续更新,干货满满
通过公众号您可以获得:
📈 最新的量化交易策略分享 💻 Python量化编程技巧 📊 市场分析和投资心得 🚀 EasyXT功能更新和使用技巧 💡 量化交易实战案例
本教程仅供学习参考,实际交易请谨慎操作!

研报速递
发表评论
发表评论: