Skip to content

NicksonCheng/AIcup2025

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Stock Competition - 飆股預測項目

因主辦單位要求賽後需刪除資料集,為避免爭議故本項目不提供資料集

項目概述

本項目旨在利用機器學習模型,基於股票技術指標與市場數據,預測哪些股票可能成為「飆股」(標籤為 1)。項目使用 TensorFlow 與雙 GPU(RTX 4090)進行訓練,包含數據前處理、模型訓練與預測階段。

  • 訓練數據: ./38_Training_Data_Set/training.csv(約 200,864 筆,12GB)
  • 測試數據: 25,108 筆股票
  • 根目錄: Stock_Competition

進行流程

1. 數據前處理

1.1 特徵選擇與數據過濾

  • 程式: analysis7.py
  • 方法:
    • 方法 1: LightGBM 特徵重要性
    • 方法 2: 互信息
    • 方法 3: Spearman 相關性
    • 方法 4: 隨機森林特徵重要性
    • 方法 5: 皮爾森相關係數
    • 方法 6: 卡方檢定
    • 方法 7: Lasso 回歸
    • 以上特徵各取前 20 個與 飆股 相關特徵
  • 輸入:
    • 原始數據: ./38_Training_Data_Set/training.csv
    • 特徵列表: ./selected_features7.csv(取聯集69 個特徵)
  • 處理:
    • 從原始數據中選取指定特徵(ID, 飆股 與 69 個技術指標)。
    • 分塊讀取(chunksize=10000)以減少記憶體壓力。
  • 輸出: ./38_Training_Data_Set/selected_training.csv

1.2 數據平衡

  • 問題: 原始數據中 飆股=1(正樣本)約 1,470 筆,飆股=0(負樣本)約 199,394 筆,比例約 0.73%,極度不平衡。
  • 方法:
    • 保留所有正樣本(1,470 筆)。
    • 從負樣本中隨機抽樣 1,470 筆(random_state=42)。
    • 合併並打亂,生成平衡數據(約 2,940 筆)。
  • 輸出: ./sampled_data7.csv(中間檔案)及 ./38_Training_Data_Set/selected_training.csv

1.3 正規化

  • 方法: Min-Max 正規化(範圍 [0, 1])。
  • 程式: 訓練程式中內建。
  • 輸出: 標準化器儲存於 ./GRU6/minmax_scaler.pkl

2. 模型訓練

2.1 環境設置

  • 硬體: 雙 RTX 4090(24GB 顯存)。
  • 框架: TensorFlow,啟用 MirroredStrategy 支援多 GPU。
  • 記憶體管理: 設置 set_memory_growth 避免 CUDA 記憶體溢出。

2.2 模型架構

  • 程式: ./GRU6/model.py
  • 模型: 6 個 GRU 模型(gru_2.0_700gru_3.2_700),結構如下:
    • gru_2.x: 1 層 GRU (500) + 2 層 Dense (500, 300),Dropout 0.3/0.2/0.1。
    • gru_3.x: 3 層 GRU (250, 150, 150),無後續 Dense。
  • 參數:
    • BATCH_SIZE: 64
    • EPOCHS: 200
    • learning_rate: 0.0005
    • 正則化: L2 (0.05)
    • 類別權重: {0: 1.0, 1: 5.0}(強調正樣本)
  • 輸出: 模型儲存於 ./GRU6/gru_*.h5

2.3 訓練過程

  • 輸入: ./38_Training_Data_Set/selected_training.csv
  • 分割: 80% 訓練集,20% 驗證集(stratify=y 保持比例)。
  • 優化:
    • 早停(patience=10,監控 val_loss)。
    • Ensemble:6 個模型預測概率加權平均(權重均等 1/6)。

3. 預測

  • 程式: ./GRU6/predict.py
  • 輸入:
    • 測試數據: ./38_Public_Test_Set_and_Submmision_Template/selected_public_x.csv(待確認)
    • 模型: ./GRU6/gru_*.h5
    • 標準化器: ./GRU6/minmax_scaler.pkl
  • 處理:
    • 正規化測試數據。
    • 6 個模型預測,Ensemble 平均。
    • 閾值調整至 0.95(提升精確率)。
  • 輸出: ./38_Public_Test_Set_and_Submmision_Template/submission.csv
    • 格式: ID, 飆股(0 或 1)

結果分析

1. 原始結果(200 Epochs, 閾值 0.5)

  • 測試集: 25,108 筆
  • 指標:
    • Precision: 0.0648
    • Recall: 0.9318
    • F1-score: 0.1212
  • 分析:
    • 高召回率(93.18%):捕捉大部分正樣本(約 164/176)。
    • 低精確率(6.48%):預測正樣本 2,531 個,假陽性約 2,367。
    • F1 分數偏低,因精確率拖累。
  • 問題: 模型過於偏向正類,假陽性過多,可能因過擬合(200 epochs)。

2. 全預測為 1 的模擬結果

  • 指標:
    • Precision: 0.007
    • Recall: 1.0
    • F1-score: 0.0139
  • 分析:
    • 正樣本數:176(25,108 * 0.007)。
    • 假陽性:24,932(全預測 25,108)。
    • 精確率極低,作為基準顯示現有模型已優於隨機全 1。

3. 正樣本比例

  • 訓練集: 1,470 / 200,864 ≈ 0.73%
  • 測試集: 176 / 25,108 ≈ 0.7%
  • 結論: 訓練與測試集分佈一致,正樣本極稀少。

下一步建議

  1. 模型優化:
    • 減少 Epochs: 50-100,避免過擬合。
    • 加強正則化: L2 從 0.05 調整至更高(例如 0.1)。
    • 損失加權: 測試更高正樣本權重(例如 10:1)。
  2. 閾值調整:
    • 當前 0.95,若精確率仍低,試 0.98;若召回率過低,降至 0.85。
  3. 數據檢查:
    • 驗證訓練與測試集特徵分佈一致性。
    • 考慮過採樣(SMOTE)或生成合成正樣本。
  4. 評估:
    • 提交新預測結果,比較 Precision、Recall、F1。
  5. 更換模型
    • 使用其他機器學習模型

About

this project is for AIcup2025 super stock

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages