💼

機器學習選股模型

👤 羽 📦 v1.0.0 ⭐ 4.7 ⬇️ 329 下載
💼 行業專業 免費

📖 技能介紹


slug: ml-alpha displayName: 機器學習選股模型 version: 1.0.0 summary: 基於XGBoost/LightGBM的A股多因子選股預測系統,實現15+特徵工程、滾動視窗訓練、分組回測、IC評估,支援時間序列交叉驗證和特徵重要性分析。 tags: - finance - machine-learning - stock-selection - xgboost - quantitative-finance license: MIT


機器學習選股模型 (ML-Alpha)

概述

ML-Alpha 是一個基於機器學習的A股多因子選股預測系統。系統使用XGBoost、LightGBM和Ridge迴歸三種模型,通過15+因子特徵工程和滾動視窗訓練,預測股票未來收益率並進行分組回測驗證。

所有資料均來自 akshare 真實介面,不使用任何隨機或偽造資料。

核心能力

資料層 (data.py)

  • 使用 akshare 獲取A股日線行情(前復權)
  • 獲取指數成分股(滬深300/中證500/上證50等)
  • 獲取基本面資料(PE/PB/ROE等估值與財務指標)
  • 面板資料構建(date x stock x features)
  • 資料清洗:去極值、截面標準化、前向填充處理停牌

特徵層 (features.py)

構建20個選股因子,覆蓋5大類別: | 類別 | 因子 | 數量 | |------|------|------| | 技術特徵 | MA5/MA20/MA60比率、RSI、MACD直方圖、布林帶位置 | 6 | | 量價特徵 | 量比、換手率變化、成交額/量比率 | 3 | | 基本面特徵 | PE分位數、PB分位數、ROE、毛利率 | 4 | | 動量特徵 | 1月/3月/6月動量、5日反轉 | 4 | | 波動率特徵 | 20日波動率、偏度、峰度 | 3 |

所有特徵計算後進行截面z-score標準化。

模型層 (models.py)

  • XGBoost迴歸模型(梯度提升樹,非線性建模)
  • LightGBM迴歸模型(輕量級梯度提升樹,訓練快速)
  • Ridge迴歸(線性baseline)
  • 滾動視窗訓練:train on past N months, predict next month
  • 時間序列交叉驗證(TimeSeriesSplit,避免資料洩露)
  • 模型持久化(joblib儲存/載入)

回測層 (backtest.py)

  • 按預測分數分5組(quintile分組)
  • 多空對沖組合:做多Top組,做空Bottom組
  • 月度調倉
  • 組合收益與換手率計算

評估層 (evaluation.py)

  • IC(Spearman秩相關係數)及IC統計摘要
  • 滾動IC評估模型穩定性
  • 分組單調性檢驗

    7w4.net提供免費和付費技能下載。

  • 夏普比率、最大回撤、年化收益
  • 換手率分析
  • 特徵重要性聚合排名

報告層 (report.py)

  • 累積收益曲線(各組 + 多空對沖)
  • 分組月度收益熱力圖
  • 特徵重要性條形圖
  • 滾動IC曲線
  • 預測vs實際收益散點圖
  • 自包含HTML報告(base64嵌入圖片)

能力邊界說明

  1. 資料來源:僅支援A股資料(通過akshare獲取),不支援港股/美股
  2. 預測範圍:預測未來1/5/10/20日收益率,不支援高頻預測
  3. 交易成本:回測未考慮交易成本(手續費、滑點、衝擊成本),實際收益可能低於回測結果
  4. 市場環境:模型基於歷史資料訓練,在極端市場環境下(如金融危機、政策劇變)可能失效
  5. 基本面資料:財務指標可能存在報告延遲,實際使用中需注意資料時效性
  6. 並非投資建議:本工具僅用於學術研究和量化分析,不構成任何投資建議

安裝使用

環境要求

  • Python 3.9+
  • 網路連線(akshare需要線上獲取資料)

安裝依賴

cd ml-alpha
pip install -r requirements.txt

基本用法

# 使用指定股票池
python predict.py --tickers 600519,000858,601318 --start 20220101 --end 20250101

# 使用滬深300成分股,XGBoost模型,5日預測週期
python predict.py --index hs300 --model xgboost --horizon 5

# 使用中證500成分股,訓練所有模型對比
python predict.py --index zz500 --model all --horizon 10

# 自定義訓練視窗
python predict.py --tickers 600519,000858 --model lightgbm --horizon 20 --train-months 18

引數說明

引數 說明 預設值
--tickers 股票程式碼列表(逗號分隔) -
--index 指數簡稱(hs300/zz500/sz50/zz1000) -
--start 開始日期 YYYYMMDD 20200101
--end 結束日期 YYYYMMDD 20250101
--model 模型型別(xgboost/lightgbm/ridge/all) xgboost
--horizon 預測週期(1/5/10/20日) 5
--train-months 訓練視窗月數 12
--n-groups 分組數量 5
--output-dir 輸出目錄 ./output
--save-models 儲存模型 False

輸出示例

執行完成後,在 output 目錄下生成:

output/
├── report_xgboost.html        # HTML評估報告(含圖表)
├── predictions_xgboost.csv    # 預測結果CSV
├── report_lightgbm.html       # LightGBM報告(--model all時)
├── predictions_lightgbm.csv
├── report_ridge.html          # Ridge報告
├── predictions_ridge.csv
└── models/                    # 模型檔案(--save-models時)
    └── xgboost_latest.pkl

控制台輸出示例

┌──── 配置資訊 ────────────────────────────────────┐
│ 股票池: 指數 hs300                                │
│ 日期範圍: 20220101 ~ 20250101                     │
│ 模型: xgboost                                     │
│ 預測週期: 5 天                                     │
│ 訓練視窗: 12 個月                                  │
└────────────────────────────────────────────────────┘

評估結果摘要:
  平均IC:        0.0342
  IC資訊比率:    0.4521
  IC勝率:        58.3%
  多空年化收益:  12.5%
  夏普比率:      1.23
  最大回撤:      8.7%
  平均換手率:    35.2%

FAQ

Q1: 獲取資料速度很慢怎麼辦?

A: akshare需要逐只股票請求歷史資料,大股票池(如滬深300的300只股票)需要較長時間。建議: - 使用較少的股票(--tickers 指定少量股票) - 縮短日期範圍 - 每隻股票請求間隔0.1秒避免被限流

Q2: 哪些IC值算好的模型?

A: 通常IC(Spearman秩相關係數)的評判標準: - IC > 0.05: 優秀,具有較強預測力 - 0.03 < IC < 0.05: 良好,有一定預測力 - 0.01 < IC < 0.03: 一般,預測力較弱 - IC < 0.01: 模型預測力不足

IC資訊比率(ICIR = mean(IC)/std(IC))> 0.5 通常被認為是可以接受的。

Q3: 滾動視窗訓練的原理是什麼?

A: 模型在每個調倉日(月末),使用過去N個月的資料訓練,然後預測下個月的收益。這模擬了真實的投資決策流程,避免了使用未來資料(look-ahead bias)。例如 train_months=12 表示用過去12個月的資料訓練,預測下個月。

Q4: 如何選擇預測週期(horizon)?

A: 預測週期取決於投資策略的持倉時間: - horizon=1: 日頻策略,適合短線交易 - horizon=5: 周頻策略,適合波段交易 - horizon=10: 兩週策略,適合中短期持倉 - horizon=20: 月頻策略,適合中長期持倉 較短的預測週期換手率較高但可能捕捉更多短期訊號,較長的週期換手率低但需要更長的資料驗證。

Q5: 模型在熊市中表現如何?

A: ML模型的預測能力在不同市場環境下會有變化。通常在趨勢明確的市場中表現較好,在震盪市或急轉市場中可能失效。建議關注滾動IC曲線,當IC持續為負時,應考慮暫停使用模型或調整策略。回測結果僅供參考,不保證未來收益。

Q6: 為什麼有些股票的資料獲取失敗?

A: 可能的原因包括:股票已退市、停牌時間過長、akshare介面暫時不可用、網路問題等。系統會跳過失敗的股票並繼續處理其他股票,不影響整體流程。

技術架構

predict.py (CLI)
    │
    ├── data.py ────── akshare獲取資料 → 面板資料
    │                    ├── 日線行情(OHLCV)
    │                    ├── 基本面資料(PE/PB)
    │                    └── 資料清洗(去極值/標準化/前向填充)
    │
    ├── features.py ── 構建20個因子 → 特徵面板
    │                    ├── 技術因子(MA/RSI/MACD/BOLL)
    │                    ├── 量價因子(量比/換手率/資金流向)
    │                    ├── 基本面因子(PE/PB分位數/ROE/毛利率)
    │                    ├── 動量因子(1m/3m/6m動量/反轉)
    │                    └── 波動率因子(std/skew/kurt)
    │
    ├── models.py ──── 滾動視窗訓練 → 預測結果
    │                    ├── XGBoost迴歸
    │                    ├── LightGBM迴歸
    │                    ├── Ridge迴歸
    │                    └── TimeSeriesSplit交叉驗證
    │
    ├── backtest.py ── 分組回測 → 組合收益
    │                    ├── 5組分組
    │                    ├── 多空對沖
    │                    └── 換手率計算
    │
    ├── evaluation.py ─ 評估指標 → 評估結果
    │                    ├── IC/Spearman相關
    │                    ├── 分組單調性
    │                    ├── Sharpe/MaxDD
    │                    └── 特徵重要性
    │
    └── report.py ──── 圖表生成 → HTML報告
                         ├── 累積收益曲線
                         ├── 熱力圖
                         ├── 特徵重要性圖
                         ├── 滾動IC曲線
                         └── 散點圖

🤖 AI 評測

這個Skill質量較高,是一套完整的機器學習選股工具,特徵豐富、模型多樣、評估全面,文件說明詳細。主要優點是功能完整、使用方便,圖表報告直觀。主要不足是回測沒有考慮手續費等交易成本,實際收益可能不如回測結果好看;獲取資料較慢,容易受網路影響。總體而言,這是一個專業度較高的量化選股工具,適合有量化基礎的開發者使用。

📊 多維度評分

適應性4.4
規範性4.7
有效性4.9
可靠性4.4
可信度5

📁 包含檔案 (11 個)

📄 README.md 5.2 KB
📄 SKILL.md 9.6 KB
📄 ml_alpha/__init__.py 874 B
📄 ml_alpha/backtest.py 7.6 KB
📄 ml_alpha/data.py 20.4 KB
📄 ml_alpha/evaluation.py 14.5 KB
📄 ml_alpha/features.py 13 KB
📄 ml_alpha/models.py 14.7 KB
📄 ml_alpha/report.py 18.7 KB
📄 predict.py 13.1 KB
📄 requirements.txt 154 B