2、数据源探秘:主流数据提供商及API接口对比
做行情数据接入,第一步就是选数据源。这步选错了,后面清洗、存储、计算全白搭。我这些年接触过的数据提供商不下十家,今天挑四个最主流的——Wind、Bloomberg、东方财富、新浪财经,跟大家聊聊它们的脾气秉性。
2.1 四大数据源,谁是谁?
先给个全景图。这四家代表了两种路线:专业金融终端和互联网数据源。Wind和Bloomberg是前者,贵但全;东方财富和新浪财经是后者,免费但糙。
核心区别一句话:Wind和Bloomberg是「给你鱼吃」,东方财富和新浪是「给你渔网自己捞」。
我个人习惯把数据源分成三层:
- L1层(实时行情):Tick级数据,毫秒延迟。Wind和Bloomberg做得好。
- L2层(历史数据):日线、分钟线、财务数据。四家都能提供,但质量天差地别。
- L3层(衍生数据):因子、研报、舆情。只有Wind和Bloomberg有。
2.2 Wind(万得)——国内金融数据的老大
Wind在国内的地位,相当于Bloomberg在全球。我入行第一年,公司花20万买了个Wind终端,当时觉得贵,后来发现真香。
API接口:Wind提供Python/C++/Java接口,叫WindPy。安装后通过COM组件调用。
# 安装:pip install windpy
from WindPy import w
w.start()
# 获取股票日线数据
data = w.wsd("000001.SZ", "open,high,low,close,volume", "2024-01-01", "2024-12-31")
print(data.Data)
优点:
- 数据全:A股、港股、期货、债券、基金,基本全覆盖
- 质量高:数据经过人工校验,很少出现空值或异常
- 速度快:本地终端缓存,查询毫秒级响应
缺点:
- 贵:个人版一年几千,机构版十几万起步
- 封闭:API只能在Windows上用,Linux用户得装虚拟机
- 限制多:并发请求有限制,我试过同时拉100只股票的历史数据,直接被封了半小时
避坑指南:我曾经在项目里用Wind拉全市场5000只股票的分钟线,结果跑了三天三夜。后来发现是没开多线程。记住:Wind的API是单线程的,要并发必须自己写线程池。
2.3 Bloomberg(彭博)——全球金融数据的标准
Bloomberg是华尔街的标配。我有个朋友在量化基金,每天上班第一件事就是打开Bloomberg Terminal。说实话,个人开发者基本用不起,但了解它没坏处。
API接口:Bloomberg提供blpapi(Python版),通过SAPI(Server API)或DPI(Desktop API)连接。
# 安装:pip install blpapi
import blpapi
session = blpapi.Session()
session.start()
# 获取IBM股票数据
request = session.createRequest("HistoricalDataRequest")
request.getElement("securities").appendValue("IBM US Equity")
request.getElement("fields").appendValue("PX_LAST")
request.getElement("fields").appendValue("VOLUME")
session.sendRequest(request)
优点:
- 全球覆盖:美股、欧股、外汇、大宗商品,没有它拿不到的
- 数据规范:字段命名全球统一,比如
PX_LAST代表收盘价 - 实时性强:延迟在微秒级,高频交易的首选
缺点:
- 贵到离谱:一个终端年费2万美元起,API授权另算
- 学习曲线陡:API文档几百页,我第一次看差点放弃
- 依赖硬件:必须连Bloomberg的专用服务器,不能随便迁移
小技巧:如果你只是偶尔用Bloomberg数据,可以试试它的Excel插件。很多分析师就是这么干的——在Excel里拉数据,然后导出CSV给我。嗯,虽然土,但管用。
2.4 东方财富(Choice)——免费里的战斗机
东方财富的Choice终端,是很多小团队的首选。免费版就能用,付费版一年几千块。我刚开始做个人量化时,全靠它撑场面。
API接口:东方财富提供akshare(第三方库)和官方emdat接口。注意,官方接口需要注册开发者账号。
# 使用akshare(推荐,开源免费)
import akshare as ak
# 获取A股日线数据
df = ak.stock_zh_a_hist(symbol="000001", period="daily",
start_date="20240101", end_date="20241231")
print(df.head())
优点:
- 免费:基础数据完全免费,高级数据(如Level-2)才收费
- 易用:akshare封装得很好,一行代码就能拉数据
- 社区活跃:遇到问题去GitHub提issue,一般当天就有人回复
缺点:
- 数据质量参差不齐:我遇到过复权数据算错的情况,得自己校验
- 频率限制:免费版每分钟最多请求60次,多了会被封IP
- 字段不统一:不同接口返回的列名不一样,清洗时很头疼
避坑指南:我曾经用akshare拉期货数据,发现某天的收盘价是0。查了半天,原来是那天该品种没交易,但接口返回了空值而不是NaN。从此我养成了习惯:拉完数据先做空值检查。
2.5 新浪财经——轻量级选手
新浪财经的API,说白了就是爬虫接口。它没有官方SDK,全靠开发者自己解析JSON。优点是快,缺点是随时可能改接口。
API接口:直接HTTP GET请求,返回JSON格式。
import requests
import json
# 获取股票实时行情
url = "https://hq.sinajs.cn/list=sh600519,sz000001"
headers = {"Referer": "https://finance.sina.com.cn"}
resp = requests.get(url, headers=headers)
print(resp.text)
# 返回格式:var hq_str_sh600519="贵州茅台,1700.00,1698.50,..."
优点:
- 零成本:完全免费,连注册都不需要
- 速度快:CDN加速,延迟在100ms以内
- 简单:一个GET请求搞定,适合快速原型开发
缺点:
- 不稳定:接口说改就改,我遇到过凌晨突然返回格式变了,导致整个数据管道崩溃
- 数据有限:只有实时行情和简单K线,没有财务数据
- 法律风险:严格来说,商业使用可能涉及侵权
小技巧:新浪的接口适合做「数据源兜底」。比如Wind宕机了,可以临时切到新浪顶上。但千万别把它当主数据源——你想想看,万一它哪天不干了,你的系统就瘫了。
2.6 四家对比,一张表说清楚
| 维度 | Wind | Bloomberg | 东方财富 | 新浪财经 |
|---|---|---|---|---|
| 价格 | 高(万级/年) | 极高(万美元/年) | 免费/低(千级/年) | 免费 |
| 数据范围 | 国内全市场 | 全球全市场 | 国内主流 | 国内实时 |
| 数据质量 | 高 | 极高 | 中 | 低 |
| API易用性 | 中(需学习) | 难(文档厚) | 易(akshare) | 极易(HTTP) |
| 实时性 | 秒级 | 微秒级 | 秒级 | 秒级 |
| 适合场景 | 机构量化 | 全球交易 | 个人/小团队 | 快速原型 |
2.7 我的选择建议
如果你问我怎么选,我的答案是:看预算和场景。
- 预算充足(10万+/年):Wind做主力,Bloomberg做全球数据补充。我上一家基金公司就是这么配的。
- 预算有限(1万以内):东方财富+新浪财经组合。东方财富拉历史数据,新浪拉实时行情。
- 个人开发者:先用akshare跑起来,等数据量大了再考虑付费。
核心原则:永远不要只依赖一个数据源。我见过太多团队因为Wind宕机导致交易暂停。至少准备两个数据源,一个主用,一个备用。
2.8 数据源接入架构图
下面这张图是我在实际项目中用过的数据源接入架构。你看,数据从不同源进来,经过统一格式转换,最后落到同一个存储层。这样即使某个源挂了,切换起来也很快。
这张图里,最关键的是「统一数据接入层」。你想想看,四个数据源返回的字段名都不一样——Wind叫close,Bloomberg叫PX_LAST,东方财富叫收盘。不统一的话,下游清洗逻辑得写四套,维护成本翻倍。
好了,数据源这块就聊到这儿。下一章我们深入清洗环节,聊聊那些年我们踩过的数据坑。