Python金融数据分析基础
说实话,很多做量化交易的朋友,一开始都栽在数据处理上。我见过太多人策略写得漂亮,结果数据一进来就崩了。为什么?因为金融数据这东西,比你想象的要脏得多。
今天我们就来聊聊Python金融数据分析的四大基石。嗯,说白了就是:怎么拿数据、怎么存数据、怎么洗数据、怎么用数据。
NumPy基础:量化计算的发动机
NumPy,全称是Numerical Python。我个人习惯叫它「数组引擎」。为什么量化交易离不开它?因为速度。
你想想看,我们做回测的时候,可能要处理几百万条行情数据。用Python原生的列表去算?那速度慢得你想哭。NumPy的底层是用C写的,计算效率比纯Python快几十倍。
核心概念:ndarray
NumPy的核心就是ndarray(N维数组)。你可以把它理解成一个高性能的表格,但比Excel快得多。
import numpy as np
# 创建一个数组
prices = np.array([100.5, 101.2, 99.8, 102.1, 100.9])
print(prices)
# 向量化运算 - 不用写循环
returns = np.diff(prices) / prices[:-1]
print(returns)
# 统计指标
mean_price = np.mean(prices)
std_price = np.std(prices)
print(f"均价: {mean_price:.2f}, 标准差: {std_price:.2f}")
我在项目中遇到过一个问题:用for循环计算500万条数据的移动平均线,跑了整整3分钟。换成NumPy的卷积函数,0.3秒就搞定了。这就是差距。
我的小技巧:做量化分析时,尽量用向量化操作代替循环。NumPy的广播机制能帮你省下大量时间。
Pandas基础:金融数据的瑞士军刀
如果说NumPy是发动机,那Pandas就是方向盘。它专门为表格数据而生,尤其是时间序列数据。
Pandas有两个核心数据结构:Series(一维)和DataFrame(二维)。做量化交易,DataFrame用得最多。
import pandas as pd
# 创建时间序列数据
dates = pd.date_range('2024-01-01', periods=5, freq='D')
data = {
'open': [100, 101, 99, 102, 101],
'high': [102, 103, 101, 104, 103],
'low': [99, 100, 98, 101, 100],
'close': [101, 99, 102, 101, 102],
'volume': [10000, 12000, 9000, 11000, 13000]
}
df = pd.DataFrame(data, index=dates)
print(df)
# 常用操作
print(df.describe()) # 统计摘要
print(df['close'].rolling(window=3).mean()) # 3日移动平均
我曾经犯过一个低级错误:用Pandas读取CSV文件时,没指定日期列,结果所有日期都变成了字符串。后来做时间序列分析时,怎么都对不上。嗯,这里要注意:parse_dates=True这个参数一定要加上。
避坑指南:Pandas的索引操作,用.loc和.iloc,别用链式索引。我曾经因为这个踩过坑,数据改了半天发现根本没生效。
金融数据获取:Tushare vs Baostock
数据从哪里来?国内做量化,绕不开两个库:Tushare和Baostock。
| 特性 | Tushare | Baostock |
|---|---|---|
| 数据范围 | 股票、基金、期货、期权等 | 股票为主 |
| 免费额度 | 有限制,需积分 | 完全免费 |
| 数据质量 | 高,更新及时 | 较高,适合学习 |
| 使用难度 | 中等,需注册Token | 简单,无需注册 |
我个人习惯:做研究用Baostock,够用且免费。做生产环境用Tushare,数据更全更稳。
# Baostock 示例
import baostock as bs
import pandas as pd
# 登录
lg = bs.login()
print('登录成功' if lg.error_code == '0' else f'登录失败: {lg.error_msg}')
# 获取日K线数据
rs = bs.query_history_k_data_plus(
"sh.600519",
"date,open,high,low,close,volume",
start_date='2024-01-01',
end_date='2024-01-31',
frequency="d"
)
data_list = []
while (rs.error_code == '0') & rs.next():
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
# 登出
bs.logout()
print(result.head())
我的建议:刚开始学,先用Baostock。等策略成熟了,再考虑Tushare的付费数据。别一上来就花钱,数据这东西,够用就行。
数据清洗与预处理:脏数据克星
拿到数据后,第一件事不是分析,而是清洗。为什么?因为金融数据太脏了。
我遇到过的情况:某只股票停牌,数据全是NaN;某天交易所系统故障,价格跳空;还有数据源自己搞错了,把开盘价和收盘价写反了。
清洗数据,核心就三步:
- 处理缺失值:用前向填充、后向填充,或者直接删除
- 处理异常值:用3σ原则或IQR方法
- 数据对齐:不同股票的交易日期可能不一样
# 数据清洗示例
import pandas as pd
import numpy as np
# 模拟脏数据
data = {
'date': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05'],
'close': [100, np.nan, 102, 9999, 101], # 9999是异常值
'volume': [10000, 12000, None, 11000, 13000]
}
df = pd.DataFrame(data)
# 1. 处理缺失值 - 前向填充
df['close'] = df['close'].fillna(method='ffill')
df['volume'] = df['volume'].fillna(df['volume'].mean())
# 2. 处理异常值 - 3σ原则
mean = df['close'].mean()
std = df['close'].std()
df['close'] = df['close'].mask(
(df['close'] < mean - 3*std) | (df['close'] > mean + 3*std),
method='ffill'
)
print(df)
避坑指南:千万别直接删除缺失值!金融数据是时间序列,删除一行可能破坏连续性。我一般先用前向填充,实在不行再用插值。
知识体系总览
下面这张图,是我自己总结的金融数据分析流程。你看一遍,心里就有数了。
这张图我画了好几次才满意。你看,数据从获取到策略开发,是一条流水线。每一步都有坑,但每一步也都有对应的工具。
好了,今天就聊这么多。记住一句话:量化交易,数据先行。数据搞不定,策略再漂亮也是空中楼阁。
核心要点回顾:
- NumPy:向量化计算,告别for循环
- Pandas:时间序列分析,DataFrame是核心
- 数据获取:Baostock入门,Tushare进阶
- 数据清洗:缺失值前向填充,异常值3σ处理