4、数据获取实战(一):使用Tushare Pro获取机构调研数据、API认证与参数设置、数据清洗与存储
4.1 为什么选Tushare Pro?
做量化投资,数据就是你的弹药。没有干净的数据,再牛的策略也是白搭。
我个人习惯用Tushare Pro,原因很简单:它覆盖了A股绝大部分的机构调研数据,而且接口设计得很规范。你想想看,机构调研数据在别的平台要么收费贵得离谱,要么数据字段残缺不全。Tushare Pro虽然也要积分,但性价比确实高。
我在项目中遇到过一个问题:某次用免费接口拉数据,结果发现「调研机构」字段全是空值。排查了半天,原来是接口版本太旧。换成Pro版后,数据质量明显上了一个台阶。
4.2 API认证与参数设置
先搞定认证。Tushare Pro用的是token机制,说白了就是一把钥匙。
import tushare as ts
# 设置token(请替换成你自己的)
ts.set_token('你的token_here')
pro = ts.pro_api()
# 测试连接
print(pro.query('trade_cal', start_date='20250101', end_date='20250110'))
嗯,这里要注意:token千万别硬编码在代码里。我吃过这个亏——有一次把代码传到GitHub上忘了删token,结果第二天就被别人刷爆了积分。
建议的做法是存环境变量:
import os
ts.set_token(os.getenv('TUSHARE_TOKEN'))
4.3 获取机构调研数据
核心接口是 stk_survey。它的参数不多,但有几个坑需要避开。
| 参数名 | 说明 | 我的经验 |
|---|---|---|
| ts_code | 股票代码 | 建议用TS格式,如000001.SZ |
| start_date | 开始日期 | 格式YYYYMMDD,别用横杠 |
| end_date | 结束日期 | 同上,注意闭区间 |
实战代码:
# 获取2024年全年机构调研数据
df = pro.stk_survey(
start_date='20240101',
end_date='20241231'
)
print(df.head())
print(f'共获取 {len(df)} 条记录')
跑完你会发现,返回的数据包含这些字段:ts_code、survey_date、fund_visitors、rece_visitors、content等。
核心字段解读:
fund_visitors:基金公司参与调研的家数。这个数字越大,说明机构越关注。rece_visitors:接待的机构总数。注意,这里包含券商、私募等。content:调研纪要。文本分析的好素材。
4.4 数据清洗——别让脏数据毁了你的策略
数据拉下来只是第一步。我见过太多人直接拿原始数据跑回测,结果亏得莫名其妙。
常见的脏数据问题:
- 缺失值:有些股票当天没有调研,但接口会返回空行
- 重复记录:同一家机构在同一天多次调研同一家公司
- 异常值:比如调研机构数量为0,这明显不合理
清洗流程我一般这么走:
# 1. 删除全空行
df = df.dropna(how='all')
# 2. 填充部分空值
df['fund_visitors'] = df['fund_visitors'].fillna(0).astype(int)
# 3. 去重(按股票+日期+调研内容去重)
df = df.drop_duplicates(subset=['ts_code', 'survey_date', 'content'])
# 4. 过滤异常值
df = df[df['fund_visitors'] >= 0]
print(f'清洗后剩余 {len(df)} 条记录')
我曾经踩过的坑:
有一次我发现某只股票显示有50家基金调研,但实际调研纪要里只提到了3家。后来查出来是数据源把「累计调研次数」和「单次调研家数」搞混了。所以清洗时一定要结合content字段做交叉验证。
4.5 数据存储——选对格式省一半时间
数据清洗完了,存哪里?我个人推荐Parquet格式,原因有三:
- 压缩率高:同样的数据,CSV要100MB,Parquet只要20MB
- 读取快:按列存储,只读需要的字段时速度飞快
- 支持schema:数据类型不会乱掉
存储代码:
import pandas as pd
# 保存为Parquet
df.to_parquet('institution_survey_2024.parquet', index=False)
# 读取验证
df_check = pd.read_parquet('institution_survey_2024.parquet')
print(f'存储成功,共 {len(df_check)} 条记录')
如果你团队里有人不习惯Parquet,也可以同时存一份CSV做备份:
df.to_csv('institution_survey_2024.csv', index=False, encoding='utf-8-sig')
小技巧:
建议按「年份+季度」分表存储。比如 survey_2024_Q1.parquet。这样后续做增量更新时,只需要追加最新季度的数据,不用全量重跑。
4.6 知识体系总览
下面这张图把本章的核心逻辑串起来了:
这张图把从API认证到最终存储的完整链路都画出来了。你跟着这个流程走,基本不会出大问题。
最后提醒一句:数据获取只是开始。下一章我们会聊怎么把这些调研数据跟资金流向数据做关联分析——那才是真正出策略的地方。
公众号:蓝海资料掘金营,微信deep3321