第二章:数据源接入实战
做量化交易,第一步就是搞定数据。我见过太多人,策略写得天花乱坠,结果数据源一塌糊涂——要么拿不到历史数据,要么实时行情断流。说白了,数据源就是你的弹药库,弹药不行,枪法再好也白搭。
今天咱们就聊聊三个主流数据源的接入方法: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秒
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那边数据源出了问题。
多只股票同时拉取:
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')
2.4 三种数据源的对比
我把这三个数据源的核心差异整理了一下,方便你快速选择:
| 特性 | Tushare Pro | Yahoo Finance | AKShare |
|---|---|---|---|
| 覆盖市场 | A股、基金、指数 | 全球股票、ETF | 国内期货、期权 |
| 是否需要token | 是 | 否 | 否 |
| 数据质量 | 高(官方维护) | 中等(偶有缺失) | 高(来自新浪) |
| 调用频率限制 | 200次/分钟 | 无明确限制 | 无明确限制 |
| 适合场景 | A股量化回测 | 美股分析 | 期货策略研究 |
2.5 数据同步的核心逻辑
搞定了单个数据源,接下来就是怎么把它们整合到一起。我画了一张图,帮你理清思路:
说白了,数据同步的核心就三步:拉取 → 清洗 → 存储。我习惯先把三个数据源的数据拉到本地,然后统一字段名(比如把Tushare的trade_date和Yahoo的Date都改成date),最后存到同一个数据库里。
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。合并前最好统一格式,不然排序会出问题。
好了,数据源接入这块就聊到这儿。记住一句话:数据质量决定策略上限。花时间把数据源调教好,后面写策略会省心很多。
公众号:蓝海资料掘金营,微信deep3321