4. 编程基础(Python):从零搭好你的量化工作台

说实话,我见过太多人一上来就啃语法书,结果写了三个月还在打印“Hello World”。做量化研究,Python 就是个工具。你的目标是快速上手,能处理数据、能画图、能验证想法。这一章,我就带你走一遍我最顺手的 Python 环境搭建流程,以及三个最核心的库——NumPy、Pandas、Matplotlib。

本章核心目标:装好环境,跑通数据清洗、聚合、可视化这一套完整流程。别怕,跟着我来,两小时内你就能搞定。

4.1 环境搭建:为什么我死磕 Anaconda

刚入行那会儿,我也试过自己手动装 Python、配 pip、一个个库去装。结果呢?版本冲突搞了我一整天。后来我学乖了,直接用 Anaconda。说白了,它就是一个大礼包——Python 解释器 + 常用科学计算库 + 包管理器 conda,一次装完,省心省力。

安装步骤(我自己的标准流程):

  1. 去 Anaconda 官网下载对应系统的安装包(选 Python 3.9+ 版本)。
  2. 安装时记得勾选“Add Anaconda to my PATH environment variable”。
  3. 装完后打开终端,输入 conda --version,看到版本号就说明成了。
  4. 创建一个独立的量化环境:conda create -n quant python=3.9。
  5. 激活环境: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 知识体系总览

下面这张图,是我自己梳理的本章知识结构。你跟着这个脉络走,就不会乱。

Python 量化编程基础 · 知识体系 Python 量化编程基础 NumPy · 数值计算 Pandas · 数据处理 Matplotlib · 可视化 ndarray 创建 向量化运算 随机数生成 统计函数 数据读取 数据清洗 分组聚合 时间序列 折线图 柱状图 多子图 样式定制 💡 学习路径:先 NumPy 打底 → 再 Pandas 处理数据 → 最后 Matplotlib 展示结果 三者配合,就能完成 80% 的量化数据工作

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,你的能力就涨一分。