数据源探索与获取:常见金融数据源与API调用基础
做量化研究,第一步就是找数据。这听起来简单,但我在项目里见过太多人在这上面栽跟头。数据源选不对,后面所有工作都是白搭。今天咱们就聊聊市面上主流的几个金融数据源,以及怎么用API把它们拉下来。
一、三大主流数据源概览
我个人习惯把数据源分成三类:机构级、社区级、国际级。这三类各有各的脾气,咱们一个个说。
| 数据源 | 类型 | 覆盖范围 | 费用 | 适合场景 |
|---|---|---|---|---|
| Wind(万得) | 机构级 | A股、港股、债券、期货、基金 | 高(年费数万) | 机构研究、专业回测 |
| Tushare | 社区级 | A股、指数、基金、期货 | 免费/积分制 | 个人研究、学习 |
| Yahoo Finance | 国际级 | 美股、全球指数、外汇 | 免费 | 跨境策略、快速验证 |
核心观点:没有完美的数据源,只有最适合你当前阶段的数据源。我刚开始做量化时,用Tushare就够用了。后来进了机构,才不得不跟Wind打交道。
二、Wind(万得)—— 机构标配
Wind在金融圈的地位,说白了就是「数据界的Windows」。几乎所有券商、基金公司都在用。它的数据质量确实高,但价格也让人肉疼。
2.1 Wind的调用方式
Wind提供Python接口,叫WindPy。安装后需要先启动Wind客户端,才能调用。嗯,这里要注意:Wind客户端必须开着,否则API会报错。
# 安装WindPy
# pip install WindPy
from WindPy import w
w.start() # 启动Wind连接
# 获取贵州茅台2024年1月的日线数据
data = w.wsd("600519.SH", "open,high,low,close,volume",
"2024-01-01", "2024-01-31", "")
print(data.Data)
个人经验:Wind的wsd函数是获取历史日线数据的标准方法。但它的返回格式有点奇葩——返回的是一个对象,数据藏在.Data属性里。我第一次用的时候找了半天数据在哪,后来才发现这个坑。
2.2 Wind的常见问题
- 连接超时:Wind客户端如果长时间不用,会自动断开。我建议每次调用前都执行一次
w.start()。 - 数据缺失:有些股票停牌期间,Wind会返回
None。处理时要小心。 - 字段名:Wind的字段名是英文缩写,比如
close是收盘价,amt是成交额。记不住的话,可以查Wind的帮助文档。
三、Tushare —— 个人研究利器
Tushare是国内社区做得最好的金融数据源之一。它免费,但需要积分才能获取更多数据。积分可以通过注册、分享、充值获得。我个人觉得,对于学习阶段来说,免费额度完全够用。
3.1 Tushare的调用方式
Tushare的Python接口叫tushare,安装后需要注册获取token。这个token相当于你的身份凭证,别泄露了。
# 安装Tushare
# pip install tushare
import tushare as ts
# 设置token(在Tushare官网注册获取)
ts.set_token('your_token_here')
pro = ts.pro_api()
# 获取贵州茅台2024年1月的日线数据
df = pro.daily(ts_code='600519.SH',
start_date='20240101',
end_date='20240131')
print(df.head())
避坑指南:我曾经遇到过Tushare返回的数据里,日期格式是YYYYMMDD的字符串,不是datetime对象。如果你直接拿去做时间序列分析,会报错。记得先转换:df['trade_date'] = pd.to_datetime(df['trade_date'])。
3.2 Tushare的积分体系
Tushare的积分决定了你能调用的接口范围。比如基础日线数据只需要200积分,但获取财务数据可能需要500积分以上。积分不够怎么办?
- 注册送积分:新用户注册会送一些积分。
- 每日签到:连续签到可以攒积分。
- 分享文章:在社区分享量化文章也能获得积分。
说白了,Tushare的积分体系就是鼓励你多用、多贡献。对于个人研究来说,这个模式其实挺良心的。
四、Yahoo Finance —— 国际数据免费拿
如果你做美股或者全球市场,Yahoo Finance是首选。它完全免费,数据覆盖全球主要市场。不过,它的数据质量偶尔会出问题,尤其是分红、拆股这些事件。
4.1 Yahoo Finance的调用方式
Yahoo Finance的Python接口有很多,最常用的是yfinance。这个库封装得很好,几行代码就能拉数据。
# 安装yfinance
# pip install yfinance
import yfinance as yf
# 获取苹果公司2024年1月的日线数据
aapl = yf.download('AAPL', start='2024-01-01', end='2024-01-31')
print(aapl.head())
个人经验:yfinance返回的数据是pandas DataFrame,列名是Open, High, Low, Close, Volume。这个格式跟Wind和Tushare不太一样,但好处是直接就能用。我一般拿到数据后,第一件事就是检查有没有NaN值——Yahoo Finance偶尔会漏数据。
4.2 Yahoo Finance的局限性
- 数据延迟:Yahoo Finance的数据不是实时的,通常有15-20分钟的延迟。
- 历史数据限制:有些股票的历史数据只能追溯到几年内,太早的数据可能没有。
- 事件数据缺失:分红、拆股、增发这些事件,Yahoo Finance有时会记录不全。
五、API调用基础 —— 通用套路
不管用哪个数据源,API调用的核心逻辑都差不多。我总结了一个通用流程,你照着做基本不会出错。
5.1 通用调用流程
- 注册账号:获取API token或密钥。
- 安装SDK:用pip安装对应的Python库。
- 设置参数:指定股票代码、时间范围、字段等。
- 发起请求:调用API函数获取数据。
- 处理返回:把数据转换成pandas DataFrame格式。
- 错误处理:捕获异常,比如网络超时、数据不存在等。
# 一个通用的数据获取模板
def fetch_data(source, symbol, start, end):
"""
从指定数据源获取股票数据
source: 'wind', 'tushare', 'yahoo'
"""
try:
if source == 'wind':
# Wind调用
data = w.wsd(symbol, "close", start, end, "")
return data.Data
elif source == 'tushare':
# Tushare调用
pro = ts.pro_api()
df = pro.daily(ts_code=symbol,
start_date=start.replace('-', ''),
end_date=end.replace('-', ''))
return df
elif source == 'yahoo':
# Yahoo Finance调用
df = yf.download(symbol, start=start, end=end)
return df
else:
raise ValueError(f"不支持的数据源: {source}")
except Exception as e:
print(f"数据获取失败: {e}")
return None
核心观点:写一个通用的数据获取函数,可以让你在切换数据源时只改一个参数。我在项目里就是这么做的,省了不少事。
5.2 常见错误与处理
| 错误类型 | 原因 | 解决方法 |
|---|---|---|
| 连接超时 | 网络问题或API服务端繁忙 | 增加重试机制,比如用time.sleep(1)等待后重试 |
| 数据为空 | 股票代码错误或该时间段无数据 | 检查股票代码格式,确认交易日期 |
| 积分不足 | Tushare积分不够 | 签到或充值获取积分 |
| 字段不存在 | API字段名写错了 | 查阅API文档,确认字段名 |
六、知识体系框架图
下面这张图展示了本章的核心逻辑:从数据源选择到API调用,再到数据获取的完整流程。
七、总结与建议
数据源的选择,说白了就是权衡:你要的是数据质量、获取成本,还是开发效率?
- 如果你在机构工作:用Wind,数据质量有保障,但要做好跟它「斗智斗勇」的准备。
- 如果你是个人研究者:用Tushare,免费且社区活跃,遇到问题有人帮你。
- 如果你做美股或全球市场:用Yahoo Finance,免费且覆盖广,但数据质量要自己把关。
避坑指南:我曾经在项目里同时用了三个数据源,结果发现同一只股票在同一天的收盘价居然不一样。后来排查发现,Wind用的是复权价格,Tushare用的是不复权价格,Yahoo Finance用的是调整后价格。所以,用数据前一定要搞清楚它的「复权规则」。
数据获取只是第一步,拿到数据后怎么清洗、怎么处理缺失值、怎么对齐时间戳,这些才是真正考验功夫的地方。不过,那是下一章的内容了。今天先把数据源搞定,后面的事后面再说。
公众号:蓝海数据掘金营,微信deep3321