第二章: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量化基础 · 知识体系 Python量化基础 Python在量化中的应用 NumPy与Pandas基础 数据获取与清洗 金融数据可视化 数据获取 · 策略回测 风险计算 · 自动化交易 ndarray · DataFrame · Series 向量化运算 · 时间序列处理 缺失值 · 异常值 · 去重 Tushare · AKShare K线图 · 折线图 · 散点图 Matplotlib · mplfinance 核心:数据是基础,工具是手段,策略是灵魂

这张图把本章的内容串起来了。你可以看到,Python应用是顶层,下面分出了四个方向。每个方向都有对应的工具和方法。我个人建议的学习路径是:先掌握NumPy和Pandas,然后学数据获取和清洗,最后才是可视化。这个顺序符合「数据→处理→展示」的自然流程。

好了,这一章的内容就到这里。记住一句话:量化交易的核心不是代码,而是你对市场的理解。Python只是帮你把想法变成现实的工具。工具用得顺手,想法才能跑得快。


专注资料整理