Python获取A股实时行情数据

在量化交易的世界里,数据是燃料,行情是基础。没有准确、及时的实时行情数据,再精妙的策略也只是空中楼阁。对于刚入门量化交易的朋友来说,如何获取实时行情往往是第一个需要解决的技术问题。今天,我就来详细介绍几种常用的实时行情获取方法,帮助你迈出量化交易的第一步。

方法一:AkShare(A 股免费数据首选)

AkShare 是一个开源的 Python 财经数据接口库,由国内开发者维护,专门针对 A 股市场设计。它的最大优势是完全免费、无需注册、数据覆盖面广。


import akshare as ak

# 获取 A 股实时行情
df = ak.stock_zh_a_spot_em()
print(df[["代码", "名称", "最新价", "涨跌幅", "成交量"]].head(10))

# 获取个股实时行情
df = ak.stock_zh_a_spot_em(symbol="sz000001")
print(df)

AkShare 的数据来源主要是东方财富、新浪财经等公开数据源,通过爬虫技术获取。它可以获取 A 股、港股、美股、期货、期权、基金等多种金融数据。

优点:

  • 完全免费,无需注册 API Key
  • 数据种类丰富,覆盖多个市场
  • 社区活跃,更新频繁

缺点:

  • 数据稳定性依赖源网站,可能偶尔失效
  • 有调用频率限制,不适合高频交易
  • 数据有 15 分钟左右延迟

方法二:Tushare(专业量化数据平台)

Tushare 是国内老牌的财经数据平台,提供稳定、规范的金融数据接口。它有免费版和付费版,免费版可以满足基本需求,付费版提供更高质量的数据。


import tushare as ts

# 初始化(需要注册获取 token)
ts.set_token('your_token_here')
pro = ts.pro_api()

# 获取实时行情
df = ts.get_realtime_quotes("000001")
print(df[["code", "name", "price", "change", "volume"]])

# Pro 版本接口
df = pro.daily(ts_code="000001.SZ", start_date="20240101")
print(df.head())

使用 Tushare 需要先在其官网注册账号,获取 API Token。免费版每天有固定的积分额度,付费版可以享受更多数据和服务。

优点:

  • 数据稳定可靠,适合生产环境
  • 文档完善,示例丰富
  • 支持多种数据格式和历史数据

缺点:

  • 免费版有限制,高频使用需要付费
  • 需要注册获取 Token
  • 实时数据精度有限

方法三:Yahoo Finance(港股美股数据)

如果你交易港股或美股,Yahoo Finance 是一个非常不错的选择。它通过 yfinance 库提供免费的全球市场数据。


import yfinance as yf

# 获取美股实时数据
aapl = yf.Ticker("AAPL")
print(aapl.history(period="1d"))

# 获取港股实时数据
hsbc = yf.Ticker("0005.HK")
print(hsbc.history(period="1d"))

# 获取多个股票数据
tickers = yf.download(["AAPL", "GOOGL", "MSFT"], period="1d")
print(tickers)

yfinance 库使用非常简单,无需注册即可使用。它支持美股、港股、外汇、加密货币等多种资产类别。

优点:

  • 完全免费,无需注册
  • 覆盖全球主要市场
  • 支持历史数据和实时数据

缺点:

  • A 股数据支持有限
  • 数据延迟约 15-20 分钟
  • 高频调用可能被限制

其他数据源

除了上述三种主流方法,还有一些其他数据源值得了解:

新浪财经接口:通过 HTTP 请求直接获取,速度快,但需要自己解析数据格式。

券商 API:部分券商提供量化交易接口,如华泰、中信等,可以获取实时行情并直接交易。

专业数据服务商:如 Wind、Choice、同花顺 iFinD 等,数据质量高,但价格昂贵,适合机构用户。

注意事项

使用免费数据源时,有几点需要特别注意:

免费数据有延迟(15 分钟左右)。这是免费数据的通病,因为交易所的实时行情是需要付费购买的。对于短线交易来说,15 分钟的延迟可能是致命的,但对于中长线策略影响不大。

高频交易需要付费数据源。如果你的策略依赖高频数据或需要快速执行,建议购买专业的付费数据服务。付费数据通常延迟在毫秒级别,稳定性也更有保障。

注意 API 调用频率限制。免费接口通常有调用次数限制,过于频繁的请求可能导致 IP 被封。建议做好数据缓存,避免重复请求。

数据质量需要验证。免费数据可能存在错误或缺失,使用前最好进行数据清洗和验证。特别是进行回测时,数据质量直接影响结果的可靠性。

实战建议

以下是几个实用建议:

  1. 多数据源备份。不要依赖单一数据源,可以配置多个数据源,当一个失效时自动切换到另一个。

  2. 做好数据缓存。获取的数据可以本地存储,避免重复请求。可以使用 SQLite、MySQL 或 HDF5 等格式存储。

  3. 异常处理要完善。网络请求可能失败,代码中要加入 try-except 处理,确保程序稳定运行。

  4. 遵守使用条款。使用免费数据时要遵守相关服务条款,不要用于商业用途或过度爬取。

完整示例

以下是一个完整的实时行情监控示例:


import akshare as ak
import pandas as pd
import time

def monitor_stocks(stock_codes, target_price):
    """监控股票价格,达到目标价时提醒"""
    while True:
        try:
            df = ak.stock_zh_a_spot_em()
            for code in stock_codes:
                stock = df[df["代码"] == code]
                if not stock.empty:
                    price = float(stock["最新价"].values[0])
                    if price >= target_price[code]:
                        print(f"⚠️ {code} 达到目标价 {price}")
            time.sleep(60)  # 每分钟检查一次
        except Exception as e:
            print(f"错误:{e}")
            time.sleep(10)

# 使用示例
# monitor_stocks(["sz000001", "sh600000"], {"sz000001": 10.5})

免责说明:本文仅供技术分享,不构成任何投资建议。数据接口可能随时变化,请以官方文档为准。投资有风险,入市需谨慎。

发表评论