3. Python编程基础(DeFi方向)

说实话,很多想入行DeFi量化的人,第一关就卡在Python上。我见过太多人一上来就啃《Python从入门到精通》,结果啃了三个月还在纠结列表和元组的区别。没必要,真的没必要。

咱们做DeFi量化,Python就是个工具。你不需要成为Python专家,但得会用这个工具干活。这一章,我就带你快速搭建环境、掌握核心语法、搞定数据处理,最后再聊聊Web3.py这个跟链上交互的神器。

3.1 Python环境搭建:别在这上面浪费时间

环境搭建这事儿,我踩过不少坑。最早我用系统自带的Python,结果项目一多,依赖包全乱套了。后来我学乖了——用虚拟环境,一个项目一个环境,清爽得很。

我的建议:直接用Anaconda或者Miniconda。它自带包管理器和虚拟环境,省心。我个人习惯用Miniconda,轻量,够用。

安装步骤其实就三步:

  1. 去官网下载Miniconda(选Python 3.9+版本)
  2. 一路默认安装,记得勾选"Add to PATH"
  3. 打开终端,输入 conda --version 验证

装完之后,创建一个专门用于DeFi量化的环境:

conda create -n defi_quant python=3.9
conda activate defi_quant

嗯,这里要注意:Python版本别选太新。3.9到3.11之间最稳,太新的版本有些DeFi相关的库还没适配好。我曾经手贱装了3.12,结果Web3.py报了一堆兼容性错误,折腾了一下午才搞定。

3.2 基础语法速通:够用就行

Python基础语法,说白了就那几样东西。我帮你划个重点,学完这些就能上手写DeFi脚本了。

3.2.1 变量与数据类型

Python是动态类型语言,变量不用声明类型。这一点跟Solidity(写智能合约的语言)完全不同,刚开始可能会不习惯。

# 常见数据类型
address = "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD18"  # 字符串
balance = 10.5  # 浮点数
is_liquid = True  # 布尔值
token_list = ["ETH", "USDC", "DAI"]  # 列表
price_map = {"ETH": 3500, "BTC": 67000}  # 字典
重点:在DeFi开发中,字典和列表是你最常用的数据结构。比如从链上拉取交易对数据,返回的往往就是列表套字典的结构。

3.2.2 函数与流程控制

函数是代码复用的基础。写DeFi脚本时,你经常需要把"查询价格"、"计算收益"这些操作封装成函数。

def calculate_apy(deposit_amount, reward_amount, days):
    """计算年化收益率"""
    if days == 0:
        return 0
    daily_rate = reward_amount / deposit_amount / days
    apy = daily_rate * 365 * 100
    return round(apy, 2)

# 调用
apy = calculate_apy(1000, 50, 30)
print(f"APY: {apy}%")

你想想看,如果不用函数,每次计算APY都要重写一遍逻辑,那得多累。我在做Uniswap V3的流动性挖矿策略时,光APY计算函数就写了三个版本,分别对应不同池子的奖励机制。

3.2.3 列表推导式与Lambda

这两个是Python的"语法糖",写起来很爽。尤其是处理链上数据时,一行代码能顶五行的活。

# 列表推导式:快速过滤数据
prices = [3500, 1.0, 0.5, 67000, 2000]
stable_coins = [p for p in prices if p < 2.0]  # 筛选出稳定币价格
print(stable_coins)  # [1.0, 0.5]

# Lambda:临时函数
sorted_pools = sorted(pools, key=lambda x: x['tvl'], reverse=True)
注意:Lambda虽然简洁,但别滥用。逻辑超过三行,还是老老实实写def函数吧。代码是给人看的,可读性第一。

3.3 Pandas与NumPy:数据处理双雄

做量化分析,数据就是你的命根子。Pandas和NumPy就是处理数据的左膀右臂。

3.3.1 NumPy:数值计算的基石

NumPy的核心是ndarray(多维数组)。它的运算速度比Python原生列表快几十倍,原因在于底层用C语言实现。

import numpy as np

# 创建数组
prices = np.array([3500, 3520, 3480, 3550, 3510])

# 向量化运算(不用写循环)
returns = np.diff(prices) / prices[:-1] * 100
print(returns)  # 计算每日收益率

# 统计指标
mean_price = np.mean(prices)
volatility = np.std(prices)
print(f"均价: {mean_price:.2f}, 波动率: {volatility:.2f}")

我记得刚开始做回测时,用Python原生列表算收益率,跑一年的数据要等好几秒。换成NumPy后,同样的数据量,0.1秒就出结果了。这就是差距。

3.3.2 Pandas:表格数据的瑞士军刀

Pandas的DataFrame,说白了就是Excel的Python版。但它比Excel强太多了——自动化、可编程、能处理海量数据。

import pandas as pd

# 创建交易数据表
data = {
    'timestamp': ['2024-01-01', '2024-01-02', '2024-01-03'],
    'token': ['ETH', 'ETH', 'ETH'],
    'price': [3500, 3520, 3480],
    'volume': [1000, 1500, 1200]
}
df = pd.DataFrame(data)

# 数据处理
df['date'] = pd.to_datetime(df['timestamp'])
df.set_index('date', inplace=True)

# 计算移动平均线
df['ma_3'] = df['price'].rolling(window=3).mean()

# 筛选条件
high_volume = df[df['volume'] > 1100]
print(high_volume)
实战技巧:在DeFi量化中,你经常需要处理时间序列数据。Pandas的resample功能特别有用——可以把分钟级数据聚合到小时级或天级,方便做趋势分析。

3.4 Web3.py库入门:跟链上数据打交道

终于到了最激动人心的部分。Web3.py是Python连接以太坊的桥梁。没有它,你的量化策略就只能分析历史数据,没法跟链上实时交互。

3.4.1 连接节点

要跟链上交互,首先得连上一个节点。你可以用自己的节点(比如Geth),也可以用第三方服务(比如Infura、Alchemy)。

from web3 import Web3

# 连接Infura节点(需要注册获取API Key)
infura_url = "https://mainnet.infura.io/v3/YOUR_API_KEY"
w3 = Web3(Web3.HTTPProvider(infura_url))

# 检查是否连接成功
if w3.is_connected():
    print("连接成功!")
    print(f"当前区块高度: {w3.eth.block_number}")
else:
    print("连接失败,检查网络或API Key")
曾经踩过的坑:我第一次用Infura时,忘了加API Key,结果一直报连接超时。折腾了半小时才发现是URL写错了。还有,免费版的Infura有请求频率限制,做高频策略时建议换Alchemy或者自建节点。

3.4.2 查询链上数据

连接上节点后,就可以查询各种链上数据了。比如查账户余额、查代币价格、查交易记录。

# 查询ETH余额
address = "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD18"
balance_wei = w3.eth.get_balance(address)
balance_eth = w3.from_wei(balance_wei, 'ether')
print(f"地址余额: {balance_eth} ETH")

# 查询ERC-20代币余额(以USDC为例)
usdc_address = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
abi = [...]  # ERC-20的ABI
contract = w3.eth.contract(address=usdc_address, abi=abi)
usdc_balance = contract.functions.balanceOf(address).call()
print(f"USDC余额: {usdc_balance / 10**6} USDC")

为什么会这样?因为ETH和ERC-20代币的余额查询方式不一样。ETH是原生代币,直接调用get_balance就行。ERC-20代币需要通过合约的balanceOf方法查询。这个区别,我刚开始也搞混过。

3.4.3 监听链上事件

做量化策略时,你往往需要实时监听链上事件——比如大额转账、流动性池变化、清算事件等。

# 监听USDC转账事件
transfer_filter = contract.events.Transfer.create_filter(
    from_block='latest'
)

while True:
    for event in transfer_filter.get_new_entries():
        tx_hash = event['transactionHash'].hex()
        from_addr = event['args']['from']
        to_addr = event['args']['to']
        value = event['args']['value'] / 10**6
        
        if value > 1000000:  # 监控大额转账(>100万USDC)
            print(f"大额转账检测: {value} USDC")
            print(f"从: {from_addr}")
            print(f"到: {to_addr}")
            print(f"交易哈希: {tx_hash}")
            print("-" * 50)
我的经验:监听事件时,别用死循环。建议加上时间间隔控制,比如每5秒检查一次。否则你的API额度很快就会被耗尽。另外,生产环境建议用WebSocket连接,比HTTP实时性更好。

3.5 本章知识体系总览

说了这么多,咱们用一张图来总结一下本章的核心内容。这张图展示了从环境搭建到链上交互的完整路径。

Python编程基础(DeFi方向)知识体系 环境搭建 Miniconda → 虚拟环境 → 依赖管理 基础语法速通 变量类型 → 函数封装 → 列表推导式 → Lambda 数据处理双雄 NumPy(数值计算) ↔ Pandas(表格分析) Web3.py库入门 连接节点 → 查询数据 → 监听事件 DeFi量化策略开发

这张图你看懂了吗?从环境搭建开始,一步步往上走,最后就能开发自己的DeFi量化策略了。每一步都是下一层的基础,缺一不可。

我个人觉得,Web3.py是这里面最有意思的部分。当你第一次成功从链上拉取数据时,那种感觉——嗯,就像打开了新世界的大门。链上数据是透明的、不可篡改的,这跟传统金融的数据获取方式完全不同。

好了,这一章的内容就到这里。记住,Python只是工具,DeFi的逻辑才是核心。工具可以慢慢熟练,但逻辑一定要想清楚。下一章我们会深入DeFi的核心协议,看看那些池子、AMM、借贷协议到底是怎么运作的。


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