4. 量化建模基础:Python环境搭建、NumPy与Pandas快速入门
说实话,很多做量化的人一上来就搞策略、跑回测,结果环境都没配好,代码跑一半报错,心态直接崩了。我见过太多这样的案例了。
所以这一章,咱们先把地基打牢。Python环境搭建、NumPy和Pandas,这三样东西搞不定,后面的模型全是空中楼阁。
4.1 Python环境搭建:别让工具卡住你
我个人习惯用Anaconda来管理Python环境。为什么?因为它自带了一堆科学计算库,省得你一个一个去pip install,而且虚拟环境隔离得干净。
安装步骤其实很简单:
- 去Anaconda官网下载对应系统的安装包
- 一路默认安装,记得勾选“Add Anaconda to my PATH environment variable”
- 打开终端或Anaconda Prompt,输入
conda --version验证
嗯,这里要注意一点:千万别用系统自带的Python。我在项目中遇到过有人直接用macOS自带的Python 2.7来跑量化代码,结果一堆库装不上,折腾了两天。何必呢?
创建虚拟环境的命令也很简单:
conda create -n quant_env python=3.9
conda activate quant_env
你想想看,一个环境专门做回测,一个环境专门做机器学习,互不干扰,多清爽。
environment.yml 文件,把依赖写清楚。换机器时一行 conda env create -f environment.yml 就搞定。
4.2 NumPy:量化计算的“发动机”
NumPy说白了就是Python里的数组计算引擎。没有它,你拿Python原生的list去算几千只股票的协方差矩阵?那速度会让你怀疑人生。
我刚开始做量化时,傻乎乎地用for循环算收益率,跑一次要半小时。后来换成NumPy的向量化操作,3秒搞定。这就是差距。
4.2.1 创建数组
import numpy as np
# 从列表创建
prices = np.array([100.5, 101.2, 102.8, 103.1])
# 创建全零数组
zeros = np.zeros((3, 4))
# 创建等差数列
dates = np.arange(20200101, 20200106)
# 随机数(模拟收益率)
returns = np.random.randn(1000) * 0.02
dtype 一定要检查清楚。
4.2.2 向量化运算
这才是NumPy的精髓。你不需要写循环,直接对整个数组做运算:
# 计算日收益率(向量化,无循环)
daily_returns = (prices[1:] - prices[:-1]) / prices[:-1]
# 计算累计收益率
cum_returns = np.cumprod(1 + daily_returns)
# 条件筛选
high_vol = returns[np.abs(returns) > 0.05]
为什么会这么快?因为底层是C语言实现的,而且利用了CPU的SIMD指令集。你写一个for循环,Python解释器要来回跳转,能不慢吗?
4.2.3 常用统计函数
| 函数 | 用途 | 量化场景 |
|---|---|---|
np.mean() |
均值 | 计算平均收益率 |
np.std() |
标准差 | 计算波动率 |
np.corrcoef() |
相关系数矩阵 | 资产相关性分析 |
np.percentile() |
百分位数 | VaR风险价值计算 |
4.3 Pandas:数据处理的“瑞士军刀”
NumPy处理的是数字,Pandas处理的是带标签的数据。说白了,Pandas就是Excel的Python版,但比Excel强大一万倍。
我记得有一次做因子分析,原始数据有500万行,Excel直接卡死。我用Pandas的groupby和pivot_table,30秒就聚合完了。嗯,从那以后我再也没打开过Excel做量化分析。
4.3.1 Series和DataFrame
两个核心数据结构:
- Series:一维带标签数组,相当于Excel里的一列
- DataFrame:二维表格,相当于整个Excel工作表
import pandas as pd
# 创建Series(带日期索引)
dates = pd.date_range('2024-01-01', periods=5)
price_series = pd.Series([100, 102, 101, 105, 108], index=dates)
# 创建DataFrame
data = {
'股票代码': ['000001', '000002', '000003'],
'收盘价': [10.5, 20.3, 15.8],
'成交量': [1000000, 500000, 800000]
}
df = pd.DataFrame(data)
df.set_index('股票代码', inplace=True)
df['2024-01'] 就能取出整个月的数据。
4.3.2 数据清洗:量化建模的“必修课”
真实数据有多脏你知道吗?缺失值、异常值、重复值、格式不统一……我见过最离谱的是某只股票的收盘价里混入了字符串“停牌”。
# 检查缺失值
df.isnull().sum()
# 填充缺失值(前向填充,适合时间序列)
df.fillna(method='ffill', inplace=True)
# 删除重复行
df.drop_duplicates(inplace=True)
# 异常值处理(3倍标准差法)
mean = df['收益率'].mean()
std = df['收益率'].std()
df = df[(df['收益率'] > mean - 3*std) & (df['收益率'] < mean + 3*std)]
4.3.3 时间序列操作
量化建模离不开时间序列。Pandas在这方面做得非常出色:
# 重采样:日线转周线
weekly = df['收盘价'].resample('W').last()
# 滚动窗口:计算20日移动平均
df['MA20'] = df['收盘价'].rolling(window=20).mean()
# 时间偏移
df['未来5日收益'] = df['收盘价'].shift(-5) / df['收盘价'] - 1
# 分组聚合(按年份计算平均收益率)
df.groupby(df.index.year)['收益率'].mean()
你想想看,如果用Excel做这些操作,你得写多少公式?而且数据一多就卡。Pandas一行代码搞定,这就是效率。
4.4 知识体系总览
下面这张图是我自己总结的,把本章的核心逻辑串起来了。你看一眼就能明白:Python环境是基础,NumPy是计算引擎,Pandas是数据处理工具,三者缺一不可。
4.5 实战小练习:计算股票日收益率
光说不练假把式。咱们来一个完整的例子,把NumPy和Pandas串起来用:
import numpy as np
import pandas as pd
# 模拟5只股票100天的价格数据
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=100)
tickers = ['AAPL', 'GOOGL', 'MSFT', 'AMZN', 'TSLA']
# 生成随机价格(从100开始,随机游走)
prices = np.zeros((100, 5))
prices[0] = 100
for i in range(1, 100):
prices[i] = prices[i-1] * (1 + np.random.randn(5) * 0.02)
# 创建DataFrame
df = pd.DataFrame(prices, index=dates, columns=tickers)
# 计算日收益率
returns = df.pct_change().dropna()
# 计算年化波动率(假设252个交易日)
annual_vol = returns.std() * np.sqrt(252)
# 输出结果
print("年化波动率:")
print(annual_vol.round(4))
这段代码你拿去跑一下,就能看到每只股票的年化波动率。这就是量化建模最基础的操作——从原始价格数据到风险指标,一行一行地算出来。
好了,这一章的内容就到这儿。环境搭好了,NumPy和Pandas的基本操作也过了一遍。这些东西看着简单,但真正用熟了,你会发现量化建模的很多“脏活累活”都能轻松搞定。