2. 环境搭建与工具链:Python环境配置、Jupyter Notebook、Pandas、Numpy、Web3.py、Requests库安装与基础使用

说实话,做链上数据分析,最怕什么?

不是策略亏钱,而是环境没搭好,代码跑不起来。

我见过太多人,策略逻辑写得挺好,结果卡在「pip install」这一步,一卡就是半天。嗯,咱们今天就把这事彻底搞定。

2.1 Python环境配置:别小看这一步

我个人习惯用 Python 3.9 或 3.10。为什么?因为 Web3.py 对这两个版本支持最稳。3.11 以上有些依赖库还没完全跟上,容易踩坑。

⚠️ 我曾经遇到过:用 Python 3.12 装 Web3.py,结果编译 solc 依赖时报错,折腾了两小时。后来老老实实切回 3.10,五分钟搞定。

安装步骤其实就三步:

  1. 下载 Python:去 python.org 下载对应版本,安装时记得勾选「Add Python to PATH」。
  2. 验证安装:打开终端,输入 python --version,看到版本号就对了。
  3. 配置虚拟环境:我强烈建议每个项目用独立的虚拟环境,避免包冲突。
# 创建虚拟环境
python -m venv onchain_env

# 激活(Windows)
onchain_env\Scripts\activate

# 激活(Mac/Linux)
source onchain_env/bin/activate

你想想看,要是把所有库都装到全局,哪天两个项目需要不同版本的 Pandas,那画面太美我不敢看。

2.2 Jupyter Notebook:交互式分析的利器

做量化回测,Jupyter Notebook 几乎是标配。为什么?因为你可以边写代码边看结果,数据可视化直接嵌在下面,非常直观。

安装很简单:

pip install jupyter notebook

启动:

jupyter notebook

浏览器会自动打开一个页面,点「New」→「Python 3」就能新建一个 notebook。

💡 我的小技巧:在 notebook 里,按 Shift + Enter 执行当前单元格,按 Tab 自动补全代码。这两个快捷键用熟了,效率翻倍。

我个人习惯把数据加载、清洗、回测、可视化分别放在不同的单元格里。这样调试起来特别方便——哪一步出问题,直接定位到那个单元格改就行。

2.3 Pandas 与 Numpy:数据处理的双引擎

做链上数据分析,说白了就是跟表格数据打交道。Pandas 就是用来处理表格的,Numpy 则是底层做数值计算的。

安装:

pip install pandas numpy

Pandas 的核心概念就两个:

  • Series:一维数据,类似 Excel 里的一列。
  • DataFrame:二维表格,类似整个 Excel 工作表。

举个例子,假设我们有一份链上交易数据:

import pandas as pd
import numpy as np

# 模拟链上交易数据
data = {
    'tx_hash': ['0xabc', '0xdef', '0xghi'],
    'block_number': [15000000, 15000001, 15000002],
    'value_eth': [1.5, 2.3, 0.8],
    'gas_used': [21000, 25000, 21000]
}

df = pd.DataFrame(data)
print(df.head())

输出:

     tx_hash  block_number  value_eth  gas_used
0    0xabc      15000000        1.5     21000
1    0xdef      15000001        2.3     25000
2    0xghi      15000002        0.8     21000

你看,数据一目了然。Pandas 最常用的操作我列一下:

操作 代码 说明
读取 CSV pd.read_csv('data.csv') 从文件加载数据
筛选行 df[df['value_eth'] > 1] 只保留价值大于1 ETH的交易
分组统计 df.groupby('block_number').sum() 按区块号汇总
新增列 df['fee'] = df['gas_used'] * 0.0001 计算手续费

Numpy 呢?它主要用来做数组运算。比如计算收益率、标准差这些:

prices = np.array([100, 102, 101, 105, 110])
returns = np.diff(prices) / prices[:-1]  # 计算每日收益率
print(returns)
# 输出: [0.02  -0.0098  0.0396  0.0476]

我在项目中遇到过一个问题:用 Pandas 处理 100 万行以上的链上数据时,直接循环会慢到怀疑人生。后来改用 Numpy 的向量化操作,速度提升了上百倍。所以记住——能向量化就别用循环

2.4 Web3.py:连接区块链的桥梁

Web3.py 是 Python 与以太坊交互的核心库。说白了,它就是让你能用 Python 读取链上数据、发送交易、调用智能合约。

安装:

pip install web3

基础用法:连接节点并读取区块数据。

from web3 import Web3

# 连接以太坊节点(这里用公共节点举例)
w3 = Web3(Web3.HTTPProvider('https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY'))

# 检查是否连接成功
print(w3.is_connected())  # 返回 True 就对了

# 获取最新区块号
latest_block = w3.eth.block_number
print(f"当前区块: {latest_block}")

# 获取指定区块的详细信息
block = w3.eth.get_block(latest_block)
print(f"区块时间戳: {block['timestamp']}")
print(f"交易数量: {len(block['transactions'])}")
🔑 关键点:你需要一个以太坊节点的 RPC URL。可以用 Infura、Alchemy 的免费节点,也可以自己跑一个节点。免费节点每天有请求次数限制,做回测时注意控制频率。

我曾经踩过一个坑:用公共节点批量拉取历史数据时,因为请求太频繁被限流了。后来加了个 time.sleep(0.1),问题就解决了。

2.5 Requests 库:链下数据的补充

链上数据不是万能的。有时候你需要链下数据来辅助分析,比如交易所的行情数据、链上指标网站的 API 数据。这时候 Requests 库就派上用场了。

安装:

pip install requests

举个例子,从 CoinGecko 获取 ETH 的历史价格:

import requests
import json

url = "https://api.coingecko.com/api/v3/coins/ethereum/history"
params = {
    "date": "15-01-2024",
    "localization": "false"
}

response = requests.get(url, params=params)
data = response.json()

# 提取价格
price = data['market_data']['current_price']['usd']
print(f"2024年1月15日 ETH 价格: ${price}")

Requests 的常用方法就几个:

  • requests.get():获取数据
  • requests.post():提交数据
  • response.json():把返回结果转成 Python 字典
  • response.status_code:检查请求是否成功(200 表示成功)
💡 避坑指南:调用外部 API 时,一定要加 try-except。网络波动、API 限流都是家常便饭。我曾经因为没加异常处理,回测脚本跑了一晚上,结果凌晨 API 挂了,后面全是空数据。

2.6 知识体系总览

下面这张图,把本章的核心逻辑串起来了:

链上数据量化回测环境搭建 基础层:Python 3.9/3.10 + 虚拟环境 工具层:Jupyter Notebook(交互式开发) 数据处理层:Pandas + Numpy 链上数据:Web3.py 链下数据:Requests

从底层到顶层,一层层搭起来。别想着一步到位,先把基础环境搞稳了,后面写策略才顺手。

2.7 快速验证:你的环境搭好了吗?

最后,我习惯跑一个「全家桶」脚本,验证所有库是否正常工作:

import sys
import pandas as pd
import numpy as np
import web3
import requests

print(f"Python 版本: {sys.version}")
print(f"Pandas 版本: {pd.__version__}")
print(f"Numpy 版本: {np.__version__}")
print(f"Web3.py 版本: {web3.__version__}")
print(f"Requests 版本: {requests.__version__}")

# 简单测试
df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]})
print("\nPandas 测试通过:")
print(df)

arr = np.array([1,2,3]) * 2
print(f"\nNumpy 测试通过:{arr}")

print("\n✅ 所有环境配置完成!")

如果所有版本号都正常显示,恭喜你,环境搭建成功了。

嗯,这一步虽然基础,但真别跳过。我见过太多人后面跑策略时发现某个库没装,回头再补,反而更浪费时间。一次搞定,后面就顺畅了。


公众号:蓝海资料掘金营,微信deep3321