只是想验证一个策略想法
走标准 pip 安装即可:装好、备好 OHLCV 数据、写一个 Strategy 子类就能跑。若你连环境都不想维护,可以先看「免部署一句话研究」的另一条路线,但要注意它和本项目是两条独立路线,前者不能替代后者的代码级可控回测。
Installation · Python 回测库
Backtesting.py 是一个 Python 回测库,官方安装方式只有一行 pip install backtesting,但真正卡住人的通常不是这一行命令,而是「装到哪个 Python 里」「依赖版本对不对」「装完怎么确认能跑」。本页把它拆成可对照执行的检查表:安装方式对照、依赖边界、装完自检清单、报错排查表,每一步都给出真实命令与预期输出,并注明哪些结论以官方 README 与 PyPI 为准。另外提醒一句:安装只是起点,真正影响回测结论的是数据口径、手续费假设与参数区间,这三件事在下单看数字之前就要先定好。
官方 README 与 PyPI 给出的安装入口是 pip;下表把常见安装路径放在一起对比,重点看「什么时候用」和「容易踩什么」。
| 安装方式 | 命令 | 适用场景 | 注意点 |
|---|---|---|---|
| pip 基础安装 | pip install backtesting | 绝大多数使用场景,官方推荐入口 | 装到当前解释器下;多环境机器上先确认 python 与 pip 是否同源 |
| 升级到最新发布版 | pip install -U backtesting | 已装过旧版本,想跟官方发布版 | 升级后重跑一次导入自检;依赖版本随发布变化,以 PyPI 页面标注为准 |
| 虚拟环境内安装 | python -m venv .venv 激活后再 pip | 一台机器上跑多个项目、依赖易冲突 | 务必先激活环境再安装,否则会装到全局解释器 |
| 指定版本安装 | pip install backtesting==<版本号> | 复现某次回测结果、对照旧代码 | 版本号只能取自 PyPI 发布列表,本页不背书任何具体号段 |
| 从 GitHub 安装开发主线 | pip install git+https://github.com/kernc/backtesting.py | 想提前用未发布改动、自己提交补丁 | 主分支行为可能变化,回测结论要记录所用提交;生产环境请回到发布版 |
| 源码目录直接引用 | 克隆仓库后把目录放到项目路径 | 需要边读源码边改的实验 | 不走 pip 时依赖要自己装齐,且容易与已安装版本互相覆盖 |
| 加装第三方指标库 | 按需另装(如 talib) | 要在策略里用现成技术指标 | 该项目与指标库解耦,是否可用取决于该库自身与你的环境 |
| 内网/镜像源安装 | pip 加 -i 指定镜像源 | 公司内网或下载超时 | 镜像源同步时间不确定,装到的版本可能与官方最新不同 |
下表把「装得对不对」的判断依据列出来:版本边界以官方声明为准,最后一列写的是不满足时你会看到什么现象。
| 依赖项 | 边界 | 作用 | 不满足时的现象 |
|---|---|---|---|
| Python | 官方声明 >= 3.9 | 运行环境 | 安装阶段直接失败并提示版本不受支持 |
| pip | 随 Python 自带,建议较新版本 | 安装入口 | 解析依赖失败、提示找不到匹配版本 |
| pandas | 运行时依赖,随包自动安装 | OHLCV 数据结构与计算 | 导入或构造数据时报缺库或版本冲突 |
| bokeh | 官方声明 >= 3.0.0 | 交互式图表渲染 | 回测能跑完但 plot() 报错或出不了图 |
| 第三方指标库(可选) | 按需自装 | 现成技术指标 | 只影响用到该库的策略,不影响回测主体 |
| 网络 | 安装期需要 | 下载包与依赖 | 下载超时、连接中断,表现为安装中途失败 |
| 磁盘与内存 | 无官方硬性数字 | 装包空间 + 回测时数据驻留 | 数据量大或参数扫描时进程被系统结束 |
五步走完,每步都给出命令、一句话说明和可验证的预期输出;命令里的版本号与依赖解析结果会随官方发布变化,属正常。
先确认你即将安装到哪个 Python 里,避免装完却在另一个环境导入。
python -V python -m pip -V
预期输出:两条命令都打印出版本号,且第二条的路径与上一条指向同一套 Python(路径前缀一致即正常)。
用 venv 隔离依赖,避免与系统或其他项目互相影响。
python -m venv .venv :: Windows 激活 .venv\Scripts\activate
预期输出:命令行提示符前出现 (.venv);再执行 python -V 显示的仍是同一版本。
安装本体,pip 会自动解析 pandas 与 bokeh 依赖。
pip install backtesting
预期输出:末尾出现 Successfully installed backtesting-...(版本号以 PyPI 当前发布为准)。
确认装好的包能被子解释器导入,这是「装成功」的判据。
python -c "import backtesting; print(backtesting.__version__)"
预期输出:打印出版本号;若报 ModuleNotFoundError,说明装到了别的环境,回到第 1 步核对。
用官方示例数据跑一次,确认依赖链路(数据 → 回测 → 出图)完整。
from backtesting import Backtest, Strategy from backtesting.test import GOOG bt = Backtest(GOOG, Strategy, cash=10000) print(bt.run().head())
预期输出:打印出绩效摘要(含区间与收益指标);若卡在出图环节,检查 bokeh 是否为 >= 3.0.0——示例调用与字段名以官方文档为准。
python -m pip install backtesting 指定解释器安装,效果等同于先激活再 pip,命令细节以官方文档为准。如果你在 CI 里跑回测,建议把安装命令与解释器版本一起写进流水线说明,这样别人复现你的结论时不会先卡在环境上。装完别急着写策略,先按这张表逐项确认;每项都有命令、预期输出和「不通过时先查什么」,比反复重装更快定位问题。
| 检查项 | 命令 | 预期输出 | 不通过时先查什么 |
|---|---|---|---|
| 解释器可用 | python -V | 打印版本号且 >= 3.9 | 系统 PATH 里是否还有更早的 Python 抢先被调用 |
| pip 指向同一环境 | python -m pip -V | 路径与上一条解释器一致 | 是否用了全局 pip;改用 python -m pip 形式执行 |
| 包已安装 | pip show backtesting | 显示名称、版本与安装位置 | 是否在虚拟环境外执行了安装命令 |
| 可被导入 | python -c "import backtesting" | 无任何报错 | 同名目录遮蔽(项目里有同名文件夹) |
| 关键依赖在位 | python -c "import pandas, bokeh; print(pandas.__version__, bokeh.__version__)" | 打印两个版本号,bokeh 为 >= 3.0.0 | 是否装到了别处;是否需要 -U bokeh 升级 |
| 回测主体可运行 | 用示例数据执行一次 Backtest(...).run() | 返回含绩效指标的统计对象 | 数据列名是否为 Open/High/Low/Close/Volume |
| 出图链路可用 | 对同一结果执行一次 plot() | 生成可交互图表或输出文件 | bokeh 版本、浏览器环境与输出方式 |
| 环境隔离生效 | 对比 python -V 与全局解释器路径 | 两者路径不同,指向虚拟环境内 | 是否忘记激活;安装与运行是否用了同一个解释器 |
除标准 pip 安装外,还有几种常见路径;选哪条取决于你是「只想用」还是「要改」,以及网络与团队的约束。
| 路径 | 怎么做 | 适合谁 | 代价与注意点 |
|---|---|---|---|
| 标准 pip 安装 | 虚拟环境内 pip install backtesting | 只想尽快跑通回测的研究者 | 升级会跟随官方发布,结论要记录版本 |
| 锁定版本复现 | 安装时指定版本号,并记录在项目说明里 | 要与同事或历史结论对齐 | 版本号需查 PyPI,本页不提供号段背书记录 |
| GitHub 开发主线 | 用上表同一 git+ 仓库地址安装主分支 | 想用未发布改动、要给上游提补丁 | 行为可能随时变化,不适合作为长期生产依赖 |
| 源码目录引用 | 克隆后放入项目路径直接 import | 要边读源码边调试实现细节 | 依赖需自装,且容易与已安装版本冲突 |
| 离线/内网安装 | 先在可联网机器下载,再拷贝安装包 | 内网环境、公司代理限制 | 依赖需一并带走,版本一致性要自己保证 |
| 容器化运行 | 在镜像里安装并固定依赖 | 团队统一环境、复现历史回测 | 镜像需自行维护;图形化出图在无界面环境下要改用输出文件 |
走标准 pip 安装即可:装好、备好 OHLCV 数据、写一个 Strategy 子类就能跑。若你连环境都不想维护,可以先看「免部署一句话研究」的另一条路线,但要注意它和本项目是两条独立路线,前者不能替代后者的代码级可控回测。
优先「虚拟环境 + 锁定版本 + 记录数据区间」三件套,把安装命令与版本号写进项目说明;回测结论如果要对齐,必须同时对齐代码版本、数据区间与手续费假设,否则数字没有可比性。团队协作里更常见的坑是「各人环境不同、结论看起来一样但细节不同」,所以环境说明建议连依赖清单一起留档。
用 GitHub 安装或源码目录引用更直接,但请把改动与官方发布版分开管理:升级官方版本时先看你改过哪些文件,避免直接覆盖导致回测结论失效。若只是临时验证一个想法,也可以先在发布版上跑通,再决定要不要切到主分支。
下表按「现象 → 可能原因 → 处理方式 → 预防」整理安装与导入阶段最常见的七类问题;报错原文与新版行为以官方文档为准。
| 现象 | 可能原因 | 处理方式 | 预防 |
|---|---|---|---|
ModuleNotFoundError: No module named 'backtesting' | 未安装,或装到了另一个 Python 环境 | 在当前解释器下用 python -m pip install backtesting 重装并复测导入 | 安装与运行使用同一解释器,命令统一用 python -m pip |
| 解析依赖失败或一直卡在下载 | 网络受限、镜像源不可用 | 换镜像源或先下载再离线安装 | 内网机器提前准备好安装包与依赖清单 |
| 提示 Python 版本不受支持 | 当前解释器低于官方声明的最低版本 | 换用更高版本的解释器,或在新虚拟环境里安装 | 建项目时先固定 Python 版本 |
| 导入时报依赖版本冲突 | 与环境中已有的 pandas / bokeh 版本相互不兼容 | 新建干净虚拟环境重装,先装本体再按需装其它库 | 一个项目一个虚拟环境,不共用全局解释器 |
回测能跑但 plot() 报错 | bokeh 未安装或低于官方声明版本 | 按 PyPI 标注的约束升级 bokeh,或先跳过出图 | 依赖升级后跑一次出图自检 |
| 导入成了项目里的同名模块 | 当前目录存在同名文件/文件夹,优先级高于已安装包 | 重命名本地文件,或在项目外目录运行脚本 | 不要用与依赖同名的文件名 |
| 升级后原有脚本报错 | 新版行为或依赖约束变化 | 按官方变更说明调整,必要时回退到之前版本 | 升级前记录当前版本与关键结论,便于回退对照 |
本节记录的是本次实测使用的环境快照与确认命令:安装成功不等于环境可用,解释器、依赖版本、样例数据与出图环境都可能单独出问题。下表六项各给出实测值,便于你在自己的机器上逐项对照。
| 记录项 | 确认命令 | 本次实测值 | 异常表现 | 处置 |
|---|---|---|---|---|
| 解释器是否一致 | python -c "import sys; print(sys.executable)" | 与本机 pip 一致的 3.11.9 解释器路径 | 与 pip 装到的解释器不是同一个 | 统一改用 python -m pip 安装,或建独立虚拟环境 |
| 库能否导入 | python -c "import backtesting; print(backtesting.__version__)" | 0.6.6 | ModuleNotFoundError | 确认装到了当前解释器;必要时重装同版本 |
| 依赖版本区间 | python -c "import pandas, numpy, bokeh; print(pandas.__version__, numpy.__version__, bokeh.__version__)" | 2.2.3 2.4.6 3.3.0 | ImportError 或依赖冲突 | 按官方元数据核对:numpy>=1.17.0、pandas!=0.25.0,>=0.25.0、bokeh!=3.0.*,!=3.2.*,>=3.0.0 |
| Python 版本门槛 | python -c "import sys; print(sys.version_info >= (3, 9))" | True | False | 官方元数据要求 Requires-Python >= 3.9,低于此版本需先升级解释器 |
| 内置样例数据 | python -c "from backtesting.test import GOOG, SMA; print(len(GOOG), list(GOOG.columns))" | 2148 与 Open/High/Low/Close/Volume | ImportError 或列名缺失 | 说明装到的不是完整发行版,按官方仓库重新安装 |
| 出图环境 | 跑一次 bt.plot() 并打开生成的 HTML | 图表可在浏览器打开、买卖点有标注 | 图打不开或空白 | 先确认浏览器环境;批量实验阶段可只保留统计结果不出图 |
# 一条命令跑完前五项(本次实测环境:Windows + Python 3.11.9)
python -c "import sys, backtesting, pandas, numpy, bokeh; \
print(sys.version.split()[0], backtesting.__version__, pandas.__version__, numpy.__version__, bokeh.__version__)"
# 实测输出:3.11.9 0.6.6 2.2.3 2.4.6 3.3.0
下面六类现象来自本次实测与官方元数据,按「出现频率从高到低」排列。每条都给出确认方式与依据来源,具体报错原文以你的终端输出与官方文档为准。
| 现象 | 常见原因 | 怎么确认 | 处置 | 依据 |
|---|---|---|---|---|
用 method='sambo' 优化时报 ImportError | sambo 不在默认依赖里,只列在 PyPI 的 test 附加项 | 直接调 optimize(method='sambo') | pip install sambo,或改用默认 method='grid' | 实测报错原文:ImportError: Need package 'sambo' for method='sambo'. pip install sambo |
| 导入时报 ModuleNotFoundError | 包装到了另一个解释器 | python -c "import sys; print(sys.executable)" 与 pip 输出对比 | 统一解释器,或建独立虚拟环境重装 | 本次实测环境要求:安装与运行必须同一个解释器 |
| 版本冲突 / 依赖被降级 | 与系统里已有包混装 | python -m pip check | 换干净环境重装,再对照官方依赖区间 | PyPI 元数据:numpy>=1.17.0、pandas!=0.25.0,>=0.25.0、bokeh!=3.0.*,!=3.2.*,>=3.0.0 |
| 下单时报 AssertionError | 下单数量不是整数股(例如 size=100.5) | 用最小脚本跑一次固定数量下单 | 先 int() 取整,再按 100 股整手处理 | 库断言原文:size must be a positive fraction of equity, or a positive whole number of units |
| 官方要求与本地 Python 不匹配 | 解释器版本低于官方门槛 | python --version | 升级到官方要求的版本区间内再装 | PyPI 元数据 Requires-Python >= 3.9;更换版本后请重跑上表自检 |
| 不清楚能不能商用 | 未确认许可条款 | 打开仓库根目录的 LICENSE 原文阅读 | 先做许可评估再集成,网络分发场景尤其要注意 | 仓库许可为 AGPL-3.0(PyPI License 字段同为 AGPL-3.0),本页不构成法律意见 |
PyPI 包名是 backtesting(安装命令 pip install backtesting),GitHub 仓库名才是 backtesting.py;两者指向同一项目。包名与命名规则以官方 README 与 PyPI 页面为准;搜索教程时如果看到两种写法,指的都是同一个项目,不要以为是两个库。
官方声明 Python >= 3.9,建议直接用更高版本并配合虚拟环境;具体支持范围以 PyPI 页面标注为准,不要照抄第三方教程里的旧版本号。如果团队里有人用旧版本解释器,建议在虚拟环境里各装一份、分别验证,而不是把全局环境升到最新再回头修别人的脚本。
运行时依赖 pandas 与 bokeh(官方声明 >= 3.0.0),pip 会自动解析;技术指标库是可选的,本项目与指标库解耦,用不用 talib 取决于你的策略。依赖清单以官方 README 与 PyPI 为准。
只要能整理成带 Open/High/Low/Close/Volume 列的时间索引数据即可用于回测;取数方式(本地文件、公开接口等)与字段口径需自行确认,具体数据要求见数据页。A 股常见的复权与停牌处理没有统一默认值,属你自己的数据准备工作。建议先把「用哪一段区间、用哪种复权口径」写清楚,再去比较回测数字,否则换了口径结论就会变。
官方说明其定位是单资产回测,不支持多资产组合与分数股交易,适合单标的方向性策略研究;如果你需要组合级回测,需要在别的工具里完成或自行扩展。能力边界以官方 README 为准,使用前建议先想清楚策略属于单标的还是组合级,避免做到一半才发现工具不匹配。
没有已证实的集成关系:它通过 pip 独立安装,本机技能提供的是另一条免部署的研究路线,两者互不替代。是否存在后续集成以双方官方说明为准,本页不做任何暗示。你现在能确定的是:安装与运行完全在本地 Python 环境里完成,回测结论与是否安装其它工具无关。