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

发布时间:2026/9/14 8:51:23
Qbot 教程如何为 Backtrader 接入自定义 MySQL 数据源回测股票策略? 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.DataBase的MySQLData数据源类加一个基于它的 MACD 回测脚本 macd.py。本文按这两个文件整理出从建表数据要求、数据源实现到跑通回测的完整路径。准备条件回测脚本 macd.py 依赖backtraderQbot 根目录 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交易时间datetime4开盘价 open5最高价 high6最低价 low7收盘价 close8成交量 volume9成交额 turnover12换手率 turnover_rate如果表结构与上述顺序不一致需要调整_load()方法中的下标或改用显式列名查询。另外数据源声明了两条自定义线lines ( turnover, turnover_rate )后文策略正是通过self.datas[0].turnover_rate读取换手率的。数据源实现MySQLData 类完整实现见 stock_datafeed.py。核心是一个MySQLData(DataBase)类包含三个部分连接参数声明fromdate、todate、ts_code三个参数供外部实例化时传入回测起止时间和股票代码start()方法回测启动时调用load_data_from_db按表名示例中为stock_normalk、ts_code和起止时间查询返回迭代器_load()方法逐行消费迭代器把每行数据写入self.lines对应的线StopIteration时返回False结束。需要替换的地方在load_data_from_db的数据库连接上。示例代码中的连接信息是文档作者的本地环境需替换为你自己的 MySQL 信息表名也要与你的实际数据表一致db pymysql.connect( hostlocalhost, userroot, password12345678, dbgolden_stone, port3306 )其中host、user、password、db、port全部按你的数据库环境修改start()中的表名stock_normalk同样要与真实表名保持一致。用 MACD 策略回测macd.py 通过from stock_datafeed import MySQLData引入数据源因此两个文件需放在同一目录下运行策略类TestStrategy的逻辑为指标EMA(12)与EMA(26)之差作为 MACDEMA(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_codesh603520, fromdatedatetime.datetime(2017, 1, 1), todatedatetime.datetime(2020, 4, 12), ) cerebro.adddata(data) cerebro.broker.setcash(10000) cerebro.addsizer(bt.sizers.FixedSize, stake100) cerebro.broker.setcommission(commission0.005) print(Starting Portfolio Value: %.2f % cerebro.broker.getvalue()) cerebro.run() print(Final Portfolio Value: %.2f % cerebro.broker.getvalue()) cerebro.plot()各参数用途ts_code、fromdate、todate决定从数据库取哪只股票、哪段时间的行情需换成你库中真实存在的代码和时间范围示例值sh603520、2017-01-01 至 2020-04-12 为文档示例setcash(10000)设置初始资金 10000FixedSize每次交易 100 股setcommission(commission0.005)设置 0.5% 手续费。运行与结果验证在两个文件所在目录执行python macd.py运行结果从三处判断终端先打印Starting Portfolio Valuecerebro.run()结束后打印Final Portfolio Value两者对比即本次回测的资金变化具体数值取决于你的数据策略的log会按 K 线逐日打印成交时输出形如BUY EXECUTED, Price: .../SELL EXECUTED, Price: .../OPERATION PROFIT, GROSS ..., NET ...的行用于核对买卖时机是否符合 MACD 金叉 换手率条件cerebro.plot()回测结束后弹出图形窗口展示价格与指标曲线。如果终端没有任何 K 线日志、也没有成交输出优先检查ts_code与时间段内数据库是否有数据以及连接参数和表名是否已按上文替换正确。已知问题遇到ImportError: cannot import name warnings错误时按 docs/tutorials_code/README.md 的说明安装指定版本 matplotlibpip install matplotlib3.2.2数据源连接参数在代码中硬编码若更换数据库环境需修改load_data_from_db中的连接信息这是该示例的固定写法macd.py中信号线周期为EMA(self.macd, period9)与 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),仅供参考