3.2 資料來源與樣本選擇
本節說明本研究的資料來源、樣本選擇標準、研究期間設定與資料處理方式。嚴謹的資料處理是確保研究結果有效性的基礎,特別是在逆向投資策略研究中,使用正確的價格資料對於跌幅計算與報酬評估至關重要。
一、樣本選擇標準
1.1 選擇依據
本研究選擇台灣與美國兩市場的大型權值股與主流 ETF 作為研究樣本,選擇依據如下:
代表性:大型權值股代表市場主要資金流向,是機構投資人與散戶投資人最常關注的標的。針對這些標的進行研究,其結果具有較高的實務參考價值。
流動性:大型股與主流 ETF 具有較高的交易量與流動性,回測時假設的進出場價格更接近實際可執行的價格,減少流動性偏誤(Liquidity Bias)的影響。
資料品質:主流標的的價格資料較為完整且可靠,資料來源多元,可進行交叉驗證,降低資料錯誤的風險。
投資人關注:本研究關注的散戶投資人群體最常接觸的投資標的即為大型權值股與 ETF,研究結果可直接應用於實務投資決策。
1.2 樣本組成
本研究樣本共包含 116 檔標的,涵蓋美國與台灣兩個市場:
美國市場(63 檔):
| 類別 | 標的範例 | 數量 |
|---|---|---|
| 科技股 | AAPL, MSFT, GOOGL, AMZN, NVDA, META, ORCL, CRM, CSCO, INTC, AMD, ADBE, IBM 等 | 15+ |
| 金融股 | JPM, BAC, V, MA, WFC, GS, MS, BLK 等 | 10+ |
| 醫療股 | UNH, JNJ, PFE, LLY, ABBV, MRK, TMO 等 | 8+ |
| 消費股 | WMT, HD, MCD, NKE, KO, PG, PEP, COST, AMZN 等 | 10+ |
| 能源/工業 | XOM, CVX, BA, CAT, GE, UPS 等 | 10+ |
| 通訊服務 | GOOGL, META, DIS, NFLX, CMCSA 等 | 6+ |
| ETF | VOO, QQQ, DIA, VT | 4 |
| 個股小計 | 59 |
台灣市場(53 檔):
| 類別 | 標的範例 | 數量 |
|---|---|---|
| 半導體 | 2330 台積電, 2454 聯發科, 3034 聯詠, 2303 聯電 等 | 10+ |
| 電子 | 2317 鴻海, 2382 廣達, 2308 台達電, 2357 華碩 等 | 15+ |
| 金融 | 2881 富邦金, 2882 國泰金, 2884 玉山金, 2886 兆豐金 等 | 10+ |
| 傳產 | 1301 台塑, 1303 南亞, 2912 統一超 等 | 10+ |
| 其他 | 各產業代表性權值股 | 5+ |
| ETF | 0050 元大台灣50, 0056 元大高股息 | 2 |
| 個股小計 | 51 |
1.3 排除條件
為確保資料品質與研究有效性,本研究設定以下排除條件:
| 排除條件 | 門檻值 | 說明 |
|---|---|---|
| 資料完整度不足 | < 95% | 缺失交易日比例過高,可能影響回測準確性 |
| 上市時間過晚 | 晚於 2008 年 | 無足夠的歷史資料進行 Walk-Forward 驗證 |
| 已下市或長期停牌 | 最後交易日早於測試期結束前 30 天 | 無法進行完整回測 |
| 存在極端異常價格 | 單日報酬 > 50% | 可能為資料錯誤,需人工審核 |
1.4 樣本分類
為回應 RQ5(市場差異)與 RQ6(產品類型差異),本研究將樣本依兩個維度進行分類:
市場分類:
- 美國市場(US):63 檔
- 台灣市場(TW):53 檔
產品類型分類:
- ETF:6 檔(美股 4 + 台股 2)
- 個股(STOCK):110 檔(美股 59 + 台股 51)
交叉分類表:
| 美國市場 | 台灣市場 | 合計 | |
|---|---|---|---|
| ETF | 4 | 2 | 6 |
| 個股 | 59 | 51 | 110 |
| 合計 | 63 | 53 | 116 |
二、資料來源
2.1 主要資料來源
本研究使用兩個專業金融資料 API 作為主要資料來源:
美股資料:Financial Modeling Prep(FMP)API
| 項目 | 說明 |
|---|---|
| 提供商 | Financial Modeling Prep |
| 資料類型 | 美國股票歷史價格(日頻) |
| API 端點 | https://financialmodelingprep.com/stable |
| 資料欄位 | date, open, high, low, close, adjClose, volume |
| 請求限制 | 免費版 250 次/天 |
| 資料品質 | 專業級,已調整股利與分割 |
台股資料:FinMind API
| 項目 | 說明 |
|---|---|
| 提供商 | FinMind 金融資料平台 |
| 資料類型 | 台灣股票歷史價格(日頻) |
| API 端點 | https://api.finmindtrade.com/api/v4 |
| 資料欄位 | date, open, high, low, close, Trading_Volume |
| 請求限制 | 免費版 600 次/小時 |
| 資料品質 | 需額外取得調整後價格 |
2.2 備援資料來源
為確保資料完整性,本研究設定以下備援來源:
| 市場 | 主要來源 | 備援來源 |
|---|---|---|
| 美股 | FMP API | yfinance(Python 套件) |
| 台股 | FinMind API | 台灣證券交易所公開資訊觀測站 |
2.3 資料欄位需求
本研究所需的價格資料欄位如下:
| 欄位名稱 | 說明 | 必要性 | 用途 |
|---|---|---|---|
date | 交易日期 | 必要 | 時間索引 |
high | 當日最高價 | 必要 | 計算近期最高價(用於跌幅計算) |
close | 收盤價 | 參考 | 資料驗證用 |
adj_close | 調整後收盤價 | 必要 | 跌幅計算、報酬率計算 |
volume | 成交量 | 可選 | 流動性篩選(備用) |
三、調整後收盤價的重要性
3.1 adj_close 的定義
調整後收盤價(Adjusted Close Price, adj_close)是經過以下企業行動(Corporate Actions)調整後的價格:
- 現金股利(Cash Dividend):除息時向下調整歷史價格
- 股票股利(Stock Dividend):除權時向下調整歷史價格
- 股票分割(Stock Split):分割時按比例調整歷史價格
- 增資配股(Rights Issue):配股時向下調整歷史價格
3.2 為何必須使用 adj_close
使用未調整的收盤價(close)進行跌幅策略研究,會產生嚴重的假跌幅訊號問題:
案例說明:假設某股票除息前收盤價為 100 元,配發現金股利 5 元。
| 情境 | 除息前價格 | 除息後價格 | 看起來的跌幅 | 真實跌幅 |
|---|---|---|---|---|
| 使用 close | 100 | 95 | -5% | 0%(實際是股利發放) |
| 使用 adj_close | 100 | 100 | 0% | 0%(正確反映) |
若使用未調整價格,在除息日當天會產生假的「大跌」訊號,觸發錯誤的進場決策。使用調整後價格可避免此問題。
3.3 adj_close 的計算原理
調整後價格的計算採用向後調整(Backward Adjustment)方法:
其中,調整因子反映了股利發放、股票分割等企業行動的影響。
實際案例:台積電(2330)於 2023 年配發現金股利 11.5 元
- 除息前收盤價:550 元
- 除息後收盤價:538.5 元(看起來跌 2.1%)
- 調整後價格:除息前後均維持可比性,不產生假跌幅
四、研究期間
4.1 期間設定
本研究的時間範圍設定如下:
| 期間類型 | 起始日期 | 結束日期 | 用途 |
|---|---|---|---|
| 資料收集期 | 2005-01-01 | 2024-10-31 | 完整價格資料範圍 |
| 觀察期(最長) | 2005-01-01 | 2014-12-31 | Walk-Forward 最長訓練期(L=10) |
| 測試期 | 2015-01-01 | 2024-10-31 | 策略績效評估期間(10 年) |
4.2 期間選擇的依據
觀察期(2005-2014):
- 涵蓋 2008 年全球金融危機,確保門檻計算包含極端市場事件
- 提供足夠長度(最長 10 年)的歷史資料進行參數估計
- 涵蓋多種市場狀態:牛市(2005-2007, 2009-2014)與熊市(2008)
測試期(2015-2024):
- 涵蓋近 10 年的市場環境,確保結果的時效性
- 包含多種市場事件:2018 年修正、2020 年疫情崩盤與復甦、2022 年熊市
- 提供足夠的樣本外測試年度(10 年)進行 Walk-Forward 驗證
4.3 Walk-Forward 期間切分
本研究採用滾動窗口的 Walk-Forward 驗證,期間切分如下(以 L = 3 年為例):
| 測試年度 | 訓練期 | 測試期 |
|---|---|---|
| 2015 | 2012-2014 | 2015 |
| 2016 | 2013-2015 | 2016 |
| 2017 | 2014-2016 | 2017 |
| ... | ... | ... |
| 2024 | 2021-2023 | 2024 |
五、資料驗證程序
5.1 資料完整性檢查
對於每檔股票,執行以下完整性檢查:
完整度計算公式: 完整度 = 實際交易日數 / 預期交易日數 × 100% 判定標準: - 完整度 ≥ 95%:通過 - 完整度 < 95%:排除或人工審核
5.2 調整後價格驗證
驗證 adj_close 資料的合理性:
- 調整比例檢查:計算 adj_close / close 的比例,識別可能的調整日期
- 連續性檢查:檢查調整後價格的日報酬是否存在異常跳動(排除真實的除權息調整)
- 極端報酬檢查:標記單日報酬超過 ±20% 的資料點,進行人工審核
5.3 異常值檢測
檢測以下類型的資料異常:
| 異常類型 | 檢測條件 | 處理方式 |
|---|---|---|
| 極端報酬 | 單日報酬 > 50% | 人工審核確認 |
| 無效價格 | 價格 ≤ 0 | 排除該筆資料 |
| High-Low 錯誤 | 最高價 < 最低價 | 排除該筆資料 |
| 重複資料 | 同日期多筆記錄 | 保留最新一筆 |
5.4 資料品質報告
資料驗證完成後,產出以下資料品質摘要:
| 項目 | 數值 |
|---|---|
| 候選股票數 | 約 130 檔 |
| 通過驗證數 | 116 檔 |
| 排除數 | 約 14 檔 |
| 通過率 | 約 89% |
| 總資料筆數 | 約 550,000 筆 |
| 資料完整度(平均) | > 98% |
六、資料處理流程
6.1 資料載入
資料從資料庫載入時,採用以下標準化流程:
- 連接資料庫:使用 Laravel 專案的 MariaDB 資料庫
- 查詢價格資料:從
daily_prices表取得 adj_close、high 等欄位 - 關聯股票資訊:從
stocks表取得 symbol、market、stock_type 等欄位 - 資料格式化:轉換為標準的 DataFrame 格式
6.2 缺失值處理
對於少量的缺失交易日(如節假日後的資料延遲),採用以下處理方式:
- 前向填補(Forward Fill):使用前一交易日的價格填補
- 後向填補(Backward Fill):若期初有缺失,使用後一交易日填補
6.3 資料輸出格式
處理後的資料以標準化格式輸出:
| 欄位 | 資料類型 | 說明 |
|---|---|---|
| stock_id | INTEGER | 股票內部識別碼 |
| symbol | VARCHAR | 股票代號 |
| date | DATE | 交易日期 |
| price | DECIMAL | 調整後收盤價(adj_close) |
| high | DECIMAL | 當日最高價 |
| market | VARCHAR | 市場(US/TW) |
| stock_type | VARCHAR | 產品類型(ETF/STOCK) |
七、小結
本節說明了本研究的資料來源與樣本選擇,主要內容包括:
- 樣本組成:116 檔標的,涵蓋美國(63 檔)與台灣(53 檔)兩市場,包含大型權值股與主流 ETF。
- 資料來源:美股使用 FMP API,台股使用 FinMind API,兩者均提供專業級的調整後價格資料。
- 調整後價格的重要性:使用 adj_close 可避免除權息產生的假跌幅訊號,確保跌幅計算與報酬評估的準確性。
- 研究期間:觀察期 2005-2014 年,測試期 2015-2024 年,共 10 年的樣本外測試。
- 資料驗證:透過完整性檢查、調整後價格驗證與異常值檢測,確保資料品質。
下一節將詳細說明動態跌幅門檻策略的設計,包括跌幅計算公式、門檻設定方式與投資執行規則。