Latest commit

History

17 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

QuantForecast

VersionPythonPyTorch

基於 PatchTST (Channel-Time Patch Time-Series Transformer) 的量化預測系統,專注於港股(小米 1810.HK)的價格預測與回測。

版本: v1.1.1 (2026-04-19) - 分類模型 + 滾動預測版本

📊 項目概述

本項目使用 Transformer 架構處理時間序列數據,通過 Patch-based 方法提取局部時序特徵,結合多維技術指標進行股票價格方向預測(分類任務)。

核心特性

  • 🔮 PatchTST 分類模型: 預測 T+5 日價格方向(漲/跌),輸出上漲概率 prob_up
  • 📈 特徵工程: 原始價格 + 技術指標(EMA比率/MACD/RSI/ATR比率/OBV/成交量比率/收益率)
  • 🎯 方向預測: 二分類問題(漲/跌),預測收益率轉換: (prob_up - 0.5) * 0.1
  • 📊 完整回測: 支持多時間段回測、Walk-forward CV 參數優化、風險指標計算
  • 🎨 數據可視化: 暗色主題專業圖表(含混淆矩陣、價格散點圖、持倉狀態條)
  • ⚖️ Walk-forward CV: Optuna + 時間序列交叉驗證,避免過擬合
  • 🔄 滾動預測: 紅線使用歷史5天數據分別預測未來5天(非插值)

🏗️ 項目結構

quantforecast/
├── src/ # 源代碼
│ ├── backtest/ # 回測引擎
│ │ ├── engine.py
│ │ └── reporting.py
│ ├── data/ # 數據處理
│ │ ├── loader.py
│ │ ├── preprocessor.py
│ │ └── features.py
│ ├── models/ # 模型定義
│ │ ├── patchtst.py # PatchTST 分類/回歸模型
│ │ └── revin.py # 可逆實例歸一化
│ ├── training/ # 訓練與優化
│ │ ├── trainer.py
│ │ ├── evaluator.py
│ │ └── optimizers/
│ │ └── optuna_optimizer.py
│ ├── utils/ # 工具函數
│ └── config.py # 配置管理
├── scripts/ # 執行腳本
│ ├── backtest.py # 完整回測(含圖表輸出)
│ ├── backtest_old_params.py # 舊參數回測可視化
│ ├── visualize_backtest.py # 回測可視化模塊
│ ├── train.py # 模型訓練
│ ├── optimize.py # Optuna 模型超參優化
│ ├── strategy_optimize.py # 交易策略參數優化
│ ├── plot_optimization.py # 優化結果可視化
│ ├── plot_params_comparison.py # 參數對比可視化
│ ├── update_realtime.py # 實時數據更新
│ ├── daily_pipeline.py # 每日數據管道
│ └── scheduled_backtest.py # 定時回測任務
├── data/ # 數據文件
│ └── xiaomi_real.csv # 小米股價數據 (2023-01 ~ 2026-04)
├── results/ # 結果輸出
│ ├── complete_backtest_results.png # 回測圖表
│ ├── complete_backtest_results.json # 回測數據
│ ├── future_prediction.json # 未來5天預測
│ └── optuna_best_params_*.json # 最佳參數
├── models/ # 模型文件
│ └── patchtst_classification_fixed_20260416_121241.pth # 當前模型
├── logs/ # 日誌文件
└── README.md # 本文件

🚀 快速開始

環境要求

pip install -r requirements.txt

更新數據(獲取最新股價)

cd quantforecast
python3 scripts/update_realtime.py

數據源:

  • akshare: 歷史日線數據(延遲但完整)
  • 新浪/騰訊實時: 當日收盤價(實時更新)

運行回測

cd quantforecast
# 使用優化後的參數運行回測
python3 scripts/backtest.py --optimized --months 3
# 或使用默認參數
python3 scripts/backtest.py

回測結果將輸出至:

  • results/complete_backtest_results.png - 回測圖表(含回測時間戳與 T+1 建議)
  • results/complete_backtest_results.json - 詳細回測數據
  • results/future_prediction.json - 未來5天預測

訓練新模型

# Walk-forward CV 優化(推薦)
python3 scripts/optimize.py
# 常規訓練
python3 scripts/train.py

策略參數優化

# 優化交易策略參數(概率閾值/持有天數/止損比例)
python3 scripts/strategy_optimize.py

📈 當前模型

模型信息

模型文件: patchtst_classification_fixed_20260416_121241.pth

模型類型: 分類模型(Classification)

輸出:

  • prob_up: 上漲概率 (0~1)
  • 預測收益率: (prob_up - 0.5) * 0.1

最佳超參數 (Walk-forward CV + Optuna):

seq_len=20# 輸入序列長度(20個交易日)pred_len=5# 預測長度(5個交易日)d_model=64# 嵌入維度n_heads=8# 注意力頭數n_layers=3# Transformer 層數patch_len=5# Patch 長度stride=2# Patch 步長dropout=0.2# Dropout 率learning_rate=2.05e-4# 學習率batch_size=32# 批次大小

策略參數 (優化後):

prob_threshold=0.3792# 概率閾值holding_days=4# 持有天數stop_loss=0.06# 止損比例 (6%)

特徵工程

特徵類型具體特徵處理方式
價格open, high, low, close原始值
成交量volume, volume_ratio原始值 / 20日均值比率
資金流OBV累積和: sign(價格變化) * volume 的累積
趨勢EMA5/10/20_ratio比率: close/ema - 1
動量MACD, MACD_hist原始值
波動率ATR_ratio (ATR/close), RSI_14, volatility_20d比率/原始值/標準差
收益率return_1d, return_5d百分比變化

🎯 最新回測結果

回測概覽 (2026-01-19 ~ 2026-04-17)

指標數值
策略總收益+10.22%
Buy & Hold-16.37%
超額收益+26.59%
最大回撤-4.63%
年化波動率27.00%
夏普比率2.73
索提諾比率3.92
卡爾瑪比率2.21
總交易次數4次
勝率100% (4勝0負)
測試準確率97.1%

T+1 操作建議

  • 回測時間: 2026-04-19 18:39
  • 最新日期: 2026-04-17
  • 操作: 🔴 SELL
  • 當前價格: 32.00 HKD
  • 目標價格: 31.60 HKD
  • 預期收益 (T+5): -1.25%
  • 預測區間: 2026-04-20 ~ 2026-04-24

滾動預測詳情

紅線使用滾動窗口預測(非線性插值),基於過去5天數據分別預測對應的未來日期:

  • T-4 數據 → 預測 T+1
  • T-3 數據 → 預測 T+2
  • ...
  • T 數據 → 預測 T+5

每個預測點都是獨立的模型推理,預測價格計算:

pred_price = hist_close * (1 + (prob_up - 0.5) * 0.1)
歷史日期目標日期預測價格prob_up
2026-04-132026-04-2030.29 HKD0.3780
2026-04-142026-04-2130.51 HKD0.3789
2026-04-152026-04-2230.51 HKD0.3744
2026-04-162026-04-2331.66 HKD0.3737
2026-04-172026-04-2431.60 HKD0.3751

🖼️ 圖表說明

Backtest Results

complete_backtest_results.png 包含6個子圖,配合回測數據解讀:

1. Confusion Matrix(混淆矩陣)

預測方向 vs 實際方向,對齊黃線邏輯(T vs T-5 比較):

預測跌預測漲
實際跌TN=26FP=0
實際漲FN=1TP=8
  • 準確率: 97.1%
  • Precision (漲): 100%(預測漲的全對)
  • Recall (漲): 88.9%(漏了1個漲的)

2. Daily Return Distribution(日收益分布)

策略每日收益的直方圖與核密度估計,展示收益分布形態。

3. Predicted Price vs Actual Price(價格散點圖)

X軸: 預測價格(T-5 預測的 T 時刻價格)
Y軸: 實際價格(T 時刻真實價格)
藍虛線: 完美預測對角線

  • 綠點 = 預測漲(prob_up > 0.5)
  • 紅點 = 預測跌(prob_up ≤ 0.5)
  • 點越靠近對角線 = 預測越準確

4. Cumulative Return(累計收益)

  • 藍線: 策略累計收益 (+10.22%)
  • 灰虛線: Buy & Hold 基準 (-16.37%)
  • 綠/紅區域: 策略正/負收益時段
  • 底部顏色條: 持倉狀態(綠=持倉,紅=空倉)

5. Stock Price(股價與預測)

  • 藍線: 實際股價
  • 黃線: 歷史 T+5 預測(T-5 預測的 T 時刻價格,用於回測驗證)
  • 紅線: 未來5天滾動預測(T-4→T+1, T-3→T+2...)
  • 紅色陰影區: 未來預測區間

數據可視化特性

  • 黃線: 用 T-5 數據預測的 T 時刻價格(與藍線同時間軸對比)
  • 紅線: 用過去5天數據分別預測未來5天的滾動預測(非插值)
  • 持倉狀態條: 綠色 = 持倉中,紅色 = 空倉

🔧 Walk-forward CV 優化

為解決過擬合問題,使用 Walk-forward 交叉驗證:

# 時間序列交叉驗證(避免未來數據洩露)fortrain_idx, val_idxinTimeSeriesSplit(n_splits=5):
# 只在歷史數據上訓練# 在之後的數據上驗證

優化結果:

  • Trial: 100次
  • CV Score: 最佳驗證分數
  • 測試集準確率: 約 51-60%
  • 模型穩定性: Walk-forward CV 顯著提升

樣本加權(指數衰減)

訓練時可選擇對近期數據賦予更高權重(指數衰減):

# 指數衰減權重:w_t = exp(λ * (t - T))# λ 越大,對近期數據權重越高weights=np.exp(decay_lambda* (time_indices-T))

用途:讓模型更關注近期市場模式,適應市場結構變化。

🎯 策略優化

方法:網格搜索 + 多目標評估

策略優化使用網格搜索(Grid Search)測試所有參數組合:

優化參數範圍:

prob_threshold= [0.35, 0.37, 0.40, 0.45, 0.50] # 概率閾值holding_days= [1, 3, 5, 7, 10] # 持有天數stop_loss= [0.05, 0.08, 0.10, 0.15] # 止損比例

評估指標:

  • 總回報(Total Return)
  • Sharpe Ratio(風險調整後收益)
  • 最大回撤(Max Drawdown)
  • 交易次數(Trade Count)

優化邏輯:

  1. 對每個參數組合運行完整回測
  2. 計算上述評估指標
  3. 選擇 Sharpe Ratio 最高的參數組合作為最佳策略

📝 關鍵文件說明

文件說明
scripts/backtest.py主回測程序,輸出含大標題的圖表與 T+1 建議
scripts/visualize_backtest.py回測可視化模塊(暗色主題、價格對齊)
scripts/optimize.pyWalk-forward CV + Optuna 模型超參優化
scripts/strategy_optimize.py交易策略參數優化(概率閾值/持有天數/止損比例)
scripts/train.py模型訓練(支持分類/回歸)
scripts/update_realtime.py實時數據更新(akshare + 新浪/騰訊)
scripts/daily_pipeline.py每日數據管道(收市後自動運行)
src/models/patchtst.pyPatchTST 分類/回歸模型架構
src/data/loader.py數據加載與驗證
data/xiaomi_real.csv小米真實股價數據

📜 版本歷史

v1.1.1 (2026-04-19)

  • 分類模型支持(輸出 prob_up 概率)
  • 滾動預測:紅線使用歷史5天數據分別預測未來5天
  • 價格對齊:散點圖顯示預測價格 vs 實際價格
  • 策略優化:獨立腳本優化交易參數
  • 清理多餘模型和腳本

v1.1.0 (2026-04-14)

  • Walk-forward CV 優化流程
  • 特徵工程標準化
  • 基礎回測框架

v1.0.0 (2026-04-10)

  • 初始版本
  • PatchTST 基礎模型
  • 簡單回測功能

⚠️ 免責聲明

本項目僅供研究學習使用,不構成任何投資建議。股市有風險,投資需謹慎。

模型預測存在風險與局限性:

  • 近期回測準確率約 97%,但歷史表現不代表未來收益
  • 預測收益波動較大,數值穩定性待改進
  • 模型基於歷史數據訓練,可能無法預測黑天鵝事件或市場結構突變
  • 回測期間交易次數較少(4次),統計意義有限

📄 License

MIT License

🙏 致謝

  • PatchTST: 基於 Nie et al. (2023) 的時間序列預測架構
  • Optuna: 超參數優化框架
  • PyTorch: 深度學習框架
  • akshare: 財經數據接口

About

PatchTST-based quantitative forecasting system for stock price prediction

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

17 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

QuantForecast

VersionPythonPyTorch

基於 PatchTST (Channel-Time Patch Time-Series Transformer) 的量化預測系統,專注於港股(小米 1810.HK)的價格預測與回測。

版本: v1.1.1 (2026-04-19) - 分類模型 + 滾動預測版本

📊 項目概述

本項目使用 Transformer 架構處理時間序列數據,通過 Patch-based 方法提取局部時序特徵,結合多維技術指標進行股票價格方向預測(分類任務)。

核心特性

  • 🔮 PatchTST 分類模型: 預測 T+5 日價格方向(漲/跌),輸出上漲概率 prob_up
  • 📈 特徵工程: 原始價格 + 技術指標(EMA比率/MACD/RSI/ATR比率/OBV/成交量比率/收益率)
  • 🎯 方向預測: 二分類問題(漲/跌),預測收益率轉換: (prob_up - 0.5) * 0.1
  • 📊 完整回測: 支持多時間段回測、Walk-forward CV 參數優化、風險指標計算
  • 🎨 數據可視化: 暗色主題專業圖表(含混淆矩陣、價格散點圖、持倉狀態條)
  • ⚖️ Walk-forward CV: Optuna + 時間序列交叉驗證,避免過擬合
  • 🔄 滾動預測: 紅線使用歷史5天數據分別預測未來5天(非插值)

🏗️ 項目結構

quantforecast/
├── src/ # 源代碼
│ ├── backtest/ # 回測引擎
│ │ ├── engine.py
│ │ └── reporting.py
│ ├── data/ # 數據處理
│ │ ├── loader.py
│ │ ├── preprocessor.py
│ │ └── features.py
│ ├── models/ # 模型定義
│ │ ├── patchtst.py # PatchTST 分類/回歸模型
│ │ └── revin.py # 可逆實例歸一化
│ ├── training/ # 訓練與優化
│ │ ├── trainer.py
│ │ ├── evaluator.py
│ │ └── optimizers/
│ │ └── optuna_optimizer.py
│ ├── utils/ # 工具函數
│ └── config.py # 配置管理
├── scripts/ # 執行腳本
│ ├── backtest.py # 完整回測(含圖表輸出)
│ ├── backtest_old_params.py # 舊參數回測可視化
│ ├── visualize_backtest.py # 回測可視化模塊
│ ├── train.py # 模型訓練
│ ├── optimize.py # Optuna 模型超參優化
│ ├── strategy_optimize.py # 交易策略參數優化
│ ├── plot_optimization.py # 優化結果可視化
│ ├── plot_params_comparison.py # 參數對比可視化
│ ├── update_realtime.py # 實時數據更新
│ ├── daily_pipeline.py # 每日數據管道
│ └── scheduled_backtest.py # 定時回測任務
├── data/ # 數據文件
│ └── xiaomi_real.csv # 小米股價數據 (2023-01 ~ 2026-04)
├── results/ # 結果輸出
│ ├── complete_backtest_results.png # 回測圖表
│ ├── complete_backtest_results.json # 回測數據
│ ├── future_prediction.json # 未來5天預測
│ └── optuna_best_params_*.json # 最佳參數
├── models/ # 模型文件
│ └── patchtst_classification_fixed_20260416_121241.pth # 當前模型
├── logs/ # 日誌文件
└── README.md # 本文件

🚀 快速開始

環境要求

pip install -r requirements.txt

更新數據(獲取最新股價)

cd quantforecast
python3 scripts/update_realtime.py

數據源:

  • akshare: 歷史日線數據(延遲但完整)
  • 新浪/騰訊實時: 當日收盤價(實時更新)

運行回測

cd quantforecast
# 使用優化後的參數運行回測
python3 scripts/backtest.py --optimized --months 3
# 或使用默認參數
python3 scripts/backtest.py

回測結果將輸出至:

  • results/complete_backtest_results.png - 回測圖表(含回測時間戳與 T+1 建議)
  • results/complete_backtest_results.json - 詳細回測數據
  • results/future_prediction.json - 未來5天預測

訓練新模型

# Walk-forward CV 優化(推薦)
python3 scripts/optimize.py
# 常規訓練
python3 scripts/train.py

策略參數優化

# 優化交易策略參數(概率閾值/持有天數/止損比例)
python3 scripts/strategy_optimize.py

📈 當前模型

模型信息

模型文件: patchtst_classification_fixed_20260416_121241.pth

模型類型: 分類模型(Classification)

輸出:

  • prob_up: 上漲概率 (0~1)
  • 預測收益率: (prob_up - 0.5) * 0.1

最佳超參數 (Walk-forward CV + Optuna):

seq_len=20# 輸入序列長度(20個交易日)pred_len=5# 預測長度(5個交易日)d_model=64# 嵌入維度n_heads=8# 注意力頭數n_layers=3# Transformer 層數patch_len=5# Patch 長度stride=2# Patch 步長dropout=0.2# Dropout 率learning_rate=2.05e-4# 學習率batch_size=32# 批次大小

策略參數 (優化後):

prob_threshold=0.3792# 概率閾值holding_days=4# 持有天數stop_loss=0.06# 止損比例 (6%)

特徵工程

特徵類型具體特徵處理方式
價格open, high, low, close原始值
成交量volume, volume_ratio原始值 / 20日均值比率
資金流OBV累積和: sign(價格變化) * volume 的累積
趨勢EMA5/10/20_ratio比率: close/ema - 1
動量MACD, MACD_hist原始值
波動率ATR_ratio (ATR/close), RSI_14, volatility_20d比率/原始值/標準差
收益率return_1d, return_5d百分比變化

🎯 最新回測結果

回測概覽 (2026-01-19 ~ 2026-04-17)

指標數值
策略總收益+10.22%
Buy & Hold-16.37%
超額收益+26.59%
最大回撤-4.63%
年化波動率27.00%
夏普比率2.73
索提諾比率3.92
卡爾瑪比率2.21
總交易次數4次
勝率100% (4勝0負)
測試準確率97.1%

T+1 操作建議

  • 回測時間: 2026-04-19 18:39
  • 最新日期: 2026-04-17
  • 操作: 🔴 SELL
  • 當前價格: 32.00 HKD
  • 目標價格: 31.60 HKD
  • 預期收益 (T+5): -1.25%
  • 預測區間: 2026-04-20 ~ 2026-04-24

滾動預測詳情

紅線使用滾動窗口預測(非線性插值),基於過去5天數據分別預測對應的未來日期:

  • T-4 數據 → 預測 T+1
  • T-3 數據 → 預測 T+2
  • ...
  • T 數據 → 預測 T+5

每個預測點都是獨立的模型推理,預測價格計算:

pred_price = hist_close * (1 + (prob_up - 0.5) * 0.1)
歷史日期目標日期預測價格prob_up
2026-04-132026-04-2030.29 HKD0.3780
2026-04-142026-04-2130.51 HKD0.3789
2026-04-152026-04-2230.51 HKD0.3744
2026-04-162026-04-2331.66 HKD0.3737
2026-04-172026-04-2431.60 HKD0.3751

🖼️ 圖表說明

Backtest Results

complete_backtest_results.png 包含6個子圖,配合回測數據解讀:

1. Confusion Matrix(混淆矩陣)

預測方向 vs 實際方向,對齊黃線邏輯(T vs T-5 比較):

預測跌預測漲
實際跌TN=26FP=0
實際漲FN=1TP=8
  • 準確率: 97.1%
  • Precision (漲): 100%(預測漲的全對)
  • Recall (漲): 88.9%(漏了1個漲的)

2. Daily Return Distribution(日收益分布)

策略每日收益的直方圖與核密度估計,展示收益分布形態。

3. Predicted Price vs Actual Price(價格散點圖)

X軸: 預測價格(T-5 預測的 T 時刻價格)
Y軸: 實際價格(T 時刻真實價格)
藍虛線: 完美預測對角線

  • 綠點 = 預測漲(prob_up > 0.5)
  • 紅點 = 預測跌(prob_up ≤ 0.5)
  • 點越靠近對角線 = 預測越準確

4. Cumulative Return(累計收益)

  • 藍線: 策略累計收益 (+10.22%)
  • 灰虛線: Buy & Hold 基準 (-16.37%)
  • 綠/紅區域: 策略正/負收益時段
  • 底部顏色條: 持倉狀態(綠=持倉,紅=空倉)

5. Stock Price(股價與預測)

  • 藍線: 實際股價
  • 黃線: 歷史 T+5 預測(T-5 預測的 T 時刻價格,用於回測驗證)
  • 紅線: 未來5天滾動預測(T-4→T+1, T-3→T+2...)
  • 紅色陰影區: 未來預測區間

數據可視化特性

  • 黃線: 用 T-5 數據預測的 T 時刻價格(與藍線同時間軸對比)
  • 紅線: 用過去5天數據分別預測未來5天的滾動預測(非插值)
  • 持倉狀態條: 綠色 = 持倉中,紅色 = 空倉

🔧 Walk-forward CV 優化

為解決過擬合問題,使用 Walk-forward 交叉驗證:

# 時間序列交叉驗證(避免未來數據洩露)fortrain_idx, val_idxinTimeSeriesSplit(n_splits=5):
# 只在歷史數據上訓練# 在之後的數據上驗證

優化結果:

  • Trial: 100次
  • CV Score: 最佳驗證分數
  • 測試集準確率: 約 51-60%
  • 模型穩定性: Walk-forward CV 顯著提升

樣本加權(指數衰減)

訓練時可選擇對近期數據賦予更高權重(指數衰減):

# 指數衰減權重:w_t = exp(λ * (t - T))# λ 越大,對近期數據權重越高weights=np.exp(decay_lambda* (time_indices-T))

用途:讓模型更關注近期市場模式,適應市場結構變化。

🎯 策略優化

方法:網格搜索 + 多目標評估

策略優化使用網格搜索(Grid Search)測試所有參數組合:

優化參數範圍:

prob_threshold= [0.35, 0.37, 0.40, 0.45, 0.50] # 概率閾值holding_days= [1, 3, 5, 7, 10] # 持有天數stop_loss= [0.05, 0.08, 0.10, 0.15] # 止損比例

評估指標:

  • 總回報(Total Return)
  • Sharpe Ratio(風險調整後收益)
  • 最大回撤(Max Drawdown)
  • 交易次數(Trade Count)

優化邏輯:

  1. 對每個參數組合運行完整回測
  2. 計算上述評估指標
  3. 選擇 Sharpe Ratio 最高的參數組合作為最佳策略

📝 關鍵文件說明

文件說明
scripts/backtest.py主回測程序,輸出含大標題的圖表與 T+1 建議
scripts/visualize_backtest.py回測可視化模塊(暗色主題、價格對齊)
scripts/optimize.pyWalk-forward CV + Optuna 模型超參優化
scripts/strategy_optimize.py交易策略參數優化(概率閾值/持有天數/止損比例)
scripts/train.py模型訓練(支持分類/回歸)
scripts/update_realtime.py實時數據更新(akshare + 新浪/騰訊)
scripts/daily_pipeline.py每日數據管道(收市後自動運行)
src/models/patchtst.pyPatchTST 分類/回歸模型架構
src/data/loader.py數據加載與驗證
data/xiaomi_real.csv小米真實股價數據

📜 版本歷史

v1.1.1 (2026-04-19)

  • 分類模型支持(輸出 prob_up 概率)
  • 滾動預測:紅線使用歷史5天數據分別預測未來5天
  • 價格對齊:散點圖顯示預測價格 vs 實際價格
  • 策略優化:獨立腳本優化交易參數
  • 清理多餘模型和腳本

v1.1.0 (2026-04-14)

  • Walk-forward CV 優化流程
  • 特徵工程標準化
  • 基礎回測框架

v1.0.0 (2026-04-10)

  • 初始版本
  • PatchTST 基礎模型
  • 簡單回測功能

⚠️ 免責聲明

本項目僅供研究學習使用,不構成任何投資建議。股市有風險,投資需謹慎。

模型預測存在風險與局限性:

  • 近期回測準確率約 97%,但歷史表現不代表未來收益
  • 預測收益波動較大,數值穩定性待改進
  • 模型基於歷史數據訓練,可能無法預測黑天鵝事件或市場結構突變
  • 回測期間交易次數較少(4次),統計意義有限

📄 License

MIT License

🙏 致謝

  • PatchTST: 基於 Nie et al. (2023) 的時間序列預測架構
  • Optuna: 超參數優化框架
  • PyTorch: 深度學習框架
  • akshare: 財經數據接口

About

PatchTST-based quantitative forecasting system for stock price prediction

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

17 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

QuantForecast

VersionPythonPyTorch

基於 PatchTST (Channel-Time Patch Time-Series Transformer) 的量化預測系統,專注於港股(小米 1810.HK)的價格預測與回測。

版本: v1.1.1 (2026-04-19) - 分類模型 + 滾動預測版本

📊 項目概述

本項目使用 Transformer 架構處理時間序列數據,通過 Patch-based 方法提取局部時序特徵,結合多維技術指標進行股票價格方向預測(分類任務)。

核心特性

  • 🔮 PatchTST 分類模型: 預測 T+5 日價格方向(漲/跌),輸出上漲概率 prob_up
  • 📈 特徵工程: 原始價格 + 技術指標(EMA比率/MACD/RSI/ATR比率/OBV/成交量比率/收益率)
  • 🎯 方向預測: 二分類問題(漲/跌),預測收益率轉換: (prob_up - 0.5) * 0.1
  • 📊 完整回測: 支持多時間段回測、Walk-forward CV 參數優化、風險指標計算
  • 🎨 數據可視化: 暗色主題專業圖表(含混淆矩陣、價格散點圖、持倉狀態條)
  • ⚖️ Walk-forward CV: Optuna + 時間序列交叉驗證,避免過擬合
  • 🔄 滾動預測: 紅線使用歷史5天數據分別預測未來5天(非插值)

🏗️ 項目結構

quantforecast/
├── src/ # 源代碼
│ ├── backtest/ # 回測引擎
│ │ ├── engine.py
│ │ └── reporting.py
│ ├── data/ # 數據處理
│ │ ├── loader.py
│ │ ├── preprocessor.py
│ │ └── features.py
│ ├── models/ # 模型定義
│ │ ├── patchtst.py # PatchTST 分類/回歸模型
│ │ └── revin.py # 可逆實例歸一化
│ ├── training/ # 訓練與優化
│ │ ├── trainer.py
│ │ ├── evaluator.py
│ │ └── optimizers/
│ │ └── optuna_optimizer.py
│ ├── utils/ # 工具函數
│ └── config.py # 配置管理
├── scripts/ # 執行腳本
│ ├── backtest.py # 完整回測(含圖表輸出)
│ ├── backtest_old_params.py # 舊參數回測可視化
│ ├── visualize_backtest.py # 回測可視化模塊
│ ├── train.py # 模型訓練
│ ├── optimize.py # Optuna 模型超參優化
│ ├── strategy_optimize.py # 交易策略參數優化
│ ├── plot_optimization.py # 優化結果可視化
│ ├── plot_params_comparison.py # 參數對比可視化
│ ├── update_realtime.py # 實時數據更新
│ ├── daily_pipeline.py # 每日數據管道
│ └── scheduled_backtest.py # 定時回測任務
├── data/ # 數據文件
│ └── xiaomi_real.csv # 小米股價數據 (2023-01 ~ 2026-04)
├── results/ # 結果輸出
│ ├── complete_backtest_results.png # 回測圖表
│ ├── complete_backtest_results.json # 回測數據
│ ├── future_prediction.json # 未來5天預測
│ └── optuna_best_params_*.json # 最佳參數
├── models/ # 模型文件
│ └── patchtst_classification_fixed_20260416_121241.pth # 當前模型
├── logs/ # 日誌文件
└── README.md # 本文件

🚀 快速開始

環境要求

pip install -r requirements.txt

更新數據(獲取最新股價)

cd quantforecast
python3 scripts/update_realtime.py

數據源:

  • akshare: 歷史日線數據(延遲但完整)
  • 新浪/騰訊實時: 當日收盤價(實時更新)

運行回測

cd quantforecast
# 使用優化後的參數運行回測
python3 scripts/backtest.py --optimized --months 3
# 或使用默認參數
python3 scripts/backtest.py

回測結果將輸出至:

  • results/complete_backtest_results.png - 回測圖表(含回測時間戳與 T+1 建議)
  • results/complete_backtest_results.json - 詳細回測數據
  • results/future_prediction.json - 未來5天預測

訓練新模型

# Walk-forward CV 優化(推薦)
python3 scripts/optimize.py
# 常規訓練
python3 scripts/train.py

策略參數優化

# 優化交易策略參數(概率閾值/持有天數/止損比例)
python3 scripts/strategy_optimize.py

📈 當前模型

模型信息

模型文件: patchtst_classification_fixed_20260416_121241.pth

模型類型: 分類模型(Classification)

輸出:

  • prob_up: 上漲概率 (0~1)
  • 預測收益率: (prob_up - 0.5) * 0.1

最佳超參數 (Walk-forward CV + Optuna):

seq_len=20# 輸入序列長度(20個交易日)pred_len=5# 預測長度(5個交易日)d_model=64# 嵌入維度n_heads=8# 注意力頭數n_layers=3# Transformer 層數patch_len=5# Patch 長度stride=2# Patch 步長dropout=0.2# Dropout 率learning_rate=2.05e-4# 學習率batch_size=32# 批次大小

策略參數 (優化後):

prob_threshold=0.3792# 概率閾值holding_days=4# 持有天數stop_loss=0.06# 止損比例 (6%)

特徵工程

特徵類型具體特徵處理方式
價格open, high, low, close原始值
成交量volume, volume_ratio原始值 / 20日均值比率
資金流OBV累積和: sign(價格變化) * volume 的累積
趨勢EMA5/10/20_ratio比率: close/ema - 1
動量MACD, MACD_hist原始值
波動率ATR_ratio (ATR/close), RSI_14, volatility_20d比率/原始值/標準差
收益率return_1d, return_5d百分比變化

🎯 最新回測結果

回測概覽 (2026-01-19 ~ 2026-04-17)

指標數值
策略總收益+10.22%
Buy & Hold-16.37%
超額收益+26.59%
最大回撤-4.63%
年化波動率27.00%
夏普比率2.73
索提諾比率3.92
卡爾瑪比率2.21
總交易次數4次
勝率100% (4勝0負)
測試準確率97.1%

T+1 操作建議

  • 回測時間: 2026-04-19 18:39
  • 最新日期: 2026-04-17
  • 操作: 🔴 SELL
  • 當前價格: 32.00 HKD
  • 目標價格: 31.60 HKD
  • 預期收益 (T+5): -1.25%
  • 預測區間: 2026-04-20 ~ 2026-04-24

滾動預測詳情

紅線使用滾動窗口預測(非線性插值),基於過去5天數據分別預測對應的未來日期:

  • T-4 數據 → 預測 T+1
  • T-3 數據 → 預測 T+2
  • ...
  • T 數據 → 預測 T+5

每個預測點都是獨立的模型推理,預測價格計算:

pred_price = hist_close * (1 + (prob_up - 0.5) * 0.1)
歷史日期目標日期預測價格prob_up
2026-04-132026-04-2030.29 HKD0.3780
2026-04-142026-04-2130.51 HKD0.3789
2026-04-152026-04-2230.51 HKD0.3744
2026-04-162026-04-2331.66 HKD0.3737
2026-04-172026-04-2431.60 HKD0.3751

🖼️ 圖表說明

Backtest Results

complete_backtest_results.png 包含6個子圖,配合回測數據解讀:

1. Confusion Matrix(混淆矩陣)

預測方向 vs 實際方向,對齊黃線邏輯(T vs T-5 比較):

預測跌預測漲
實際跌TN=26FP=0
實際漲FN=1TP=8
  • 準確率: 97.1%
  • Precision (漲): 100%(預測漲的全對)
  • Recall (漲): 88.9%(漏了1個漲的)

2. Daily Return Distribution(日收益分布)

策略每日收益的直方圖與核密度估計,展示收益分布形態。

3. Predicted Price vs Actual Price(價格散點圖)

X軸: 預測價格(T-5 預測的 T 時刻價格)
Y軸: 實際價格(T 時刻真實價格)
藍虛線: 完美預測對角線

  • 綠點 = 預測漲(prob_up > 0.5)
  • 紅點 = 預測跌(prob_up ≤ 0.5)
  • 點越靠近對角線 = 預測越準確

4. Cumulative Return(累計收益)

  • 藍線: 策略累計收益 (+10.22%)
  • 灰虛線: Buy & Hold 基準 (-16.37%)
  • 綠/紅區域: 策略正/負收益時段
  • 底部顏色條: 持倉狀態(綠=持倉,紅=空倉)

5. Stock Price(股價與預測)

  • 藍線: 實際股價
  • 黃線: 歷史 T+5 預測(T-5 預測的 T 時刻價格,用於回測驗證)
  • 紅線: 未來5天滾動預測(T-4→T+1, T-3→T+2...)
  • 紅色陰影區: 未來預測區間

數據可視化特性

  • 黃線: 用 T-5 數據預測的 T 時刻價格(與藍線同時間軸對比)
  • 紅線: 用過去5天數據分別預測未來5天的滾動預測(非插值)
  • 持倉狀態條: 綠色 = 持倉中,紅色 = 空倉

🔧 Walk-forward CV 優化

為解決過擬合問題,使用 Walk-forward 交叉驗證:

# 時間序列交叉驗證(避免未來數據洩露)fortrain_idx, val_idxinTimeSeriesSplit(n_splits=5):
# 只在歷史數據上訓練# 在之後的數據上驗證

優化結果:

  • Trial: 100次
  • CV Score: 最佳驗證分數
  • 測試集準確率: 約 51-60%
  • 模型穩定性: Walk-forward CV 顯著提升

樣本加權(指數衰減)

訓練時可選擇對近期數據賦予更高權重(指數衰減):

# 指數衰減權重:w_t = exp(λ * (t - T))# λ 越大,對近期數據權重越高weights=np.exp(decay_lambda* (time_indices-T))

用途:讓模型更關注近期市場模式,適應市場結構變化。

🎯 策略優化

方法:網格搜索 + 多目標評估

策略優化使用網格搜索(Grid Search)測試所有參數組合:

優化參數範圍:

prob_threshold= [0.35, 0.37, 0.40, 0.45, 0.50] # 概率閾值holding_days= [1, 3, 5, 7, 10] # 持有天數stop_loss= [0.05, 0.08, 0.10, 0.15] # 止損比例

評估指標:

  • 總回報(Total Return)
  • Sharpe Ratio(風險調整後收益)
  • 最大回撤(Max Drawdown)
  • 交易次數(Trade Count)

優化邏輯:

  1. 對每個參數組合運行完整回測
  2. 計算上述評估指標
  3. 選擇 Sharpe Ratio 最高的參數組合作為最佳策略

📝 關鍵文件說明

文件說明
scripts/backtest.py主回測程序,輸出含大標題的圖表與 T+1 建議
scripts/visualize_backtest.py回測可視化模塊(暗色主題、價格對齊)
scripts/optimize.pyWalk-forward CV + Optuna 模型超參優化
scripts/strategy_optimize.py交易策略參數優化(概率閾值/持有天數/止損比例)
scripts/train.py模型訓練(支持分類/回歸)
scripts/update_realtime.py實時數據更新(akshare + 新浪/騰訊)
scripts/daily_pipeline.py每日數據管道(收市後自動運行)
src/models/patchtst.pyPatchTST 分類/回歸模型架構
src/data/loader.py數據加載與驗證
data/xiaomi_real.csv小米真實股價數據

📜 版本歷史

v1.1.1 (2026-04-19)

  • 分類模型支持(輸出 prob_up 概率)
  • 滾動預測:紅線使用歷史5天數據分別預測未來5天
  • 價格對齊:散點圖顯示預測價格 vs 實際價格
  • 策略優化:獨立腳本優化交易參數
  • 清理多餘模型和腳本

v1.1.0 (2026-04-14)

  • Walk-forward CV 優化流程
  • 特徵工程標準化
  • 基礎回測框架

v1.0.0 (2026-04-10)

  • 初始版本
  • PatchTST 基礎模型
  • 簡單回測功能

⚠️ 免責聲明

本項目僅供研究學習使用,不構成任何投資建議。股市有風險,投資需謹慎。

模型預測存在風險與局限性:

  • 近期回測準確率約 97%,但歷史表現不代表未來收益
  • 預測收益波動較大,數值穩定性待改進
  • 模型基於歷史數據訓練,可能無法預測黑天鵝事件或市場結構突變
  • 回測期間交易次數較少(4次),統計意義有限

📄 License

MIT License

🙏 致謝

  • PatchTST: 基於 Nie et al. (2023) 的時間序列預測架構
  • Optuna: 超參數優化框架
  • PyTorch: 深度學習框架
  • akshare: 財經數據接口

About

PatchTST-based quantitative forecasting system for stock price prediction

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

17 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

QuantForecast

VersionPythonPyTorch

基於 PatchTST (Channel-Time Patch Time-Series Transformer) 的量化預測系統,專注於港股(小米 1810.HK)的價格預測與回測。

版本: v1.1.1 (2026-04-19) - 分類模型 + 滾動預測版本

📊 項目概述

本項目使用 Transformer 架構處理時間序列數據,通過 Patch-based 方法提取局部時序特徵,結合多維技術指標進行股票價格方向預測(分類任務)。

核心特性

  • 🔮 PatchTST 分類模型: 預測 T+5 日價格方向(漲/跌),輸出上漲概率 prob_up
  • 📈 特徵工程: 原始價格 + 技術指標(EMA比率/MACD/RSI/ATR比率/OBV/成交量比率/收益率)
  • 🎯 方向預測: 二分類問題(漲/跌),預測收益率轉換: (prob_up - 0.5) * 0.1
  • 📊 完整回測: 支持多時間段回測、Walk-forward CV 參數優化、風險指標計算
  • 🎨 數據可視化: 暗色主題專業圖表(含混淆矩陣、價格散點圖、持倉狀態條)
  • ⚖️ Walk-forward CV: Optuna + 時間序列交叉驗證,避免過擬合
  • 🔄 滾動預測: 紅線使用歷史5天數據分別預測未來5天(非插值)

🏗️ 項目結構

quantforecast/
├── src/ # 源代碼
│ ├── backtest/ # 回測引擎
│ │ ├── engine.py
│ │ └── reporting.py
│ ├── data/ # 數據處理
│ │ ├── loader.py
│ │ ├── preprocessor.py
│ │ └── features.py
│ ├── models/ # 模型定義
│ │ ├── patchtst.py # PatchTST 分類/回歸模型
│ │ └── revin.py # 可逆實例歸一化
│ ├── training/ # 訓練與優化
│ │ ├── trainer.py
│ │ ├── evaluator.py
│ │ └── optimizers/
│ │ └── optuna_optimizer.py
│ ├── utils/ # 工具函數
│ └── config.py # 配置管理
├── scripts/ # 執行腳本
│ ├── backtest.py # 完整回測(含圖表輸出)
│ ├── backtest_old_params.py # 舊參數回測可視化
│ ├── visualize_backtest.py # 回測可視化模塊
│ ├── train.py # 模型訓練
│ ├── optimize.py # Optuna 模型超參優化
│ ├── strategy_optimize.py # 交易策略參數優化
│ ├── plot_optimization.py # 優化結果可視化
│ ├── plot_params_comparison.py # 參數對比可視化
│ ├── update_realtime.py # 實時數據更新
│ ├── daily_pipeline.py # 每日數據管道
│ └── scheduled_backtest.py # 定時回測任務
├── data/ # 數據文件
│ └── xiaomi_real.csv # 小米股價數據 (2023-01 ~ 2026-04)
├── results/ # 結果輸出
│ ├── complete_backtest_results.png # 回測圖表
│ ├── complete_backtest_results.json # 回測數據
│ ├── future_prediction.json # 未來5天預測
│ └── optuna_best_params_*.json # 最佳參數
├── models/ # 模型文件
│ └── patchtst_classification_fixed_20260416_121241.pth # 當前模型
├── logs/ # 日誌文件
└── README.md # 本文件

🚀 快速開始

環境要求

pip install -r requirements.txt

更新數據(獲取最新股價)

cd quantforecast
python3 scripts/update_realtime.py

數據源:

  • akshare: 歷史日線數據(延遲但完整)
  • 新浪/騰訊實時: 當日收盤價(實時更新)

運行回測

cd quantforecast
# 使用優化後的參數運行回測
python3 scripts/backtest.py --optimized --months 3
# 或使用默認參數
python3 scripts/backtest.py

回測結果將輸出至:

  • results/complete_backtest_results.png - 回測圖表(含回測時間戳與 T+1 建議)
  • results/complete_backtest_results.json - 詳細回測數據
  • results/future_prediction.json - 未來5天預測

訓練新模型

# Walk-forward CV 優化(推薦)
python3 scripts/optimize.py
# 常規訓練
python3 scripts/train.py

策略參數優化

# 優化交易策略參數(概率閾值/持有天數/止損比例)
python3 scripts/strategy_optimize.py

📈 當前模型

模型信息

模型文件: patchtst_classification_fixed_20260416_121241.pth

模型類型: 分類模型(Classification)

輸出:

  • prob_up: 上漲概率 (0~1)
  • 預測收益率: (prob_up - 0.5) * 0.1

最佳超參數 (Walk-forward CV + Optuna):

seq_len=20# 輸入序列長度(20個交易日)pred_len=5# 預測長度(5個交易日)d_model=64# 嵌入維度n_heads=8# 注意力頭數n_layers=3# Transformer 層數patch_len=5# Patch 長度stride=2# Patch 步長dropout=0.2# Dropout 率learning_rate=2.05e-4# 學習率batch_size=32# 批次大小

策略參數 (優化後):

prob_threshold=0.3792# 概率閾值holding_days=4# 持有天數stop_loss=0.06# 止損比例 (6%)

特徵工程

特徵類型具體特徵處理方式
價格open, high, low, close原始值
成交量volume, volume_ratio原始值 / 20日均值比率
資金流OBV累積和: sign(價格變化) * volume 的累積
趨勢EMA5/10/20_ratio比率: close/ema - 1
動量MACD, MACD_hist原始值
波動率ATR_ratio (ATR/close), RSI_14, volatility_20d比率/原始值/標準差
收益率return_1d, return_5d百分比變化

🎯 最新回測結果

回測概覽 (2026-01-19 ~ 2026-04-17)

指標數值
策略總收益+10.22%
Buy & Hold-16.37%
超額收益+26.59%
最大回撤-4.63%
年化波動率27.00%
夏普比率2.73
索提諾比率3.92
卡爾瑪比率2.21
總交易次數4次
勝率100% (4勝0負)
測試準確率97.1%

T+1 操作建議

  • 回測時間: 2026-04-19 18:39
  • 最新日期: 2026-04-17
  • 操作: 🔴 SELL
  • 當前價格: 32.00 HKD
  • 目標價格: 31.60 HKD
  • 預期收益 (T+5): -1.25%
  • 預測區間: 2026-04-20 ~ 2026-04-24

滾動預測詳情

紅線使用滾動窗口預測(非線性插值),基於過去5天數據分別預測對應的未來日期:

  • T-4 數據 → 預測 T+1
  • T-3 數據 → 預測 T+2
  • ...
  • T 數據 → 預測 T+5

每個預測點都是獨立的模型推理,預測價格計算:

pred_price = hist_close * (1 + (prob_up - 0.5) * 0.1)
歷史日期目標日期預測價格prob_up
2026-04-132026-04-2030.29 HKD0.3780
2026-04-142026-04-2130.51 HKD0.3789
2026-04-152026-04-2230.51 HKD0.3744
2026-04-162026-04-2331.66 HKD0.3737
2026-04-172026-04-2431.60 HKD0.3751

🖼️ 圖表說明

Backtest Results

complete_backtest_results.png 包含6個子圖,配合回測數據解讀:

1. Confusion Matrix(混淆矩陣)

預測方向 vs 實際方向,對齊黃線邏輯(T vs T-5 比較):

預測跌預測漲
實際跌TN=26FP=0
實際漲FN=1TP=8
  • 準確率: 97.1%
  • Precision (漲): 100%(預測漲的全對)
  • Recall (漲): 88.9%(漏了1個漲的)

2. Daily Return Distribution(日收益分布)

策略每日收益的直方圖與核密度估計,展示收益分布形態。

3. Predicted Price vs Actual Price(價格散點圖)

X軸: 預測價格(T-5 預測的 T 時刻價格)
Y軸: 實際價格(T 時刻真實價格)
藍虛線: 完美預測對角線

  • 綠點 = 預測漲(prob_up > 0.5)
  • 紅點 = 預測跌(prob_up ≤ 0.5)
  • 點越靠近對角線 = 預測越準確

4. Cumulative Return(累計收益)

  • 藍線: 策略累計收益 (+10.22%)
  • 灰虛線: Buy & Hold 基準 (-16.37%)
  • 綠/紅區域: 策略正/負收益時段
  • 底部顏色條: 持倉狀態(綠=持倉,紅=空倉)

5. Stock Price(股價與預測)

  • 藍線: 實際股價
  • 黃線: 歷史 T+5 預測(T-5 預測的 T 時刻價格,用於回測驗證)
  • 紅線: 未來5天滾動預測(T-4→T+1, T-3→T+2...)
  • 紅色陰影區: 未來預測區間

數據可視化特性

  • 黃線: 用 T-5 數據預測的 T 時刻價格(與藍線同時間軸對比)
  • 紅線: 用過去5天數據分別預測未來5天的滾動預測(非插值)
  • 持倉狀態條: 綠色 = 持倉中,紅色 = 空倉

🔧 Walk-forward CV 優化

為解決過擬合問題,使用 Walk-forward 交叉驗證:

# 時間序列交叉驗證(避免未來數據洩露)fortrain_idx, val_idxinTimeSeriesSplit(n_splits=5):
# 只在歷史數據上訓練# 在之後的數據上驗證

優化結果:

  • Trial: 100次
  • CV Score: 最佳驗證分數
  • 測試集準確率: 約 51-60%
  • 模型穩定性: Walk-forward CV 顯著提升

樣本加權(指數衰減)

訓練時可選擇對近期數據賦予更高權重(指數衰減):

# 指數衰減權重:w_t = exp(λ * (t - T))# λ 越大,對近期數據權重越高weights=np.exp(decay_lambda* (time_indices-T))

用途:讓模型更關注近期市場模式,適應市場結構變化。

🎯 策略優化

方法:網格搜索 + 多目標評估

策略優化使用網格搜索(Grid Search)測試所有參數組合:

優化參數範圍:

prob_threshold= [0.35, 0.37, 0.40, 0.45, 0.50] # 概率閾值holding_days= [1, 3, 5, 7, 10] # 持有天數stop_loss= [0.05, 0.08, 0.10, 0.15] # 止損比例

評估指標:

  • 總回報(Total Return)
  • Sharpe Ratio(風險調整後收益)
  • 最大回撤(Max Drawdown)
  • 交易次數(Trade Count)

優化邏輯:

  1. 對每個參數組合運行完整回測
  2. 計算上述評估指標
  3. 選擇 Sharpe Ratio 最高的參數組合作為最佳策略

📝 關鍵文件說明

文件說明
scripts/backtest.py主回測程序,輸出含大標題的圖表與 T+1 建議
scripts/visualize_backtest.py回測可視化模塊(暗色主題、價格對齊)
scripts/optimize.pyWalk-forward CV + Optuna 模型超參優化
scripts/strategy_optimize.py交易策略參數優化(概率閾值/持有天數/止損比例)
scripts/train.py模型訓練(支持分類/回歸)
scripts/update_realtime.py實時數據更新(akshare + 新浪/騰訊)
scripts/daily_pipeline.py每日數據管道(收市後自動運行)
src/models/patchtst.pyPatchTST 分類/回歸模型架構
src/data/loader.py數據加載與驗證
data/xiaomi_real.csv小米真實股價數據

📜 版本歷史

v1.1.1 (2026-04-19)

  • 分類模型支持(輸出 prob_up 概率)
  • 滾動預測:紅線使用歷史5天數據分別預測未來5天
  • 價格對齊:散點圖顯示預測價格 vs 實際價格
  • 策略優化:獨立腳本優化交易參數
  • 清理多餘模型和腳本

v1.1.0 (2026-04-14)

  • Walk-forward CV 優化流程
  • 特徵工程標準化
  • 基礎回測框架

v1.0.0 (2026-04-10)

  • 初始版本
  • PatchTST 基礎模型
  • 簡單回測功能

⚠️ 免責聲明

本項目僅供研究學習使用,不構成任何投資建議。股市有風險,投資需謹慎。

模型預測存在風險與局限性:

  • 近期回測準確率約 97%,但歷史表現不代表未來收益
  • 預測收益波動較大,數值穩定性待改進
  • 模型基於歷史數據訓練,可能無法預測黑天鵝事件或市場結構突變
  • 回測期間交易次數較少(4次),統計意義有限

📄 License

MIT License

🙏 致謝

  • PatchTST: 基於 Nie et al. (2023) 的時間序列預測架構
  • Optuna: 超參數優化框架
  • PyTorch: 深度學習框架
  • akshare: 財經數據接口

About

PatchTST-based quantitative forecasting system for stock price prediction

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

17 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

QuantForecast

VersionPythonPyTorch

基於 PatchTST (Channel-Time Patch Time-Series Transformer) 的量化預測系統,專注於港股(小米 1810.HK)的價格預測與回測。

版本: v1.1.1 (2026-04-19) - 分類模型 + 滾動預測版本

📊 項目概述

本項目使用 Transformer 架構處理時間序列數據,通過 Patch-based 方法提取局部時序特徵,結合多維技術指標進行股票價格方向預測(分類任務)。

核心特性

  • 🔮 PatchTST 分類模型: 預測 T+5 日價格方向(漲/跌),輸出上漲概率 prob_up
  • 📈 特徵工程: 原始價格 + 技術指標(EMA比率/MACD/RSI/ATR比率/OBV/成交量比率/收益率)
  • 🎯 方向預測: 二分類問題(漲/跌),預測收益率轉換: (prob_up - 0.5) * 0.1
  • 📊 完整回測: 支持多時間段回測、Walk-forward CV 參數優化、風險指標計算
  • 🎨 數據可視化: 暗色主題專業圖表(含混淆矩陣、價格散點圖、持倉狀態條)
  • ⚖️ Walk-forward CV: Optuna + 時間序列交叉驗證,避免過擬合
  • 🔄 滾動預測: 紅線使用歷史5天數據分別預測未來5天(非插值)

🏗️ 項目結構

quantforecast/
├── src/ # 源代碼
│ ├── backtest/ # 回測引擎
│ │ ├── engine.py
│ │ └── reporting.py
│ ├── data/ # 數據處理
│ │ ├── loader.py
│ │ ├── preprocessor.py
│ │ └── features.py
│ ├── models/ # 模型定義
│ │ ├── patchtst.py # PatchTST 分類/回歸模型
│ │ └── revin.py # 可逆實例歸一化
│ ├── training/ # 訓練與優化
│ │ ├── trainer.py
│ │ ├── evaluator.py
│ │ └── optimizers/
│ │ └── optuna_optimizer.py
│ ├── utils/ # 工具函數
│ └── config.py # 配置管理
├── scripts/ # 執行腳本
│ ├── backtest.py # 完整回測(含圖表輸出)
│ ├── backtest_old_params.py # 舊參數回測可視化
│ ├── visualize_backtest.py # 回測可視化模塊
│ ├── train.py # 模型訓練
│ ├── optimize.py # Optuna 模型超參優化
│ ├── strategy_optimize.py # 交易策略參數優化
│ ├── plot_optimization.py # 優化結果可視化
│ ├── plot_params_comparison.py # 參數對比可視化
│ ├── update_realtime.py # 實時數據更新
│ ├── daily_pipeline.py # 每日數據管道
│ └── scheduled_backtest.py # 定時回測任務
├── data/ # 數據文件
│ └── xiaomi_real.csv # 小米股價數據 (2023-01 ~ 2026-04)
├── results/ # 結果輸出
│ ├── complete_backtest_results.png # 回測圖表
│ ├── complete_backtest_results.json # 回測數據
│ ├── future_prediction.json # 未來5天預測
│ └── optuna_best_params_*.json # 最佳參數
├── models/ # 模型文件
│ └── patchtst_classification_fixed_20260416_121241.pth # 當前模型
├── logs/ # 日誌文件
└── README.md # 本文件

🚀 快速開始

環境要求

pip install -r requirements.txt

更新數據(獲取最新股價)

cd quantforecast
python3 scripts/update_realtime.py

數據源:

  • akshare: 歷史日線數據(延遲但完整)
  • 新浪/騰訊實時: 當日收盤價(實時更新)

運行回測

cd quantforecast
# 使用優化後的參數運行回測
python3 scripts/backtest.py --optimized --months 3
# 或使用默認參數
python3 scripts/backtest.py

回測結果將輸出至:

  • results/complete_backtest_results.png - 回測圖表(含回測時間戳與 T+1 建議)
  • results/complete_backtest_results.json - 詳細回測數據
  • results/future_prediction.json - 未來5天預測

訓練新模型

# Walk-forward CV 優化(推薦)
python3 scripts/optimize.py
# 常規訓練
python3 scripts/train.py

策略參數優化

# 優化交易策略參數(概率閾值/持有天數/止損比例)
python3 scripts/strategy_optimize.py

📈 當前模型

模型信息

模型文件: patchtst_classification_fixed_20260416_121241.pth

模型類型: 分類模型(Classification)

輸出:

  • prob_up: 上漲概率 (0~1)
  • 預測收益率: (prob_up - 0.5) * 0.1

最佳超參數 (Walk-forward CV + Optuna):

seq_len=20# 輸入序列長度(20個交易日)pred_len=5# 預測長度(5個交易日)d_model=64# 嵌入維度n_heads=8# 注意力頭數n_layers=3# Transformer 層數patch_len=5# Patch 長度stride=2# Patch 步長dropout=0.2# Dropout 率learning_rate=2.05e-4# 學習率batch_size=32# 批次大小

策略參數 (優化後):

prob_threshold=0.3792# 概率閾值holding_days=4# 持有天數stop_loss=0.06# 止損比例 (6%)

特徵工程

特徵類型具體特徵處理方式
價格open, high, low, close原始值
成交量volume, volume_ratio原始值 / 20日均值比率
資金流OBV累積和: sign(價格變化) * volume 的累積
趨勢EMA5/10/20_ratio比率: close/ema - 1
動量MACD, MACD_hist原始值
波動率ATR_ratio (ATR/close), RSI_14, volatility_20d比率/原始值/標準差
收益率return_1d, return_5d百分比變化

🎯 最新回測結果

回測概覽 (2026-01-19 ~ 2026-04-17)

指標數值
策略總收益+10.22%
Buy & Hold-16.37%
超額收益+26.59%
最大回撤-4.63%
年化波動率27.00%
夏普比率2.73
索提諾比率3.92
卡爾瑪比率2.21
總交易次數4次
勝率100% (4勝0負)
測試準確率97.1%

T+1 操作建議

  • 回測時間: 2026-04-19 18:39
  • 最新日期: 2026-04-17
  • 操作: 🔴 SELL
  • 當前價格: 32.00 HKD
  • 目標價格: 31.60 HKD
  • 預期收益 (T+5): -1.25%
  • 預測區間: 2026-04-20 ~ 2026-04-24

滾動預測詳情

紅線使用滾動窗口預測(非線性插值),基於過去5天數據分別預測對應的未來日期:

  • T-4 數據 → 預測 T+1
  • T-3 數據 → 預測 T+2
  • ...
  • T 數據 → 預測 T+5

每個預測點都是獨立的模型推理,預測價格計算:

pred_price = hist_close * (1 + (prob_up - 0.5) * 0.1)
歷史日期目標日期預測價格prob_up
2026-04-132026-04-2030.29 HKD0.3780
2026-04-142026-04-2130.51 HKD0.3789
2026-04-152026-04-2230.51 HKD0.3744
2026-04-162026-04-2331.66 HKD0.3737
2026-04-172026-04-2431.60 HKD0.3751

🖼️ 圖表說明

Backtest Results

complete_backtest_results.png 包含6個子圖,配合回測數據解讀:

1. Confusion Matrix(混淆矩陣)

預測方向 vs 實際方向,對齊黃線邏輯(T vs T-5 比較):

預測跌預測漲
實際跌TN=26FP=0
實際漲FN=1TP=8
  • 準確率: 97.1%
  • Precision (漲): 100%(預測漲的全對)
  • Recall (漲): 88.9%(漏了1個漲的)

2. Daily Return Distribution(日收益分布)

策略每日收益的直方圖與核密度估計,展示收益分布形態。

3. Predicted Price vs Actual Price(價格散點圖)

X軸: 預測價格(T-5 預測的 T 時刻價格)
Y軸: 實際價格(T 時刻真實價格)
藍虛線: 完美預測對角線

  • 綠點 = 預測漲(prob_up > 0.5)
  • 紅點 = 預測跌(prob_up ≤ 0.5)
  • 點越靠近對角線 = 預測越準確

4. Cumulative Return(累計收益)

  • 藍線: 策略累計收益 (+10.22%)
  • 灰虛線: Buy & Hold 基準 (-16.37%)
  • 綠/紅區域: 策略正/負收益時段
  • 底部顏色條: 持倉狀態(綠=持倉,紅=空倉)

5. Stock Price(股價與預測)

  • 藍線: 實際股價
  • 黃線: 歷史 T+5 預測(T-5 預測的 T 時刻價格,用於回測驗證)
  • 紅線: 未來5天滾動預測(T-4→T+1, T-3→T+2...)
  • 紅色陰影區: 未來預測區間

數據可視化特性

  • 黃線: 用 T-5 數據預測的 T 時刻價格(與藍線同時間軸對比)
  • 紅線: 用過去5天數據分別預測未來5天的滾動預測(非插值)
  • 持倉狀態條: 綠色 = 持倉中,紅色 = 空倉

🔧 Walk-forward CV 優化

為解決過擬合問題,使用 Walk-forward 交叉驗證:

# 時間序列交叉驗證(避免未來數據洩露)fortrain_idx, val_idxinTimeSeriesSplit(n_splits=5):
# 只在歷史數據上訓練# 在之後的數據上驗證

優化結果:

  • Trial: 100次
  • CV Score: 最佳驗證分數
  • 測試集準確率: 約 51-60%
  • 模型穩定性: Walk-forward CV 顯著提升

樣本加權(指數衰減)

訓練時可選擇對近期數據賦予更高權重(指數衰減):

# 指數衰減權重:w_t = exp(λ * (t - T))# λ 越大,對近期數據權重越高weights=np.exp(decay_lambda* (time_indices-T))

用途:讓模型更關注近期市場模式,適應市場結構變化。

🎯 策略優化

方法:網格搜索 + 多目標評估

策略優化使用網格搜索(Grid Search)測試所有參數組合:

優化參數範圍:

prob_threshold= [0.35, 0.37, 0.40, 0.45, 0.50] # 概率閾值holding_days= [1, 3, 5, 7, 10] # 持有天數stop_loss= [0.05, 0.08, 0.10, 0.15] # 止損比例

評估指標:

  • 總回報(Total Return)
  • Sharpe Ratio(風險調整後收益)
  • 最大回撤(Max Drawdown)
  • 交易次數(Trade Count)

優化邏輯:

  1. 對每個參數組合運行完整回測
  2. 計算上述評估指標
  3. 選擇 Sharpe Ratio 最高的參數組合作為最佳策略

📝 關鍵文件說明

文件說明
scripts/backtest.py主回測程序,輸出含大標題的圖表與 T+1 建議
scripts/visualize_backtest.py回測可視化模塊(暗色主題、價格對齊)
scripts/optimize.pyWalk-forward CV + Optuna 模型超參優化
scripts/strategy_optimize.py交易策略參數優化(概率閾值/持有天數/止損比例)
scripts/train.py模型訓練(支持分類/回歸)
scripts/update_realtime.py實時數據更新(akshare + 新浪/騰訊)
scripts/daily_pipeline.py每日數據管道(收市後自動運行)
src/models/patchtst.pyPatchTST 分類/回歸模型架構
src/data/loader.py數據加載與驗證
data/xiaomi_real.csv小米真實股價數據

📜 版本歷史

v1.1.1 (2026-04-19)

  • 分類模型支持(輸出 prob_up 概率)
  • 滾動預測:紅線使用歷史5天數據分別預測未來5天
  • 價格對齊:散點圖顯示預測價格 vs 實際價格
  • 策略優化:獨立腳本優化交易參數
  • 清理多餘模型和腳本

v1.1.0 (2026-04-14)

  • Walk-forward CV 優化流程
  • 特徵工程標準化
  • 基礎回測框架

v1.0.0 (2026-04-10)

  • 初始版本
  • PatchTST 基礎模型
  • 簡單回測功能

⚠️ 免責聲明

本項目僅供研究學習使用,不構成任何投資建議。股市有風險,投資需謹慎。

模型預測存在風險與局限性:

  • 近期回測準確率約 97%,但歷史表現不代表未來收益
  • 預測收益波動較大,數值穩定性待改進
  • 模型基於歷史數據訓練,可能無法預測黑天鵝事件或市場結構突變
  • 回測期間交易次數較少(4次),統計意義有限

📄 License

MIT License

🙏 致謝

  • PatchTST: 基於 Nie et al. (2023) 的時間序列預測架構
  • Optuna: 超參數優化框架
  • PyTorch: 深度學習框架
  • akshare: 財經數據接口

About

PatchTST-based quantitative forecasting system for stock price prediction

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

17 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

QuantForecast

VersionPythonPyTorch

基於 PatchTST (Channel-Time Patch Time-Series Transformer) 的量化預測系統,專注於港股(小米 1810.HK)的價格預測與回測。

版本: v1.1.1 (2026-04-19) - 分類模型 + 滾動預測版本

📊 項目概述

本項目使用 Transformer 架構處理時間序列數據,通過 Patch-based 方法提取局部時序特徵,結合多維技術指標進行股票價格方向預測(分類任務)。

核心特性

  • 🔮 PatchTST 分類模型: 預測 T+5 日價格方向(漲/跌),輸出上漲概率 prob_up
  • 📈 特徵工程: 原始價格 + 技術指標(EMA比率/MACD/RSI/ATR比率/OBV/成交量比率/收益率)
  • 🎯 方向預測: 二分類問題(漲/跌),預測收益率轉換: (prob_up - 0.5) * 0.1
  • 📊 完整回測: 支持多時間段回測、Walk-forward CV 參數優化、風險指標計算
  • 🎨 數據可視化: 暗色主題專業圖表(含混淆矩陣、價格散點圖、持倉狀態條)
  • ⚖️ Walk-forward CV: Optuna + 時間序列交叉驗證,避免過擬合
  • 🔄 滾動預測: 紅線使用歷史5天數據分別預測未來5天(非插值)

🏗️ 項目結構

quantforecast/
├── src/ # 源代碼
│ ├── backtest/ # 回測引擎
│ │ ├── engine.py
│ │ └── reporting.py
│ ├── data/ # 數據處理
│ │ ├── loader.py
│ │ ├── preprocessor.py
│ │ └── features.py
│ ├── models/ # 模型定義
│ │ ├── patchtst.py # PatchTST 分類/回歸模型
│ │ └── revin.py # 可逆實例歸一化
│ ├── training/ # 訓練與優化
│ │ ├── trainer.py
│ │ ├── evaluator.py
│ │ └── optimizers/
│ │ └── optuna_optimizer.py
│ ├── utils/ # 工具函數
│ └── config.py # 配置管理
├── scripts/ # 執行腳本
│ ├── backtest.py # 完整回測(含圖表輸出)
│ ├── backtest_old_params.py # 舊參數回測可視化
│ ├── visualize_backtest.py # 回測可視化模塊
│ ├── train.py # 模型訓練
│ ├── optimize.py # Optuna 模型超參優化
│ ├── strategy_optimize.py # 交易策略參數優化
│ ├── plot_optimization.py # 優化結果可視化
│ ├── plot_params_comparison.py # 參數對比可視化
│ ├── update_realtime.py # 實時數據更新
│ ├── daily_pipeline.py # 每日數據管道
│ └── scheduled_backtest.py # 定時回測任務
├── data/ # 數據文件
│ └── xiaomi_real.csv # 小米股價數據 (2023-01 ~ 2026-04)
├── results/ # 結果輸出
│ ├── complete_backtest_results.png # 回測圖表
│ ├── complete_backtest_results.json # 回測數據
│ ├── future_prediction.json # 未來5天預測
│ └── optuna_best_params_*.json # 最佳參數
├── models/ # 模型文件
│ └── patchtst_classification_fixed_20260416_121241.pth # 當前模型
├── logs/ # 日誌文件
└── README.md # 本文件

🚀 快速開始

環境要求

pip install -r requirements.txt

更新數據(獲取最新股價)

cd quantforecast
python3 scripts/update_realtime.py

數據源:

  • akshare: 歷史日線數據(延遲但完整)
  • 新浪/騰訊實時: 當日收盤價(實時更新)

運行回測

cd quantforecast
# 使用優化後的參數運行回測
python3 scripts/backtest.py --optimized --months 3
# 或使用默認參數
python3 scripts/backtest.py

回測結果將輸出至:

  • results/complete_backtest_results.png - 回測圖表(含回測時間戳與 T+1 建議)
  • results/complete_backtest_results.json - 詳細回測數據
  • results/future_prediction.json - 未來5天預測

訓練新模型

# Walk-forward CV 優化(推薦)
python3 scripts/optimize.py
# 常規訓練
python3 scripts/train.py

策略參數優化

# 優化交易策略參數(概率閾值/持有天數/止損比例)
python3 scripts/strategy_optimize.py

📈 當前模型

模型信息

模型文件: patchtst_classification_fixed_20260416_121241.pth

模型類型: 分類模型(Classification)

輸出:

  • prob_up: 上漲概率 (0~1)
  • 預測收益率: (prob_up - 0.5) * 0.1

最佳超參數 (Walk-forward CV + Optuna):

seq_len=20# 輸入序列長度(20個交易日)pred_len=5# 預測長度(5個交易日)d_model=64# 嵌入維度n_heads=8# 注意力頭數n_layers=3# Transformer 層數patch_len=5# Patch 長度stride=2# Patch 步長dropout=0.2# Dropout 率learning_rate=2.05e-4# 學習率batch_size=32# 批次大小

策略參數 (優化後):

prob_threshold=0.3792# 概率閾值holding_days=4# 持有天數stop_loss=0.06# 止損比例 (6%)

特徵工程

特徵類型具體特徵處理方式
價格open, high, low, close原始值
成交量volume, volume_ratio原始值 / 20日均值比率
資金流OBV累積和: sign(價格變化) * volume 的累積
趨勢EMA5/10/20_ratio比率: close/ema - 1
動量MACD, MACD_hist原始值
波動率ATR_ratio (ATR/close), RSI_14, volatility_20d比率/原始值/標準差
收益率return_1d, return_5d百分比變化

🎯 最新回測結果

回測概覽 (2026-01-19 ~ 2026-04-17)

指標數值
策略總收益+10.22%
Buy & Hold-16.37%
超額收益+26.59%
最大回撤-4.63%
年化波動率27.00%
夏普比率2.73
索提諾比率3.92
卡爾瑪比率2.21
總交易次數4次
勝率100% (4勝0負)
測試準確率97.1%

T+1 操作建議

  • 回測時間: 2026-04-19 18:39
  • 最新日期: 2026-04-17
  • 操作: 🔴 SELL
  • 當前價格: 32.00 HKD
  • 目標價格: 31.60 HKD
  • 預期收益 (T+5): -1.25%
  • 預測區間: 2026-04-20 ~ 2026-04-24

滾動預測詳情

紅線使用滾動窗口預測(非線性插值),基於過去5天數據分別預測對應的未來日期:

  • T-4 數據 → 預測 T+1
  • T-3 數據 → 預測 T+2
  • ...
  • T 數據 → 預測 T+5

每個預測點都是獨立的模型推理,預測價格計算:

pred_price = hist_close * (1 + (prob_up - 0.5) * 0.1)
歷史日期目標日期預測價格prob_up
2026-04-132026-04-2030.29 HKD0.3780
2026-04-142026-04-2130.51 HKD0.3789
2026-04-152026-04-2230.51 HKD0.3744
2026-04-162026-04-2331.66 HKD0.3737
2026-04-172026-04-2431.60 HKD0.3751

🖼️ 圖表說明

Backtest Results

complete_backtest_results.png 包含6個子圖,配合回測數據解讀:

1. Confusion Matrix(混淆矩陣)

預測方向 vs 實際方向,對齊黃線邏輯(T vs T-5 比較):

預測跌預測漲
實際跌TN=26FP=0
實際漲FN=1TP=8
  • 準確率: 97.1%
  • Precision (漲): 100%(預測漲的全對)
  • Recall (漲): 88.9%(漏了1個漲的)

2. Daily Return Distribution(日收益分布)

策略每日收益的直方圖與核密度估計,展示收益分布形態。

3. Predicted Price vs Actual Price(價格散點圖)

X軸: 預測價格(T-5 預測的 T 時刻價格)
Y軸: 實際價格(T 時刻真實價格)
藍虛線: 完美預測對角線

  • 綠點 = 預測漲(prob_up > 0.5)
  • 紅點 = 預測跌(prob_up ≤ 0.5)
  • 點越靠近對角線 = 預測越準確

4. Cumulative Return(累計收益)

  • 藍線: 策略累計收益 (+10.22%)
  • 灰虛線: Buy & Hold 基準 (-16.37%)
  • 綠/紅區域: 策略正/負收益時段
  • 底部顏色條: 持倉狀態(綠=持倉,紅=空倉)

5. Stock Price(股價與預測)

  • 藍線: 實際股價
  • 黃線: 歷史 T+5 預測(T-5 預測的 T 時刻價格,用於回測驗證)
  • 紅線: 未來5天滾動預測(T-4→T+1, T-3→T+2...)
  • 紅色陰影區: 未來預測區間

數據可視化特性

  • 黃線: 用 T-5 數據預測的 T 時刻價格(與藍線同時間軸對比)
  • 紅線: 用過去5天數據分別預測未來5天的滾動預測(非插值)
  • 持倉狀態條: 綠色 = 持倉中,紅色 = 空倉

🔧 Walk-forward CV 優化

為解決過擬合問題,使用 Walk-forward 交叉驗證:

# 時間序列交叉驗證(避免未來數據洩露)fortrain_idx, val_idxinTimeSeriesSplit(n_splits=5):
# 只在歷史數據上訓練# 在之後的數據上驗證

優化結果:

  • Trial: 100次
  • CV Score: 最佳驗證分數
  • 測試集準確率: 約 51-60%
  • 模型穩定性: Walk-forward CV 顯著提升

樣本加權(指數衰減)

訓練時可選擇對近期數據賦予更高權重(指數衰減):

# 指數衰減權重:w_t = exp(λ * (t - T))# λ 越大,對近期數據權重越高weights=np.exp(decay_lambda* (time_indices-T))

用途:讓模型更關注近期市場模式,適應市場結構變化。

🎯 策略優化

方法:網格搜索 + 多目標評估

策略優化使用網格搜索(Grid Search)測試所有參數組合:

優化參數範圍:

prob_threshold= [0.35, 0.37, 0.40, 0.45, 0.50] # 概率閾值holding_days= [1, 3, 5, 7, 10] # 持有天數stop_loss= [0.05, 0.08, 0.10, 0.15] # 止損比例

評估指標:

  • 總回報(Total Return)
  • Sharpe Ratio(風險調整後收益)
  • 最大回撤(Max Drawdown)
  • 交易次數(Trade Count)

優化邏輯:

  1. 對每個參數組合運行完整回測
  2. 計算上述評估指標
  3. 選擇 Sharpe Ratio 最高的參數組合作為最佳策略

📝 關鍵文件說明

文件說明
scripts/backtest.py主回測程序,輸出含大標題的圖表與 T+1 建議
scripts/visualize_backtest.py回測可視化模塊(暗色主題、價格對齊)
scripts/optimize.pyWalk-forward CV + Optuna 模型超參優化
scripts/strategy_optimize.py交易策略參數優化(概率閾值/持有天數/止損比例)
scripts/train.py模型訓練(支持分類/回歸)
scripts/update_realtime.py實時數據更新(akshare + 新浪/騰訊)
scripts/daily_pipeline.py每日數據管道(收市後自動運行)
src/models/patchtst.pyPatchTST 分類/回歸模型架構
src/data/loader.py數據加載與驗證
data/xiaomi_real.csv小米真實股價數據

📜 版本歷史

v1.1.1 (2026-04-19)

  • 分類模型支持(輸出 prob_up 概率)
  • 滾動預測:紅線使用歷史5天數據分別預測未來5天
  • 價格對齊:散點圖顯示預測價格 vs 實際價格
  • 策略優化:獨立腳本優化交易參數
  • 清理多餘模型和腳本

v1.1.0 (2026-04-14)

  • Walk-forward CV 優化流程
  • 特徵工程標準化
  • 基礎回測框架

v1.0.0 (2026-04-10)

  • 初始版本
  • PatchTST 基礎模型
  • 簡單回測功能

⚠️ 免責聲明

本項目僅供研究學習使用,不構成任何投資建議。股市有風險,投資需謹慎。

模型預測存在風險與局限性:

  • 近期回測準確率約 97%,但歷史表現不代表未來收益
  • 預測收益波動較大,數值穩定性待改進
  • 模型基於歷史數據訓練,可能無法預測黑天鵝事件或市場結構突變
  • 回測期間交易次數較少(4次),統計意義有限

📄 License

MIT License

🙏 致謝

  • PatchTST: 基於 Nie et al. (2023) 的時間序列預測架構
  • Optuna: 超參數優化框架
  • PyTorch: 深度學習框架
  • akshare: 財經數據接口

About

PatchTST-based quantitative forecasting system for stock price prediction

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

17 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

QuantForecast

VersionPythonPyTorch

基於 PatchTST (Channel-Time Patch Time-Series Transformer) 的量化預測系統,專注於港股(小米 1810.HK)的價格預測與回測。

版本: v1.1.1 (2026-04-19) - 分類模型 + 滾動預測版本

📊 項目概述

本項目使用 Transformer 架構處理時間序列數據,通過 Patch-based 方法提取局部時序特徵,結合多維技術指標進行股票價格方向預測(分類任務)。

核心特性

  • 🔮 PatchTST 分類模型: 預測 T+5 日價格方向(漲/跌),輸出上漲概率 prob_up
  • 📈 特徵工程: 原始價格 + 技術指標(EMA比率/MACD/RSI/ATR比率/OBV/成交量比率/收益率)
  • 🎯 方向預測: 二分類問題(漲/跌),預測收益率轉換: (prob_up - 0.5) * 0.1
  • 📊 完整回測: 支持多時間段回測、Walk-forward CV 參數優化、風險指標計算
  • 🎨 數據可視化: 暗色主題專業圖表(含混淆矩陣、價格散點圖、持倉狀態條)
  • ⚖️ Walk-forward CV: Optuna + 時間序列交叉驗證,避免過擬合
  • 🔄 滾動預測: 紅線使用歷史5天數據分別預測未來5天(非插值)

🏗️ 項目結構

quantforecast/
├── src/ # 源代碼
│ ├── backtest/ # 回測引擎
│ │ ├── engine.py
│ │ └── reporting.py
│ ├── data/ # 數據處理
│ │ ├── loader.py
│ │ ├── preprocessor.py
│ │ └── features.py
│ ├── models/ # 模型定義
│ │ ├── patchtst.py # PatchTST 分類/回歸模型
│ │ └── revin.py # 可逆實例歸一化
│ ├── training/ # 訓練與優化
│ │ ├── trainer.py
│ │ ├── evaluator.py
│ │ └── optimizers/
│ │ └── optuna_optimizer.py
│ ├── utils/ # 工具函數
│ └── config.py # 配置管理
├── scripts/ # 執行腳本
│ ├── backtest.py # 完整回測(含圖表輸出)
│ ├── backtest_old_params.py # 舊參數回測可視化
│ ├── visualize_backtest.py # 回測可視化模塊
│ ├── train.py # 模型訓練
│ ├── optimize.py # Optuna 模型超參優化
│ ├── strategy_optimize.py # 交易策略參數優化
│ ├── plot_optimization.py # 優化結果可視化
│ ├── plot_params_comparison.py # 參數對比可視化
│ ├── update_realtime.py # 實時數據更新
│ ├── daily_pipeline.py # 每日數據管道
│ └── scheduled_backtest.py # 定時回測任務
├── data/ # 數據文件
│ └── xiaomi_real.csv # 小米股價數據 (2023-01 ~ 2026-04)
├── results/ # 結果輸出
│ ├── complete_backtest_results.png # 回測圖表
│ ├── complete_backtest_results.json # 回測數據
│ ├── future_prediction.json # 未來5天預測
│ └── optuna_best_params_*.json # 最佳參數
├── models/ # 模型文件
│ └── patchtst_classification_fixed_20260416_121241.pth # 當前模型
├── logs/ # 日誌文件
└── README.md # 本文件

🚀 快速開始

環境要求

pip install -r requirements.txt

更新數據(獲取最新股價)

cd quantforecast
python3 scripts/update_realtime.py

數據源:

  • akshare: 歷史日線數據(延遲但完整)
  • 新浪/騰訊實時: 當日收盤價(實時更新)

運行回測

cd quantforecast
# 使用優化後的參數運行回測
python3 scripts/backtest.py --optimized --months 3
# 或使用默認參數
python3 scripts/backtest.py

回測結果將輸出至:

  • results/complete_backtest_results.png - 回測圖表(含回測時間戳與 T+1 建議)
  • results/complete_backtest_results.json - 詳細回測數據
  • results/future_prediction.json - 未來5天預測

訓練新模型

# Walk-forward CV 優化(推薦)
python3 scripts/optimize.py
# 常規訓練
python3 scripts/train.py

策略參數優化

# 優化交易策略參數(概率閾值/持有天數/止損比例)
python3 scripts/strategy_optimize.py

📈 當前模型

模型信息

模型文件: patchtst_classification_fixed_20260416_121241.pth

模型類型: 分類模型(Classification)

輸出:

  • prob_up: 上漲概率 (0~1)
  • 預測收益率: (prob_up - 0.5) * 0.1

最佳超參數 (Walk-forward CV + Optuna):

seq_len=20# 輸入序列長度(20個交易日)pred_len=5# 預測長度(5個交易日)d_model=64# 嵌入維度n_heads=8# 注意力頭數n_layers=3# Transformer 層數patch_len=5# Patch 長度stride=2# Patch 步長dropout=0.2# Dropout 率learning_rate=2.05e-4# 學習率batch_size=32# 批次大小

策略參數 (優化後):

prob_threshold=0.3792# 概率閾值holding_days=4# 持有天數stop_loss=0.06# 止損比例 (6%)

特徵工程

特徵類型具體特徵處理方式
價格open, high, low, close原始值
成交量volume, volume_ratio原始值 / 20日均值比率
資金流OBV累積和: sign(價格變化) * volume 的累積
趨勢EMA5/10/20_ratio比率: close/ema - 1
動量MACD, MACD_hist原始值
波動率ATR_ratio (ATR/close), RSI_14, volatility_20d比率/原始值/標準差
收益率return_1d, return_5d百分比變化

🎯 最新回測結果

回測概覽 (2026-01-19 ~ 2026-04-17)

指標數值
策略總收益+10.22%
Buy & Hold-16.37%
超額收益+26.59%
最大回撤-4.63%
年化波動率27.00%
夏普比率2.73
索提諾比率3.92
卡爾瑪比率2.21
總交易次數4次
勝率100% (4勝0負)
測試準確率97.1%

T+1 操作建議

  • 回測時間: 2026-04-19 18:39
  • 最新日期: 2026-04-17
  • 操作: 🔴 SELL
  • 當前價格: 32.00 HKD
  • 目標價格: 31.60 HKD
  • 預期收益 (T+5): -1.25%
  • 預測區間: 2026-04-20 ~ 2026-04-24

滾動預測詳情

紅線使用滾動窗口預測(非線性插值),基於過去5天數據分別預測對應的未來日期:

  • T-4 數據 → 預測 T+1
  • T-3 數據 → 預測 T+2
  • ...
  • T 數據 → 預測 T+5

每個預測點都是獨立的模型推理,預測價格計算:

pred_price = hist_close * (1 + (prob_up - 0.5) * 0.1)
歷史日期目標日期預測價格prob_up
2026-04-132026-04-2030.29 HKD0.3780
2026-04-142026-04-2130.51 HKD0.3789
2026-04-152026-04-2230.51 HKD0.3744
2026-04-162026-04-2331.66 HKD0.3737
2026-04-172026-04-2431.60 HKD0.3751

🖼️ 圖表說明

Backtest Results

complete_backtest_results.png 包含6個子圖,配合回測數據解讀:

1. Confusion Matrix(混淆矩陣)

預測方向 vs 實際方向,對齊黃線邏輯(T vs T-5 比較):

預測跌預測漲
實際跌TN=26FP=0
實際漲FN=1TP=8
  • 準確率: 97.1%
  • Precision (漲): 100%(預測漲的全對)
  • Recall (漲): 88.9%(漏了1個漲的)

2. Daily Return Distribution(日收益分布)

策略每日收益的直方圖與核密度估計,展示收益分布形態。

3. Predicted Price vs Actual Price(價格散點圖)

X軸: 預測價格(T-5 預測的 T 時刻價格)
Y軸: 實際價格(T 時刻真實價格)
藍虛線: 完美預測對角線

  • 綠點 = 預測漲(prob_up > 0.5)
  • 紅點 = 預測跌(prob_up ≤ 0.5)
  • 點越靠近對角線 = 預測越準確

4. Cumulative Return(累計收益)

  • 藍線: 策略累計收益 (+10.22%)
  • 灰虛線: Buy & Hold 基準 (-16.37%)
  • 綠/紅區域: 策略正/負收益時段
  • 底部顏色條: 持倉狀態(綠=持倉,紅=空倉)

5. Stock Price(股價與預測)

  • 藍線: 實際股價
  • 黃線: 歷史 T+5 預測(T-5 預測的 T 時刻價格,用於回測驗證)
  • 紅線: 未來5天滾動預測(T-4→T+1, T-3→T+2...)
  • 紅色陰影區: 未來預測區間

數據可視化特性

  • 黃線: 用 T-5 數據預測的 T 時刻價格(與藍線同時間軸對比)
  • 紅線: 用過去5天數據分別預測未來5天的滾動預測(非插值)
  • 持倉狀態條: 綠色 = 持倉中,紅色 = 空倉

🔧 Walk-forward CV 優化

為解決過擬合問題,使用 Walk-forward 交叉驗證:

# 時間序列交叉驗證(避免未來數據洩露)fortrain_idx, val_idxinTimeSeriesSplit(n_splits=5):
# 只在歷史數據上訓練# 在之後的數據上驗證

優化結果:

  • Trial: 100次
  • CV Score: 最佳驗證分數
  • 測試集準確率: 約 51-60%
  • 模型穩定性: Walk-forward CV 顯著提升

樣本加權(指數衰減)

訓練時可選擇對近期數據賦予更高權重(指數衰減):

# 指數衰減權重:w_t = exp(λ * (t - T))# λ 越大,對近期數據權重越高weights=np.exp(decay_lambda* (time_indices-T))

用途:讓模型更關注近期市場模式,適應市場結構變化。

🎯 策略優化

方法:網格搜索 + 多目標評估

策略優化使用網格搜索(Grid Search)測試所有參數組合:

優化參數範圍:

prob_threshold= [0.35, 0.37, 0.40, 0.45, 0.50] # 概率閾值holding_days= [1, 3, 5, 7, 10] # 持有天數stop_loss= [0.05, 0.08, 0.10, 0.15] # 止損比例

評估指標:

  • 總回報(Total Return)
  • Sharpe Ratio(風險調整後收益)
  • 最大回撤(Max Drawdown)
  • 交易次數(Trade Count)

優化邏輯:

  1. 對每個參數組合運行完整回測
  2. 計算上述評估指標
  3. 選擇 Sharpe Ratio 最高的參數組合作為最佳策略

📝 關鍵文件說明

文件說明
scripts/backtest.py主回測程序,輸出含大標題的圖表與 T+1 建議
scripts/visualize_backtest.py回測可視化模塊(暗色主題、價格對齊)
scripts/optimize.pyWalk-forward CV + Optuna 模型超參優化
scripts/strategy_optimize.py交易策略參數優化(概率閾值/持有天數/止損比例)
scripts/train.py模型訓練(支持分類/回歸)
scripts/update_realtime.py實時數據更新(akshare + 新浪/騰訊)
scripts/daily_pipeline.py每日數據管道(收市後自動運行)
src/models/patchtst.pyPatchTST 分類/回歸模型架構
src/data/loader.py數據加載與驗證
data/xiaomi_real.csv小米真實股價數據

📜 版本歷史

v1.1.1 (2026-04-19)

  • 分類模型支持(輸出 prob_up 概率)
  • 滾動預測:紅線使用歷史5天數據分別預測未來5天
  • 價格對齊:散點圖顯示預測價格 vs 實際價格
  • 策略優化:獨立腳本優化交易參數
  • 清理多餘模型和腳本

v1.1.0 (2026-04-14)

  • Walk-forward CV 優化流程
  • 特徵工程標準化
  • 基礎回測框架

v1.0.0 (2026-04-10)

  • 初始版本
  • PatchTST 基礎模型
  • 簡單回測功能

⚠️ 免責聲明

本項目僅供研究學習使用,不構成任何投資建議。股市有風險,投資需謹慎。

模型預測存在風險與局限性:

  • 近期回測準確率約 97%,但歷史表現不代表未來收益
  • 預測收益波動較大,數值穩定性待改進
  • 模型基於歷史數據訓練,可能無法預測黑天鵝事件或市場結構突變
  • 回測期間交易次數較少(4次),統計意義有限

📄 License

MIT License

🙏 致謝

  • PatchTST: 基於 Nie et al. (2023) 的時間序列預測架構
  • Optuna: 超參數優化框架
  • PyTorch: 深度學習框架
  • akshare: 財經數據接口

About

PatchTST-based quantitative forecasting system for stock price prediction

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

17 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

QuantForecast

VersionPythonPyTorch

基於 PatchTST (Channel-Time Patch Time-Series Transformer) 的量化預測系統,專注於港股(小米 1810.HK)的價格預測與回測。

版本: v1.1.1 (2026-04-19) - 分類模型 + 滾動預測版本

📊 項目概述

本項目使用 Transformer 架構處理時間序列數據,通過 Patch-based 方法提取局部時序特徵,結合多維技術指標進行股票價格方向預測(分類任務)。

核心特性

  • 🔮 PatchTST 分類模型: 預測 T+5 日價格方向(漲/跌),輸出上漲概率 prob_up
  • 📈 特徵工程: 原始價格 + 技術指標(EMA比率/MACD/RSI/ATR比率/OBV/成交量比率/收益率)
  • 🎯 方向預測: 二分類問題(漲/跌),預測收益率轉換: (prob_up - 0.5) * 0.1
  • 📊 完整回測: 支持多時間段回測、Walk-forward CV 參數優化、風險指標計算
  • 🎨 數據可視化: 暗色主題專業圖表(含混淆矩陣、價格散點圖、持倉狀態條)
  • ⚖️ Walk-forward CV: Optuna + 時間序列交叉驗證,避免過擬合
  • 🔄 滾動預測: 紅線使用歷史5天數據分別預測未來5天(非插值)

🏗️ 項目結構

quantforecast/
├── src/ # 源代碼
│ ├── backtest/ # 回測引擎
│ │ ├── engine.py
│ │ └── reporting.py
│ ├── data/ # 數據處理
│ │ ├── loader.py
│ │ ├── preprocessor.py
│ │ └── features.py
│ ├── models/ # 模型定義
│ │ ├── patchtst.py # PatchTST 分類/回歸模型
│ │ └── revin.py # 可逆實例歸一化
│ ├── training/ # 訓練與優化
│ │ ├── trainer.py
│ │ ├── evaluator.py
│ │ └── optimizers/
│ │ └── optuna_optimizer.py
│ ├── utils/ # 工具函數
│ └── config.py # 配置管理
├── scripts/ # 執行腳本
│ ├── backtest.py # 完整回測(含圖表輸出)
│ ├── backtest_old_params.py # 舊參數回測可視化
│ ├── visualize_backtest.py # 回測可視化模塊
│ ├── train.py # 模型訓練
│ ├── optimize.py # Optuna 模型超參優化
│ ├── strategy_optimize.py # 交易策略參數優化
│ ├── plot_optimization.py # 優化結果可視化
│ ├── plot_params_comparison.py # 參數對比可視化
│ ├── update_realtime.py # 實時數據更新
│ ├── daily_pipeline.py # 每日數據管道
│ └── scheduled_backtest.py # 定時回測任務
├── data/ # 數據文件
│ └── xiaomi_real.csv # 小米股價數據 (2023-01 ~ 2026-04)
├── results/ # 結果輸出
│ ├── complete_backtest_results.png # 回測圖表
│ ├── complete_backtest_results.json # 回測數據
│ ├── future_prediction.json # 未來5天預測
│ └── optuna_best_params_*.json # 最佳參數
├── models/ # 模型文件
│ └── patchtst_classification_fixed_20260416_121241.pth # 當前模型
├── logs/ # 日誌文件
└── README.md # 本文件

🚀 快速開始

環境要求

pip install -r requirements.txt

更新數據(獲取最新股價)

cd quantforecast
python3 scripts/update_realtime.py

數據源:

  • akshare: 歷史日線數據(延遲但完整)
  • 新浪/騰訊實時: 當日收盤價(實時更新)

運行回測

cd quantforecast
# 使用優化後的參數運行回測
python3 scripts/backtest.py --optimized --months 3
# 或使用默認參數
python3 scripts/backtest.py

回測結果將輸出至:

  • results/complete_backtest_results.png - 回測圖表(含回測時間戳與 T+1 建議)
  • results/complete_backtest_results.json - 詳細回測數據
  • results/future_prediction.json - 未來5天預測

訓練新模型

# Walk-forward CV 優化(推薦)
python3 scripts/optimize.py
# 常規訓練
python3 scripts/train.py

策略參數優化

# 優化交易策略參數(概率閾值/持有天數/止損比例)
python3 scripts/strategy_optimize.py

📈 當前模型

模型信息

模型文件: patchtst_classification_fixed_20260416_121241.pth

模型類型: 分類模型(Classification)

輸出:

  • prob_up: 上漲概率 (0~1)
  • 預測收益率: (prob_up - 0.5) * 0.1

最佳超參數 (Walk-forward CV + Optuna):

seq_len=20# 輸入序列長度(20個交易日)pred_len=5# 預測長度(5個交易日)d_model=64# 嵌入維度n_heads=8# 注意力頭數n_layers=3# Transformer 層數patch_len=5# Patch 長度stride=2# Patch 步長dropout=0.2# Dropout 率learning_rate=2.05e-4# 學習率batch_size=32# 批次大小

策略參數 (優化後):

prob_threshold=0.3792# 概率閾值holding_days=4# 持有天數stop_loss=0.06# 止損比例 (6%)

特徵工程

特徵類型具體特徵處理方式
價格open, high, low, close原始值
成交量volume, volume_ratio原始值 / 20日均值比率
資金流OBV累積和: sign(價格變化) * volume 的累積
趨勢EMA5/10/20_ratio比率: close/ema - 1
動量MACD, MACD_hist原始值
波動率ATR_ratio (ATR/close), RSI_14, volatility_20d比率/原始值/標準差
收益率return_1d, return_5d百分比變化

🎯 最新回測結果

回測概覽 (2026-01-19 ~ 2026-04-17)

指標數值
策略總收益+10.22%
Buy & Hold-16.37%
超額收益+26.59%
最大回撤-4.63%
年化波動率27.00%
夏普比率2.73
索提諾比率3.92
卡爾瑪比率2.21
總交易次數4次
勝率100% (4勝0負)
測試準確率97.1%

T+1 操作建議

  • 回測時間: 2026-04-19 18:39
  • 最新日期: 2026-04-17
  • 操作: 🔴 SELL
  • 當前價格: 32.00 HKD
  • 目標價格: 31.60 HKD
  • 預期收益 (T+5): -1.25%
  • 預測區間: 2026-04-20 ~ 2026-04-24

滾動預測詳情

紅線使用滾動窗口預測(非線性插值),基於過去5天數據分別預測對應的未來日期:

  • T-4 數據 → 預測 T+1
  • T-3 數據 → 預測 T+2
  • ...
  • T 數據 → 預測 T+5

每個預測點都是獨立的模型推理,預測價格計算:

pred_price = hist_close * (1 + (prob_up - 0.5) * 0.1)
歷史日期目標日期預測價格prob_up
2026-04-132026-04-2030.29 HKD0.3780
2026-04-142026-04-2130.51 HKD0.3789
2026-04-152026-04-2230.51 HKD0.3744
2026-04-162026-04-2331.66 HKD0.3737
2026-04-172026-04-2431.60 HKD0.3751

🖼️ 圖表說明

Backtest Results

complete_backtest_results.png 包含6個子圖,配合回測數據解讀:

1. Confusion Matrix(混淆矩陣)

預測方向 vs 實際方向,對齊黃線邏輯(T vs T-5 比較):

預測跌預測漲
實際跌TN=26FP=0
實際漲FN=1TP=8
  • 準確率: 97.1%
  • Precision (漲): 100%(預測漲的全對)
  • Recall (漲): 88.9%(漏了1個漲的)

2. Daily Return Distribution(日收益分布)

策略每日收益的直方圖與核密度估計,展示收益分布形態。

3. Predicted Price vs Actual Price(價格散點圖)

X軸: 預測價格(T-5 預測的 T 時刻價格)
Y軸: 實際價格(T 時刻真實價格)
藍虛線: 完美預測對角線

  • 綠點 = 預測漲(prob_up > 0.5)
  • 紅點 = 預測跌(prob_up ≤ 0.5)
  • 點越靠近對角線 = 預測越準確

4. Cumulative Return(累計收益)

  • 藍線: 策略累計收益 (+10.22%)
  • 灰虛線: Buy & Hold 基準 (-16.37%)
  • 綠/紅區域: 策略正/負收益時段
  • 底部顏色條: 持倉狀態(綠=持倉,紅=空倉)

5. Stock Price(股價與預測)

  • 藍線: 實際股價
  • 黃線: 歷史 T+5 預測(T-5 預測的 T 時刻價格,用於回測驗證)
  • 紅線: 未來5天滾動預測(T-4→T+1, T-3→T+2...)
  • 紅色陰影區: 未來預測區間

數據可視化特性

  • 黃線: 用 T-5 數據預測的 T 時刻價格(與藍線同時間軸對比)
  • 紅線: 用過去5天數據分別預測未來5天的滾動預測(非插值)
  • 持倉狀態條: 綠色 = 持倉中,紅色 = 空倉

🔧 Walk-forward CV 優化

為解決過擬合問題,使用 Walk-forward 交叉驗證:

# 時間序列交叉驗證(避免未來數據洩露)fortrain_idx, val_idxinTimeSeriesSplit(n_splits=5):
# 只在歷史數據上訓練# 在之後的數據上驗證

優化結果:

  • Trial: 100次
  • CV Score: 最佳驗證分數
  • 測試集準確率: 約 51-60%
  • 模型穩定性: Walk-forward CV 顯著提升

樣本加權(指數衰減)

訓練時可選擇對近期數據賦予更高權重(指數衰減):

# 指數衰減權重:w_t = exp(λ * (t - T))# λ 越大,對近期數據權重越高weights=np.exp(decay_lambda* (time_indices-T))

用途:讓模型更關注近期市場模式,適應市場結構變化。

🎯 策略優化

方法:網格搜索 + 多目標評估

策略優化使用網格搜索(Grid Search)測試所有參數組合:

優化參數範圍:

prob_threshold= [0.35, 0.37, 0.40, 0.45, 0.50] # 概率閾值holding_days= [1, 3, 5, 7, 10] # 持有天數stop_loss= [0.05, 0.08, 0.10, 0.15] # 止損比例

評估指標:

  • 總回報(Total Return)
  • Sharpe Ratio(風險調整後收益)
  • 最大回撤(Max Drawdown)
  • 交易次數(Trade Count)

優化邏輯:

  1. 對每個參數組合運行完整回測
  2. 計算上述評估指標
  3. 選擇 Sharpe Ratio 最高的參數組合作為最佳策略

📝 關鍵文件說明

文件說明
scripts/backtest.py主回測程序,輸出含大標題的圖表與 T+1 建議
scripts/visualize_backtest.py回測可視化模塊(暗色主題、價格對齊)
scripts/optimize.pyWalk-forward CV + Optuna 模型超參優化
scripts/strategy_optimize.py交易策略參數優化(概率閾值/持有天數/止損比例)
scripts/train.py模型訓練(支持分類/回歸)
scripts/update_realtime.py實時數據更新(akshare + 新浪/騰訊)
scripts/daily_pipeline.py每日數據管道(收市後自動運行)
src/models/patchtst.pyPatchTST 分類/回歸模型架構
src/data/loader.py數據加載與驗證
data/xiaomi_real.csv小米真實股價數據

📜 版本歷史

v1.1.1 (2026-04-19)

  • 分類模型支持(輸出 prob_up 概率)
  • 滾動預測:紅線使用歷史5天數據分別預測未來5天
  • 價格對齊:散點圖顯示預測價格 vs 實際價格
  • 策略優化:獨立腳本優化交易參數
  • 清理多餘模型和腳本

v1.1.0 (2026-04-14)

  • Walk-forward CV 優化流程
  • 特徵工程標準化
  • 基礎回測框架

v1.0.0 (2026-04-10)

  • 初始版本
  • PatchTST 基礎模型
  • 簡單回測功能

⚠️ 免責聲明

本項目僅供研究學習使用,不構成任何投資建議。股市有風險,投資需謹慎。

模型預測存在風險與局限性:

  • 近期回測準確率約 97%,但歷史表現不代表未來收益
  • 預測收益波動較大,數值穩定性待改進
  • 模型基於歷史數據訓練,可能無法預測黑天鵝事件或市場結構突變
  • 回測期間交易次數較少(4次),統計意義有限

📄 License

MIT License

🙏 致謝

  • PatchTST: 基於 Nie et al. (2023) 的時間序列預測架構
  • Optuna: 超參數優化框架
  • PyTorch: 深度學習框架
  • akshare: 財經數據接口

About

PatchTST-based quantitative forecasting system for stock price prediction

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages