聊天視窗

金融數據科學實戰:從原始數據到智能投資 - 第 1 章

第1章 金融數據的種類與來源

發布於 2026-03-06 11:02

# 第1章 金融數據的種類與來源 金融數據科學的首要步驟是 **確定數據的來源與類型**。不同類型的數據具有不同的結構、頻率與可信度,直接影響後續的清洗、建模與投資決策。本章將: 1. 認識主要金融數據類別:市場行情、宏觀經濟、公司財報、新聞與社群訊息。 2. 學習如何使用 API、Web Scraping 與資料庫連結等工具抓取、同步與存儲這些數據。 --- ## 1.1 市場行情數據 | 類別 | 主要資料 | 典型頻率 | 典型工具 | 典型應用 | |------|----------|----------|----------|----------| | 股票價格 | 開盤、收盤、最高、最低、成交量 | 1 分鐘 / 5 分鐘 / 日 | Alpha Vantage、Yahoo Finance、Quandl | 歷史回測、技術指標計算 | | 外匯 | 兌換率、成交量 | 1 分鐘 / 日 | OANDA、FXCM | 匯率風險管理、跨國投資 | | 商品 | 商品期貨價格、交割價格 | 1 分鐘 / 日 | CME、ICE | 套利、對沖 | | 債券 | 收益率曲線、信用利差 | 日 | Bloomberg、Thomson Reuters | 風險偏好校準 | | 指數 | 指數成份、權重 | 日 | Bloomberg、Yahoo | 基準比較、風險敞口 | > **實務提示**:行情數據通常為**時序型**(時間戳+多個變數)。在導入時務必保留完整時間戳,避免因時區或交易時間差異導致資料不一致。 ### 1.1.1 透過 API 抓取股票日行情 以 **Yahoo Finance** 為例,Python 透過 `yfinance` 套件簡單拉取歷史價格: python import yfinance as yf # 拉取台積電 (2330.TW) 近五年的日行情 ticker = yf.Ticker('2330.TW') history = ticker.history(start='2019-01-01', end='2024-01-01', interval='1d') print(history.head()) > **輸出示例**: > > Open High Low Close Adj Close Volume > Date > 2019-01-02 595.0 610.0 590.0 600.0 600.0 12345 > 2019-01-03 602.0 615.0 595.0 610.0 610.0 67890 > ... > > **注意事項**: > - 若需更高頻率(例如 1 分鐘),請使用專業 API(如 Polygon.io 或 Interactive Brokers)並遵守頻率限制。 > - Yahoo Finance 在某些市場(如 OTC)可能不完整,需交叉驗證。 ### 1.1.2 使用 `pandas_datareader` 連結 Alpha Vantage Alpha Vantage 提供免費的 API 介面,適合快速試驗: python import pandas_datareader.data as web from datetime import datetime start = datetime(2020, 1, 1) end = datetime(2024, 1, 1) # 以 Alpha Vantage 的 API key 作為參數 api_key = 'YOUR_ALPHA_VANTAGE_API_KEY' # 拉取台積電每日數據 stock = web.DataReader('2330.TW', 'av-daily', start, end, api_key=api_key) print(stock.head()) > **輸出示例**: > > Open High Low Close Volume > Date > 2020-01-02 500.0 520.0 490.0 510.0 1500000 > 2020-01-03 512.0 530.0 500.0 525.0 1400000 > ... > > **常見問題**: > - Alpha Vantage 以每分鐘 5 次呼叫為限,超過後會暫停。 > - 需要註冊 API Key,且免費版每日可取得 5,000 筆資料。 ## 1.2 宏觀經濟數據 宏觀指標(GDP、CPI、PMI 等)通常以**季度**或**月度**發布,對投資決策、風險評估具有基礎性參考價值。常見數據源: | 數據源 | 主要指標 | 訪問方式 | |--------|----------|----------| | OECD | GDP、就業、通脹 | 網站下載、Quandl API | | 國際貨幣基金組織 (IMF) | World Economic Outlook | API (WEO) | | 央行 | 利率、貨幣供應 | 網站 RSS、Data API | | 台灣行政院主計總處 | CPI、工業生產 | 下載 CSV、Open Data | > **實務提示**:宏觀數據往往有**季調**與**時滯**,建議將其對應到相同的時間頻率並使用滾動窗口做預測。 ### 1.2.1 以 `fredapi` 抓取美國 CPI python from fredapi import Fred fred = Fred(api_key='YOUR_FRED_API_KEY') # FRED 代碼:CPIAUCSL (美國消費者物價指數) cpi = fred.get_series('CPIAUCSL', observation_start='2010-01-01') print(cpi.head()) > **輸出示例**: > > 2010-01-01 218.1 > 2010-02-01 218.5 > 2010-03-01 218.3 > ... > dtype: float64 > ## 1.3 公司財報數據 財報(盈餘表、資產負債表、現金流量表)是評估公司價值、風險與成長的核心資料。數據來源包括: | 數據源 | 主要資料 | 取得方式 | |--------|----------|----------| | SEC EDGAR | 10-K、10-Q、8-K | 網站搜尋、EDGAR API | | 台灣證券交易所 (TWSE) | 財報摘要、股票基本面 | Open Data、TWSE API | | Bloomberg | 財務比率、調整後財報 | 訂閱服務 | | Yahoo Finance | 財報摘要 | `yfinance` | > **實務提示**:財報數據往往以**年度**或**季度**為單位,需將其與市場行情對齊,建立「財報事件」特徵以捕捉公告影響。 ### 1.3.1 以 `yfinance` 抓取台積電財報摘要 python ticker = yf.Ticker('2330.TW') # 取得最新的 10-K(全年)報表摘要 report = ticker.financials print(report) > **輸出示例**: > > 2021 2020 2019 > Total Revenue 150000 140000 130000 > Gross Profit 60000 58000 56000 > ... > ## 1.4 新聞與社群訊息 投資者情緒與市場動態常透過新聞標題、社群討論、論壇貼文等非結構化資料反映。常見資料來源: | 數據源 | 內容 | 取得方式 | |--------|------|----------| | Reuters / Bloomberg | 專業新聞 | RSS、API | | Twitter | 推文 | Twitter API v2 | | Reddit | 貼文 | Pushshift API | | 財經論壇 | 內部討論 | 網站爬蟲 | > **實務提示**:非結構化資料需先做**文字預處理**(分詞、去除停用詞)並轉換為數值特徵(TF-IDF、Word2Vec、BERT embeddings)以供模型使用。 ### 1.4.1 使用 `tweepy` 抓取最新財經推文 python import tweepy # 先在 Twitter Developer Portal 取得 API Key 與 Token consumer_key = 'YOUR_CONSUMER_KEY' consumer_secret = 'YOUR_CONSUMER_SECRET' access_token = 'YOUR_ACCESS_TOKEN' access_token_secret = 'YOUR_ACCESS_TOKEN_SECRET' auth = tweepy.OAuth1UserHandler(consumer_key, consumer_secret, access_token, access_token_secret) api = tweepy.API(auth) # 搜尋關鍵字 "台積電" 的最近 10 筆推文 for tweet in api.search_tweets(q='台積電', lang='zh', count=10): print(f'{tweet.created_at} - {tweet.user.screen_name}: {tweet.text}') > **輸出示例**: > > 2024-03-05 10:12:00 - fintech_guru: 台積電最新財報顯示營收持續增長。 > 2024-03-05 09:58:00 - market_watch: 台積電股價今日開高! > ... > ## 1.5 資料庫連結與持久化 為了避免每次分析都重複抓取資料,建議將清洗後的資料存入 **關聯式資料庫**(MySQL、PostgreSQL)或 **時序資料庫**(InfluxDB、TimescaleDB)。以下以 PostgreSQL 為例展示連結與寫入流程: python import psycopg2 import pandas as pd # 連線參數 conn = psycopg2.connect( host='localhost', port='5432', dbname='finance_db', user='db_user', password='db_pass' ) # 假設已將 Yahoo Finance 歷史數據存入 DataFrame `df` # 先建立表格 create_table_query = ''' CREATE TABLE IF NOT EXISTS stock_prices ( ticker VARCHAR(10), dt DATE, open NUMERIC, high NUMERIC, low NUMERIC, close NUMERIC, volume BIGINT, PRIMARY KEY (ticker, dt) ); ''' cur = conn.cursor() cur.execute(create_table_query) conn.commit() # 將 DataFrame 寫入資料庫 df.to_sql('stock_prices', conn, if_exists='append', index=False) cur.close() conn.close() > **最佳實踐**: > - 使用 **分區表**(按日期或股票分區)提升查詢效能。 > - 定期備份資料庫,並加密重要欄位。 --- ## 小結 1. **多元數據來源**:市場行情、宏觀經濟、財報、新聞與社群訊息,構成金融數據科學的完整資料庫。 2. **抓取工具**:API(yfinance、Alpha Vantage、FRED)、Web Scraping(requests、BeautifulSoup)與資料庫連結(psycopg2、SQLAlchemy)。 3. **資料品質**:確認時間戳一致、頻率匹配、資料完整性,並建立**ETL**流程確保數據可重複利用。 4. **持久化**:使用關聯式或時序資料庫,結合分區與索引,以支持大規模查詢與模型訓練。 在接下來的章節中,我們將深入探討如何將這些原始資料進行清洗、特徵工程與模型建構,最終轉化為可執行的投資洞察。