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 Bloomberg 东方财富 新浪财经 统一数据接入层(格式转换、字段映射) 数据清洗层(去重、补空、异常检测) 统一存储层(ClickHouse / InfluxDB / HDFS) 注:每个数据源独立接入,互不影响。切换时只需修改配置。

这张图里,最关键的是「统一数据接入层」。你想想看,四个数据源返回的字段名都不一样——Wind叫close,Bloomberg叫PX_LAST,东方财富叫收盘。不统一的话,下游清洗逻辑得写四套,维护成本翻倍。

好了,数据源这块就聊到这儿。下一章我们深入清洗环节,聊聊那些年我们踩过的数据坑。


蓝海数据掘金营,专注资料整理