聚宽策略想实盘?这个开源项目让你一行代码不改直接跑
写了个量化策略,回测年化30%,然后呢?实盘的坑比你想象的多得多。
故事的开始
两年前,我遇到了和很多聚宽用户一样的问题:策略回测效果不错,但实盘很麻烦。
- 聚宽官方实盘:要订阅服务,每月费用不低,而且有持仓限制
- 自己对接券商:代码要改,API 完全不一样,光调试就要几周
- 用 vnpy 等框架:学习成本高,之前写的聚宽代码全要重写
当时没找到满意的方案,就自己撸了一个本地交易系统,边用边改,跑了两年多,实盘也一直在用。
但这套代码写得比较野,东一块西一块,自己用没问题,想开源给别人用就不太行了——文档没有、结构混乱、到处是 hardcode。
今年终于下定决心,基于这两年的实战经验,从头重构了一版,这就是 BulletTrade。
核心逻辑经过了两年实盘验证,但代码是全新的,架构清晰、文档齐全、方便扩展。
一句话介绍
BulletTrade 是一个兼容聚宽 API 的本地量化框架,让你的聚宽策略代码几乎不改就能在本地回测、实盘。
pip install bullet-trade
就这么简单。
为什么要做这个?
先聊聊聚宽用户实盘的几条路:
| 方案 | 优点 | 痛点 |
|---|---|---|
| 聚宽官方实盘 | 代码不用改 | 收费、有限制、依赖聚宽服务器 |
| 自己对接券商 API | 完全自主 | 代码要重写、对接成本高 |
| vnpy/掘金等框架 | 功能强大 | 聚宽代码不兼容、学习曲线陡 |
| BulletTrade | 聚宽代码兼容、本地运行 | 还在完善中 |
我的设计目标很简单:
让
from jqdata import *这行代码在本地也能跑。
策略逻辑不用改,换个运行环境就能从回测切到实盘。
核心功能
1. 聚宽策略无缝迁移
你在聚宽写的策略,大概率可以直接用。
# 这是一个标准的聚宽策略,bullet-trade 直接支持
from jqdata import *def initialize(context):set_benchmark('000300.XSHG')g.security = '510300.XSHG'run_daily(trade, 'every_bar')def trade(context):if g.security not in context.portfolio.positions:order_value(g.security, context.portfolio.available_cash)
在聚宽怎么写,在 bullet-trade 就怎么写。initialize、handle_data、run_daily、order、get_price... 这些 API 都兼容。
2. 多数据源支持
不想用聚宽数据?没问题,切换数据源只需要改一行配置:
# .env 配置文件
DEFAULT_DATA_PROVIDER=jqdata # 聚宽数据(需要账号)
# DEFAULT_DATA_PROVIDER=miniqmt # MiniQMT 数据
# DEFAULT_DATA_PROVIDER=tushare # TuShare 数据
支持的数据源:
- MiniQMT:QMT 客户端自带,开通券商账户即可免费使用
- TuShare:注册即可用,部分高级数据需要积分
- JQData:聚宽官方数据,质量好但需要付费
- 本地缓存:自动缓存历史数据,重复回测更快
3. 回测引擎
一条命令跑回测:
bullet-trade backtest your_strategy.py --start 2024-01-01 --end 2024-12-01
回测引擎的特点:
- 真实价格撮合:用开盘价/收盘价成交,不是用信号价
- 分红送股处理:自动处理除权除息,回测更真实
- 支持分钟/日线:
--frequency minute或--frequency day - HTML 报告一键生成:收益曲线、回撤、交易记录全都有

4. 参数优化
策略里有参数想调优?多进程并行帮你跑:
bullet-trade optimize your_strategy.py \--params '{"ma_period": [5, 10, 20], "threshold": [0.01, 0.02, 0.03]}' \--start 2020-01-01 --end 2023-12-31
自动遍历所有参数组合,输出最优解。

5. Tick 实时行情(打板利器)
对于打板、抢涨停的用户,行情延迟至关重要。bullet-trade 支持 tick 级别的实时行情订阅:
def initialize(context):g.watch_list = ['000001.XSHE', '000002.XSHE']g.limit_up = {} # 缓存涨停价# 订阅 tick 数据subscribe(g.watch_list, 'tick')def before_trading_start(context):# 开盘前获取涨停价,写入全局变量for code in g.watch_list:data = get_current_data()[code]g.limit_up[code] = data.high_limit # 涨停价def handle_tick(context, tick):# 实时处理每一笔 tickcode = tick['sid']price = tick['last_price']bid1_vol = tick.get('bid1_volume', 0) # 买一量(封单量)# 判断涨停 + 封单量limit_up = g.limit_up.get(code)if limit_up and price >= limit_up and bid1_vol > 100000:print(f"{code} 涨停封单!封单量: {bid1_vol}")
Tick 功能特点:
- ⚡ 毫秒级延迟:基于 QMT 的 xtdata 实时推送
- 📊 盘口深度:买一卖一价格和挂单量
- 🌐 全市场订阅:
subscribe(['SH', 'SZ'], 'tick')扫描全市场
打板场景:实时监控封单量变化,判断涨停板强度,抓住打开瞬间。
6. 实盘接入
这是重点。bullet-trade 提供两种主要的实盘方案:
方案一:独立实盘(完全本地运行)
策略代码、数据、下单全部在本地完成,不依赖任何外部平台。
本地 QMT(Windows)
如果你有 QMT 客户端(国金、华鑫等券商都支持),一条命令启动:
bullet-trade live your_strategy.py --broker qmt
策略就跑起来了,下单直接走券商通道。
远程 QMT Server(Mac/Linux 也能用)
没有 Windows 电脑?没关系。
先在一台 Windows 机器(或云服务器)上运行 QMT Server:
bullet-trade server --listen 0.0.0.0 --port 58620 --token your_secret
然后在你的 Mac/Linux 上运行策略:
bullet-trade live your_strategy.py --broker qmt-remote
策略在本地跑,下单请求通过网络发到 Windows 上的 QMT。
这意味着:
- 🍎 Mac 用户也能实盘了
- ☁️ 策略可以跑在云服务器上
- 🔒 策略代码不用上传到任何平台
方案二:聚宽模拟盘 + 远程 QMT Server
这是一个混合方案:策略在聚宽模拟盘实时运行,产生交易信号后调用你自己的 QMT Server 执行真实下单。
适用场景:
- 策略已经在聚宽模拟盘跑了很久,验证过了
- 想用聚宽的数据和策略托管,但实盘用自己的券商
- 聚宽官方实盘太贵或有限制,想接自己的账户
工作原理:
┌─────────────────┐ ┌─────────────────┐
│ 聚宽模拟盘 │ ──────▶ │ 远程 QMT Server │
│ (策略实时运行) │ HTTP │ (Windows + QMT) │
│ 产生交易信号 │ │ 执行真实下单 │
└─────────────────┘ └─────────────────┘│▼┌─────────────────┐│ 券商真实账户 │└─────────────────┘
使用步骤:
- 在 Windows 机器上启动 QMT Server:
bullet-trade server --listen 0.0.0.0 --port 58620 --token your_secret
-
把
bullet_trade_jq_remote_helper.py上传到聚宽研究根目录 -
在聚宽模拟盘策略中,信号触发时调用远程下单:
import bullet_trade_jq_remote_helper as btdef initialize(context):# 配置远程 QMT Serverbt.configure(host='你的服务器IP',port=58620,token='your_secret')def handle_data(context, data):# 你的策略逻辑...产生信号if should_buy:# 聚宽模拟盘下单(可选,用于记录)order('510300.XSHG', 100)# 同时调用远程 QMT 真实下单bt.order('510300.XSHG', 100)# 也可以查询真实账户信息real_portfolio = bt.get_portfolio()print(f"真实账户可用资金: {real_portfolio['available_cash']}")
优势:
- 📊 策略托管在聚宽:7x24 小时运行,不用自己维护服务器
- 💰 下单走自己券商:佣金更低,资金在自己账户
- 🔄 信号和执行分离:聚宽产生信号,QMT 执行交易,各司其职
- ✅ 双重记录:聚宽模拟盘记录一份,真实账户执行一份,方便对账
快速上手
三步跑通:
Step 1: 安装
pip install bullet-trade
Step 2: 配置数据源
创建 .env 文件,选择一个数据源:
# 方式一:MiniQMT(推荐,开通 QMT 后免费使用)
DEFAULT_DATA_PROVIDER=qmt# 方式二:TuShare(需要注册,部分数据免费)
# DEFAULT_DATA_PROVIDER=tushare
# TUSHARE_TOKEN=你的token# 方式三:JQData(聚宽数据,需要申请账号)
# DEFAULT_DATA_PROVIDER=jqdata
# JQDATA_USER=你的账号
# JQDATA_PASSWORD=你的密码# 方式四:先用模拟数据体验
# DEFAULT_DATA_PROVIDER=simulator
数据源说明:
- MiniQMT:开通 QMT 券商账户后免费使用,数据质量好,推荐
- TuShare:注册即可用,部分高级数据需要积分
- JQData:聚宽官方数据,质量最好但需要付费
Step 3: 运行
# 回测
bullet-trade backtest your_strategy.py --start 2024-01-01 --end 2024-06-01# 或者启动研究环境(JupyterLab)
bullet-trade lab
就这么简单。你之前在聚宽写的策略,复制过来基本就能跑。
和聚宽的关系
说明一下:bullet-trade 不是聚宽官方项目,是我个人开发的开源工具。
它的定位是:
- 聚宽的补充,不是替代
- 让聚宽用户的策略能本地化运行
- 提供从回测到实盘的完整链路
如果你:
- 只需要研究和回测 → 聚宽研究环境足够了
- 想要本地运行、实盘接入 → bullet-trade 是个选择
两者可以配合使用:在聚宽上研究调试,确认没问题后用 bullet-trade 本地实盘。
项目现状
目前版本(v0.x)已经稳定可用:
✅ 已支持
- 聚宽 API 兼容(大部分常用 API)
- 多数据源(JQData、MiniQMT、TuShare)
- 日线/分钟级回测
- 参数优化
- 本地/远程 QMT 实盘
- CLI 工具链
🔲 规划中
- Web UI 监控面板
- 更多数据源支持
- 策略模板库
最后
开源不易,如果觉得有用:
- ⭐ GitHub Star:https://github.com/BulletTrade/bullet-trade
- 📖 文档站点:https://bullettrade.cn/
- 💬 问题反馈:GitHub Issue 或微信交流
有问题欢迎在评论区聊,也想听听大家实盘都用什么方案?
⚠️ 风险提示:量化交易有风险,任何策略都不保证收益。请先在模拟环境充分验证,实盘从小仓位开始。
作者是个独立开发者,白天搬砖晚上写代码,欢迎交流量化心得。