第 1 章 · 02 依赖环境梳理与运行准备


文档摘要

第 1 章 · 02 依赖环境梳理与运行准备 本节摘要:本节把"诚实回测哲学"落到工程层面。quant-trading 仓库没有 requirements.txt,作者把依赖直接写进了每个脚本的 里——所以你要做的第一件事,是反向工程出一份依赖清单。除此之外,仓库里还有三个"地雷":文件名带空格( 这种没法直接 )、两个已废弃的第三方库( 、 )、以及散落在多处的硬编码绝对路径( )。本节带你逐个排雷,并给出一份精简版 建议,让你的环境最快跑起来。 涉及源码:全仓 26 个 的 语句; 目录下的 6 个数据文件。 ⚠️ 注意:本书只精读根目录的技术指标脚本(依赖相对干净)。

第 1 章 · 02 依赖环境梳理与运行准备

本节摘要:本节把"诚实回测哲学"落到工程层面。quant-trading 仓库没有 requirements.txt,作者把依赖直接写进了每个脚本的 import 里——所以你要做的第一件事,是反向工程出一份依赖清单。除此之外,仓库里还有三个"地雷":文件名带空格(Oil Money Trading backtest.py 这种没法直接 import)、两个已废弃的第三方库(basemapfix_yahoo_finance)、以及散落在多处的硬编码绝对路径(os.chdir('d:/'))。本节带你逐个排雷,并给出一份精简版 requirements.txt 建议,让你的环境最快跑起来。

涉及源码:全仓 26 个 .pyimport 语句;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 个技术指标脚本,依赖极简——只要 pandasnumpymatplotlib,加上 yfinance 拉数据,就能全部跑通。这是入门阶段最友好的部分。

二、两个已废弃的库及替代方案

仓库里有三个脚本还在用早已停止维护的库,跑之前必须替换——

2.1 fix_yahoo_financeyfinance

MACD Oscillator backtest.pyAwesome Oscillator backtest.pyParabolic 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 章三个脚本前必须做的一件事

2.2 mpl_toolkits.basemapcartopy

地图脚本(oil production choropleth.pyiron 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 投影即可。

三、文件名带空格:无法直接 import

这是仓库最让人哭笑不得的工程问题。文件命名是这样的——

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 装好,这三个脚本立刻能跑。

算法与代码精读

一份精简版 requirements.txt 建议

针对第 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 大项目,而那些可以放到第二遍。把环境成本与学习回报匹配起来,才不会在最容易的部分就被吓退。

关键技巧

  1. 从 import 反推依赖:没有 requirements.txt 时,grep -rhE "^(import|from) " *.py | sort -u 一行命令就能列出全仓第三方库。
  2. fix_yahoo_financeyfinance:第 2 章三个脚本必须先做这个替换才能跑,API 完全兼容,只改 import 行。
  3. basemapcartopy:地图脚本废弃库,第一遍跳过,真要跑再换。
  4. 文件名带空格重命名:Oil Money Trading backtest.pyoil_money_trading_backtest.py,否则跨文件 import 失败。
  5. 硬编码 os.chdir('d:/') 全改成相对路径:用 os.path.dirname(os.path.abspath(__file__)) 一行搞定。
  6. 最小依赖先跑通:pandas+numpy+matplotlib+yfinance 四件套,前 5 章全部能跑。

本节要点

  1. 项目无 requirements.txt,依赖从 import 反推;技术指标脚本依赖极简(三件套 + yfinance)。
  2. 两个已废弃库:fix_yahoo_finance(→yfinance,第 2 章必改)、basemap(→cartopy,地图脚本用)。
  3. 文件名带空格无法 import,Oil Money 子目录需把 Oil Money Trading backtest.py 重命名为 oil_money_trading_backtest.py,才能 import oil_money_trading_backtest as om
  4. 硬编码 os.chdir('d:/') 等绝对路径散落多处,VIX Calculator 甚至有法语路径,需统一改成相对路径。
  5. 数据文件在 data/ 目录:gbpusd/bitcoin/stoxx50/henry hub options/cme holidays/treasury yield curve,第 2 章不依赖本地数据。

下一章,我们正式踏上策略之旅——从最经典的 MACD 均线交叉开始,看一眼"trading strategy 101"长什么样。


作者与出处
原作者: 灏天文库
整理: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: 灏天文库 转发
评论区 (0)
U