20 行代码回测一个交易策略:backtesting.py 快速上手指南
【免费下载链接】backtesting.py🔎 📈 🐍 💰 Backtest trading strategies in Python.项目地址: https://gitcode.com/GitHub_Trending/ba/backtesting.py
backtesting.py 是一个用 Python 做交易策略回测的轻量框架:你给它一段 OHLC 历史行情和一个买卖规则,它按 K 线逐根重放,算出收益率、最大回撤、胜率等指标,还能画出可交互的 K 线复盘图。适合想验证自己交易想法、又不想手写回测引擎的你。读完这篇文章,你就能用自带的测试数据跑通第一次回测,并知道怎么调参、怎么避开常见坑。
先看看没有回测框架的滋味
你想验证一个"双均线金叉买入、死叉卖出"的策略,没有工具的话得自己干这些事:写循环逐天计算均线、判断交叉、扣佣金、记录净值、统计回撤……几十行代码写完还要怀疑自己算错。更难受的是换个参数组合(比如 10/20 换成 15/30)就得重跑一遍,画个净值曲线又得另写绘图代码。
backtesting.py 把这些重复劳动收进了一个Backtest引擎:数据喂进去、策略用两个方法声明,结果指标和交互图直接吐出来。指标库它不绑死,你自带的SMA函数、TA-Lib 或者任何返回序列的函数都能用。
3 分钟装好并跑出第一个回测结果
一行命令装上:
pip install backtesting如果想拿开发版:
git clone https://gitcode.com/GitHub_Trending/ba/backtesting.py下面这段代码用框架自带的谷歌(GOOG)测试数据跑一个双均线交叉策略。注意SMA不是框架内置的,是 快速上手指南 里自己定义的一个滑窗均值函数,框架对指标库持中立态度。
import pandas as pd from backtesting import Backtest, Strategy from backtesting.lib import crossover SMA = lambda v, n: pd.Series(v).rolling(n).mean() class SmaCross(Strategy): def init(self): self.ma1 = self.I(SMA, self.data.Close, 10) self.ma2 = self.I(SMA, self.data.Close, 20) def next(self): if crossover(self.ma1, self.ma2): self.buy() elif crossover(self.ma2, self.ma1): self.sell() bt = Backtest(GOOG, SmaCross, commission=0.002) stats = bt.run()bt.run()返回的stats就是一张完整的统计报表:总收益、年化、最大回撤、交易次数、胜率、利润因子等。README 里同参数示例的输出显示,这个策略九年赚了约 589%,但最大回撤 -33%、最长回撤持续 688 天——收益和险被放在同一张表里,这正是回测的意义。再调一句bt.plot(),就能在浏览器里打开可缩放的 K 线图:买卖点、净值曲线、回撤区间全标出来了。
两个方法讲透:init 和 next 在干什么
理解框架的核心机制只需要想清楚一件事:它把历史行情当成录像带,一根 K 线一根 K 线地播给你看。
类比一下值班看盘。init()是开市前的一次性准备:所有指标(均线、你写的任何函数)在这里用向量化方式一次算完,快且只需算一次。next()则是盘中的每一根 K 线收盘时,框架回调你一次,此时数据被"截断"到当前时刻,self.data.Close[-1]是当前收盘价,[-2]是前一根——就像你只能看到已经走完的 K 线,看不到未来。框架还替你处理了执行细节:self.buy()下单后默认下一根 K 线开盘成交,佣金按你给的commission比例扣。
典型用法:参数怎么扫、明细怎么查
写策略时别把参数写死。把n1、n2声明成类变量,就能直接交给optimize扫描:
stats = bt.optimize(n1=range(5, 30, 5), n2=range(10, 70, 5), maximize='Equity Final [$]', constraint=lambda p: p.n1 < p.n2)每个参数传一组候选值,maximize指定以哪个统计量最优,constraint过滤掉n1 >= n2这种非法组合。stats返回的仍是统计 Series,其中_trades列是逐笔交易明细(入场/出场时间、价格、持仓收益),_equity_curve是净值与回撤曲线,都是普通 pandas 对象,方便你接着分析。想多看几类玩法,参数优化示例 演示了热力图对比,策略库示例 给了一批可组合的基础策略。
新手最常卡住的两个点
数据格式有硬性要求。列名必须是Open、High、Low、Close(可选Volume),索引用pd.to_datetime()转成 DatetimeIndex,喂给Backtest时才不会报错。多出来的自定义列也能在策略里当指标用,这点不少人不知道。
K 线内没法下单。框架按"收盘出信号、次根开盘成交"的模型跑,trade_on_close=True可改成当根收盘成交。想模拟日内高频,别在日线里硬挤,直接用小时级数据回测。另外optimize扫的是历史数据,样本内表现会被过度拟合放大,参数定稿前记得留出验证区间。
下一步:打开 Quick Start User Guide,从数据格式到参数优化跟着完整走一遍,你的第一个策略报告十分钟内就能生成。
【免费下载链接】backtesting.py🔎 📈 🐍 💰 Backtest trading strategies in Python.项目地址: https://gitcode.com/GitHub_Trending/ba/backtesting.py
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考