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_codesurvey_datefund_visitorsrece_visitorscontent等。

核心字段解读:

  • 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格式,原因有三:

  1. 压缩率高:同样的数据,CSV要100MB,Parquet只要20MB
  2. 读取快:按列存储,只读需要的字段时速度飞快
  3. 支持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 知识体系总览

下面这张图把本章的核心逻辑串起来了:

机构调研数据获取流程 步骤1:API认证 set_token → pro_api() 步骤2:参数设置 ts_code, start_date, end_date 步骤3:数据获取 pro.stk_survey() 步骤4:数据清洗 删除空行 → 填充缺失值 → 去重 → 过滤异常 重点关注:fund_visitors, content字段 步骤5:数据存储 推荐Parquet格式,按季度分表存储 常见问题与避坑 • token不要硬编码,用环境变量 • 日期格式必须是YYYYMMDD • 注意调研家数与次数的区别 • 清洗时结合content字段验证 • 存储建议Parquet+CSV双备份 • 增量更新按季度分表

这张图把从API认证到最终存储的完整链路都画出来了。你跟着这个流程走,基本不会出大问题。

最后提醒一句:数据获取只是开始。下一章我们会聊怎么把这些调研数据跟资金流向数据做关联分析——那才是真正出策略的地方。


公众号:蓝海资料掘金营,微信deep3321