聊天視窗

金融數據分析實務:從資料到洞見 - 第 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 管線。 - **品質治理**:從缺失值、時區到重複項,確保數據可靠性。 在本章結束後,讀者應已掌握從「數據來源選擇」到「資料庫儲存」的完整流程,為接下來的清洗與探索奠定堅實基礎。