第三章 数据获取:用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 本章知识体系

下面这张图展示了数据获取的完整流程。从数据源到最终存储,每一步都有讲究。

数据获取知识体系 数据源层 Tushare AkShare 其他数据源 数据类型层 行情数据(日/周/月) 财务数据(季/年) 基本面数据 数据处理层 数据清洗 复权处理 时间对齐 存储层(CSV / SQLite / 数据库)

说白了,数据获取就是这三步:选对工具、拿对数据、存好数据。别小看这一步,数据质量直接决定模型效果。我见过太多人花90%的时间调模型,结果数据本身就有问题。

核心要点:
  • Tushare适合生产环境,AkShare适合快速原型
  • 财务数据注意季度对齐,行情数据注意复权
  • 数据清洗比模型调参更重要
  • 建议用环境变量管理token,别硬编码

好了,数据到手了。下一章咱们聊聊怎么用这些数据构建因子。记住,好的开始是成功的一半,数据搞定了,后面就顺了。

专注资料整理