第1章:金融数据获取——用Tushare和AKShare搞定股票、期货、基金数据

做量化交易,第一步就是搞数据。没有数据,再牛的策略也是空中楼阁。

我入行那会儿,数据源可没现在这么丰富。那时候得自己写爬虫,从东方财富、新浪财经这些网站一点点扒。效率低不说,还经常被反爬机制搞得焦头烂额。现在好了,有了Tushare和AKShare这两个库,数据获取变得简单多了。

今天我就带你看看,怎么用这两个库拿到股票、期货、基金的数据。嗯,咱们直接上干货。

1.1 为什么选Tushare和AKShare?

市面上金融数据接口不少,但真正好用的不多。我个人习惯用Tushare做A股和基金数据,用AKShare做期货和更广泛的市场数据。为什么这么搭配?

  • Tushare:数据质量高,更新及时,社区活跃。适合做股票、基金、指数的深度分析。
  • AKShare:覆盖面广,支持期货、期权、外汇、加密货币等。而且完全免费,对新手友好。

说白了,Tushare像是个精装修的公寓,住着舒服但得交物业费(积分)。AKShare像个大市场,啥都有,但需要你自己挑挑拣拣。

1.2 环境准备

先装库。这个简单,一行命令搞定:

pip install tushare akshare pandas

装完之后,记得去Tushare官网注册个账号,拿到你的API token。这个token就像你的身份证,每次请求都得带上。

小提示: 我建议把token存在环境变量里,别硬编码在代码中。万一代码传到GitHub上,token泄露了可就麻烦了。

1.3 用Tushare获取股票数据

先来个最简单的——获取某只股票的历史日线数据。

import tushare as ts

# 设置token
ts.set_token('你的token')

# 初始化pro接口
pro = ts.pro_api()

# 获取平安银行(000001.SZ)2024年1月的数据
df = pro.daily(ts_code='000001.SZ', start_date='20240101', end_date='20240131')
print(df.head())

跑完这段代码,你会得到一个DataFrame,里面包含日期、开盘价、收盘价、最高价、最低价、成交量等字段。嗯,这就是我们做策略最基础的数据。

我在项目中遇到过一个问题:有时候拿到的数据会有空值。比如某天停牌,那天的数据就是NaN。处理方式很简单,用df.fillna(method='ffill')向前填充就行。但要注意,如果连续停牌好几天,向前填充可能会失真。这时候我一般会直接删除这些行。

注意: Tushare的daily接口有频率限制。普通用户每分钟最多请求200次。如果你要批量拉取几千只股票的数据,记得加个time.sleep(),别把接口搞崩了。

1.4 用AKShare获取期货数据

期货数据和股票不太一样。期货有交割日,有主力合约,还有夜盘。AKShare处理这些就方便多了。

import akshare as ak

# 获取螺纹钢主力连续合约的日线数据
df = ak.futures_main_sina(symbol="RB0")
print(df.head())

这里RB0代表螺纹钢主力连续合约。AKShare会自动帮你处理换月的问题,拿到的就是一条连续的价格曲线。

为什么会需要主力连续合约?因为期货合约会到期,你不能一直交易同一个合约。主力连续合约就是把每个时间段最活跃的合约拼接起来,方便做回测。

我曾经踩过一个坑:直接用单个合约做回测,结果发现策略在换月那天表现异常。后来才意识到,换月时会有价差,这个价差会影响策略收益。所以,做期货回测一定要用主力连续合约,或者自己处理换月逻辑。

1.5 用Tushare获取基金数据

基金数据相对简单,主要是净值数据。Tushare提供了基金净值、基金持仓、基金分红等接口。

# 获取某只基金的净值数据
df = pro.fund_nav(ts_code='110011.OF', start_date='20240101', end_date='20240131')
print(df.head())

这里110011.OF是易方达中小盘混合的代码。拿到的数据包括单位净值、累计净值、日增长率等。

做基金分析时,我一般会关注两个指标:

  • 最大回撤:基金从高点跌到低点的最大幅度。这个指标比波动率更直观。
  • 夏普比率:衡量风险调整后的收益。大于1就算不错了。

这些指标都可以用净值数据算出来。后面讲策略评估的时候,我会详细展开。

1.6 数据存储与缓存

每次跑策略都去拉数据,效率太低了。我建议把数据存到本地,用的时候直接读文件。

# 保存到CSV
df.to_csv('stock_data.csv', index=False)

# 下次读取
df = pd.read_csv('stock_data.csv')

如果你数据量比较大,比如几千只股票的历史数据,CSV就不太够用了。这时候可以考虑用HDF5或者Parquet格式。我个人的习惯是用Parquet,压缩率高,读写速度快。

核心思路: 数据获取只是第一步,更重要的是数据清洗和存储。别把时间浪费在重复拉数据上,建立好本地数据缓存,能让你把精力集中在策略开发上。

1.7 本章知识体系

下面这张图帮你梳理了本章的核心逻辑:

金融数据获取核心流程 数据源 Tushare / AKShare 数据类型 股票 / 期货 / 基金 本地存储 CSV / Parquet ⚠️ 注意事项 API频率限制 | 数据空值处理 | 期货换月逻辑 | Token安全 股票应用 日线数据 / 因子计算 期货应用 主力连续 / 换月处理 基金应用 净值分析 / 回撤计算 核心原则:数据质量决定策略上限,获取只是开始,清洗和存储才是关键

1.8 避坑指南

做数据获取这几年,我踩过的坑不少。挑几个典型的说说:

  • 日期格式问题:Tushare的日期是YYYYMMDD格式,AKShare有的是YYYY-MM-DD。统一处理一下,别混用。
  • 复权问题:股票有除权除息,拿到的价格是前复权还是后复权?我建议用后复权做回测,前复权做分析。具体区别后面会讲。
  • 数据延迟:Tushare的日线数据一般在收盘后半小时更新。如果你在盘中拉数据,拿到的是前一天的数据。

我曾经有一次,因为没注意数据延迟,用昨天的数据跑了个盘中策略,结果回测曲线漂亮得不行,实盘却亏得一塌糊涂。嗯,从那以后,我每次拉数据都会先检查一下数据的时间戳。

1.9 小结

这一章我们讲了怎么用Tushare和AKShare获取股票、期货、基金的数据。说白了,数据获取就是个熟练活,多练几次就上手了。

下一章,我们会讲数据清洗和预处理。你拿到的原始数据往往有缺失值、异常值,怎么处理这些脏数据,是量化工程师的基本功。


专注资料整理