返回目錄
A
金融數據分析實務:從資料到洞見 - 第 2 章
第2章:金融數據來源與取得策略
發布於 2026-03-02 09:47
# 第2章:金融數據來源與取得策略
在金融分析的第一階段,**數據的質量與可得性**往往決定了後續模型的可行性與效益。本章將從不同類型的數據來源、取得方式、API 介面與爬蟲技術,逐步闡述如何構建一套可重複、可擴充的數據採集管線。
## 2.1 公開 API:低門檻、高靈活性
| 供應商 | 主要特色 | 可用函式 | 認證方式 |
|--------|----------|----------|----------|
| Alpha Vantage | 免費,限制 5 次/分 | `TIME_SERIES_DAILY_ADJUSTED`, `GLOBAL_QUOTE`, `FX_DAILY` | API Key |
| IEX Cloud | 半免費,實時行情 | `stock/price`, `stock/earnings` | Bearer Token |
| Quandl | 多種金融、宏觀數據 | `WIKI/AAPL`, `FRED/GDP` | API Key |
| Yahoo Finance | 直接爬取,無限制 | N/A | 無需認證 |
### 2.1.1 以 Alpha Vantage 為例
python
import requests
import pandas as pd
api_key = "YOUR_API_KEY"
symbol = "AAPL"
url = f"https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol={symbol}&outputsize=full&apikey={api_key}"
response = requests.get(url)
# 若網路延遲或服務端失敗,請確認 status_code
assert response.status_code == 200, f"HTTP {response.status_code}"
raw_json = response.json()
# 解析成 DataFrame
raw_ts = raw_json.get('Time Series (Daily)', {})
if not raw_ts:
raise ValueError("API 返回空資料或 rate limit 被觸發")
df = pd.DataFrame.from_dict(raw_ts, orient='index')
df.index = pd.to_datetime(df.index)
# 轉換成數值型
float_cols = ['1. open', '2. high', '3. low', '4. close', '5. adjusted close', '6. volume', '7. dividend amount', '8. split coefficient']
df[float_cols] = df[float_cols].astype(float)
print(df.head())
> **注意**:Alpha Vantage 受 rate‑limit 約束,若連續多次請使用 `outputsize=compact` 或使用 `retry` 機制。
### 2.1.2 其他實務工具
- `yfinance`:可一次性拉取多個股票、ETF 的歷史行情與基本面。
- `pandas_datareader`:直接連接 `Yahoo Finance`, `Google Finance`, `FRED`。
- `requests` + `BeautifulSoup`:若 API 無法滿足需求,可將爬蟲納入資料流。
## 2.2 付費數據供應商:完整性與專業度
| 供應商 | 典型產品 | 優勢 | 缺點 |
|--------|----------|------|------|
| Bloomberg | Bloomberg Terminal, Eikon | 實時、深度資料;專業 API | 高昂費用,專業化程度高 |
| Refinitiv (原 Thomson Reuters) | Datastream, Eikon | 經濟數據、財報 | 需要企業授權 |
| FactSet | 財務報表、交易所資料 | 專業化統計,整合度高 | 需長期合約 |
付費數據雖昂貴,但若需 **高頻交易**、**衍生品定價** 或 **全方位風險管理**,投資成本可被長期價值抵消。建議在初期可先使用公開 API 迭代完成原型,待商業化需求成熟後再談付費合作。
## 2.3 代替數據(Alternative Data)
- **社群情緒**:Twitter、Reddit、股評網站的文字情感分析。
- **搜尋趨勢**:Google Trends、Bing Trends。
- **宏觀經濟**:衛星影像、天氣、交通流量。
- **供應鏈**:物流數據、訂單數量。
代替數據往往能補足傳統市場數據的缺口,提供 **前瞻性訊息**。但需注意資料來源可信度、法規合規與數據更新頻率。
## 2.4 網頁爬蟲:從 HTML 到 DataFrame
python
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = "https://finance.yahoo.com/quote/AAPL/history"
headers = {"User-Agent": "Mozilla/5.0"}
resp = requests.get(url, headers=headers)
soup = BeautifulSoup(resp.text, 'html.parser')
# 以表格為例:挑選 <table> 標籤
rows = soup.select('table[data-test="historical-prices"] tr')
data = []
for row in rows[1:]: # 跳過 header
cols = row.find_all('td')
if len(cols) < 6:
continue
data.append([c.text.strip() for c in cols])
columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume']
df = pd.DataFrame(data, columns=columns)
# 清理缺失值、日期轉換
> **警示**:大量爬蟲行為可能觸發網站封鎖,請務必遵守 robots.txt 與使用條款。
## 2.5 資料庫存取:結構化資料儲存
- **關聯式**:PostgreSQL、MySQL,用於存放歷史行情、公司基本面。
- **文件型**:MongoDB、CouchDB,適合非結構化數據(新聞、評論)。
- **雲端 RDS**:AWS RDS、GCP Cloud SQL,省去自行維護硬體。
常見儲存流程:
1. 先將 DataFrame 轉存為 CSV 或 Parquet。
2. 使用 `COPY` 或 `INSERT` 批次載入資料庫。
3. 建立索引(例如 `date`, `symbol`)以提升查詢效率。
## 2.6 資料管道與工作流:自動化 & 可追蹤
| 工具 | 特點 | 適用場景 |
|------|------|-----------|
| Airflow | DAG 方式排程 | 大規模批次處理 |
| Prefect | 更友好的 Python API | 中型到大型專案 |
| Luigi | 依賴管理 | 內部工具 |
| Dagster | 型別安全 | 專業開發 |
> 以 Airflow 為例:設定 `daily_etl.py`
python
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime
with DAG("daily_etl", start_date=datetime(2023, 1, 1), schedule_interval="@daily") as dag:
def fetch_and_store():
# 1. 取得資料
df = fetch_from_api("AAPL")
# 2. 清洗
df_clean = clean(df)
# 3. 儲存
df_clean.to_sql(name="stocks_aapl", con=engine, if_exists="replace")
task = PythonOperator(task_id="fetch_and_store", python_callable=fetch_and_store)
## 2.7 資料品質治理
| 原因 | 檢測 | 修正 |
|------|------|------|
| 缺失值 | `df.isna().sum()` | 補值(中位數、前值填補) |
| 時間戳不統一 | `pd.to_datetime()` | 標準化時間戳(UTC) |
| 雙重資料 | `df.drop_duplicates()` | 去重 |
| 外部因素噪音 | `zscore` 檢測 | 滤除 |
**最佳實踐**:
- 所有原始檔案保存原始副本。
- 資料轉換過程中生成 **metadata**(版本、時間、來源)。
- 監控 pipeline 執行,遇到失敗即自動重試或發送通知。
## 小結
- **多元資料來源**:公開 API、付費數據、代替數據、爬蟲;各有優劣,應依業務需求選擇。
- **結構化儲存**:關聯式資料庫結合 Parquet,確保可擴充與查詢效率。
- **自動化流程**:使用 Airflow/Prefect 等工具實現可追蹤、可重複的 ETL 管線。
- **品質治理**:從缺失值、時區到重複項,確保數據可靠性。
在本章結束後,讀者應已掌握從「數據來源選擇」到「資料庫儲存」的完整流程,為接下來的清洗與探索奠定堅實基礎。