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许可证。
  • 接口wapiakshare 部分支持

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. 推荐数据获取策略

  1. 开发阶段:使用免费API(yfinance、AKShare)快速原型
  2. 回测阶段:下载高质量历史数据到本地数据库
  3. 实盘阶段:订阅专业数据源(Wind、JoinQuant)确保低延迟
  4. 数据备份:定期同步数据到云存储或本地
  5. 多源验证:同一数据从多个源获取,交叉验证准确性

8. 常见问题与解决方案

  • API限制:使用代理、缓存机制、多账号轮询
  • 数据延迟:实时数据需付费,免费数据有15分钟延迟
  • 数据格式不一致:标准化处理(时间戳、字段名)
  • 跨市场数据:注意交易时间、节假日差异

选择数据源时,优先考虑:

  • 数据质量 > 实时性 > 成本
  • 国内市场首选 Tushare/AKShare,国际市场用 yfinance
  • 实盘交易必须使用合规、低延迟的数据源

需要特定市场的数据获取代码或更详细的API使用方法,请告诉我具体需求!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注