第二章:数据源接入实战

做量化交易,第一步就是搞定数据。我见过太多人,策略写得天花乱坠,结果数据源一塌糊涂——要么拿不到历史数据,要么实时行情断流。说白了,数据源就是你的弹药库,弹药不行,枪法再好也白搭。

今天咱们就聊聊三个主流数据源的接入方法:A股用Tushare Pro,美股用Yahoo Finance,期货用AKShare。这三个工具我用了好几年,踩过的坑不少,但用顺手了确实香。

2.1 Tushare Pro:A股数据的首选

Tushare Pro是目前国内最成熟的A股数据接口之一。我个人习惯用它来做日线级别的回测,数据质量很稳。

先装包:

pip install tushare

然后注册获取token。嗯,这里要注意,Tushare Pro需要积分才能拿到完整数据,免费版够用但有限制。

基本用法:

import tushare as ts

# 初始化
pro = ts.pro_api('你的token')

# 获取日线行情
df = pro.daily(ts_code='000001.SZ', start_date='20240101', end_date='20240301')
print(df.head())

我在项目中遇到过一个问题:Tushare的token有调用频率限制,每分钟最多200次。如果你要批量拉取几千只股票,直接循环调用会被封。我的解决方案是加个sleep:

import time

codes = ['000001.SZ', '600036.SH', '300750.SZ']
for code in codes:
    df = pro.daily(ts_code=code, start_date='20240101', end_date='20240301')
    # 处理数据...
    time.sleep(0.5)  # 每只股票间隔0.5秒
小技巧: Tushare Pro的trade_cal接口可以获取交易日历,用来判断某天是不是交易日。我每次做数据清洗都会先拉一份日历,避免把非交易日的数据算进去。

2.2 Yahoo Finance:美股数据的好帮手

美股数据源,Yahoo Finance算是老牌选手了。虽然中间被关停过一阵,但现在用yfinance这个第三方库,体验还不错。

安装:

pip install yfinance

获取苹果公司(AAPL)的日线数据:

import yfinance as yf

# 下载数据
aapl = yf.download('AAPL', start='2024-01-01', end='2024-03-01')
print(aapl.head())

你想想看,Yahoo Finance最方便的地方是什么?它不需要token,直接就能用。但代价就是——数据偶尔会缺失。我曾经在回测中发现某天的开盘价是0,查了半天才发现是Yahoo那边数据源出了问题。

避坑指南: 我曾经在凌晨2点拉取美股数据,结果返回了空值。后来发现Yahoo Finance在非交易时段会返回缓存数据,有时候缓存是空的。建议在美股收盘后1小时再拉取,数据最稳定。

多只股票同时拉取:

tickers = ['AAPL', 'MSFT', 'GOOGL']
data = yf.download(tickers, start='2024-01-01', end='2024-03-01')
# 返回的是MultiIndex DataFrame,列名是 (Open, AAPL), (Close, AAPL) 这种格式
print(data['Close'].head())  # 只看收盘价

2.3 AKShare:期货数据的利器

期货数据这块,AKShare是我用得最多的。它覆盖了国内三大期货交易所(上期所、大商所、郑商所)的行情数据,而且完全免费。

安装:

pip install akshare

获取螺纹钢主力合约的日线数据:

import akshare as ak

# 获取期货日线
df = ak.futures_main_sina(symbol='RB0')
print(df.head())

这里有个细节:AKShare的接口命名比较随意,有的叫futures_main_sina,有的叫futures_zh_minute_sina。我刚开始用的时候经常记混,后来干脆写了个函数封装一下:

def get_futures_data(symbol, start_date, end_date):
    """统一封装期货数据获取"""
    df = ak.futures_main_sina(symbol=symbol)
    df = df[(df['date'] >= start_date) & (df['date'] <= end_date)]
    return df

# 使用
rb_data = get_futures_data('RB0', '2024-01-01', '2024-03-01')
核心要点: AKShare的数据源来自新浪财经,更新频率是分钟级。如果你需要tick级别的数据,它可能不太够用。但做日线级别的回测和策略分析,完全没问题。

2.4 三种数据源的对比

我把这三个数据源的核心差异整理了一下,方便你快速选择:

特性 Tushare Pro Yahoo Finance AKShare
覆盖市场 A股、基金、指数 全球股票、ETF 国内期货、期权
是否需要token
数据质量 高(官方维护) 中等(偶有缺失) 高(来自新浪)
调用频率限制 200次/分钟 无明确限制 无明确限制
适合场景 A股量化回测 美股分析 期货策略研究

2.5 数据同步的核心逻辑

搞定了单个数据源,接下来就是怎么把它们整合到一起。我画了一张图,帮你理清思路:

跨市场数据同步架构 Tushare Pro (A股) Yahoo Finance (美股) AKShare (期货) 统一数据接口层(标准化字段、时间对齐) 数据存储层(CSV / 数据库 / Parquet) 图:跨市场数据同步的三大层级

说白了,数据同步的核心就三步:拉取 → 清洗 → 存储。我习惯先把三个数据源的数据拉到本地,然后统一字段名(比如把Tushare的trade_date和Yahoo的Date都改成date),最后存到同一个数据库里。

我的经验: 别急着把所有数据都存下来。先确定你要做什么策略,只拉取需要的品种和时间范围。我刚开始做的时候,一口气拉了全市场5000只股票,结果硬盘爆了,回测还慢得要命。

2.6 实战:三源数据同步示例

最后给一个完整的示例,把A股、美股、期货的数据拉到一起:

import pandas as pd
import tushare as ts
import yfinance as yf
import akshare as ak

# 1. 拉取A股数据
pro = ts.pro_api('your_token')
a_stock = pro.daily(ts_code='000001.SZ', start_date='20240101', end_date='20240301')
a_stock = a_stock[['trade_date', 'open', 'high', 'low', 'close', 'vol']]
a_stock.columns = ['date', 'open', 'high', 'low', 'close', 'volume']
a_stock['market'] = 'A股'

# 2. 拉取美股数据
us_stock = yf.download('AAPL', start='2024-01-01', end='2024-03-01')
us_stock = us_stock.reset_index()
us_stock = us_stock[['Date', 'Open', 'High', 'Low', 'Close', 'Volume']]
us_stock.columns = ['date', 'open', 'high', 'low', 'close', 'volume']
us_stock['market'] = '美股'

# 3. 拉取期货数据
futures = ak.futures_main_sina(symbol='RB0')
futures = futures[['date', 'open', 'high', 'low', 'close', 'volume']]
futures['market'] = '期货'

# 4. 合并数据
all_data = pd.concat([a_stock, us_stock, futures], ignore_index=True)
print(all_data.head())

嗯,这里要注意:三个数据源的日期格式可能不一样。Tushare是YYYYMMDD,Yahoo是YYYY-MM-DD,AKShare也是YYYY-MM-DD。合并前最好统一格式,不然排序会出问题。

避坑指南: 我曾经在合并数据时没注意时区问题。美股数据用的是美国东部时间,A股是北京时间,期货又是北京时间。如果你要做跨市场套利策略,时间对齐这一步绝对不能省。

好了,数据源接入这块就聊到这儿。记住一句话:数据质量决定策略上限。花时间把数据源调教好,后面写策略会省心很多。


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