
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.pyPIT 数据与 check_dump_bin.pydump 结果校验共同构成「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, days250): ... 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.pyRSRS 择时指标实现、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_objself.syslog) elif self.trade_opts[class] 实盘: self.TradeEngine RealTradeEngine(self.trade_opts, syslog_objself.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.pyMACD 指标分析、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、股票基金管家扩展层承载「其他功能插件服务」当前仓库中的实际落点有三处QInvestoolqbot/plugins/investool/采用 Go 语言开发目录包含cmds命令、core、cron定时任务、datacenter数据中心、models、routesHTTP 路由、webserverWeb 服务提供基金股票评测、选股、因子挖掘等后台能力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, dataNone): self.event_type event_type self.data data class EventEngine: 事件驱动引擎 def __init__(self): self.__queue Queue() # 事件队列 self.__active False # 引擎开关 self.__thread Thread(targetself.__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 客户端。即 QInvestoolGo 编写的评测、选股、因子挖掘服务与 fund-strategies基金分析、基金评测、4433 基金选择、策略评测浏览器插件 股票基金管家 则作为前端扩展触点。这种「桌面 GUI Web 页面 独立后端服务 浏览器插件」的多形态前端共同围绕同一套数据层与策略层符合文档「插件服务作为后台引入」的架构意图。五、开发语言与技术栈文档明确了各模块的语言选型仓库内容与之吻合Python主体核心客户端、引擎、策略均为 Python 实现GUI 基于 wxPython 框架mainframe.py 中import wx即可见依赖声明见根目录 requirements.txt 与 qbot/setup.pyWindows/Linux 下的 wxPython、TA-Lib 离线轮子预置于 dev/ 目录dev/environment.yaml 提供 conda 环境定义Go后台插件服务 QInvestoolqbot/plugins/investool/ 全目录为.go源码含webserver、routes、datacenter等服务组件JavaScript/TypeScriptfund-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),仅供参考