4. 编程基础(Python):从零搭好你的量化工作台
说实话,我见过太多人一上来就啃语法书,结果写了三个月还在打印“Hello World”。做量化研究,Python 就是个工具。你的目标是快速上手,能处理数据、能画图、能验证想法。这一章,我就带你走一遍我最顺手的 Python 环境搭建流程,以及三个最核心的库——NumPy、Pandas、Matplotlib。
本章核心目标:装好环境,跑通数据清洗、聚合、可视化这一套完整流程。别怕,跟着我来,两小时内你就能搞定。
4.1 环境搭建:为什么我死磕 Anaconda
刚入行那会儿,我也试过自己手动装 Python、配 pip、一个个库去装。结果呢?版本冲突搞了我一整天。后来我学乖了,直接用 Anaconda。说白了,它就是一个大礼包——Python 解释器 + 常用科学计算库 + 包管理器 conda,一次装完,省心省力。
安装步骤(我自己的标准流程):
- 去 Anaconda 官网下载对应系统的安装包(选 Python 3.9+ 版本)。
- 安装时记得勾选“Add Anaconda to my PATH environment variable”。
- 装完后打开终端,输入
conda --version,看到版本号就说明成了。 - 创建一个独立的量化环境:
conda create -n quant python=3.9。 - 激活环境:
conda activate quant。
我的小习惯:每个项目我都单独建一个 conda 环境。这样不同项目依赖的库版本互不干扰。我曾经因为没隔离环境,一个旧项目的 pandas 0.25 和新项目的 1.5 打架,排查了整整一下午……
环境激活后,用 conda 安装三大件:
conda install numpy pandas matplotlib
conda install jupyter notebook # 顺手装上,写代码方便
嗯,到这里你的工作台就搭好了。接下来我们看看这三个库到底能干什么。
4.2 NumPy:所有数据的“地基”
NumPy 的核心就是 ndarray(N维数组)。你想想看,股票价格序列、因子暴露矩阵、收益率向量……在底层都是用 ndarray 存的。Pandas 也是建立在它之上的。
我常用的几个操作:
import numpy as np
# 创建一个数组
prices = np.array([100.5, 101.2, 102.8, 103.1])
print(prices.shape) # (4,)
# 向量化运算——不用写循环
returns = (prices[1:] - prices[:-1]) / prices[:-1]
print(returns) # [0.00697 0.01581 0.00292]
# 生成随机数(模拟收益率)
np.random.seed(42)
sim_returns = np.random.randn(1000) * 0.02 + 0.001
注意:NumPy 的向量化运算比 Python 原生 for 循环快几十倍。我在处理百万级 tick 数据时,用向量化几毫秒就搞定,用 for 循环能等到你怀疑人生。
4.3 Pandas:量化研究员的第一把交椅
Pandas 有两个核心数据结构:Series(一维)和 DataFrame(二维)。做量化,你天天跟 DataFrame 打交道——它就像 Excel 表格,但比 Excel 强大一百倍。
数据读取与预览:
import pandas as pd
# 读取CSV(假设你有一份股票日线数据)
df = pd.read_csv('stock_data.csv', parse_dates=['date'], index_col='date')
print(df.head()) # 看前5行
print(df.info()) # 看数据类型、缺失值
数据清洗——我踩过的坑:
真实数据从来不是干净的。缺失值、异常值、重复值……我曾经因为没处理缺失值,算出来的夏普比率直接爆表,差点以为自己发现了“无敌策略”。
# 检查缺失值
print(df.isnull().sum())
# 填充缺失值(用前一天的收盘价填充)
df['close'].fillna(method='ffill', inplace=True)
# 删除重复行
df.drop_duplicates(inplace=True)
# 过滤异常值(比如涨跌幅超过20%的,大概率是数据错误)
df = df[df['pct_chg'].abs() < 0.2]
数据聚合——分组计算的核心:
# 按股票代码分组,计算每只股票的月均收益率
monthly_returns = df.groupby('stock_id')['return'].resample('M').mean()
# 多列聚合:同时算均值、标准差、计数
agg_stats = df.groupby('stock_id').agg({
'return': ['mean', 'std', 'count'],
'volume': 'sum'
})
一句话总结:Pandas 的 groupby + agg 组合,是量化数据处理的核心武器。因子分析、组合构建、回测数据准备,都离不开它。
4.4 Matplotlib:让数据说话
你算了一堆统计量,但光看数字很难发现问题。画个图,一眼就能看出趋势、异常、分布。我个人习惯用 Matplotlib 做基础绘图,配合 Seaborn 做统计图。
画一条价格曲线:
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['close'], label='Close Price', color='#3498db')
plt.title('Stock Price Over Time')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
多子图——对比不同指标:
fig, axes = plt.subplots(2, 1, figsize=(12, 8))
# 上子图:价格
axes[0].plot(df.index, df['close'], color='#2ecc71')
axes[0].set_title('Price')
# 下子图:成交量
axes[1].bar(df.index, df['volume'], color='#e74c3c', alpha=0.6)
axes[1].set_title('Volume')
plt.tight_layout()
plt.show()
避坑指南:我曾经画图时没设置 figsize,默认图太小,趋势线挤成一团,根本看不清。后来我固定用 (12, 6) 起步,再根据子图数量调整高度。
4.5 知识体系总览
下面这张图,是我自己梳理的本章知识结构。你跟着这个脉络走,就不会乱。
4.6 实战:完整的数据处理流水线
光说不练假把式。下面我给你一个完整的实战案例,把清洗、聚合、可视化串起来。这是我当年做因子分析时用的标准流程。
场景:你拿到了一份 A 股日线数据,包含多只股票的价格和成交量。你要清洗数据,计算每只股票的月度收益率,然后画图对比。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 1. 读取数据
df = pd.read_csv('a_stock_daily.csv', parse_dates=['date'])
print(f'原始数据量:{len(df)}')
# 2. 清洗
# 删除缺失值
df.dropna(subset=['close', 'volume'], inplace=True)
# 删除涨跌幅超过20%的异常值
df = df[df['pct_chg'].abs() < 0.2]
# 按日期排序
df.sort_values(['stock_id', 'date'], inplace=True)
# 3. 计算日收益率
df['daily_ret'] = df.groupby('stock_id')['close'].pct_change()
# 4. 聚合:按月计算每只股票的收益率和波动率
monthly = df.groupby(['stock_id', pd.Grouper(key='date', freq='M')]).agg({
'daily_ret': ['mean', 'std', 'count'],
'volume': 'sum'
})
monthly.columns = ['monthly_ret', 'monthly_vol', 'trading_days', 'total_volume']
monthly.reset_index(inplace=True)
# 5. 可视化:画前5只股票的月度收益率对比
top5 = monthly[monthly['stock_id'].isin(monthly['stock_id'].unique()[:5])]
pivot = top5.pivot_table(index='date', columns='stock_id', values='monthly_ret')
plt.figure(figsize=(14, 7))
for col in pivot.columns:
plt.plot(pivot.index, pivot[col], label=col, linewidth=1.5)
plt.title('Top 5 Stocks Monthly Returns Comparison')
plt.xlabel('Date')
plt.ylabel('Monthly Return')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
print('流水线跑完!清洗、聚合、可视化一步到位。')
注意:pct_change() 计算时第一行会是 NaN,记得在聚合前用 dropna() 去掉,否则月度均值会偏小。我刚开始就吃过这个亏。
4.7 本章小结
这一章我们走完了量化编程的“三板斧”:
- Anaconda 帮你一键搭好环境,省去配置烦恼。
- NumPy 提供高性能数组运算,是所有计算的底层引擎。
- Pandas 是数据处理的核心,清洗、聚合、时间序列一把抓。
- Matplotlib 让数据可视化,帮你快速发现规律和异常。
说实话,这三个库我用了快十年,每次遇到新问题,第一反应还是回到它们身上。你只要把这一章的内容练熟,后面做因子分析、回测系统、风险模型,都会顺手很多。
我的建议:别光看,打开 Jupyter Notebook 把代码敲一遍。遇到报错很正常,我当年也是一路踩坑过来的。每解决一个 bug,你的能力就涨一分。