量化交易的核心在于数据。无论是回测策略还是实盘交易,高质量、实时性的数据都是成功的关键。本文将深入调研 GitHub 上主流的量化交易数据获取项目,帮助你选择最适合的数据源。
| 项目 | Stars | 类型 | 覆盖市场 | 核心特性 |
|---|---|---|---|---|
| **CCXT** | 41k | 加密货币 API | 107+ 交易所 | 统一 API、WebSocket 实时流 |
| **Qlib** | 37.5k | AI 量化平台 | 美股、A股 | 微软出品、完整 ML 流水线 |
| **AKShare** | 16.3k | 金融数据 API | 以A股为主 | 免费开源、30+ 数据源 |
| **Tushare** | 14.4k | A股数据 | A股 | 积分制访问、数据全面 |
| **yfinance** | ~12k | Yahoo Finance | 美股 | 历史数据获取 |
| **FinRL-Meta** | ~3k | RL 框架 | 多源聚合 | 强化学习、多源整合 |
GitHub: https://github.com/akfamily/akshare
Stars: 16.3k+
License: MIT
pip install akshare --upgradeimport akshare as ak
# 获取A股历史K线数据
df = ak.stock_zh_a_hist(symbol="000001", period="daily", start_date="20230101", end_date="20231231")
print(df.head())
# 获取实时行情
realtime = ak.stock_zh_a_spot_em()
print(realtime.head())
# 获取美股数据
us_stock = ak.stock_us_daily(symbol="AAPL", adjust="qfq")
print(us_stock.head())
# 获取加密货币行情
crypto = ak.crypto_hist(symbol="BTC", period="1d")
print(crypto.head())
┌─────────────────────────────────────────┐
│ AKShare 架构 │
├─────────────────────────────────────────┤
│ 交易所数据 │ 财经门户 │
│ - 上交所 │ - 东方财富 │
│ - 深交所 │ - 新浪财经 │
│ - 中金所 │ - 同花顺 │
├─────────────────────────────────────────┤
│ 数据类型 │
│ - 股票行情(实时/历史) │
│ - 财务数据 │
│ - 宏观经济 │
│ - 期货/期权/外汇 │
└─────────────────────────────────────────┘
GitHub: https://github.com/ccxt/ccxt
Stars: 41k+
License: MIT
import ccxt
# 创建交易所实例
exchange = ccxt.binance()
# 获取市场行情
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker)
# 获取K线数据
ohlcvs = exchange.fetch_ohlcv('BTC/USDT', '1h', limit=100)
print(ohlcvs)
# 获取订单簿
orderbook = exchange.fetch_order_book('BTC/USDT')
print(orderbook)
# 使用 CCXT Pro 获取实时数据(需要订阅)
# import ccxtpro
# exchange = ccxtpro.binance()
# ticker = await exchange.watch_ticker('BTC/USDT')
# 查看支持的交易所
print(ccxt.exchanges)
# 输出: ['binance', 'okx', 'bybit', 'coinbase', 'kraken', 'huobi', ...]
# 切换交易所只需更换实例
okx = ccxt.okx()
bybit = ccxt.bybit()
GitHub: https://github.com/waditu/tushare
Stars: 14.4k+
import tushare as ts
# 设置Token(需注册获取)
pro = ts.pro_api('your_token_here')
# 获取股票列表
stock_list = pro.stock_basic(exchange='', list_status='L')
print(stock_list.head())
# 获取日线行情
df = pro.daily(ts_code='000001.SZ', start_date='20230101', end_date='20231231')
print(df.head())
# 获取财务数据
income = pro.income(ts_code='000001.SZ', start_date='20230101', end_date='20231231')
print(income.head())
# 获取指数数据
index = pro.index_daily(ts_code='000001.SH', start_date='20230101')
print(index.head())
| 数据类型 | 说明 |
|---|---|
| 日线/周线/月线 | 股票历史行情 |
| 财务报表 | 利润表、资产负债表、现金流量表 |
| 公司信息 | 基本面、股东、管理层 |
| 指数数据 | 各类指数成分和行情 |
| 基金数据 | 公募基金净值和持仓 |
GitHub: https://github.com/ranaroussi/yfinance
Stars: ~12k
import yfinance as yf
# 获取股票数据
ticker = yf.Ticker("AAPL")
# 获取历史数据
hist = ticker.history(period="1y")
print(hist.head())
# 获取公司信息
info = ticker.info
print(info['longName'], info['sector'])
# 批量获取多只股票
data = yf.download("AAPL MSFT GOOGL", start="2023-01-01", end="2023-12-31")
print(data.head())
# 获取实时价格
fast_info = ticker.fast_info
print(fast_info['last_price'])
GitHub: https://github.com/microsoft/qlib
Stars: 37.5k+
import qlib
from qlib.constant import REG_CN
# 初始化(自动下载数据)
qlib.init(provider_uri='~/.qlib/qlib_data/cn_data', region=REG_CN)
# 获取数据
from qlib.data import D
instruments = D.instruments(market='all')
print(instruments)
# 使用表达式引擎
from qlib.data.expr import Eval
expr = Eval("Ref($close, -1) / $close - 1") # 计算收益率
GitHub: https://github.com/AI4Finance-Foundation/FinRL-Meta
Stars: ~3k
from finrl.meta.preprocessor.yahoodownloader import YahooDownloader
from finrl.meta.preprocessor.preprocessors import FeatureEngineer
# 下载股票数据
DOWNLOADER = YahooDownloader(
start_date='2023-01-01',
end_date='2023-12-31',
ticker_list=['AAPL', 'GOOGL', 'MSFT']
)
df = DOWNLOADER.fetch_data()
# 特征工程
fe = FeatureEngineer(
use_technical_indicator=True,
tech_indicator_list=['macd', 'rsi_30', 'cci_30']
)
processed = fe.preprocess_data(df)
| 特性 | 实时数据 | 历史数据 |
|---|---|---|
| 用途 | 实盘交易、监控 | 回测、研究 |
| 数据源 | WebSocket、流API | REST API、文件下载 |
| 延迟要求 | 毫秒级 | 无要求 |
| 成本 | 较高 | 通常免费或低价 |
| 推荐项目 | CCXT Pro、Polygon | AKShare、yfinance |
# CCXT Pro WebSocket 实时数据
import ccxtpro.async_support as ccxtpro
import asyncio
async def watch_ticker():
exchange = ccxtpro.binance()
while True:
ticker = await exchange.watch_ticker('BTC/USDT')
print(f"实时价格: {ticker['last']}")
asyncio.run(watch_ticker())
| 市场 | 首选 | 备选 |
|---|---|---|
| A股 | AKShare / Tushare | Qlib |
| 美股 | yfinance | Qlib |
| 港股 | AKShare | yfinance |
| 加密货币 | CCXT | AKShare |
| 期货 | AKShare | Tushare |
| 需求 | 推荐 |
|---|---|
| 免费入门 | AKShare |
| 专业研究 | Tushare Pro |
| 加密交易 | CCXT + CCXT Pro |
| 机器学习 | Qlib / FinRL-Meta |
| 实时交易 | CCXT Pro |
def check_data_quality(df):
"""数据质量检查"""
print(f"缺失值统计:\n{df.isnull().sum()}")
print(f"数据时间范围: {df.index.min()} ~ {df.index.max()}")
print(f"数据行数: {len(df)}")
return df.describe()
# 用多个数据源交叉验证
import akshare as ak
import yfinance as yf
# 对比同一标的数据
ak_data = ak.stock_us_daily(symbol="AAPL")
yf_data = yf.Ticker("AAPL").history(period="1y")
# 检查一致性
# ...
import pandas as pd
from datetime import datetime, timedelta
import os
def get_cached_data(symbol, days=30, cache_dir='./cache'):
"""带缓存的数据获取"""
os.makedirs(cache_dir, exist_ok=True)
cache_file = f"{cache_dir}/{symbol}.parquet"
if os.path.exists(cache_file):
df = pd.read_parquet(cache_file)
last_date = df.index[-1]
if datetime.now() - last_date.to_pydatetime() < timedelta(days=1):
return df
# 获取新数据
import akshare as ak
new_data = ak.stock_zh_a_hist(symbol=symbol, period="daily")
new_data.to_parquet(cache_file)
return new_data
量化交易数据获取已经形成完整的开源生态系统:
参考资料:GitHub 项目官方文档及源码
还没有人回复