因主辦單位要求賽後需刪除資料集,為避免爭議故本項目不提供資料集
本項目旨在利用機器學習模型,基於股票技術指標與市場數據,預測哪些股票可能成為「飆股」(標籤為 1)。項目使用 TensorFlow 與雙 GPU(RTX 4090)進行訓練,包含數據前處理、模型訓練與預測階段。
- 訓練數據:
./38_Training_Data_Set/training.csv(約 200,864 筆,12GB) - 測試數據: 25,108 筆股票
- 根目錄:
Stock_Competition
- 程式:
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(正樣本)約 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
- 方法: Min-Max 正規化(範圍
[0, 1])。 - 程式: 訓練程式中內建。
- 輸出: 標準化器儲存於
./GRU6/minmax_scaler.pkl。
- 硬體: 雙 RTX 4090(24GB 顯存)。
- 框架: TensorFlow,啟用
MirroredStrategy支援多 GPU。 - 記憶體管理: 設置
set_memory_growth避免 CUDA 記憶體溢出。
- 程式:
./GRU6/model.py - 模型: 6 個 GRU 模型(
gru_2.0_700至gru_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: 64EPOCHS: 200learning_rate: 0.0005- 正則化: L2 (0.05)
- 類別權重:
{0: 1.0, 1: 5.0}(強調正樣本)
- 輸出: 模型儲存於
./GRU6/gru_*.h5
- 輸入:
./38_Training_Data_Set/selected_training.csv - 分割: 80% 訓練集,20% 驗證集(
stratify=y保持比例)。 - 優化:
- 早停(
patience=10,監控val_loss)。 - Ensemble:6 個模型預測概率加權平均(權重均等 1/6)。
- 早停(
- 程式:
./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)
- 格式:
- 測試集: 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)。
- 指標:
- Precision: 0.007
- Recall: 1.0
- F1-score: 0.0139
- 分析:
- 正樣本數:176(25,108 * 0.007)。
- 假陽性:24,932(全預測 25,108)。
- 精確率極低,作為基準顯示現有模型已優於隨機全 1。
- 訓練集: 1,470 / 200,864 ≈ 0.73%
- 測試集: 176 / 25,108 ≈ 0.7%
- 結論: 訓練與測試集分佈一致,正樣本極稀少。
- 模型優化:
- 減少 Epochs: 50-100,避免過擬合。
- 加強正則化: L2 從 0.05 調整至更高(例如 0.1)。
- 損失加權: 測試更高正樣本權重(例如 10:1)。
- 閾值調整:
- 當前 0.95,若精確率仍低,試 0.98;若召回率過低,降至 0.85。
- 數據檢查:
- 驗證訓練與測試集特徵分佈一致性。
- 考慮過採樣(SMOTE)或生成合成正樣本。
- 評估:
- 提交新預測結果,比較 Precision、Recall、F1。
- 更換模型
- 使用其他機器學習模型