聊天視窗

金融資料科學:從數據到決策的完整流程 - 第 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. **品質管控**:持續監測與品質檢查,確保模型輸入正確。 本章奠定了資料取得的基礎,下一章將深入討論資料清理與前處理,為後續建模與分析打下堅實基礎。