Skip to content

1.87万星的开源量化平台Qbot,回测跑出来却是亏的

作 者:老余捞鱼

原创不易,转载请标明出处及原作者。

技术讨论不构成任何操作建议。
模型评测不等于投资建议。
不荐股、不卖课、不承诺收益。
市场有风险,请合法合规投资。

本文约 3100 字 | 预计阅读 10 分钟,后有代码和项目地址,建议先收藏


Qbot 是 UFund-Me 开源的量化平台,在 GitHub 上有 18718 star、2613 fork、MIT 协议,2022 年 11 月建的仓。

经典策略那一支是真能跑的,AI 策略那一支是坏的,需要改造。

我花了些时间把它拉下来、装起来、把自带脚本跑了一遍,又扒了一遍源码。挖出来的东西比预期多,也有几个地方让我盯着屏幕愣了一会儿。

它的野心,一条链路跑完

Qbot 想做的事很直白。数据获取、策略开发、策略回测、模拟交易、实盘交易,放同一套流程里。

README 里画了一张结构图,从上到下四层。底层是 qlib 和深度学习策略。中间是 backtrader 和 easyquant 两个回测引擎,上层是 vnpy、pytrader、pyfunds 三个交易框架。最外层套 quantstats 做绩效看板。

作者自己写了一句定位,AI 智能量化投研平台。要覆盖股票、基金、期货、加密货币四类标的。

仓库里的经典策略目录挺全。均线、布林、海龟、小市值、多因子、Alpha 对冲、指数增强、RSRS 择时,配对交易和选股都有单独的文档。

目录看着是齐的。

实测,官方脚本跑通了,结果是亏的

我挑了仓库里最干净的一个策略,qbot/strategies/boll_strategy_bt.py。13 日布林带,跌破下轨买,突破上轨卖。

数据用招商银行 600036,2021 年 1 月 4 日到 2022 年 12 月 6 日,467 根 K 线,前复权。初始资金 100 万,手续费 0.1%。

策略类我是直接从仓库 import 进来的,一行都没改。唯一动的是取数。脚本里写的 akshare 东财接口 stock_zh_a_hist 在我这台机器上连不上,我换成新浪的 stock_zh_a_daily。

跑通了。期末 999586.53 元,两年亏了 413 块。

四种跑法都跑同一段行情。官方默认参数下的回撤只有 0.13%,是因为仓位太小,不是策略稳

同期一直拿着是 966275.20 元,亏 33725 元。股价从 32.79 跌到 29.14,跌了 11.13%。

这么看布林策略是跑赢基准的。官方默认参数下成交 6 笔,3 胜 3 负,最大回撤 0.13%。

但这个表格有个地方不对劲,我第一眼就注意到了,说不好是哪儿不对,翻回去才看明白。

官方脚本默认只用了 0.36% 的本金

boll_strategy_bt.py 里写着 cerebro.addsizer(bt.sizers.FixedSize, stake=100)。初始资金 100 万。

stake=100 的意思是每次固定买 100 股。600036 这段时间均价 35.67 元,100 股就是 3567 元。

100 万本金,3567 元在场上。占 0.36%。

100 万本金,官方脚本只用了 3567 元在场。放大仓位后,真实盈亏才显出来

剩下 99.64% 的钱躺在账上,一分钱没参与交易。

所以官方脚本跑出来那个几乎不亏的结果,不是策略有多稳,是仓位小到收益被稀释成了看不见。同一个策略我把 stake 改成 30000 满仓,净亏立刻变成 -1.03%。

同一次回测,那个数字看起来稳得不行。可这是真的吗?我第一次看到这行输出的时候,心里是有点信的。

放大 25 倍仓位,亏损也放大 25 倍。这个数我盯了一会儿才敢写下来。

这一点值得单独拎出来说。新手看回测输出最容易掉这个坑,看到一个几乎不亏的结果,第一反应是策略稳,而不是”仓位是不是太小了”。

0.1% 手续费,两年吃掉 5154 元

既然说到成本,我把手续费参数调成 0 再跑一遍,其他一律不动。

零成本那版期末 994900.00,净亏 5100 元。0.1% 手续费那版期末 989745.70,净亏 10254.30 元。

同一套策略代码,只改手续费参数。0.1% 的单边费率,两年多花 5154 元

差 5154 元。

满仓条件下策略一共成交 3 次,1 胜 2 负。也就是说这 10254 元的净亏里,手续费占了 5154 元,一半。

3 次成交吃 5154 元手续费,是因为满仓一笔就是 30 万本金。0.1% 一次进出 600 元,3 次来回 3600,剩下的是开仓那一次。

所以 Qbot 这个策略在满仓时净亏,成本和策略亏损差不多各占一半。这不算致命。问题是官方脚本的默认输出根本看不出成本的存在,仓位太小,手续费被稀释到看不见。

三处硬伤,都在 AI 策略那一支

装依赖的时候我就觉得不对。官方 README 让你跑 pip install -r dev/requirements.txt。

我先在 Python 3.13 上试,秒崩。

AttributeError: module 'configparser' has no attribute 'SafeConfigParser'

这是 pyfolio 那个包的问题。quantopian 早关停了,仓库还挂着,它的 setup.py 里用了 Python 3.12 删掉的 API。

换成 Python 3.9,README 声明支持的版本,pyfolio 这个错过了。但下一个坑接上来。matplotlib==3.2.2 这个钉死的版本,在 Apple Silicon 上没有预编译包。得下 40MB 源码自己编。

我最后是把这几个坏包剔掉,用剩下的依赖把环境跑起来的。

然后我核对了一遍 requirements 和代码里实际 import 的东西。

tushare、keras、tensorflow、rlkit、easyquant、qlib、vnpy、lightgbm、gym、ta-lib、wxpython。十一个包,一个都不在 requirements.txt 里。

这十一个包,全是仓库自带策略代码 import 的。

这解释了一个现象。为什么这个仓库 star 涨到 1.8 万,我一开始想不明白,但 issue 里”装不上””报 xxx 错”能排到前十。76 个 issue 里有 10 个是安装相关。评论最多的 #10,标题是「mac python3.9 pip install -r requirements.txt error」,底下有 11 条讨论。

装得上的人是把缺的东西自己补齐了。装不上的人就一直卡在那。

强化学习策略引用了一个不存在的东西

qbot/strategies/rl_strategy_bt.py 这个文件,我用 AST 静态扫了一遍所有 self 属性引用。

第 48 行写的是 action = self.model.predict(self.obs.reshape(1, -1))[0]

self.model 从哪来?我把整个类扫了一遍,没有。这个类从来没创建过模型。

第 57 行写的是 self.log('(MA Period %2d) Ending Value %.2f' % ...)

self.log 也没定义。这个文件里没有 log 方法。

第 58 行引用了 self.params.maperiod。而这个类的 params 只有三个,lookback、neurons、period。

三处硬伤,都在一个文件里。

同一批扫描里,另外四个策略文件都通过了。

这个文件跑不起来还有第二层原因。它 import 了 rlkit。这个包在 PyPI 上只有 0.1 和 0.2.0 两个版本,全都依赖 tensorflow==1.11.0。这个版本的 tensorflow 只提供到 Python 3.6 的 wheel。

Qbot 要求 3.8 或 3.9。依赖链是死锁的,不是配置问题,改不出来。

LSTM 策略的信号是用未来算出来的

这个比前面的硬伤更值得说,因为它不报错,能跑完,还能出一张漂亮的收益曲线。

lstm_strategy_bt.py 的 next() 方法长这样。

X = self.test_data['X']
y_pred = self.model.predict(X)
y_pred = self.scaler.inverse_transform(y_pred)
if self.dataclose[0] < y_pred[-1]:
    self.buy(size=100)

每次决策,它都把整个测试集丢进模型算一遍,然后取最后一个算出来的值 y_pred[-1],跟当前收盘价比。

问题是这个 y_pred[-1] 对应的样本窗口,是测试集的最后 20 天。

我按这段代码复了一遍时间轴。

  • 训练段 373 根 K 线,截至 2022 年 7 月 19 日
  • 决策发生区间 94 个交易日,2022 年 7 月 20 日到 12 月 6 日
  • 信号实际来自 2022 年 11 月 9 日到 12 月 6 日这一段

也就是说,7 月 20 日那天的买卖决策,用的信号来自 12 月 6 日收盘的数据。往前平均算,每个决策点提前用了约 47 个交易日的未来信息。

蓝色是策略做决策的时间段,红色是信号实际来源的窗口。两个区间几乎不重叠

还有一处。self.scaler.fit_transform(data) 是在全量数据上拟合的,测试段的信息进了归一化参数。

这类代码跑出来的回测结果是没有意义的。它不是策略好,是它提前知道了答案。这条我看第一遍没反应过来,第二遍才有点火大。

我第一反应是想去 issue 里翻有没有人提过,翻了一圈没人提,挺意外的。68 条未关闭的 issue 里没有一条跟策略逻辑有关,全是环境问题。

把五个策略文件扫完,结果是这样。

Qbot 自带的策略文件静态扫描与依赖情况
rl_strategy_bt.py 强化学习self.model、self.log 未定义,params 里没有 maperiod。依赖 rlkit 锁死 tensorflow 1.11,装不上
lstm_strategy_bt.py LSTM代码能跑,但信号用了未来数据。要 keras 和 tensorflow
sma_cross_strategy_bt.py 均线通过。依赖 tushare,没列进 requirements
boll_strategy_bt.py 布林通过。akshare 在 requirements 里,能装
multi_strategy_bt.py 多策略通过。依赖 tushare,没列进 requirements

文档也有问题

docs/03-智能策略/model_zoo.md,标题写着 Model Zoo。内容是 SECOND、SECOND baselines、8 张 GPU 的显存占用,还贴了个 mmdetection 的 benchmark.py 链接。

这是从目标检测项目 mmdetection 复制过来的,跟量化一点关系没有。

经典策略目录里,Alpha对冲.md 和 指数增强.md 两个文件,全文各 116 字节。除了标题和一句”以下部分内容参考《因子投资:方法与实践》一书”,就只剩一个”1. 原理”和一行分隔线。

原理没了。

还有几个数字

最后 push 是 2026 年 3 月 11 日,一个 autofix 提交,修的是 wxMenuItem 的问题。到今天七个月。

贡献者列表拉下来只有 3 个人。作者 Charmve 提交 149 次,另两个各 1 次。

68 个 issue 挂着没关,29 个关过。关掉的那 29 个里有几个是环境修复。

fork/star 是 14%。1.87 万 star,2613 fork。

这个比例说明一件事。大多数人 star 完就走了,真把代码拉下来改过的是那 2613 个人。而这 2613 个人里,绝大多数装环境这一步就卡住了。

那它到底能用在哪

说句公道话,我更倾向把它当成一套骨架。

这套东西的价值不在于策略,在于它把数据到回测这一段的路铺好了,铺的还是国内能直接用的路。akshare、efinance、baostock、tushare 都是国内接口。模拟交易直接对接券商客户端,走的是 easytrader 那套。GUI 是 wxPython 写的桌面应用。

对一个想快速看一眼某个策略在 A 股上什么表现的人,这套骨架省下来的时间是真的。

安装这件事,我建议这么绕。

Python 版本锁 3.9,别用 3.10 以上(pyfolio 会崩)。requirements.txt 里 matplotlib==3.2.2 改成 3.7 以上。git+https://github.com/quantopian/pyfolio 这行直接删掉,quantopian 2020 年就关了,代码不会再更新。wxPython 从源码装,别用仓库里那堆预编译 wheel。里面只有 cp38 和 cp39 的 x86_64 版本,Apple Silicon 用不了。

数据源别用脚本里默认的东财接口,换新浪。

AI 策略那一支先别碰。LSTM 那个信号是坏的,强化学习那个依赖装不上。经典策略里有能用的,布林、均线、海龟、小市值、多因子这几套代码逻辑是通的,改改参数就能跑。

模拟交易需要装券商客户端,还要连 chromedriver。这条链路我没能测。

最后

我把这套东西拉下来装好跑通,花了大概一天。挖出来最有价值的不是它有多少功能,是它哪里坏了。依赖缺 11 个包。RL 策略引用了不存在的属性。LSTM 的信号来自未来。文档有两个空壳。model_zoo 是从目标检测项目抄的。

开源项目的 star 数只说明有多少人点了个收藏。装得上、跑得通、跑出来的数是对的,是三件完全不同的事。

建议大家可以先自己翻翻它的 issue 区,前 30 条按评论数排,装不上的人踩的坑基本都在那里面。仓库地址在文末。

参考资料

  • Qbot 仓库与源码 https://github.com/UFund-Me/Qbot
  • 在线文档 https://ufund-me.github.io/Qbot
  • 依赖清单 dev/requirements.txt
  • 布林策略 qbot/strategies/boll_strategy_bt.py
  • 强化学习策略 qbot/strategies/rl_strategy_bt.py
  • LSTM 策略 qbot/strategies/lstm_strategy_bt.py
  • 本篇复现脚本 outputs/qbot-quant-platform/repro_qbot.py
  • 原始数据 outputs/qbot-quant-platform/repro_data/data_600036.csv

#Qbot #开源量化 #量化平台 #回测 #AI策略 #backtrader #akshare #A股量化 #量化平权 #GitHub开源

Published inAI&Invest专栏

Be First to Comment

    发表回复