第 1 章 · 02 依赖环境梳理与运行准备 本节摘要:本节把"诚实回测哲学"落到工程层面。quant-trading 仓库没有 requirements.txt,作者把依赖直接写进了每个脚本的 里——所以你要做的第一件事,是反向工程出一份依赖清单。除此之外,仓库里还有三个"地雷":文件名带空格( 这种没法直接 )、两个已废弃的第三方库( 、 )、以及散落在多处的硬编码绝对路径( )。本节带你逐个排雷,并给出一份精简版 建议,让你的环境最快跑起来。 涉及源码:全仓 26 个 的 语句; 目录下的 6 个数据文件。 ⚠️ 注意:本书只精读根目录的技术指标脚本(依赖相对干净)。
本节摘要:本节把"诚实回测哲学"落到工程层面。quant-trading 仓库没有 requirements.txt,作者把依赖直接写进了每个脚本的
import里——所以你要做的第一件事,是反向工程出一份依赖清单。除此之外,仓库里还有三个"地雷":文件名带空格(Oil Money Trading backtest.py这种没法直接import)、两个已废弃的第三方库(basemap、fix_yahoo_finance)、以及散落在多处的硬编码绝对路径(os.chdir('d:/'))。本节带你逐个排雷,并给出一份精简版requirements.txt建议,让你的环境最快跑起来。
涉及源码:全仓 26 个
.py的import语句;data/目录下的 6 个数据文件。
⚠️ 注意:本书只精读根目录的技术指标脚本(依赖相对干净)。如果你想跑 quantamental 大项目(Oil/Smart Farmers),需要额外装
cvxopt/folium/basemap等,装起来会更折腾,建议第二遍再啃。
本节没有金融原理,只有"工程现实"。但有一条贯穿全局的工程经济学原理值得先讲——
个人量化研究者的依赖管理,应当服从"够用就行"原则,而不是"环境最纯"原则。
作者显然是这条原理的践行者:他不写 requirements.txt,不是不知道有这东西,而是因为他的目标受众是"能跑起来就行的同行",而非"要部署到生产环境的运维"。仓库里 fix_yahoo_finance(已废弃)和 yfinance 两种写法同时存在,就是这种"够用就行"留下的痕迹——早期脚本用前者,后来 Yahoo 改 API,他换库但没回头改老脚本。
理解了这一点,你就明白本节的真正目的不是"指责作者不规范",而是帮你这份读者把环境最低成本地跑起来。
把全仓所有 import 语句抽出来去重,第三方依赖是这样的(按"出现频率 + 重要程度"排序)——
| 依赖 | 用途 | 出现在 |
|---|---|---|
pandas |
DataFrame 主战场,几乎所有脚本 | 全仓 |
numpy |
向量化运算、np.where/diff/cumsum |
全仓 |
matplotlib |
画持仓图/震荡柱/资产曲线 | 全仓技术指标 |
seaborn |
高级绘图(热力图等) | Oil/Smart Farmers |
scipy |
scipy.integrate.quad(数值积分,算 CVaR)、scipy.stats(t 分布)、scipy.optimize.minimize |
Monte Carlo/Smart Farmers |
statsmodels |
adfuller(ADF 检验,协整用)、statsmodels.api(OLS 回归、VECM) |
Pair Trading/Oil/Smart Farmers |
scikit-learn |
ElasticNetCV(弹性网)、KMeans/silhouette_score(聚类)、train_test_split |
Oil/Smart Farmers |
cvxopt |
凸优化(求解需求模型) | Smart Farmers |
yfinance / fix_yahoo_finance |
拉 Yahoo 股票数据 | 全仓技术指标 |
folium |
画 choropleth 地图(各国产量) | Oil/Smart Farmers 地图脚本 |
mpl_toolkits.basemap |
画 bubble map(地理散点) | Oil/Ore 地图脚本 |
mpl_toolkits.mplot3d |
3D 绘图 | Oil Money CAD |
imageio |
生成 GIF 动画(KMeans 收敛过程) | Oil Money COP |
好消息:第 2~5 章你要读的 12 个技术指标脚本,依赖极简——只要 pandas、numpy、matplotlib,加上 yfinance 拉数据,就能全部跑通。这是入门阶段最友好的部分。
仓库里有三个脚本还在用早已停止维护的库,跑之前必须替换——
fix_yahoo_finance → yfinanceMACD Oscillator backtest.py、Awesome Oscillator backtest.py、Parabolic SAR backtest.py 这三篇(也是本书第 2 章的主角),头部都是——
import fix_yahoo_finance as yf
fix_yahoo_finance 是 2017~2018 年间 Yahoo Finance 改 API 后的临时补丁库,2019 年起官方就推荐迁移到 yfinance(同一个作者 Ran Aroussi 维护,API 几乎完全兼容)。修法极简,把 import 那行改成——
import yfinance as yf
yf.download(ticker, start=..., end=...) 的调用方式保持不变。这是你在跑第 2 章三个脚本前必须做的一件事。
mpl_toolkits.basemap → cartopy地图脚本(oil production choropleth.py、iron ore production bubble map.py)用——
from mpl_toolkits.basemap import Basemap
basemap 早在 2016 年就停止开发,官方推荐迁移到 cartopy。作者在注释里也吐槽过"installing basemap is pretty painful for anaconda"(在 Anaconda 里装 basemap 简直痛苦)。好消息是:这两个地图脚本属于 quantamental 大项目,本书第一遍不啃,所以你可以暂时跳过。真要跑,装 cartopy(conda install -c conda-forge cartopy)并把 Basemap(...) 调用改成 cartopy.crs 投影即可。
这是仓库最让人哭笑不得的工程问题。文件命名是这样的——
MACD Oscillator backtest.py Awesome Oscillator backtest.py Parabolic SAR backtest.py Oil Money project/Oil Money Trading backtest.py
文件名里带空格,在 Python 里无法用 import oil money trading backtest 这种语法引入。对单文件回测(像 MACD/AO/SAR)这无所谓——直接 python MACD Oscillator backtest.py 能跑。但对有跨文件依赖的项目就出大问题了。
典型例子:Oil Money project/Oil Money NOK.py 第 462 行写着——
import oil_money_trading_backtest as om
它想引入的是同目录的 Oil Money Trading backtest.py(注意:文件名是"Trading"且带空格,而 import 写的是下划线且无空格)。这意味着作者心里期望的文件名是 oil_money_trading_backtest.py,但实际 commit 进仓库的是带空格的版本。要让这段代码跑通,你必须手动把文件重命名——
Oil Money Trading backtest.py → oil_money_trading_backtest.py
之后 import oil_money_trading_backtest as om 才能找到模块。这是本书"工程排雷"环节最实在的一条提醒:遇到 ModuleNotFoundError,先去查文件名有没有空格。
另一类常见地雷是脚本里写死了作者的本地路径。grep 一遍 os.chdir,能找到十来处——
os.chdir('d:/') # Dual Thrust, London Breakout, Oil Money 多处 os.chdir('D:/') # Options Straddle, Bollinger os.chdir('k:/') # Oil Money COP os.chdir('K:/ecole/github/televerser/données') # VIX Calculator(注意是法语 é)
这些路径在作者自己电脑上有效,到你机器上必然 FileNotFoundError。修法是把脚本下载到任意目录后,要么删掉这行、改用相对路径,要么改成你自己的数据目录。建议统一改成——
import os os.chdir(os.path.dirname(os.path.abspath(__file__))) # 切到脚本所在目录
这样脚本无论放哪都能跑。注意 VIX Calculator.py 那条法语路径(données = data,téléverser = upload),也算作者意裔/法语背景的一个小彩蛋。
data/ 目录下共 6 个文件,本书会用到其中几个——
| 文件 | 大小 | 用途 |
|---|---|---|
gbpusd.csv |
806 KB | 英镑/美元外汇(histdata 来源),London Breakout 用 |
bitcoin.csv |
6 KB | 比特币日线 |
stoxx50.xlsx |
360 KB | 欧洲斯托克 50 指数 |
henry hub european options.csv |
2.9 MB | 亨利港天然气期权,Options Straddle 用 |
cme holidays.csv |
2 KB | CME 交易所假日表 |
treasury yield curve rates.csv |
54 KB | 美国国债收益率曲线 |
第 2 章的 MACD/AO/SAR 主要用 yfinance 拉股票数据,不直接依赖 data/ 目录。所以你只要把 yfinance 装好,这三个脚本立刻能跑。
针对第 2~5 章(技术指标 + Pair Trading),给一份最小依赖清单——
# quant-trading 技术指标章节最小依赖 pandas>=1.3 numpy>=1.20 matplotlib>=3.4 yfinance>=0.2.0 # Pair Trading / 协整需要 scipy>=1.7 statsmodels>=0.13 # 可选:画图更好看 seaborn>=0.11
装完这 7 个,前 5 章全部脚本能跑。如果你打算啃 Oil/Smart Farmers 大项目,再加——
scikit-learn>=1.0 cvxopt>=1.2 folium>=0.12 cartopy>=0.20 # 替代废弃的 basemap imageio>=2.9 openpyxl>=3.0 # 读 stoxx50.xlsx 用
记住一条:先装最小集,缺什么再补什么。不要一上来就 pip install 全套,cvxopt 在 Windows 上编译会卡很久,cartopy 依赖 GEOS/PROJ 也容易翻车——能晚装就晚装。
以 MACD 为例,排完雷后的脚本头部应该是这样——
import matplotlib.pyplot as plt import numpy as np import pandas as pd import yfinance as yf # 原来是 fix_yahoo_finance,已替换 def macd(signals): signals['ma1'] = signals['Close'].rolling(window=ma1, min_periods=1).mean() signals['ma2'] = signals['Close'].rolling(window=ma2, min_periods=1).mean() return signals
只改了一行 import,整个脚本就活了。这就是第 2 章你将看到的所有脚本的"通用预处理"。
🎯 反直觉发现:很多读者一拿到没有
requirements.txt的仓库就放弃,觉得"环境都跑不起来还学什么"。但 quant-trading 这种个人项目恰恰相反——技术指标那一档的依赖极简(三个库 + 一个数据源),排雷成本几乎为零;真正难啃的是 quantamental 大项目,而那些可以放到第二遍。把环境成本与学习回报匹配起来,才不会在最容易的部分就被吓退。
requirements.txt 时,grep -rhE "^(import|from) " *.py | sort -u 一行命令就能列出全仓第三方库。fix_yahoo_finance → yfinance:第 2 章三个脚本必须先做这个替换才能跑,API 完全兼容,只改 import 行。basemap → cartopy:地图脚本废弃库,第一遍跳过,真要跑再换。Oil Money Trading backtest.py → oil_money_trading_backtest.py,否则跨文件 import 失败。os.chdir('d:/') 全改成相对路径:用 os.path.dirname(os.path.abspath(__file__)) 一行搞定。pandas+numpy+matplotlib+yfinance 四件套,前 5 章全部能跑。fix_yahoo_finance(→yfinance,第 2 章必改)、basemap(→cartopy,地图脚本用)。Oil Money Trading backtest.py 重命名为 oil_money_trading_backtest.py,才能 import oil_money_trading_backtest as om。os.chdir('d:/') 等绝对路径散落多处,VIX Calculator 甚至有法语路径,需统一改成相对路径。data/ 目录:gbpusd/bitcoin/stoxx50/henry hub options/cme holidays/treasury yield curve,第 2 章不依赖本地数据。下一章,我们正式踏上策略之旅——从最经典的 MACD 均线交叉开始,看一眼"trading strategy 101"长什么样。