Qbot 分层设计与事件驱动架构:数据、策略、引擎、接口、通知、分析、扩展七层职责解析
【免费下载链接】Qbot[🔥updating ...] AI 自动量化交易机器人(完全本地部署) AI-powered Quantitative Investment Research Platform. 📃 online docs: https://ufund-me.github.io/Qbot ✨ :news: qbot-mini: https://github.com/Charmve/iQuant项目地址: https://gitcode.com/GitHub_Trending/qbot/Qbot
本文基于仓库根目录的 DEVELOPMENT.md(以及内容更全的 docs/DEVELOPMENT.md)展开,逐层拆解 Qbot「AI 自动量化交易机器人」的分层架构设计:数据层如何统一表达行情数据、策略层如何用统一模板承载多因子/机器学习策略、Engine 层如何编排回测与模拟/实盘交易,以及事件驱动机制在 GUI 与交易引擎中的落点。读完本篇,你可以按层定位 Qbot 的代码目录,理解各层职责边界,并知道新策略、新交易接口应接入哪一层。
一、总体设计原则:DATA 统一表达、策略模板统一表达
docs/DEVELOPMENT.md 开篇即给出两条总体设计原则:
- DATA 统一表达:无论数据来自本地 CSV 还是 qlib 二进制格式,都归一到统一的数据结构;
- 策略模板统一表达:不同类别的策略(指标类、机器学习类、强化学习类)都收敛到统一的策略接口上,供回测与交易引擎调用。
在此基础上,文档将系统划分为七个层次。需要说明的是,原文档中的部分目录链接是历史版本的路径,与当前仓库的实际布局存在差异,从源码结构看可对应为下表:
| 文档中定义的层 | 文档中的路径 | 当前仓库中的实际落点 |
|---|---|---|
| 数据层 | qbot/data/ | qbot/data/(数据获取抽象封装) |
| 策略层 | qbot/strategy/ | qbot/strategies/(多因子、动量、机器学习、强化学习、深度学习策略) |
| Engine 层 | qbot/engine/ | qbot/engine/(回测引擎、模拟交易、实盘交易) |
| 接口层 | qbot/engine/trading/ | qbot/engine/trade/(多平台模拟与实盘交易接口封装) |
| 通知层 | qbot/notify/ | utils/(邮件、飞书、微信、本地信号推送等) |
| 分析层 | qbot/analyser/ | pytrader/analyser/(数据清洗、指标、评测结果分析) |
| 扩展层 | qbot/extension/ | qbot/plugins/ 与 pyfunds/(QInvestool、基金分析、浏览器插件等) |
原文档还保留了一条作者备注:「接口层和 Engine 层会考虑重新调整」。从当前仓库结构看,这一调整正在进行中——qbot/engine/trade/下同时并存trade/(trader 引擎封装)、trading/(emt_api、thsauto、bitcoin-arbitrage 等对接第三方 API 的适配目录)和easytrader/(易语言客户端自动化方案)三套实现,说明接口层正处于重构过渡期。
二、分层设计逐层解析
2.1 数据层:qbot/data/ 的两种数据形态
数据层负责「数据获取抽象封装」。当前仓库中 qbot/data/ 的核心实现是 dump_bin.py,它把 CSV 行情转换为 qlib 的二进制 dump 格式(.bin),为机器学习类策略提供统一的数据表达。其基类DumpDataBase的关键参数(见 dump_bin.py)包括:
def __init__( self, csv_path: str, # 股票数据文件或目录 qlib_dir: str, # qlib(dump) 数据目录 backup_dir: str = None, freq: str = "day", # 交易频率,日线或分钟线 max_workers: int = 16, # 并行线程数 date_field_name: str = "date", # CSV 中日期字段名 file_suffix: str = ".csv", symbol_field_name: str = "symbol", exclude_fields: str = "", # 排除字段 include_fields: str = "", # 指定保留字段 limit_nums: int = None, # 调试时限制条数 ):从源码结构看,dump 目录遵循 qlib 约定的三级结构:calendars(交易日历)、features(特征数据)、instruments(标的清单),配合UPDATE_MODE = "update"/ALL_MODE = "all"两种更新模式,支持增量更新历史 dump 数据。数据获取侧还有 get_data.py、dump_pit.py(PIT 数据)与 check_dump_bin.py(dump 结果校验),共同构成「CSV 原始数据 → 统一二进制表达」的管道。
2.2 策略层:qbot/strategies/ 的策略模板统一表达
策略层承载「多因子、动量、机器学习、强化学习、深度学习」策略。qbot/strategies/ 下的文件命名直接体现了这一分类:
- 经典指标/动量类:boll_strategy.py、adx_strategy.py、arbr_strategy.py、bigger_than_ema.py;
- 回测类(
_bt后缀):sma_cross_strategy_bt.py、macd 系 klines_bt.py、multi_strategy_bt.py; - 机器学习/深度学习/强化学习类:lstm_strategy_bt.py、rl_strategy_bt.py、ssa_strategy_bt.py;
- 选股类:undervalued_stock_picking_strategy.py。
策略的「统一表达」体现在回测模板上。backtest_base.py 中的BacktestStrategyTemplate定义了策略需要遵循的最小接口:
# 策略 尾盘根据K线数据买卖 class BacktestStrategyTemplate: name = "BacktestStrategyTemplate" def __init__(self, stock_code, bars: DataFrame, days=250): ... def process(self): position = 0 for i in range(self.days): # 当前的持仓,是上一天的信号 singal = self.get_singal(self.bars[: -self.days + i - 1]) ... def get_singal(self, bars: DataFrame): # 子类必须实现:输出 1 / -1 / 0 return 0即子类只需实现get_singal,基于「截止到当天的 K 线」输出目标仓位信号,引擎负责推进时序、累计收益(strategy = cumprod(1 + ret × signal))与画图。这套「信号驱动、仓位表达」的模板,就是文档所说策略模板统一表达的具体落点;pyfunds/strategy/signal_strategy.py、pytrader/strategies/signal_strategy.py 等文件进一步印证信号是贯穿全平台的统一语言。
2.3 Engine 层:回测引擎与交易引擎的编排
DEVELOPMENT.md 定义 Engine 层为「回测引擎、模拟交易、实盘交易」,对应 qbot/engine/:
- 回测:qbot/engine/backtest/ 下有 backtest_main.py(回测主流程)、backtest_base.py(策略模板)、macd_bt.py、rsrs.py(RSRS 择时指标实现)、bitcoin_bt_example.py(比特币回测示例);
- 交易:qbot/engine/trade/ 下的 trade_engine.py 是引擎层的总调度入口。
2.4 接口层:TradeEngine 的「虚拟盘/实盘」分派
接口层负责「交易接口封装,包含多平台的模拟和实盘交易」。最直观的代码证据是 trade_engine.py 中基于trade_opts的分派逻辑:
if self.trade_opts["class"] == "虚拟盘": self.TradeEngine = SimTradeEngine(self.trade_opts, syslog_obj=self.syslog) elif self.trade_opts["class"] == "实盘": self.TradeEngine = RealTradeEngine(self.trade_opts, syslog_obj=self.syslog) else: logger.error(...)TradeEngine对外只暴露login / get_cash / get_positions / load_strategy / start_trade / close一组方法,文件末尾的__main__示例给出了一个完整的trade_opts配置样例(交易类别为「虚拟盘」、平台为「掘金」、交易类型为「股票」、标的399006.SZ、策略为「单因子-相对强弱指数RSI」),说明平台/类别/标的/策略都以配置字典的形式注入引擎,而不是硬编码。
模拟盘一侧,trade_sim.py 的SimTradeEngine先加载账户配置(file2dict(STOCK_SIM_ACCOUNT)),创建StockTradeEngine并登录;随后根据trade_opts["platform"]分派到华泰证券、通达信、银河证券、同花顺、雪球等平台,通过 easytrader 完成客户端自动化登录与交易。实盘一侧由 trade_real.py 的RealTradeEngine承接。
多资产、多平台的接口实现集中在 engine_apis/ 下,按资产类别划分为btc、funds、futures、options、stocks五个子目录;其中 engine_apis/stocks/ 提供 stock_engine.py、easytrader_example.py、gmtrade_example.py 与account.json.example账户配置模板。此外 trading/ 目录封装了 emt_api、thsauto 等第三方交易 API 的适配,bitcoin-arbitrage子目录则对应比特币套利接口——这与文档「多平台的模拟和实盘交易」的描述一致。
2.5 通知层:系统弹窗、邮件、飞书、微信、钉钉
文档将通知层描述为「系统监控服务、消息通知(系统弹窗、邮件、飞书、微信、钉钉、企业微信等)」。当前仓库中这些能力落在 utils/ 目录:
- larkbot.py:飞书机器人消息推送,使用 Webhook + HMAC 签名,并演示了飞书
interactive卡片消息(msg_type: "interactive")的组装方式; - wxbot.py:微信机器人推送;
- send_email.py、sendemail_stargazers.py:邮件通知;
- push_local_sigal.py:本地信号推送(对应文档所说的「系统弹窗」类通知)。
tests/test_send_email.py、tests/send_email_test.py 对邮件通知提供了测试用例,说明通知能力是独立可验证的功能模块。
2.6 分析层:数据清洗、指标与评测结果分析
文档将分析层定义为「原始数据清洗、股票指标、算子库、评测结果分析」。当前仓库中,分析类实现集中在 pytrader/analyser/:macd.py(MACD 指标分析)、highfreq.py(高频数据处理)、alphafold158.py、online.py、workflow.py(分析工作流编排)。
评测结果分析则与「模型库」深度绑定:pytrader/strategies/benchmarks/ 下按算法组织了对比基准,包括LightGBM、Linear、MLP、LSTM、TFT、Transformer、XGBoost等目录(各目录含配置、脚本与结果文件),配合 pytrader/strategies/monte_carlo.py(蒙特卡洛模拟)与 quantstats 插件(绩效报告),构成「策略产出 → 统计评测 → 报表」的完整分析链路。
2.7 扩展层:QInvestool、fund-strategies、股票基金管家
扩展层承载「其他功能插件服务」,当前仓库中的实际落点有三处:
- QInvestool:qbot/plugins/investool/,采用 Go 语言开发,目录包含
cmds(命令)、core、cron(定时任务)、datacenter(数据中心)、models、routes(HTTP 路由)、webserver(Web 服务),提供基金股票评测、选股、因子挖掘等后台能力; - fund-strategies 基金分析工具:pyfunds/fund-strategies/,基于 umi/React 的前端工程(src/app.ts),支持基金分析、基金评测、4433 基金选择与策略评测,其选基方法论在 docs/02-经典策略/02-基金/4433法则.md 中有配套说明;
- 股票基金管家浏览器插件:pyfunds/web-extension/,基于 Vue + webpack 打包(manifest.json),把股票/基金数据抓取能力做到浏览器端。
此外 qbot/plugins/dagster/ 提供基于 dagster 的任务图插件(dagster_taskgraph.py),属于调度类的扩展服务。
三、事件驱动:GUI 事件循环与 EventEngine
文档标题即点明「事件驱动」。它在仓库中有两处典型实现:
1. GUI 层的事件驱动:Qbot 客户端基于 wxPython 构建,mainframe.py 中的MainFrame(wx.Frame)定义主窗口「Qbot - AI智能量化投研平台」,通过init_menu_bar、init_main_tabs组织界面,并挂载 panel_backtest.py(回测)、panel_sim_trade.py(模拟交易)、panel_real_trade.py(实盘交易)、panel_results.py(结果展示)等功能面板;global_event.py 进一步定义跨面板的全局事件对象。用户交互(选平台、配策略、启动引擎)均通过事件回调驱动下层引擎,这正是分层架构「上层只发指令、下层执行」的体现。
2. 交易引擎的事件驱动:pytrader/easyquant/event_engine.py 实现了一个独立的事件引擎,核心结构如下:
class Event: """事件对象""" def __init__(self, event_type, data=None): self.event_type = event_type self.data = data class EventEngine: """事件驱动引擎""" def __init__(self): self.__queue = Queue() # 事件队列 self.__active = False # 引擎开关 self.__thread = Thread(target=self.__run) # 事件处理线程 self.__handlers = defaultdict(list) # 事件类型 -> 监听函数列表从源码结构看,EventEngine采用「单队列 + 多监听」的经典模式:后台线程持续从队列取事件,并针对每个事件为对应的 handler 列表新开线程执行,实现事件分发与业务逻辑的解耦。同一模块中的 push_engine/(quotation_engine.py行情推送引擎、clock_engine.py时钟引擎)则把行情更新、定时任务都表达为事件流,策略模块只需注册监听,无需关心数据从哪里来——这与「DATA 统一表达、策略模板统一表达」的总原则一脉相承。
四、前后端分离的落地形态
DEVELOPMENT.md 对前后端分离的定义是:
- 前端:客户端显示和分析评测工具 Web 网页。对应实现包括 wxPython 桌面客户端(qbot/gui/)以及 pytrader/frontend/ 下的 Vue + Vite 管理端工程和已构建的 pytrader/static/ 静态资源、web/ 下的基金 Web 页面;
- 后端插件服务:股票、基金分析工具作为后台引入 qbot 客户端。即 QInvestool(Go 编写的评测、选股、因子挖掘服务)与 fund-strategies(基金分析、基金评测、4433 基金选择、策略评测),浏览器插件 股票基金管家 则作为前端扩展触点。
这种「桌面 GUI + Web 页面 + 独立后端服务 + 浏览器插件」的多形态前端,共同围绕同一套数据层与策略层,符合文档「插件服务作为后台引入」的架构意图。
五、开发语言与技术栈
文档明确了各模块的语言选型,仓库内容与之吻合:
- Python(主体):核心客户端、引擎、策略均为 Python 实现,GUI 基于 wxPython 框架(mainframe.py 中
import wx即可见);依赖声明见根目录 requirements.txt 与 qbot/setup.py,Windows/Linux 下的 wxPython、TA-Lib 离线轮子预置于 dev/ 目录,dev/environment.yaml 提供 conda 环境定义; - Go:后台插件服务 QInvestool(qbot/plugins/investool/ 全目录为
.go源码,含webserver、routes、datacenter等服务组件); - JavaScript/TypeScript:fund-strategies 基金分析工具(umi + React,见 package.json)与股票基金管家浏览器插件(package.json + webpack.config.js)。
六、开发者阅读路径建议
沿着七层结构,推荐的源码阅读顺序是:
- 入口:从 qbot/qbot.py 和 qbot/gui/mainframe.py 入手,看 GUI 如何组装各功能面板;
- 引擎:读 qbot/engine/backtest/backtest_main.py 理解回测主流程,再读 qbot/engine/trade/trade_engine.py 理解交易分派;
- 策略:挑一个最简单的 bigger_than_ema.py 或 boll_strategy_bt.py,对照 BacktestStrategyTemplate 看信号如何产出;
- 数据:读 qbot/data/dump_bin.py 理解 CSV → qlib bin 的统一数据管道;
- 验证:用 tests/ 下的 backtest_test.py、test_trade.py 验证回测与交易链路是否按预期工作。
需要提醒的是,原文档中「接口层和 Engine 层会考虑重新调整」的备注仍然有效:当前 qbot/engine/trade/ 下 easytrader、trader、trading 多套实现并存,trade_sim.py中存在明显的过渡期痕迹,阅读相关代码时建议以trade_engine.py的分派入口为锚点,再顺藤摸瓜,避免在过时的分支上消耗精力。
整体而言,Qbot 的架构可以用一句话概括:用「数据统一表达 + 策略统一模板 + 事件驱动调度」把数据、策略、引擎、多平台交易接口、通知与评测分析组装成一套完全本地部署的量化投研平台。理解上表的七层映射关系,就掌握了在这座代码库中导航的地图。
【免费下载链接】Qbot[🔥updating ...] AI 自动量化交易机器人(完全本地部署) AI-powered Quantitative Investment Research Platform. 📃 online docs: https://ufund-me.github.io/Qbot ✨ :news: qbot-mini: https://github.com/Charmve/iQuant项目地址: https://gitcode.com/GitHub_Trending/qbot/Qbot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考