3、数据获取入门:使用tushare获取股票数据、数据格式理解、数据存储(CSV/Excel)
做量化研究,第一步就是搞定数据。没有数据,再牛的策略也是空中楼阁。我个人习惯用 tushare 来获取 A 股数据,它免费、稳定,而且社区活跃。今天我们就从零开始,把数据获取、格式理解、存储这三个环节彻底讲透。
本章核心脉络:安装 tushare → 获取日线数据 → 理解 DataFrame 结构 → 保存为 CSV/Excel → 避坑指南
3.1 准备工作:安装与初始化
首先,你得把 tushare 装好。打开终端,敲一行命令就行:
pip install tushare
装完之后,还需要一个 token。去 tushare.pro 注册账号,在个人主页找到 token,复制下来。我个人习惯把 token 存在环境变量里,这样代码里不会暴露敏感信息。
import tushare as ts
# 设置 token(建议用你自己的)
ts.set_token('你的token')
# 初始化接口
pro = ts.pro_api()
小提示:token 相当于你的钥匙。我曾经把 token 直接写在代码里上传到 GitHub,结果第二天就被别人刷光了积分。嗯,从那以后我再也不敢偷懒了。
3.2 获取股票日线数据
数据接口准备好了,我们来拉一把贵州茅台的历史日线数据。代码很简单:
# 获取贵州茅台(600519.SH)从2023-01-01到2023-12-31的日线数据
df = pro.daily(
ts_code='600519.SH',
start_date='20230101',
end_date='20231231'
)
print(df.head())
跑完之后,你会看到一个表格。里面包含这些字段:
| 字段名 | 含义 | 示例值 |
|---|---|---|
| ts_code | 股票代码 | 600519.SH |
| trade_date | 交易日期 | 20231229 |
| open | 开盘价 | 1725.00 |
| high | 最高价 | 1748.00 |
| low | 最低价 | 1720.00 |
| close | 收盘价 | 1743.00 |
| pre_close | 昨收价 | 1728.00 |
| change | 涨跌额 | 15.00 |
| pct_chg | 涨跌幅(%) | 0.87 |
| vol | 成交量(手) | 35200 |
| amount | 成交额(千元) | 6130000 |
重点理解:返回的数据是一个 pandas DataFrame。说白了,它就是一个带标签的二维表格,行是日期,列是字段。你想想看,后续所有数据处理、回测、可视化,几乎都离不开 DataFrame。
3.3 数据格式深度理解
拿到数据后,别急着存。先看看数据类型对不对。我教你几个常用操作:
# 查看数据基本信息
print(df.info())
# 查看数据统计摘要
print(df.describe())
# 检查是否有缺失值
print(df.isnull().sum())
# 把 trade_date 转成日期类型
df['trade_date'] = pd.to_datetime(df['trade_date'])
# 按日期排序(tushare默认是倒序)
df = df.sort_values('trade_date')
为什么会强调数据类型?我在项目中遇到过一个问题:某次策略回测结果总是对不上,查了半天才发现 trade_date 是字符串,排序时按字典序排的,导致日期顺序全乱了。这种坑,踩过一次就记住了。
注意:tushare 返回的 trade_date 是字符串格式(如 '20231229'),不是日期类型。建议第一时间转成 datetime,否则后续按时间筛选、画图都会出问题。
3.4 数据存储:CSV 与 Excel
数据拿到了,格式也理清了,接下来就是存起来。我个人习惯用 CSV,因为它轻量、跨平台、版本控制友好。但如果你要给不懂代码的同事看,Excel 更合适。
3.4.1 保存为 CSV
# 保存为 CSV 文件
df.to_csv('600519_daily.csv', index=False, encoding='utf-8-sig')
# 读取 CSV 文件
df_read = pd.read_csv('600519_daily.csv')
print(df_read.head())
这里有个细节:encoding='utf-8-sig' 是为了让 Excel 打开 CSV 时不乱码。我曾经没加这个参数,结果同事用 Excel 打开全是乱码,被吐槽了半天。
3.4.2 保存为 Excel
# 保存为 Excel 文件(需要安装 openpyxl)
df.to_excel('600519_daily.xlsx', index=False, sheet_name='日线数据')
# 读取 Excel 文件
df_read_excel = pd.read_excel('600519_daily.xlsx')
print(df_read_excel.head())
小提示:保存 Excel 前,记得先装 openpyxl:pip install openpyxl。不然会报错。另外,Excel 文件体积比 CSV 大不少,如果数据量上百万行,建议用 CSV 或更高效的格式(比如 parquet)。
3.5 实战:一次获取多只股票并合并存储
单只股票的数据获取学会了,那多只股票呢?我经常需要同时拉取沪深300成分股的数据。这里给个示例:
import pandas as pd
# 股票列表
stock_list = ['600519.SH', '000001.SZ', '601318.SH']
# 循环获取并存储
all_data = []
for code in stock_list:
df_temp = pro.daily(
ts_code=code,
start_date='20230101',
end_date='20231231'
)
all_data.append(df_temp)
print(f'{code} 数据获取完成,共 {len(df_temp)} 条')
# 合并所有数据
df_all = pd.concat(all_data, ignore_index=True)
# 保存到 CSV
df_all.to_csv('multi_stocks_daily.csv', index=False, encoding='utf-8-sig')
print(f'合并后总数据量:{len(df_all)} 条')
核心要点:用 pd.concat 合并多个 DataFrame 时,确保它们的列结构一致。tushare 返回的字段名是统一的,所以直接合并没问题。
3.6 避坑指南
做数据获取这几年,我踩过的坑不少。挑几个最常见的分享给你:
- 积分限制:tushare 免费版每天有调用次数限制。我曾经一次性拉 5000 只股票,结果被限流了。建议加
time.sleep(0.5)控制频率。 - 日期格式:tushare 的日期参数是 'YYYYMMDD' 格式,不是 'YYYY-MM-DD'。写错会报错或返回空数据。
- 复权问题:
pro.daily()返回的是未复权数据。做回测时建议用pro.daily(adj='qfq')获取前复权数据。 - 缺失值处理:停牌日的数据是 NaN。我建议用
df.fillna(method='ffill')向前填充,或者直接删除。
重要提醒:数据是量化研究的基石。如果数据源有问题,后面所有分析都是错的。每次获取数据后,建议先画个 K 线图肉眼检查一下,看看有没有异常跳空或缺失。
好了,数据获取入门就讲到这里。你只要把安装、获取、理解格式、存储这四个环节走通,后面做策略回测、因子分析就有了坚实的基础。记住,多动手,多踩坑,经验就是这么积累起来的。
公众号:蓝海资料掘金营,微信deep3321