Python 获取金融数据
Python 获取金融数据指南
获取高质量金融数据是量化交易的基础。Python 提供了多种方式从不同来源获取股票、期货、外汇等数据,包括免费API、付费数据源和本地文件解析。以下是主流方法和工具。
1. 免费数据源与API
Yahoo Finance (yfinance)
- 特点:最常用免费数据源,支持股票、ETF、指数、加密货币。历史数据完整,日内数据有限。
- 安装:
pip install yfinance
- 示例:
import yfinance as yf
import pandas as pd
# 获取单只股票历史数据
ticker = "AAPL"
stock = yf.Ticker(ticker)
hist = stock.history(period="1y", interval="1d") # 1年日K线
print(hist.head())
# 获取基本信息
info = stock.info
print(f"公司名称: {info['longName']}")
print(f"当前价格: {info['currentPrice']}")
# 批量获取多只股票
tickers = ["AAPL", "MSFT", "GOOGL"]
data = yf.download(tickers, start="2020-01-01", end="2025-01-01")
print(data.head())
Alpha Vantage
- 特点:免费API密钥(每日500次调用),支持技术指标、外汇、加密货币。
- 注册:https://www.alphavantage.co/support/#api-key
- 安装:
pip install alpha_vantage
from alpha_vantage.timeseries import TimeSeries
from alpha_vantage.techindicators import TechIndicators
key = "YOUR_API_KEY"
ts = TimeSeries(key=key, output_format='pandas')
# 获取日K线
data, meta_data = ts.get_daily(symbol='IBM', outputsize='full')
print(data.head())
# 获取技术指标
ti = TechIndicators(key=key, output_format='pandas')
sma, meta = ti.get_sma(symbol='IBM', interval='daily', time_period=20)
print(sma.head())
Tushare (国内股票)
- 特点:专注中国市场(A股、港股、期货),免费基础数据,Pro版更丰富。
- 注册:https://tushare.pro/ 获取token
- 安装:
pip install tushare
import tushare as ts
import pandas as pd
# 设置token
ts.set_token('your_token_here')
pro = ts.pro_api()
# 获取股票基本信息
basic = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area')
print(basic.head())
# 获取日K线数据
daily = pro.daily(ts_code='000001.SZ', start_date='20240101', end_date='20250101')
print(daily.head())
# 获取指数数据
index_daily = pro.index_daily(ts_code='000300.SH', start_date='20240101', end_date='20250101')
2. 付费/专业数据源
Wind金融终端接口
- 特点:国内最专业金融数据,覆盖所有市场,需Wind许可证。
- 接口:
wapi
或akshare
部分支持
JoinQuant 聚宽平台
- 特点:国内量化平台,提供丰富数据和回测环境,Python API。
- 注册:https://www.joinquant.com/
RiceQuant 米筐
- 特点:支持Python策略开发,数据质量高,API接口。
AKShare
- 特点:聚合多种数据源(免费+付费),国内市场数据丰富。
- 安装:
pip install akshare
import akshare as ak
# A股日K线
stock_zh_a_daily = ak.stock_zh_a_daily(symbol="sh600000", start_date="20200101000000", end_date="20250101000000")
print(stock_zh_a_daily.head())
# 基金净值
fund_nav = ak.fund_nav(symbol="000001")
print(fund_nav.head())
# 宏观经济数据
macro_china_gdp_yearly = ak.macro_china_gdp_yearly()
print(macro_china_gdp_yearly)
3. 实时数据获取
WebSocket 实时行情
import websocket
import json
import pandas as pd
def on_message(ws, message):
data = json.loads(message)
print(data) # 处理实时行情数据
def on_error(ws, error):
print(error)
def on_close(ws):
print("### closed ###")
def on_open(ws):
# 订阅实时数据
subscribe = {"op": "subscribe", "args": ["tickers:AAPL"]}
ws.send(json.dumps(subscribe))
# 使用 WebSocket 连接(示例:使用第三方API)
websocket.enableTrace(True)
ws = websocket.WebSocketApp("wss://api.example.com/ws",
on_message=on_message,
on_error=on_error,
on_close=on_close)
ws.on_open = on_open
ws.run_forever()
TuShare Pro 实时数据
# 实时报价
quote = pro.trade_cal(exchange='SSE', start_date='20250101', end_date='20250131')
realtime = pro.snap(ts_code='000001.SZ', trade_date='20250117')
print(realtime)
4. 数据存储与管理
本地数据库存储
import sqlite3
import pandas as pd
# 创建SQLite数据库
conn = sqlite3.connect('financial_data.db')
# 存储数据
df = yf.download('AAPL', start='2020-01-01', end='2025-01-01')
df.to_sql('AAPL_daily', conn, if_exists='replace', index=True)
# 查询数据
query_df = pd.read_sql('SELECT * FROM AAPL_daily WHERE Date > "2024-01-01"', conn)
print(query_df.head())
conn.close()
数据清洗与预处理
import pandas as pd
import numpy as np
def clean_financial_data(df):
"""清洗金融数据"""
# 删除缺失值
df = df.dropna()
# 处理异常值(价格不能为负)
df = df[df['Close'] > 0]
# 计算收益率
df['Returns'] = df['Close'].pct_change()
# 添加技术指标
df['MA20'] = df['Close'].rolling(window=20).mean()
df['RSI'] = compute_rsi(df['Close'], 14)
return df
def compute_rsi(prices, window=14):
"""计算RSI指标"""
delta = prices.diff()
gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()
rs = gain / loss
rsi = 100 - (100 / (1 + rs))
return rsi
5. 国内特色数据源
东方财富、同花顺接口
# 通过akshare获取
eastmoney_fund = ak.fund_em_fundinfo(symbol="000001")
print(eastmoney_fund)
# 期货数据
futures_main_sina = ak.futures_main_sina()
print(futures_main_sina.head())
Level-2 行情数据
- 特点:Tick级数据、委托队列,需付费订阅
- 来源:Wind、Choice、同花顺Level-2
6. 数据质量控制
def validate_financial_data(df):
"""验证数据质量"""
issues = []
# 检查时间序列连续性
if df.index.is_monotonic_increasing:
print("✓ 时间序列有序")
else:
issues.append("时间序列不连续")
# 检查价格合理性
if (df['High'] >= df['Low']).all():
print("✓ 价格关系合理")
else:
issues.append("高价低于低价")
# 检查成交量
if (df['Volume'] >= 0).all():
print("✓ 成交量非负")
else:
issues.append("成交量异常")
if issues:
print("⚠️ 数据质量问题:", issues)
else:
print("✓ 数据质量通过")
return len(issues) == 0
# 使用示例
df = yf.download('AAPL', start='2024-01-01')
validate_financial_data(df)
7. 推荐数据获取策略
- 开发阶段:使用免费API(yfinance、AKShare)快速原型
- 回测阶段:下载高质量历史数据到本地数据库
- 实盘阶段:订阅专业数据源(Wind、JoinQuant)确保低延迟
- 数据备份:定期同步数据到云存储或本地
- 多源验证:同一数据从多个源获取,交叉验证准确性
8. 常见问题与解决方案
- API限制:使用代理、缓存机制、多账号轮询
- 数据延迟:实时数据需付费,免费数据有15分钟延迟
- 数据格式不一致:标准化处理(时间戳、字段名)
- 跨市场数据:注意交易时间、节假日差异
选择数据源时,优先考虑:
- 数据质量 > 实时性 > 成本
- 国内市场首选 Tushare/AKShare,国际市场用 yfinance
- 实盘交易必须使用合规、低延迟的数据源
需要特定市场的数据获取代码或更详细的API使用方法,请告诉我具体需求!