2.环境搭建与快速开始
环境搭建是踏入 FinRL 世界的第一道门槛。这门课把这道门槛拆成了几块平整的台阶:先搞定跨平台开发环境,再理清依赖库的管理思路,最后跑通第一个交易 AI 的完整流程。整个过程不需要任何金融背景,只要跟着步骤走,五分钟后就能看到 AI 在虚拟市场里做出买卖决策。
FinRL 的设计哲学里有一条很实在的理念:让研究代码和生产代码共享同一套底层。这意味着今天笔记本上跑通的训练流程,明天可以直接搬到服务器上继续迭代。这种一致性从环境配置阶段就开始体现——无论是 Mac 笔记本、Ubuntu 服务器,还是 Windows 工作站,核心依赖栈保持高度统一。
跨平台开发环境配置
Mac OS 配置路径
Mac 系统下的配置最贴近原生开发体验。第一步是安装 Anaconda,这个 Python 环境管理器几乎是数据科学领域的标配。从官网下载图形化安装包,一路点击下一步就能完成。安装完成后,打开终端输入 which python,如果返回路径包含 anaconda3,说明命令行环境已经自动切换到了 Anaconda 的 Python 解释器。如果还是系统默认的 Python,需要手动配置 PATH,或者通过 Anaconda Navigator 启动终端。
接下来安装 Homebrew,这是 Mac 的软件包管理器。一行命令就能完成安装,它会在后台处理好所有依赖关系。FinRL 的某些底层库需要编译安装,Homebrew 提供的 cmake 和 openmpi 能确保编译过程顺利。
OpenAI 的 Baselines 库是强化学习算法的参考实现,FinRL 的部分环境设计借鉴了它的接口规范。通过 Homebrew 安装系统级依赖后,Python 层的包就能顺利编译。这一步不是安装 Baselines 本身,而是为它准备编译环境。
FinRL 本身处于快速迭代期,PyPI 上的稳定版本往往滞后于最新功能。因此官方推荐直接从 GitHub 安装开发版:pip install git+https://github.com/AI4Finance-Foundation/FinRL.git。这条命令会拉取最新代码并执行安装,确保拿到的是社区最活跃的版本。
Box2D 是一个物理引擎,在 FinRL 的某些自定义环境中可能用到。如果安装过程出现 AttributeError: module '_Box2D' has no attribute 'RAND_LIMIT_swigconstant' 这类错误,说明 SWIG 接口生成有问题。此时可以尝试 brew install swig 重新安装 SWIG 工具,或者改用 pip install box2d-kengz 这个社区维护的修复版本。
最后,下载 FinRL-Tutorials 仓库。这个仓库独立于主库,包含了各种场景的示例 notebook。通过 git clone 或者直接下载 ZIP 包都可以。打开 Anaconda Navigator,启动 Jupyter Notebook,导航到教程目录,就能运行第一个股票交易示例。
Ubuntu 配置路径
Ubuntu 的配置逻辑与 Mac 类似,但包管理器换成了 apt。安装 Anaconda 的步骤可以参考官方文档,主要是下载 shell 脚本并执行。Ubuntu 20.04 及以上版本对 Anaconda 的支持非常完善,一般不会遇到路径配置问题。
OpenAI 相关依赖的安装命令更简洁:sudo apt-get update && sudo apt-get install cmake libopenmpi-dev python3-dev zlib1g-dev libgl1-mesa-glx swig。这里多了 libgl1-mesa-glx,是为了支持某些需要图形渲染的环境。Ubuntu 的包管理系统会自动处理版本冲突,安装过程比 Mac 更省心。
FinRL 的安装方式与 Mac 完全一致,同样推荐开发版。Ubuntu 的 pip 默认指向 Python 3,不需要额外指定版本。如果系统里同时存在 Python 2 和 Python 3,建议显式使用 pip3 命令。
Box2D 在 Ubuntu 上的安装通常更顺利,因为编译工具链更完整。如果遇到问题,同样可以尝试 pip install box2d-kengz 这个替代方案。
运行示例时,在终端直接输入 jupyter notebook,浏览器会自动打开文件管理界面。Ubuntu 的权限模型比 Mac 严格,如果 notebook 无法写入数据,检查当前目录的写权限即可。
Windows 10 配置路径
Windows 的配置需要特别注意两点:Python 版本和网络代理。FinRL 要求 Python 3.7 及以上版本,如果系统里装过旧版 Python,建议先卸载。另一个常见冲突是 Zipline,这个量化回测库与 FinRL 的部分依赖不兼容,安装前需要执行 pip remove zipline。
由于 YahooFinance 在中国区停止服务,Windows 用户如果直接运行示例,会遇到数据下载失败的问题。解决方案有两种:配置 VPN 全局代理,或者改用其他数据源。FinRL 支持多种数据源切换,这个在后续数据流水线章节会详细展开。
Windows 的安装步骤与 Unix 系系统不同。先通过 git clone 下载 FinRL 主库,然后进入目录执行 pip install .。这个点号表示安装当前目录下的包,pip 会自动读取 setup.py 并处理依赖。这种方式在 Windows 上更稳定,能避免路径解析的潜在问题。
安装完成后,运行 python Stock_NeurIPS2018.py 测试基本功能。如果出现 UserWarning: Module "zipline.assets" not found,这是预期内的警告,不影响核心功能。如果提示下载失败,则需要检查网络代理设置。
Windows 10 (WSL) 配置路径
WSL(Windows Subsystem for Linux)为 Windows 用户提供了接近原生的 Linux 开发体验。安装 Ubuntu 子系统后,所有操作都可以在 Linux 环境中完成,避免了 Windows 路径和权限的诸多坑。
WSL 的配置步骤与原生 Ubuntu 完全一致:安装 Anaconda、安装系统依赖、安装 FinRL 开发版、下载教程仓库。WSL 的文件系统与 Windows 互通,可以在 Windows 下用 VS Code 编辑代码,在 WSL 里运行训练。
WSL 的网络配置需要特别注意。如果 Windows 主机开了 VPN,WSL 子系统可能需要额外配置才能走代理。具体方法取决于 VPN 软件,有些需要设置 WSL 的 DNS,有些需要配置环境变量。这个细节在官方文档里没有展开,但社区讨论区有很多解决方案。
Anaconda 与依赖库管理
为什么必须用 Anaconda
FinRL 的依赖树相当复杂,直接调用系统 Python 安装会导致各种版本冲突。Anaconda 提供了隔离的环境沙盒,每个项目可以拥有独立的 Python 版本和依赖库。这种隔离性在强化学习项目中尤为重要,因为 PyTorch、TensorFlow 等深度学习框架对 CUDA 版本有严格要求。
创建独立环境的命令很简单:conda create -n finrl python=3.8。激活环境后,所有 pip 安装的操作都只影响当前环境,不会污染系统或其他项目。训练完成后,执行 conda deactivate 就能退出环境,回到干净的系统状态。
核心依赖库解析
FinRL 的依赖可以分为四层。最底层是数值计算库,NumPy 和 Pandas 处理金融数据,Matplotlib 和 Plotly 负责可视化。这些库的版本兼容性很好,一般不需要手动干预。
第二层是深度学习框架。FinRL 支持 ElegantRL、RLlib 和 Stable Baselines 3 三个强化学习库,它们又分别依赖 PyTorch 或 TensorFlow。ElegantRL 是 FinRL 团队维护的轻量级库,默认推荐;RLlib 适合分布式训练;SB3 接口最成熟,适合快速验证想法。安装 FinRL 时,这三个库不会全部装上,而是根据实际使用动态导入。
第三层是金融数据接口。YahooFinance 是默认数据源,通过 yfinance 库访问。此外还支持 Alpaca、JoinQuant 等实盘接口。这些数据源的 API 密钥管理在 config.py 中统一配置,避免硬编码在训练脚本里。
第四层是环境依赖。OpenAI Gym 提供了强化学习环境的基础接口,FinRL 的所有交易环境都继承自 gym.Env。Box2D、Pygame 等库只在特定环境中需要,属于可选依赖。
环境隔离的最佳实践
建议为每个交易策略创建独立的环境。比如研究股票交易用 finrl-stock,研究加密货币用 finrl-crypto。不同策略可能依赖不同版本的库,隔离环境能避免升级导致的意外破坏。
环境配置文件可以导出为 YAML:conda env export > environment.yml。把这个文件加入 Git 仓库,团队成员就能一键复现相同的开发环境。FinRL 主库的 requirements.txt 只包含最小依赖,实际项目中往往需要补充数据、可视化等额外库,这时候 YAML 文件比 requirements 更可靠。
5分钟快速启动你的第一个交易AI
项目结构速览
FinRL 的代码组织遵循清晰的职责分离。finrl/applications 目录下是各种交易任务的具体实现,股票、加密货币、高频交易各自独立。finrl/agents 封装了不同强化学习库的调用接口,训练脚本不需要关心底层是 PPO 还是 SAC。finrl/meta 是环境核心,定义了状态空间、动作空间和奖励函数。
根目录下的 main.py 是统一入口,通过 --mode 参数切换训练、测试、交易三个模式。train.py、test.py、trade.py 分别实现对应逻辑,config.py 集中管理所有超参数和路径配置。这种设计让实验管理变得简单,跑完一组实验只需修改配置文件,不用动业务代码。
main.py 代码拆解
import os
from typing import List
from argparse import ArgumentParser
from finrl import config
from finrl.config_tickers import DOW_30_TICKER
开头导入的是配置系统和股票代码列表。DOW_30_TICKER 包含了道琼斯 30 成分股,是默认的测试标的。config 里定义了数据保存路径、模型保存路径、TensorBoard 日志路径等常量,避免硬编码。
from finrl.meta.env_stock_trading.env_stocktrading_np import StockTradingEnv
这行导入了股票交易环境。注意路径中的 np,表示这个环境基于 NumPy 实现,运行速度比纯 Python 快一个数量级。后续章节会详细讲解环境内部的状态设计和动作解析,这里只需要知道它封装了交易逻辑。
def build_parser():
parser = ArgumentParser()
parser.add_argument(
"--mode",
dest="mode",
help="start mode, train, download_data" " backtest",
metavar="MODE",
default="train",
)
return parser
参数解析器只暴露了一个核心参数:mode。这种极简设计降低了使用门槛,复杂配置全部隐藏在 config.py 里。实际项目中可能需要添加更多参数,比如指定 GPU 编号、调整训练步数,但官方示例保持简洁,优先保证跑通。
def check_and_make_directories(directories: List[str]):
for directory in directories:
if not os.path.exists("./" + directory):
os.makedirs("./" + directory)
这个辅助函数确保所有必要的目录都存在。FinRL 在运行时会生成模型文件、日志文件和结果图表,提前建好目录能避免权限错误。路径前的 ./ 表示相对路径,保证项目在任意位置都能正常运行。
if options.mode == "train":
from finrl import train
env = StockTradingEnv
kwargs = {}
train(
start_date=TRAIN_START_DATE,
end_date=TRAIN_END_DATE,
ticker_list=DOW_30_TICKER,
data_source="yahoofinance",
time_interval="1D",
technical_indicator_list=INDICATORS,
drl_lib="elegantrl",
env=env,
model_name="ppo",
cwd="./test_ppo",
erl_params=ERL_PARAMS,
break_step=1e5,
kwargs=kwargs,
)
训练模式的核心调用。train 函数封装了数据下载、环境构建、智能体初始化和训练循环。参数里,technical_indicator_list 定义了状态空间中的技术指标,默认包含 MACD、RSI、CCI 等。drl_lib 指定使用 ElegantRL,model_name="ppo" 选择 PPO 算法。break_step=1e5 表示训练 10 万步后自动停止,这个数值在示例中设得比较小,方便快速跑通。
elif options.mode == "test":
from finrl import test
env = StockTradingEnv
kwargs = {}
account_value_erl = test(
start_date=TEST_START_DATE,
end_date=TEST_END_DATE,
ticker_list=DOW_30_TICKER,
data_source="yahoofinance",
time_interval="1D",
technical_indicator_list=INDICATORS,
drl_lib="elegantrl",
env=env,
model_name="ppo",
cwd="./test_ppo",
net_dimension=512,
kwargs=kwargs,
)
测试模式加载训练好的模型,在测试集上评估表现。cwd="./test_ppo" 指定了模型加载路径,必须与训练时的 cwd 一致。net_dimension=512 定义了神经网络隐藏层维度,这个参数在训练时自动保存,测试时无需重复指定。函数返回 account_value_erl,是账户价值的时间序列,后续回测分析会用到。
elif options.mode == "trade":
from finrl import trade
env = StockTradingEnv
kwargs = {}
trade(
start_date=TRADE_START_DATE,
end_date=TRADE_END_DATE,
ticker_list=DOW_30_TICKER,
data_source="yahoofinance",
time_interval="1D",
technical_indicator_list=INDICATORS,
drl_lib="elegantrl",
env=env,
model_name="ppo",
API_KEY=ALPACA_API_KEY,
API_SECRET=ALPACA_API_SECRET,
API_BASE_URL=ALPACA_API_BASE_URL,
trade_mode='backtesting',
if_vix=True,
kwargs=kwargs,
)
交易模式支持实盘和回测两种。示例中 trade_mode='backtesting' 表示用历史数据模拟交易,不需要真实账户。if_vix=True 会加入波动率指数作为额外特征,提升策略对恐慌情绪的感知能力。Alpaca 的 API 密钥在 config.py 中配置,避免泄露到代码仓库。
运行第一个训练
在终端执行 python main.py --mode=train,会看到数据下载、环境初始化、训练进度条依次出现。第一次运行会下载道琼斯 30 成分股的历史数据,时间范围由 TRAIN_START_DATE 和 TRAIN_END_DATE 定义。数据自动缓存到 DATA_SAVE_DIR,下次训练直接读取,节省时间。
训练过程中,TensorBoard 日志会写入 TENSORBOARD_LOG_DIR。在另一个终端运行 tensorboard --logdir ./tensorboard_log,就能实时监控损失函数、奖励值、账户价值等指标。ElegantRL 的 PPO 实现支持自适应学习率调整,训练初期学习率较大,后期自动衰减,这个细节在日志里能看到。
10 万步训练在普通笔记本上约需 5-10 分钟。完成后,TRAINED_MODEL_DIR 目录下会出现 actor.pth 和 critic.pth 两个文件,分别是策略网络和价值网络的权重。此时执行 python main.py --mode=test,程序会加载这两个文件,在测试集上运行策略,输出账户价值曲线。
验证安装与常见问题解决
安装验证 checklist
- 执行
python -c "import finrl; print(finrl.__version__)",确认导入无报错 - 运行
python main.py --mode=train,观察数据下载是否正常 - 检查
DATA_SAVE_DIR目录是否生成 CSV 文件 - 训练完成后,确认
TRAINED_MODEL_DIR有.pth模型文件 - 执行
python main.py --mode=test,看是否能加载模型并输出结果
如果以上五步都通过,说明环境配置成功。任何一步失败,都需要针对性排查。
典型问题与修复方案
问题 1:ImportError: No module named 'finrl'
这个错误通常发生在终端 Python 环境不是 Anaconda 的情况下。检查 which python 或 where python 的输出路径,确保在 Anaconda 环境下。如果用了虚拟环境,确认已经执行 conda activate finrl。
问题 2:Failed download: No data found for this date range
YahooFinance 在中国区服务不稳定。解决方案有三种:一是配置 VPN 全局代理;二是修改 config.py 改用 data_source="joinquant",需要注册聚宽账号获取 token;三是手动下载 CSV 数据放到 DATA_SAVE_DIR,FinRL 会优先读取本地文件。
问题 3:ModuleNotFoundError: No module named 'box2d'
Box2D 只在特定环境中需要,如果不用可以忽略。如果确实需要,先安装 SWIG:conda install swig,再执行 pip install box2d-py。Windows 用户可能需要安装 Visual C++ Build Tools 才能编译成功。
问题 4:RuntimeError: CUDA out of memory
这是显存不足的错误。ElegantRL 默认会检测 GPU,如果显存小于 4GB,建议修改 ERL_PARAMS 中的 batch_size 从 2048 降到 512,或者 net_dimension 从 512 降到 256。纯 CPU 训练也可以,只是速度慢一些。
问题 5:Permission denied: './trained_models'
Windows 用户常遇到权限问题。以管理员身份运行 Anaconda Prompt,或者把项目移到用户目录下,比如 C:\Users\YourName\finrl-project。避免在 C:\Program Files 等系统目录下运行代码。
性能优化小贴士
如果训练速度太慢,可以检查几点:一是确认 PyTorch 安装了 GPU 版本,执行 python -c "import torch; print(torch.cuda.is_available())" 应该返回 True;二是数据是否已缓存,重复下载会拖慢启动速度;三是 break_step 设得是否合理,调试阶段可以降到 1e4,快速验证流程。
WSL 用户要注意文件系统性能。WSL 访问 Windows 文件系统(/mnt/c/)会有明显延迟,建议把项目放在 WSL 家目录下,比如 ~/finrl-project。这样编译和 IO 速度都能提升 2-3 倍。
小结与展望
环境搭建是 FinRL 实战的第一步,也是最容易卡住的地方。跨平台支持让不同背景的开发者都能快速上手,Anaconda 的环境隔离机制则为长期研究提供了稳定基础。通过 main.py 的三模式设计,训练、测试、交易三个环节被无缝串联起来,五分钟跑通全流程不再是口号。
现在,开发环境已经就绪,第一个交易 AI 也成功运行。下一步需要深入理解数据如何在 FinRL 中流动。下一章将拆解金融数据流水线的构建过程,从多源数据接入到技术指标生成,看看 FinRL 如何把原始价格数据转化为智能体可理解的状态空间。数据质量直接决定了策略上限,这个环节值得花足功夫。