# Python怎么爬取股票交易數據并可視化展示
## 一、前言
在金融數據分析領域,獲取實時或歷史的股票交易數據并進行可視化分析是量化投資、市場研究的重要基礎。Python憑借其豐富的第三方庫(如`requests`、`pandas`、`matplotlib`等),成為實現這一目標的理想工具。本文將詳細介紹如何使用Python爬取股票數據,并通過可視化技術展示關鍵指標。
---
## 二、數據獲取途徑
### 2.1 免費數據源
1. **Yahoo Finance API**
通過`yfinance`庫可直接獲取全球多交易所數據:
```python
import yfinance as yf
data = yf.download("AAPL", start="2023-01-01", end="2023-12-31")
Tushare Pro
國內股票數據接口(需注冊):
import tushare as ts
ts.set_token('your_token')
pro = ts.pro_api()
df = pro.daily(ts_code='600519.SH')
AKShare
開源金融數據接口:
import akshare as ak
stock_zh = ak.stock_zh_a_daily(symbol="sh600519")
服務商 | 特點 | 費用區間 |
---|---|---|
Alpha Vantage | 全球數據,API限制 | 免費/月$49 |
Wind | 機構級數據 | 年費10萬+ |
同花順i問財 | 中文場景優化 | 按需購買 |
通過瀏覽器開發者工具(F12)分析請求:
- 數據接口:https://finance.sina.com.cn/realstock/company/sh600519/nc.shtml
- 實際數據通過AJAX請求獲取,真實API地址可在XHR中查找
import requests
import pandas as pd
from fake_useragent import UserAgent
def get_sina_stock(code):
url = f"http://hq.sinajs.cn/list={code}"
headers = {"User-Agent": UserAgent().random}
response = requests.get(url, headers=headers)
data = response.text.split(",")
return {
"名稱": data[0].split('"')[1],
"開盤價": float(data[1]),
"收盤價": float(data[3]),
"最高價": float(data[4]),
"最低價": float(data[5]),
"成交量": int(data[8])
}
# 示例:獲取貴州茅臺實時數據
print(get_sina_stock("sh600519"))
import pandas as pd
# 示例:處理Yahoo Finance數據
df = yf.download("AAPL", period="1y")
df = df.reset_index()
# 計算移動平均線
df['MA5'] = df['Close'].rolling(5).mean()
df['MA20'] = df['Close'].rolling(20).mean()
CSV文件
df.to_csv("stock_data.csv", index=False)
MySQL數據庫
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://user:pass@localhost/stock_db')
df.to_sql('apple_data', con=engine, if_exists='replace')
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['stock']
db['apple'].insert_many(df.to_dict('records'))
import mplfinance as mpf
# 需要將日期設為索引
df = df.set_index('Date')
mpf.plot(df, type='candle', mav=(5,20), volume=True)
import plotly.graph_objects as go
fig = go.Figure(data=[go.Candlestick(
x=df.index,
open=df['Open'],
high=df['High'],
low=df['Low'],
close=df['Close']
)])
fig.update_layout(title='Apple Stock Price')
fig.show()
import talib
# 計算MACD
df['MACD'], df['Signal'], _ = talib.MACD(df['Close'])
# 繪制雙坐標軸圖表
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12,8))
ax1.plot(df['Close'], label='Price')
ax1.plot(df['MA5'], label='5日均線')
ax2.plot(df['MACD'], label='MACD', color='red')
ax2.plot(df['Signal'], label='Signal', color='blue')
def get_a_stock():
stock_df = ak.stock_zh_a_daily(symbol="sh600519")
# 添加基本面數據
basic_df = ak.stock_financial_report_sina(stock="600519", symbol="現金流量表")
return pd.merge(stock_df, basic_df, on='date')
import dash
from dash import dcc, html
app = dash.Dash()
app.layout = html.Div([
dcc.Graph(id='kline-chart'),
dcc.Dropdown(
id='stock-selector',
options=[{'label': '茅臺', 'value': '600519'}]
)
])
if __name__ == '__main__':
app.run_server(debug=True)
合規性
數據質量
df.isnull().sum()
df = df[(df['volume'] > 0)]
緩存策略
使用requests_cache
減少重復請求:
import requests_cache
requests_cache.install_cache('stock_cache')
量化交易策略
結合backtrader庫進行策略回測:
import backtrader as bt
class MyStrategy(bt.Strategy):
def next(self):
if self.data.close[0] > self.data.ma[0]:
self.buy()
預測模型
使用Prophet進行價格預測:
from prophet import Prophet
model = Prophet(daily_seasonality=True)
model.fit(df[['Date','Close']].rename(columns={'Date':'ds','Close':'y'}))
實時監控系統
通過APScheduler實現定時任務:
from apscheduler.schedulers.blocking import BlockingScheduler
def job():
print(get_sina_stock("sh600519"))
scheduler = BlockingScheduler()
scheduler.add_job(job, 'interval', hours=1)
本文系統介紹了從數據獲取到可視化的完整流程,關鍵要點包括: 1. 優先選擇穩定的官方API 2. 爬蟲需遵守robots.txt協議 3. 可視化應突出核心指標 4. 生產環境需要添加異常處理
完整項目代碼可參考GitHub倉庫:示例鏈接
注:實際代碼運行時需要替換相關API密鑰,市場有風險,投資需謹慎。 “`
(全文約2750字,實際字數可能因Markdown渲染略有差異)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。