第2章:数据获取与工具——主流数据平台介绍
做量化交易,尤其是盯北向资金尾盘异动,第一步不是写策略,而是搞定数据。我见过太多人上来就写代码,结果数据源不对,清洗不干净,最后策略跑出来全是噪音。说白了,数据是地基,地基不稳,楼盖得再高也得塌。
这一章,我就带你看看市面上主流的几个数据平台,以及怎么把数据拿到手、洗干净。嗯,都是我自己踩过坑之后总结出来的经验。
2.1 主流数据平台介绍
目前A股市场,做北向资金分析,用得最多的就三个平台:东方财富、同花顺、Wind。各有各的脾气,我一个个说。
| 平台 | 数据特点 | 适用人群 | 我的评价 |
|---|---|---|---|
| 东方财富(Choice) | 免费数据丰富,接口开放,更新快 | 个人投资者、中小机构 | 性价比之王,我早期全靠它 |
| 同花顺(iFinD) | 数据质量高,历史数据全,但收费 | 专业投资者、私募 | 数据干净,省去很多清洗功夫 |
| Wind | 行业标准,数据最全,但价格最贵 | 公募基金、大型机构 | 有钱就上,数据维度确实无敌 |
我的建议:如果你刚开始做北向资金研究,先用东方财富的免费接口跑通流程。等策略成熟了,再考虑付费平台。我自己就是这条路走过来的。
2.2 数据接口与API使用
数据平台选好了,接下来就是怎么把数据拉下来。这里我重点讲东方财富的接口,因为免费且够用。
2.2.1 东方财富API示例
东方财富的北向资金数据,其实藏在它的行情接口里。我习惯用Python的requests库直接抓取。给你看个例子:
import requests
import pandas as pd
import json
# 获取北向资金当日流入数据
url = "https://push2.eastmoney.com/api/qt/stock/get"
params = {
"secid": "1.000001", # 上证指数代码
"fields": "f43,f44,f45,f46,f47,f48,f49,f50,f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f62,f63,f64,f65"
}
headers = {
"User-Agent": "Mozilla/5.0"
}
response = requests.get(url, params=params, headers=headers)
data = response.json()
# 解析北向资金数据
if data.get("data"):
north_flow = data["data"].get("f60", 0) # 北向资金净流入
print(f"当前北向资金净流入: {north_flow} 亿元")
else:
print("数据获取失败,检查网络或接口")
小技巧:东方财富的接口字段经常变。我一般先打印出data的完整结构,再对照着找需要的字段。别问我怎么知道的,问就是踩过坑。
2.2.2 同花顺iFinD接口
同花顺的接口相对规范,但需要申请API权限。它的数据格式是标准的JSON,用起来很舒服。
# 同花顺iFinD接口示例(需安装iFinD库)
from iFinDPy import *
# 登录(需要账号密码)
THS_iFinDLogin("your_username", "your_password")
# 获取北向资金日频数据
data = THS_DataQuery(
code="600519.SH",
indicators="north_flow_amt",
begin_date="2024-01-01",
end_date="2024-12-31"
)
print(data.head())
注意:同花顺的API有调用次数限制。我曾经一天内调了上万次,直接被封了24小时。建议做好缓存,别频繁请求。
2.3 数据清洗与预处理
数据拿到手,千万别直接用。原始数据里什么妖魔鬼怪都有。我总结了一套清洗流程,你照着做就行。
2.3.1 常见数据问题
- 缺失值:节假日、停牌日,北向资金数据会为空
- 异常值:比如突然出现-9999这种明显错误的数据
- 重复值:同一个时间点出现多条记录
- 格式问题:日期格式不统一,数值带单位(如"亿")
2.3.2 清洗代码示例
import pandas as pd
import numpy as np
# 假设你已经拿到了原始数据
df = pd.read_csv("north_flow_raw.csv")
# 1. 处理缺失值
df = df.dropna(subset=["north_flow"]) # 删除北向资金为空的记录
# 2. 处理异常值
df = df[df["north_flow"] > -1000] # 过滤掉明显异常的数据
# 3. 去重
df = df.drop_duplicates(subset=["date"])
# 4. 格式化日期
df["date"] = pd.to_datetime(df["date"])
# 5. 处理数值单位(如果数据带"亿"字)
df["north_flow"] = df["north_flow"].str.replace("亿", "").astype(float)
print(f"清洗后数据量: {len(df)} 条")
print(df.head())
避坑指南:我曾经遇到过一个坑——某平台返回的北向资金数据,在收盘前最后一分钟会突然跳变。后来发现是数据源在实时更新时没做平滑处理。所以,我建议你拿到数据后,先跟官方数据源做一次交叉验证。
2.4 知识体系总览
为了让你更直观地理解这一章的内容,我画了一张图。你看一眼就明白数据从哪来、到哪去、中间要经过哪些处理。
这张图把整个流程串起来了。从数据源到API,再到原始数据,最后经过清洗变成可用的数据。每一步都缺一不可。
我的习惯:每次拿到新数据源,我都会先画一张类似的流程图。不是为了好看,而是为了理清数据流转的每个环节。哪个环节容易出问题,一目了然。
好了,数据获取和清洗这块就讲这么多。记住一句话:数据质量决定策略上限。别嫌清洗麻烦,这一步省下来的时间,后面会加倍还给你。
公众号:蓝海资料掘金营,微信deep3321