
專案概述
LazyBacktest 是一個全端 Web 應用,用於回測台股(TWSE)交易策略。React 前端讓用戶選擇股票代號、日期範圍、策略和參數,並以資產曲線、年/月報酬率熱力圖和 9 項關鍵指標(CAGR、最大回撤、Sharpe、Sortino 等)視覺化結果。FastAPI 後端獲取歷史價格資料(本地 DB 快取 → yfinance → CSV 備援),執行回測,並支援以 Sharpe Ratio 排序的網格搜尋參數最佳化。
技術挑戰與解決方案
策略抽象設計
各策略(SMA、RSI、MACD、KD、布林帶、價格突破)的信號邏輯不同,但回測引擎需要統一的介面。
解決方案:
設計帶有抽象 generate_signals() 方法的 Strategy 基類,各策略分別實作。回測引擎統一呼叫 generate_signals(),並套用倉位大小和資金管理,讓新增策略非常直觀。
網格搜尋參數最佳化
透過手動試誤找到最佳參數組合(如 SMA 快/慢週期)既繁瑣又不可靠。
解決方案:
實作網格搜尋引擎,對用戶定義範圍內的所有參數組合進行窮舉測試,每種組合執行完整回測,並以 Sharpe Ratio 排序結果。前端顯示前 N 個組合供比較。
歷史資料可靠性
yfinance API 呼叫可能失敗或返回不完整資料,尤其是已下市的台股代號。
解決方案:
實作三層資料來源策略:先查詢本地 PostgreSQL 快取,快取未命中時備援至 yfinance,對已知 API 問題的代號最終備援至本地 CSV 檔案。結果回寫快取以加速未來查詢。
系統架構
前端:React 18 + TypeScript + Vite + TailwindCSS + Recharts,Docker + Nginx 部署。後端:Python 3.11+ + FastAPI + SQLAlchemy(ORM)+ Alembic 遷移 + Pandas/NumPy 計算 + yfinance 市場資料 + PostgreSQL(正式)/ SQLite(測試)+ Redis 快取。一鍵啟動:docker-compose up --build。
學習與心得
建立 LazyBacktest 深化了我的量化金融知識和 Python 資料處理技能。設計帶有解耦進出場邏輯的策略抽象層,讓新增策略變得直觀。使用 pytest TDD 和嚴格的 Mypy 型別檢查早期發現邊緣案例,讓金融計算邏輯更可靠。
技術棧
前端
React 18TypeScriptViteTailwindCSS
資料視覺化
Recharts
後端
Python 3.11+FastAPISQLAlchemyAlembic
資料分析
PandasNumPy
金融資料
yfinance
資料庫
PostgreSQLRedisSQLite (test)
部署
Docker ComposeNginx