Qbot 教程如何为 Backtrader 接入自定义 MySQL 数据源回测股票策略?
2026/9/14 8:51:15 网站建设 项目流程

Qbot 教程如何为 Backtrader 接入自定义 MySQL 数据源回测股票策略?

【免费下载链接】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

如果你的日线行情存在自己的 MySQL 数据库里,而 Backtrader 默认只支持 CSV 等内置数据格式,就需要自定义一个 Data Feed 把数据库数据加载进回测引擎。Qbot 仓库的教程代码目录 09.custom_data_source 提供了完整做法:一个继承backtrader.feed.DataBaseMySQLData数据源类,加一个基于它的 MACD 回测脚本 macd.py。本文按这两个文件整理出从建表数据要求、数据源实现到跑通回测的完整路径。

准备条件

回测脚本 macd.py 依赖backtrader(Qbot 根目录 requirements.txt 中已包含backtrader),数据源文件 stock_datafeed.py 依赖pymysql。本地 MySQL 中需要有存放股票日线数据的表,并且表中包含ts_code(股票代码)和trade_time(交易时间)字段——数据源内部按这两个字段做过滤查询:

SELECT * FROM {table} WHERE trade_time >= '{start_time}' and trade_time < '{end_time}' and ts_code = '{ts_code}' order by trade_time asc

表结构要求:按 SELECT * 的列顺序取数

数据源通过SELECT *取出整行后,按列下标(从 0 开始)读取数值,因此你数据表的列顺序必须与代码中的下标对应,stock_datafeed.py 中实际读取的列如下:

列下标含义
3交易时间(datetime)
4开盘价 open
5最高价 high
6最低价 low
7收盘价 close
8成交量 volume
9成交额 turnover
12换手率 turnover_rate

如果表结构与上述顺序不一致,需要调整_load()方法中的下标或改用显式列名查询。另外数据源声明了两条自定义线:

lines = ( "turnover", "turnover_rate" )

后文策略正是通过self.datas[0].turnover_rate读取换手率的。

数据源实现:MySQLData 类

完整实现见 stock_datafeed.py。核心是一个MySQLData(DataBase)类,包含三个部分:

  1. 连接参数声明:fromdatetodatets_code三个参数,供外部实例化时传入回测起止时间和股票代码;
  2. start()方法:回测启动时调用load_data_from_db,按表名(示例中为stock_normalk)、ts_code和起止时间查询,返回迭代器;
  3. _load()方法:逐行消费迭代器,把每行数据写入self.lines对应的线,StopIteration时返回False结束。

需要替换的地方在load_data_from_db的数据库连接上。示例代码中的连接信息是文档作者的本地环境,需替换为你自己的 MySQL 信息,表名也要与你的实际数据表一致:

db = pymysql.connect( host="localhost", user="root", password="12345678", db="golden_stone", port=3306 )

其中hostuserpassworddbport全部按你的数据库环境修改;start()中的表名stock_normalk同样要与真实表名保持一致。

用 MACD 策略回测

macd.py 通过from stock_datafeed import MySQLData引入数据源(因此两个文件需放在同一目录下运行),策略类TestStrategy的逻辑为:

  • 指标:EMA(12)EMA(26)之差作为 MACD,EMA(9)作为信号线,同时创建bt.indicators.MACDHisto
  • 买入:无持仓时,当 MACD 前一日小于信号线、当日大于信号线(金叉),且turnover_rate[0] < 3(换手率小于 3%)时创建买单;
  • 卖出:有持仓时,若当前收盘价相对成交日收盘价的涨跌幅超过 +10% 或低于 -10%,创建卖单。

入口部分把数据、策略、资金和交易规则组装进 Cerebro,示例参数如下:

if __name__ == "__main__": cerebro = bt.Cerebro() cerebro.addstrategy(TestStrategy) # 加载数据到模型中 data = MySQLData( ts_code="sh603520", fromdate=datetime.datetime(2017, 1, 1), todate=datetime.datetime(2020, 4, 12), ) cerebro.adddata(data) cerebro.broker.setcash(10000) cerebro.addsizer(bt.sizers.FixedSize, stake=100) cerebro.broker.setcommission(commission=0.005) print("Starting Portfolio Value: %.2f" % cerebro.broker.getvalue()) cerebro.run() print("Final Portfolio Value: %.2f" % cerebro.broker.getvalue()) cerebro.plot()

各参数用途:ts_codefromdatetodate决定从数据库取哪只股票、哪段时间的行情,需换成你库中真实存在的代码和时间范围(示例值sh603520、2017-01-01 至 2020-04-12 为文档示例);setcash(10000)设置初始资金 10000;FixedSize每次交易 100 股;setcommission(commission=0.005)设置 0.5% 手续费。

运行与结果验证

在两个文件所在目录执行:

python macd.py

运行结果从三处判断:

  1. 终端先打印Starting Portfolio Valuecerebro.run()结束后打印Final Portfolio Value,两者对比即本次回测的资金变化(具体数值取决于你的数据);
  2. 策略的log会按 K 线逐日打印,成交时输出形如BUY EXECUTED, Price: .../SELL EXECUTED, Price: .../OPERATION PROFIT, GROSS ..., NET ...的行,用于核对买卖时机是否符合 MACD 金叉 + 换手率条件;
  3. cerebro.plot()回测结束后弹出图形窗口,展示价格与指标曲线。

如果终端没有任何 K 线日志、也没有成交输出,优先检查ts_code与时间段内数据库是否有数据,以及连接参数和表名是否已按上文替换正确。

已知问题

  • 遇到ImportError: cannot import name 'warnings'错误时,按 docs/tutorials_code/README.md 的说明安装指定版本 matplotlib:

    pip install matplotlib==3.2.2
  • 数据源连接参数在代码中硬编码,若更换数据库环境需修改load_data_from_db中的连接信息,这是该示例的固定写法;

  • macd.py中信号线周期为EMA(self.macd, period=9),与 02.easy_macd_strategy 中的简单 MACD 示例(周期 5、无换手率条件)不是同一套参数,对照两个脚本时注意区分。

下一步

数据源模式确认跑通后,同一目录结构下的 03.macd_in_A_market 展示了如何把单只股票的回测扩展为批量股票回测,可按同样方式把数据读取层换成你的MySQLData

【免费下载链接】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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询