4. 量化建模基础:Python环境搭建、NumPy与Pandas快速入门

说实话,很多做量化的人一上来就搞策略、跑回测,结果环境都没配好,代码跑一半报错,心态直接崩了。我见过太多这样的案例了。

所以这一章,咱们先把地基打牢。Python环境搭建、NumPy和Pandas,这三样东西搞不定,后面的模型全是空中楼阁。

4.1 Python环境搭建:别让工具卡住你

我个人习惯用Anaconda来管理Python环境。为什么?因为它自带了一堆科学计算库,省得你一个一个去pip install,而且虚拟环境隔离得干净。

核心要点: 量化建模最怕依赖冲突。你跑一个模型需要numpy 1.19,另一个需要1.21,搞在一起就炸了。虚拟环境就是你的“隔离病房”。

安装步骤其实很简单:

  1. 去Anaconda官网下载对应系统的安装包
  2. 一路默认安装,记得勾选“Add Anaconda to my PATH environment variable”
  3. 打开终端或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
避坑指南: 我曾经在计算夏普比率时,直接用Python的list做除法,结果因为类型问题算出了NaN。NumPy数组是强类型的,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)
个人经验: 我习惯把时间序列数据的索引设为DatetimeIndex,这样后面做时间切片、重采样会方便很多。比如 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是数据处理工具,三者缺一不可。

量化建模基础:知识体系 Python环境搭建 NumPy 数值计算 Pandas 数据处理 Anaconda 虚拟环境 依赖管理 数组创建 向量化运算 统计函数 Series/DataFrame 数据清洗 时间序列 三者结合 → 量化建模流水线

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))

这段代码你拿去跑一下,就能看到每只股票的年化波动率。这就是量化建模最基础的操作——从原始价格数据到风险指标,一行一行地算出来。

我的建议: 刚开始学的时候,别急着搞复杂策略。先把数据清洗、收益率计算、波动率估计这些基本功练扎实。我见过太多人一上来就搞LSTM、强化学习,结果连pct_change和shift都分不清,那能做出什么靠谱模型?

好了,这一章的内容就到这儿。环境搭好了,NumPy和Pandas的基本操作也过了一遍。这些东西看着简单,但真正用熟了,你会发现量化建模的很多“脏活累活”都能轻松搞定。

专注资料整理