返回目錄
A
金融數據科學實戰:從原始數據到智能投資 - 第 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. **持久化**:使用關聯式或時序資料庫,結合分區與索引,以支持大規模查詢與模型訓練。
在接下來的章節中,我們將深入探討如何將這些原始資料進行清洗、特徵工程與模型建構,最終轉化為可執行的投資洞察。