第三章 数据获取:用Tushare/AkShare搞定A股数据
做量化选股,第一步就是搞数据。这活儿看着简单,其实坑不少。
我刚开始做多因子模型时,花了两周时间手动扒数据,结果发现财务数据对不上号。后来老老实实用专业数据源,才把这事儿理顺。今天咱们就聊聊怎么用Tushare和AkShare这两个工具,把A股的行情、财务、基本面数据拿到手。
3.1 两大工具怎么选?
先说说我的个人习惯。Tushare是老牌工具,数据质量高,但需要注册获取token。AkShare是后起之秀,完全免费,接口更丰富。你想想看,如果只是做研究,AkShare够用了。要是做生产环境,我建议用Tushare,数据更稳定。
| 对比项 | Tushare | AkShare |
|---|---|---|
| 注册门槛 | 需要token | 无需注册 |
| 数据质量 | 高,有校验 | 中等,偶尔有延迟 |
| 财务数据 | 完整,支持季度/年度 | 基础财务数据 |
| 行情数据 | 日/周/月/分钟 | 日/周/月 |
| 免费额度 | 基础版有限 | 无限制 |
我的建议:新手先用AkShare上手,跑通流程。等需要更精细的数据时,再切换到Tushare。我在项目中遇到过,用AkShare抓取历史财务数据时,某些股票的数据会缺失,这时候就得用Tushare补全。
3.2 安装与配置
安装很简单,pip一把梭。但要注意版本兼容性。
# 安装Tushare
pip install tushare
# 安装AkShare
pip install akshare
# 验证安装
import tushare as ts
import akshare as ak
print("安装成功!")
Tushare需要设置token。你可以在官网注册后拿到自己的token。
import tushare as ts
# 设置token(替换成你自己的)
ts.set_token('你的token')
# 初始化pro接口
pro = ts.pro_api()
注意:token不要硬编码在代码里。我曾经把token直接写在脚本里,结果不小心上传到了GitHub...嗯,那之后我都是用环境变量来管理。
3.3 获取行情数据
行情数据是选股的基础。咱们先拿日线数据试试。
3.3.1 用Tushare拿日线
import tushare as ts
pro = ts.pro_api()
# 获取平安银行2024年1月日线数据
df = pro.daily(
ts_code='000001.SZ',
start_date='20240101',
end_date='20240131'
)
print(df.head())
返回的数据包含:开盘价、收盘价、最高价、最低价、成交量、成交额等。这些是后续计算因子(比如动量因子、波动率因子)的原材料。
3.3.2 用AkShare拿日线
import akshare as ak
# 获取平安银行日线数据
df = ak.stock_zh_a_hist(
symbol="000001",
period="daily",
start_date="20240101",
end_date="20240131",
adjust="qfq" # 前复权
)
print(df.head())
关键点:复权处理很重要。我见过有人直接用不复权的数据算收益率,结果回测结果完全失真。前复权适合回测,后复权适合看历史价格。
3.4 获取财务数据
财务数据是多因子模型的核心。常用的因子包括市盈率、市净率、ROE、营收增长率等。
3.4.1 Tushare财务数据
# 获取平安银行2023年年度财务数据
df = pro.fina_indicator(
ts_code='000001.SZ',
start_date='20230101',
end_date='20231231',
fields='roe,eps,revenue,profit'
)
print(df)
这里我选了ROE、每股收益、营收、利润这几个关键指标。你想想看,这些数据能直接用来构建估值因子和盈利因子。
3.4.2 AkShare财务数据
import akshare as ak
# 获取平安银行财务数据
df = ak.stock_financial_abstract(
symbol="000001",
indicator="按年度"
)
print(df.head())
避坑指南:我曾经用AkShare抓取财务数据时,发现某些季度的数据是空的。后来查了文档才知道,有些股票在特定季度没有披露数据。建议用try-except处理异常,或者用Tushare做补充。
3.5 获取基本面数据
基本面数据包括行业分类、股东信息、分红记录等。这些数据能帮我们做行业中性化处理。
3.5.1 行业分类数据
# Tushare获取行业分类
df = pro.stock_basic(
exchange='',
list_status='L',
fields='ts_code,symbol,name,industry'
)
print(df.head())
3.5.2 股东信息
# 获取前十大股东
df = pro.top10_holders(
ts_code='000001.SZ',
start_date='20230101',
end_date='20231231'
)
print(df.head())
3.6 数据整合与存储
拿到数据后,别急着用。先做数据清洗和整合。我一般会存到本地CSV或者SQLite里,方便后续调用。
import pandas as pd
# 整合行情和财务数据
def get_stock_data(ts_code, start_date, end_date):
# 获取行情
price_df = pro.daily(ts_code=ts_code, start_date=start_date, end_date=end_date)
# 获取财务
fina_df = pro.fina_indicator(ts_code=ts_code, start_date=start_date, end_date=end_date)
# 合并数据
merged_df = pd.merge(price_df, fina_df, on='ts_code', how='left')
return merged_df
# 保存到CSV
df = get_stock_data('000001.SZ', '20240101', '20240131')
df.to_csv('stock_data.csv', index=False)
注意:数据对齐是个大坑。行情数据是日频,财务数据是季频。合并时要注意时间戳对齐,否则会出现未来函数。我建议用reindex或者resample来处理。
3.7 本章知识体系
下面这张图展示了数据获取的完整流程。从数据源到最终存储,每一步都有讲究。
说白了,数据获取就是这三步:选对工具、拿对数据、存好数据。别小看这一步,数据质量直接决定模型效果。我见过太多人花90%的时间调模型,结果数据本身就有问题。
核心要点:
- Tushare适合生产环境,AkShare适合快速原型
- 财务数据注意季度对齐,行情数据注意复权
- 数据清洗比模型调参更重要
- 建议用环境变量管理token,别硬编码
好了,数据到手了。下一章咱们聊聊怎么用这些数据构建因子。记住,好的开始是成功的一半,数据搞定了,后面就顺了。