3. Python金融数据获取:从零搭建你的数据管道

做量化投资,第一道坎就是数据。我见过太多人,策略写得天花乱坠,结果数据源一塌糊涂。说白了,数据质量直接决定策略生死。今天咱们就聊聊怎么用Python把数据稳稳拿到手。

3.1 为什么选pandas-datareader和yfinance?

市面上数据接口很多,但我个人习惯用这两个库。原因很简单:

  • pandas-datareader:老牌库,支持雅虎、谷歌、FRED等多个数据源。适合拿A股和美股历史数据。
  • yfinance:后来居上,专门针对雅虎财经优化。速度更快,支持全球市场。

我在项目中遇到过一个问题:用pandas-datareader拿美股数据,偶尔会超时。后来换成yfinance,稳多了。所以我的建议是:A股用datareader,全球市场用yfinance。

小提示:两个库都依赖网络。如果在内网环境,记得配好代理。我曾经因为没配代理,debug了一下午...

3.2 安装与基础配置

先装库。打开终端,一行搞定:

pip install pandas-datareader yfinance

嗯,这里要注意版本兼容性。我建议用Python 3.8以上,pandas 1.3以上。低版本容易出幺蛾子。

3.3 实战:获取A股数据

拿贵州茅台举个例子。用pandas-datareader从雅虎拿数据:

import pandas as pd
import pandas_datareader.data as web
from datetime import datetime

# 定义股票代码和时间范围
stock_code = '600519.SS'  # 贵州茅台,上海交易所
start = '2023-01-01'
end = '2024-01-01'

# 获取数据
df = web.DataReader(stock_code, 'yahoo', start, end)
print(df.head())

跑完你会看到这样的表格:

Date Open High Low Close Volume
2023-01-03 172.0 175.5 171.0 174.0 35000000
2023-01-04 174.5 176.0 173.0 175.2 28000000
注意:雅虎的A股数据有时会缺失。特别是分红、送股后,价格可能不准。我建议用国内数据源(如Tushare)做交叉验证。

3.4 实战:获取全球市场数据

yfinance的用法更简洁。拿苹果和腾讯举例:

import yfinance as yf

# 定义股票列表
tickers = ['AAPL', '0700.HK']  # 苹果、腾讯

# 下载数据
data = yf.download(tickers, start='2023-01-01', end='2024-01-01')

# 只看收盘价
close_prices = data['Close']
print(close_prices.head())

你想想看,yfinance还能直接拿财报数据:

# 获取苹果公司信息
aapl = yf.Ticker('AAPL')
info = aapl.info
print(info['longBusinessSummary'])  # 公司简介

这个功能我特别喜欢。做基本面分析时,不用再手动去网站扒数据了。

3.5 数据清洗与预处理

拿到原始数据后,千万别直接用。我踩过坑:有一次策略回测跑得挺好,实盘却亏了。查了半天,发现是数据里有空值没处理。

标准清洗流程如下:

  1. 检查缺失值:用df.isnull().sum()看看哪些列有空值
  2. 处理缺失值:前向填充(ffill)或插值(interpolate)
  3. 去重:用df.drop_duplicates()删除重复行
  4. 调整数据类型:确保日期是datetime,价格是float

来看个完整例子:

# 假设df是原始数据
# 1. 检查缺失
print('缺失值统计:')
print(df.isnull().sum())

# 2. 前向填充(用前一天的数据填充)
df.fillna(method='ffill', inplace=True)

# 3. 去重
df.drop_duplicates(inplace=True)

# 4. 确保日期索引
df.index = pd.to_datetime(df.index)

# 5. 添加收益率列
df['Return'] = df['Close'].pct_change()

print('清洗完成!')
print(df.head())
核心要点:数据清洗不是一次性工作。每次新增数据源,都要重新检查一遍。我习惯写个清洗函数,每次拿数据后自动调用。

3.6 知识体系总览

下面这张图,是我做数据获取时的完整流程。你照着走,基本不会出错:

金融数据获取与清洗流程 数据源选择 A股/美股/全球市场 数据获取 pandas-datareader/yfinance 数据清洗 缺失值/去重/类型转换 预处理 收益率/标准化/特征工程 数据存储 CSV/HDF5/数据库 数据验证 可视化/统计检验/回测 发现问题,返回清洗步骤

这张图我画了好几次才满意。你注意看那个循环箭头——数据验证发现问题后,要回到清洗步骤重新处理。这是实战中最重要的环节。

3.7 避坑指南

最后分享几个我踩过的坑:

  • 股票代码格式:A股在雅虎上要加后缀(如.SS、.SZ),港股加.HK。我一开始不知道,查了半天没数据。
  • 时区问题:雅虎返回的是美国时间。如果你做A股,记得转成北京时间:df.index = df.index.tz_convert('Asia/Shanghai')
  • 数据频率:默认是日线。如果需要分钟线,yfinance支持interval='1m',但只能拿最近7天。
一句话总结:数据获取是量化投资的基石。花80%的时间在数据上,策略才能跑得稳。别像我一样,等到实盘亏了才后悔。

专注资料整理