十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Backtrader 完整指南:10 分钟跑通量化回测,避开 3 个结果失真的坑

Backtrader 完整指南:10 分钟跑通量化回测,避开 3 个结果失真的坑 Backtrader 完整指南10 分钟跑通量化回测避开 3 个结果失真的坑【免费下载链接】backtraderPython Backtesting library for trading strategies项目地址: https://gitcode.com/gh_mirrors/ba/backtraderBacktrader 是一个 Python 回测框架你写一个交易策略喂给它历史 K 线数据它自动模拟成交、扣佣金、算盈亏。读完这篇你能说清 Backtrader 能干什么、独立跑通一个最小量化回测、并判断一次回测结果是否可信。它到底帮你解决什么场景你盯盘三个月总结出一条快均线穿慢均线就买、穿回就卖的规矩。它真能赚钱还是你只记住了赚过的那几次手工翻 K 线验证几百根 K 线就得算到手软而且根本没法把佣金、滑点算进去。Backtrader 把这件事变成一个循环数据进来 → 策略做决定 → 经纪商模拟成交 → 分析器记账。它覆盖从数据到分析的整条链路数据层CSV、Pandas、Yahoo 等数据源统一接入支持重采样和多数据对齐见 数据源模块 feeds/策略层继承bt.Strategy写交易逻辑50 内置技术指标直接用见 技术指标库 indicators/执行层模拟订单成交、佣金、滑点、仓位结算见 经纪商模块 brokers/分析层夏普比率、回撤、交易统计回测结束直接出报告见 分析器模块 analyzers/10 分钟跑通第一个量化回测2 步搭建回测环境在终端里装好框架pip install backtrader装完导入backtrader不报错即可想用仓库最新代码也可以从源码安装后文行动清单给出命令。3 步创建移动平均线交叉策略下面这个策略类在做什么算一条 10 日和一条 30 日移动平均线SMA金叉时买入、死叉时平仓。这是最经典的移动平均线交叉信号import backtrader as bt class SmaCross(bt.Strategy): params ((fast, 10), (slow, 30)) def __init__(self): self.fastma bt.indicators.SMA(self.data.close, periodself.params.fast) self.slowma bt.indicators.SMA(self.data.close, periodself.params.slow) self.crossover bt.indicators.CrossOver(self.fastma, self.slowma) def next(self): if not self.position: if self.crossover 0: self.buy() # 金叉买入 elif self.crossover 0: self.close() # 死叉平仓你会得到一个随时可以回测的策略类参数10 和 30后续还能用来做优化。再配一个回测引擎。这段代码在做什么把策略挂上、加载仓库自带的 ORCL 两年日线数据、设 10 万初始资金和 0.1% 佣金然后开跑cerebro bt.Cerebro() cerebro.addstrategy(SmaCross) data bt.feeds.GenericCSVData( datanamedatas/orcl-2003-2005.txt, # 仓库自带样例数据 dtformat%Y-%m-%d, headersTrue, ) cerebro.adddata(data) cerebro.broker.setcash(100000.0) # 初始资金 10 万 cerebro.broker.setcommission(commission0.001) # 0.1% 佣金 cerebro.run() print(期末资产: %.2f % cerebro.broker.getvalue())在仓库根目录运行后终端会打出一行期末资产: xxx.xx。数字大于 100000 说明这套策略在这段数据上赚钱了没到就是亏的——都属正常先跑通再说。回测引擎 cerebro.py 里能看到 run() 的完整流程。一次回测里发生了什么很多人只把回测当按个按钮出个数字出问题时无从下手。理解下面五层分工你就能定位问题出在哪一层┌─────────────────────────────────────────────┐ │ 策略层 Strategy 你的买卖规则next() 里做决策 │ ├─────────────────────────────────────────────┤ │ 指标层 Indicators SMA / RSI / ATR50 内置 │ ├─────────────────────────────────────────────┤ │ 数据层 Feeds CSV / Pandas重采样与对齐 │ ├─────────────────────────────────────────────┤ │ 执行层 Broker 撮合订单扣佣金、记滑点、结算 │ ├─────────────────────────────────────────────┤ │ 分析层 Analyzers 夏普、回撤、交易统计 │ └─────────────────────────────────────────────┘流程是一条单向链数据层每根 K 线推进一格 → 指标层算出当前值 → 策略层的next()被调用并下订单 → 执行层按该 K 线的价格撮合、扣佣金 → 分析层把每一笔盈亏和资金曲线记下来。任何一层配置错了结果都会失真。让回测更可信的三件事回测结果虚高是新手最常见的坑。三个高频失真点各配一句对策失真点一句话对策交易成本被忽略没算佣金和滑点滑点你的挂单价与实际成交价之间的差距回测永远比实盘好看setcommission()设佣金set_slippage_perc()设滑点实盘成本多少回测就填多少数据质量差缺口、错位、异常价会让指标和信号全错先检查缺失值与异常值缺数据用 数据填充过滤器 datafiller.py 补齐未来函数不小心用了还没发生的数据比如self.data.close[1]下一根 K 线的价格只在next()里做决策只引用[0]当前和[-1]历史__init__()里不下单不偷看未来测试用例 tests/ 里有大量正确引用数据偏移的写法拿不准时照着抄。进阶玩法跑通最小回测后这三个方向最常用。多时间框架大周期定方向小周期找入场adddata()可以挂多份数据self.data0是第一份如日线、self.data1是第二份如周线指标各算各的self.rsi_d bt.indicators.RSI(self.data0.close, period14) # 日线超卖 self.ema_w bt.indicators.EMA(self.data1.close, period20) # 周线趋势这样就能实现周线向上 日线超卖才买这类过滤逻辑参考 多时间框架示例>class RiskSizer(bt.Sizer): def _getsizing(self, comminfo, cash, data, isbuy): risk cash * 0.02 # 单笔风险预算 stop 2.0 * data.close[0] # 止损距离2 倍现价 return int(risk / stop)加进引擎用cerebro.addsizer(RiskSizer)即可内置的 固定与百分比仓位 sizers/ 也值得先看一眼。高级订单不止市价买市价单之外订单类型决定成交模拟的真实性self.buy(exectypebt.Order.Limit, priceprice * 0.99) # 限价单 self.sell(exectypebt.Order.Stop, priceprice * 0.95) # 止损单bt.Order.StopTrail是跟踪止损适合波段策略OCO二择一等组合玩法见 OCO 示例 oco.py。怎么判断策略好不好回测跑完别只看期末资产。加三个分析器结束后取结果cerebro.addanalyzer(bt.analyzers.SharpeRatio, _namesharpe) cerebro.addanalyzer(bt.analyzers.DrawDown, _namedrawdown) cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _nametrades) results cerebro.run() strat results[0] print(夏普比率: %.2f % strat.analyzers.sharpe.get_analysis()[sharperatio]) print(最大回撤: %.2f%% % strat.analyzers.drawdown.get_analysis()[max][drawdown]) print(交易次数: %d % strat.analyzers.trades.get_analysis()[total][total])跑完你会拿到三个数读法如下指标白话解释参考线夏普比率每承担一份风险换来多少收益大于 1 及格大于 2 优秀最大回撤从最高资产到最低谷最多跌了百分之几超过 30% 偏危险胜率赚钱的交易占比单看意义不大要和盈亏比一起看策略参数优化网格搜索参数比如 fast10、slow30不该拍脑袋。用optstrategy()给参数列出候选值引擎自动跑完所有组合cerebro.optstrategy(SmaCross, fastrange(5, 25, 5), slowrange(20, 60, 10)) results cerebro.run(maxcpus4)写法的完整范例见 参数优化示例 optimization.py。提醒一句组合越多越容易挑出一个恰好拟合历史数据的假最优选参数时留点余地并在另一段数据上验证。从回测走向实盘完整工作流是一条链策略构思 → 数据准备 → 回测验证 → 参数优化 → 风控设置 → 实盘部署上实盘前守三条纪律先用小资金回测再漂亮也是模拟盘用小仓位验证回测→实盘这段落差先定风控再谈收益最大回撤上限、单笔止损写进策略而不是写进脑子里持续对账实盘表现和回测长期偏离时先怀疑成本模型和数据再怀疑策略结语与行动清单Backtrader 的价值不在指标多而在它把策略→执行→分析逼成一个可重复、可检验的闭环你能说清结果是从哪来的也就能判断它可信几分。现在动手克隆仓库git clone https://gitcode.com/gh_mirrors/ba/backtrader进入目录安装cd backtrader pip install -e .把本文的双均线脚本放到仓库根目录运行用自带的 样例数据 datas/ 出第一个期末资产打开 官方示例 samples/ 挑一个带止损或分析的示例读一遍替换成你自己的规则跑通第一个回测只是开始让回测结果值得相信才是你真正的下一步。【免费下载链接】backtraderPython Backtesting library for trading strategies项目地址: https://gitcode.com/gh_mirrors/ba/backtrader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表