第二章:Python量化基础
说实话,很多人一听到「量化」两个字,就觉得门槛很高。其实没那么玄乎。Python在量化领域的地位,就像Excel在财务领域的地位一样——不是因为它最强,而是因为它最顺手。
我刚开始做量化的时候,用的还是Matlab。后来转Python,说实话一开始挺不习惯的。但用了一个月之后,我就回不去了。为什么?因为Python的生态太完整了。你要拿数据,有;你要算指标,有;你要画图,也有。一条龙服务,省心。
Python在量化中的具体应用
Python在量化交易里到底能干什么?我简单列几个场景:
- 数据获取:从交易所、财经网站拉取行情数据
- 策略回测:用历史数据验证你的交易想法
- 风险计算:算VaR、最大回撤、夏普比率这些指标
- 自动化交易:对接券商API,实现程序化下单
- 监控告警:实时盯盘,触发条件自动提醒
说白了,只要你能想到的交易环节,Python基本都能插一脚。我个人习惯把量化系统分成三层:数据层、策略层、执行层。Python在每一层都有对应的库。
核心观点:Python不是最快的语言,但它是开发效率最高的语言。在量化领域,开发效率往往比运行效率更重要——因为你的策略思路需要快速验证。
NumPy与Pandas基础
这两个库,是Python量化的基石。我见过不少新手一上来就学机器学习、深度学习,结果连DataFrame都不会用。嗯,这路子走偏了。
NumPy:数值计算的发动机
NumPy的核心是ndarray,也就是多维数组。为什么不用Python自带的列表?因为慢。我在项目中遇到过一个问题:用列表计算100万条数据的移动平均,跑了快两分钟。换成NumPy,不到一秒。
import numpy as np
# 创建数组
prices = np.array([100.5, 101.2, 102.8, 103.1, 102.5])
# 向量化运算——不用写循环
returns = np.diff(prices) / prices[:-1]
print(returns)
# 输出: [0.00697 0.01581 0.00292 -0.00582]
# 常用统计函数
mean_price = np.mean(prices)
std_price = np.std(prices)
max_price = np.max(prices)
你想想看,如果不用NumPy,你得写个for循环,一行一行算。代码又长又慢。NumPy的向量化操作,说白了就是把循环藏在了C语言层面,速度自然快。
Pandas:数据分析的瑞士军刀
Pandas建立在NumPy之上,但它更贴近实际使用场景。它的核心是两个数据结构:Series(一维)和DataFrame(二维)。
我个人觉得,Pandas最牛的地方是处理时间序列数据。金融数据本质上就是带时间戳的序列,Pandas在这方面简直是量身定做。
import pandas as pd
# 创建时间序列数据
dates = pd.date_range('2024-01-01', periods=5, freq='D')
data = pd.DataFrame({
'open': [100, 102, 101, 103, 105],
'high': [103, 105, 104, 106, 108],
'low': [99, 101, 100, 102, 104],
'close': [102, 101, 103, 105, 107],
'volume': [10000, 12000, 11000, 13000, 15000]
}, index=dates)
# 查看前几行
print(data.head())
# 计算5日移动平均
data['ma5'] = data['close'].rolling(window=5).mean()
# 筛选条件
high_volume = data[data['volume'] > 12000]
小技巧:处理金融数据时,记得先把日期列设为索引。这样很多时间序列操作会方便很多。我曾经因为没设索引,写了一大堆冗余代码,后来才发现Pandas自带的时间序列功能全浪费了。
数据获取与清洗
做量化的人都知道一句话:垃圾进,垃圾出。数据质量直接决定策略效果。我见过有人用有问题的数据回测,跑出来收益率高得离谱,结果实盘亏得一塌糊涂。
数据获取渠道
| 数据源 | 特点 | 适用场景 |
|---|---|---|
| Tushare | 国内股票数据全,免费额度有限 | A股分析 |
| AKShare | 开源免费,数据源广 | 多品种研究 |
| Yahoo Finance | 国际数据,接口稳定 | 美股/港股 |
| 交易所API | 实时数据,延迟低 | 实盘交易 |
数据清洗的常见问题
拿到原始数据后,你会发现各种问题。我总结了几类最常见的:
- 缺失值:某天停牌,数据是NaN
- 异常值:价格突然跳变,可能是数据错误
- 重复数据:同一时间戳出现多条记录
- 时间不同步:不同数据源的时间戳格式不一致
# 数据清洗示例
import pandas as pd
# 读取数据
df = pd.read_csv('stock_data.csv', parse_dates=['date'])
df.set_index('date', inplace=True)
# 处理缺失值——向前填充
df.fillna(method='ffill', inplace=True)
# 检测异常值——用3倍标准差法
mean = df['close'].mean()
std = df['close'].std()
df = df[(df['close'] > mean - 3*std) & (df['close'] < mean + 3*std)]
# 去重
df.drop_duplicates(inplace=True)
注意:处理缺失值时,千万别直接用dropna()把数据删掉。金融数据的时间连续性很重要,删掉一行可能导致后续计算出错。我一般用向前填充,用上一个有效值补上。
金融数据可视化
数据可视化不是为了好看,是为了发现问题。一张好的图表,能让你一眼看出数据中的模式、异常和趋势。
Python里做可视化,最常用的是Matplotlib和Seaborn。不过对于金融数据,我推荐用mplfinance,它是专门为K线图设计的。
import matplotlib.pyplot as plt
import mplfinance as mpf
# 准备数据——需要包含OHLCV
data = pd.DataFrame({
'Open': [100, 102, 101, 103, 105],
'High': [103, 105, 104, 106, 108],
'Low': [99, 101, 100, 102, 104],
'Close': [102, 101, 103, 105, 107],
'Volume': [10000, 12000, 11000, 13000, 15000]
}, index=pd.date_range('2024-01-01', periods=5, freq='D'))
# 画K线图
mpf.plot(data, type='candle', volume=True, style='charles')
除了K线图,还有几种图在量化中很常用:
- 折线图:看价格趋势、净值曲线
- 散点图:看两个变量之间的关系,比如收益和波动
- 热力图:看相关性矩阵,选股时很有用
- 分布图:看收益率分布,判断是否正态
我的习惯:每次拿到新数据,第一件事就是画图。把价格走势、成交量、收益率分布都画一遍。很多时候,数据的问题在图表上一目了然,比跑统计检验快多了。
本章知识体系
下面这张图,是我对本章内容的一个梳理。你可以把它当作一个地图,知道每个知识点在量化系统中的位置。
这张图把本章的内容串起来了。你可以看到,Python应用是顶层,下面分出了四个方向。每个方向都有对应的工具和方法。我个人建议的学习路径是:先掌握NumPy和Pandas,然后学数据获取和清洗,最后才是可视化。这个顺序符合「数据→处理→展示」的自然流程。
好了,这一章的内容就到这里。记住一句话:量化交易的核心不是代码,而是你对市场的理解。Python只是帮你把想法变成现实的工具。工具用得顺手,想法才能跑得快。