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;某天交易所系统故障,价格跳空;还有数据源自己搞错了,把开盘价和收盘价写反了。

清洗数据,核心就三步:

  1. 处理缺失值:用前向填充、后向填充,或者直接删除
  2. 处理异常值:用3σ原则或IQR方法
  3. 数据对齐:不同股票的交易日期可能不一样
# 数据清洗示例
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)

避坑指南:千万别直接删除缺失值!金融数据是时间序列,删除一行可能破坏连续性。我一般先用前向填充,实在不行再用插值。

知识体系总览

下面这张图,是我自己总结的金融数据分析流程。你看一遍,心里就有数了。

Python金融数据分析知识体系 数据获取 Tushare / Baostock 数据存储 NumPy ndarray / Pandas DataFrame 数据清洗 缺失值 / 异常值 / 对齐 数据分析 统计指标 / 时间序列 / 相关性 策略开发 回测 / 优化 / 实盘 从数据获取到策略开发,每一步都离不开NumPy和Pandas

这张图我画了好几次才满意。你看,数据从获取到策略开发,是一条流水线。每一步都有坑,但每一步也都有对应的工具。

好了,今天就聊这么多。记住一句话:量化交易,数据先行。数据搞不定,策略再漂亮也是空中楼阁。

核心要点回顾

  • NumPy:向量化计算,告别for循环
  • Pandas:时间序列分析,DataFrame是核心
  • 数据获取:Baostock入门,Tushare进阶
  • 数据清洗:缺失值前向填充,异常值3σ处理

专注资料整理