聚宽策略想实盘?这个开源项目让你一行代码不改直接跑

聚宽策略想实盘?这个开源项目让你一行代码不改直接跑

写了个量化策略,回测年化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 就怎么写。initializehandle_datarun_dailyorderget_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 报告一键生成:收益曲线、回撤、交易记录全都有

backtest_result

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

自动遍历所有参数组合,输出最优解。

optimize-demo

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):
    # 实时处理每一笔 tick
    code = 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) │
│  产生交易信号    │          │   执行真实下单   │
└─────────────────┘          └─────────────────┘
                                     │
                                     ▼
                              ┌─────────────────┐
                              │   券商真实账户   │
                              └─────────────────┘

使用步骤

  1. 在 Windows 机器上启动 QMT Server:
bullet-trade server --listen 0.0.0.0 --port 58620 --token your_secret
  1. bullet_trade_jq_remote_helper.py 上传到聚宽研究根目录

  2. 在聚宽模拟盘策略中,信号触发时调用远程下单:

import bullet_trade_jq_remote_helper as bt

def initialize(context):
    # 配置远程 QMT Server
    bt.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 监控面板
  • 更多数据源支持
  • 策略模板库

最后

开源不易,如果觉得有用:

有问题欢迎在评论区聊,也想听听大家实盘都用什么方案?


⚠️ 风险提示:量化交易有风险,任何策略都不保证收益。请先在模拟环境充分验证,实盘从小仓位开始。


作者是个独立开发者,白天搬砖晚上写代码,欢迎交流量化心得。

posted @ 2025-12-04 17:10  bigbencat  阅读(0)  评论(0)    收藏  举报