在金融领域,实时数据对于交易决策、行情分析和量化策略至关重要。Python 拥有丰富的数据抓取、分析和可视化工具,使得金融数据实时处理变得可行。本文将带你从零到一,完成 Python 爬虫抓取股票/金融数据并实时分析 的完整实战流程。


一、技术选型

  1. 数据源

    • 新浪财经、东方财富、雅虎财经等公开 API 或网页
    • 重点关注股票实时行情、历史行情、财务指标等
  2. Python 爬虫库

    • requests / aiohttp:同步与异步 HTTP 请求
    • BeautifulSoup / lxml:网页解析
    • pandas:数据清洗与分析
  3. 实时分析与可视化

    • pandas:计算涨跌幅、均线、波动率
    • matplotlib / plotly:图表可视化
    • streamlitdash:构建实时数据仪表盘

二、抓取股票实时行情

1. 使用 requests 抓取新浪股票数据

import requests
import pandas as pd

url = "http://hq.sinajs.cn/list=sh600000,sz000001"
res = requests.get(url)
res.encoding = "gbk"
data = res.text.split(',')

stock_info = {
    "symbol": "sh600000",
    "name": data[0].split('"')[1],
    "open": float(data[1]),
    "prev_close": float(data[2]),
    "price": float(data[3]),
    "high": float(data[4]),
    "low": float(data[5]),
    "volume": int(data[8])
}

df = pd.DataFrame([stock_info])
print(df)

说明

  • URL 中的 sh600000sz000001 分别为沪深两市股票代码
  • 数据包含开盘价、收盘价、当前价、最高、最低、成交量

2. 批量抓取多个股票

stocks = ["sh600000", "sz000001", "sh600519"]
url = "http://hq.sinajs.cn/list=" + ",".join(stocks)
res = requests.get(url)
res.encoding = "gbk"
lines = res.text.strip().split("\n")

data_list = []
for line in lines:
    parts = line.split(",")
    info = {
        "symbol": parts[0].split('"')[1],
        "name": parts[0].split('"')[0][-6:],
        "price": float(parts[3]),
        "volume": int(parts[8])
    }
    data_list.append(info)

df = pd.DataFrame(data_list)
print(df)

三、实时抓取与异步处理

当股票数量很多时,可以使用 aiohttp + asyncio 提高抓取效率:

import asyncio
import aiohttp
import pandas as pd

stocks = ["sh600000", "sz000001", "sh600519"]
url_template = "http://hq.sinajs.cn/list={}"

async def fetch(session, url):
    async with session.get(url) as resp:
        text = await resp.text(encoding="gbk")
        return text

async def main():
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url_template.format(stock)) for stock in stocks]
        results = await asyncio.gather(*tasks)

        data_list = []
        for line in results:
            parts = line.split(",")
            info = {
                "symbol": parts[0].split('"')[1],
                "name": parts[0].split('"')[0][-6:],
                "price": float(parts[3]),
                "volume": int(parts[8])
            }
            data_list.append(info)
        df = pd.DataFrame(data_list)
        print(df)

asyncio.run(main())

亮点

  • 多股票同时抓取,提高抓取速度
  • 异步 IO 减少阻塞

四、实时数据分析

1. 计算涨跌幅

df["change_pct"] = (df["price"] - df["prev_close"]) / df["prev_close"] * 100

2. 计算移动均线

# 假设 df_stock 为历史数据
df_stock["ma5"] = df_stock["price"].rolling(5).mean()
df_stock["ma10"] = df_stock["price"].rolling(10).mean()

3. 波动率计算

df_stock["returns"] = df_stock["price"].pct_change()
volatility = df_stock["returns"].rolling(10).std()

五、可视化实时数据

1. Matplotlib 简单折线图

import matplotlib.pyplot as plt

plt.plot(df_stock["price"], label="Price")
plt.plot(df_stock["ma5"], label="MA5")
plt.plot(df_stock["ma10"], label="MA10")
plt.legend()
plt.show()

2. Plotly 实时交互图

import plotly.graph_objects as go

fig = go.Figure()
fig.add_trace(go.Scatter(y=df_stock["price"], name="Price"))
fig.add_trace(go.Scatter(y=df_stock["ma5"], name="MA5"))
fig.add_trace(go.Scatter(y=df_stock["ma10"], name="MA10"))
fig.show()

3. Streamlit 实时仪表盘

import streamlit as st
import pandas as pd
import time

st.title("实时股票行情")

while True:
    df = get_stock_data(stocks)  # 封装前面抓取逻辑
    st.dataframe(df)
    time.sleep(5)  # 每5秒更新一次

六、抓取大规模金融数据优化策略

  1. 异步并发抓取

    • aiohttp + asyncio,提高大数据量抓取效率
  2. 缓存与去重

    • Redis 缓存已抓取股票,避免重复抓取
  3. 批量写入数据库

    • 使用 MySQL、MongoDB 批量写入,提高 IO 效率
  4. 数据压缩与存储优化

    • CSV/Gzip/Parquet 等高效存储格式
  5. 分布式抓取

    • Scrapy + Redis,支持多节点同时抓取

七、实战案例:沪深300实时监控

  1. 目标:抓取沪深300成分股,每分钟计算涨跌幅

  2. 方案:

    • 使用 asyncio 异步抓取
    • pandas 计算涨跌幅和均线
    • Plotly / Streamlit 可视化
  3. 优化点:

    • 并发控制 Semaphore
    • 异常重试机制
    • 批量数据库写入

八、总结

通过本文,你学会了:

  • 使用 Python 抓取股票/金融数据(同步与异步)
  • 实时分析数据,包括涨跌幅、均线、波动率
  • 可视化实时数据,搭建仪表盘
  • 对大规模金融数据抓取的优化策略

Python 爬虫结合金融数据分析,可实现实时监控、量化策略回测和大数据分析,为投资决策提供数据支持。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐