返回目錄
A
金融資料科學:從數據到決策的完整流程 - 第 2 章
第 2 章:金融數據來源與取得
發布於 2026-03-07 11:23
# 第 2 章:金融數據來源與取得
> **章節概述**:本章聚焦於金融領域的資料來源與實務取得方式。從股票、期貨、外匯到基金,並深入探討 API、爬蟲、金融資料庫與政府統計等多元管道,協助讀者建立完整、可持續、合規的資料管線。
---
## 2.1 金融資料類型與特性
| 資料類別 | 典型指標 | 主要特性 | 資料頻率 | 典型應用 |
| -------- | -------- | -------- | -------- | -------- |
| 股票 | 開盤價、收盤價、成交量、波動率 | 成交集中於交易時間,存在高頻噪聲 | 1 秒至 1 天 | 量化交易、風險評估 |
| 期貨 | 合約價格、到期日、履約價格 | 多樣合約類型、保證金制度 | 1 秒至 1 天 | 套利、對沖 |
| 外匯 | 兌換率、利率差 | 24 小時交易,跨時區 | 1 秒至 1 天 | 匯率風險管理 |
| 基金 | NAV、資產配置、費用率 | 週或月結算 | 1 天 | 資產配置、績效比較 |
| 宏觀經濟 | GDP、失業率、CPI | 週或月發布 | 1 天 | 風險模型、因子分析 |
> **實務提示**:不同資料類型的時間對齊與缺失處理策略各異。先釐清業務需求,決定資料頻率與粒度,再設計對應的取得與清理流程。
---
## 2.2 主要資料來源
### 2.2.1 交易所官方資料
- **台灣證券交易所(TWSE)**、**美國納斯達克(NASDAQ)**、**倫敦金屬交易所(LME)** 等
- 優點:授權清晰、更新頻率高、資料完整
- 缺點:部分高頻資料需付費或 API 限額
python
# 以 Pandas DataReader 讀取 TWSE 成分股日行情
import pandas_datareader.data as web
import datetime
start = datetime.datetime(2023, 1, 1)
end = datetime.datetime(2023, 12, 31)
# 以 TWSE 的 API 取得台積電 2330
stock = web.DataReader('2330.TW', 'yahoo', start, end)
print(stock.head())
### 2.2.2 金融資料 API
| API | 提供商 | 主要功能 | 定價模式 |
| --- | --- | --- | --- |
| **Alpha Vantage** | Alpha Vantage | 股票、外匯、加密貨幣 | 免費 (每分鐘 5 次) / Premium |
| **Quandl** | Quandl | 統計數據、基金、經濟指標 | 免費/付費 |
| **Polygon.io** | Polygon | 低延遲股票/期貨/外匯 | 付費 |
| **Tiingo** | Tiingo | 高品質股票/ETF/基金 | 免費/付費 |
python
# 使用 Alpha Vantage 取得美股 AAPL 日行情
import requests
api_key = 'YOUR_API_KEY'
url = 'https://www.alphavantage.co/query'
params = {
'function': 'TIME_SERIES_DAILY_ADJUSTED',
'symbol': 'AAPL',
'outputsize': 'compact',
'apikey': api_key
}
resp = requests.get(url, params=params)
data = resp.json()
print(list(data['Time Series (Daily)'].keys())[:3]) # 取前三天資料
> **實務建議**:多重 API 交叉驗證可提升資料完整性。選擇 API 時,務必留意資料授權與使用限制,避免違規。
### 2.2.3 網路爬蟲
- **適用場景**:非公開或付費資料、新聞、社群媒體、公司公告等
- **技術棧**:Scrapy、BeautifulSoup、Selenium(動態網頁)
- **注意事項**:遵守 robots.txt、請求頻率控制、資料抓取合法性
python
# 以 requests + BeautifulSoup 抓取台股公司基本資訊
import requests
from bs4 import BeautifulSoup
url = 'https://www.twse.com.tw/zh/page/trading/stock/CS_2.html'
headers = {'User-Agent': 'Mozilla/5.0'}
resp = requests.get(url, headers=headers)
soup = BeautifulSoup(resp.text, 'html.parser')
# 假設資料在 <table id='stock_basic'>
table = soup.find('table', {'id': 'stock_basic'})
rows = table.find_all('tr')[1:]
for row in rows:
cols = row.find_all('td')
symbol = cols[0].text
name = cols[1].text
print(symbol, name)
> **實務建議**:爬蟲資料往往缺乏正式授權,使用前務必確認版權與法規。可考慮使用商業資料服務以確保合法性。
### 2.2.4 金融數據庫
| 資料庫 | 特色 | 主要覆蓋範圍 |
| --- | --- | --- |
| **Bloomberg Terminal** | 即時、歷史、分析工具 | 期貨、衍生、外匯、固定收益 |
| **Thomson Reuters Eikon** | 大量新聞、研究報告 | 企業財報、行業指標 |
| **FactSet** | 統一資料平台 | 企業、投資、行業 |
| **WRDS (Wharton Research Data Services)** | 專業學術資料 | 企業財報、股票、基金 |
> **實務建議**:這類資料庫多為企業級訂閱,成本高昂。對於中小規模專案,可優先考慮開源 API 或公有資料庫。
### 2.2.5 政府統計與公開資料
- **國家統計局**:人口、經濟、貿易、金融
- **證券交易所**:交易量、成交額、合約
- **中央銀行**:利率、貨幣供應、匯率
- **資料開放平台**:台灣 openData、美國 data.gov、歐盟 open data portal
python
# 以 台灣統計資料 API 取得 CPI 資料
import requests
url = 'https://api.doe.gov/v1/price/api/cpi'
params = {'format': 'json', 'start_date': '2023-01-01'}
resp = requests.get(url, params=params)
print(resp.json()['data'][:3])
> **實務建議**:政府資料多為公開且授權明確,適合用於宏觀模型。仍需注意資料更新頻率與版本變動。
---
## 2.3 資料取得流程設計
1. **需求分析**:確認資料類型、頻率、粒度與授權要求。
2. **來源評估**:評估可用 API、交易所、數據庫,權衡成本、延遲與授權。
3. **認證與授權**:取得 API 金鑰、簽署合約、設置使用限制。
4. **資料抓取**:使用腳本(Python/Scala/Java)或 ETL 工具(Airflow、Prefect)。
5. **資料儲存**:選擇雲端儲存(S3、GCS)或本地資料倉庫(PostgreSQL、Snowflake)。
6. **版本控制**:利用 Delta Lake、Parquet 的時間戳欄位或自訂分區來追蹤資料變更。
7. **監控與告警**:設定資料完整性檢查、失敗重試、延遲監控。
8. **合規檢查**:確保資料使用符合 GDPR、MiFID II 等法規。
> **實務建議**:將資料抓取流程包裝成可重複執行的 DAG,並使用 CI/CD 進行自動化部署,可大幅降低維護成本。
---
## 2.4 合規與版權注意事項
| 規範 | 主要要求 | 風險 | 應對措施 |
| --- | --- | --- | --- |
| GDPR | 個人資料保護、同意 | 罰款、品牌信譽 | 匿名化、取得同意、數據最小化 |
| MiFID II | 交易透明、資料保存 | 監管調查 | 合規檢測、審計紀錄 |
| 資料授權 | API 使用限制、版權 | 法律訴訟 | 讀取合約、購買合法授權 |
> **實務建議**:在資料抓取前,先確認資料來源的授權條款,必要時取得合法授權或與供應商簽訂資料使用協議。
---
## 2.5 案例:構建台股日行情資料管線
1. **來源**:使用 Yahoo Finance API(pandas‑datareader)
2. **抓取範圍**:2023 年 1 月 1 日至 12 月 31 日
3. **資料庫**:存入 AWS S3,Parquet 格式,按月份分區
4. **ETL**:Airflow DAG 進行每天更新、資料品質檢查
python
# DAG 範例(Airflow)
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime, timedelta
import pandas_datareader.data as web
import pyarrow.parquet as pq
import pyarrow as pa
def fetch_and_store(**context):
date = context['ds']
start = datetime.strptime(date, '%Y-%m-%d')
end = start + timedelta(days=1)
df = web.DataReader('2330.TW', 'yahoo', start, end)
# 轉成 Parquet 並上傳至 S3
table = pa.Table.from_pandas(df)
pq.write_to_dataset(table, root_path='s3://my-bucket/twse/2330', partition_cols=['Date'])
with DAG('twse_daily_etl', start_date=datetime(2023,1,1), schedule_interval='@daily') as dag:
task = PythonOperator(task_id='fetch_store', python_callable=fetch_and_store)
> **實務建議**:定期審查資料完整性與一致性,使用校驗碼(MD5)或哈希值追蹤資料改動。
---
## 小結
金融資料科學的第一步是掌握「資料」本身。透過多元管道—交易所官方資料、API、爬蟲、金融數據庫、政府統計等—我們能取得高品質、合規且多樣化的資料。關鍵在於:
1. **需求先行**:釐清資料粒度與頻率。
2. **授權合規**:確保使用權限,避免法律風險。
3. **流程自動化**:ETL 與 CI/CD 使資料管線可持續、可追蹤。
4. **品質管控**:持續監測與品質檢查,確保模型輸入正確。
本章奠定了資料取得的基礎,下一章將深入討論資料清理與前處理,為後續建模與分析打下堅實基礎。