Skip to content

softaverse/quant-backtest-monorepo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

19 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“ˆ Backtest Portfolio

้€™ๆ˜ฏไธ€ๅ€‹ๅฐˆ็‚บ่ค‡้›œ้‡‘่ž็ญ–็•ฅ่จญ่จˆ็š„็พŽ่‚กๆŠ•่ณ‡็ต„ๅˆๅ›žๆธฌๅนณๅฐใ€‚ๅ‰็ซฏๆŽก็”จ Next.js ๆไพ›ๆตๆšข็š„ไบ’ๅ‹•้ซ”้ฉ—๏ผŒๅพŒ็ซฏๅ‰‡ๅˆฉ็”จ FastAPI ็ตๅˆ Python ๅผทๅคง็š„็ง‘ๅญธ่จˆ็ฎ—็”Ÿๆ…‹๏ผˆPandas, VectorBT๏ผ‰๏ผŒๆ”ฏๆดๆฉŸๅ™จๅญธ็ฟ’ๆจกๅž‹ๆ•ดๅˆ่ˆ‡ๅคง่ฆๆจก็Ÿฉ้™ฃ้‹็ฎ—ใ€‚


๐Ÿš€ ๆ ธๅฟƒๅ›žๆธฌๅŠŸ่ƒฝ

ๆœฌ็ณป็ตฑ้‡ๅฐ้•ท็ทšๆŠ•่ณ‡่ˆ‡่ณ‡็”ข้…็ฝฎ้œ€ๆฑ‚๏ผŒๆไพ›ไปฅไธ‹ๆ ธๅฟƒๅŠŸ่ƒฝ๏ผš

  • ๅคšๆช”ๆจ™็š„ๆ”ฏๆด๏ผšๅฏๅŒๆ™‚ๅ›žๆธฌ 1 ่‡ณ 50 ๆช” ็พŽ่‚กๆจ™็š„ใ€‚
  • ๅฝˆๆ€งๆ™‚้–“ๅ€้–“๏ผšๆœ€ๅฐ่จˆ็ฎ—ๅ–ฎไฝ็‚บ ใ€Œๆœˆใ€(Monthly)๏ผŒๆ”ฏๆด 1ๅนดใ€5ๅนดใ€10ๅนดใ€20ๅนด็ญ‰่‡ชๅฎš็พฉๅ€้–“ใ€‚
  • ๅ†ๅนณ่กกๆฉŸๅˆถ (Rebalancing)๏ผš
    • ๆ”ฏๆดๅนดๅบฆๅ†ๅนณ่กก๏ผˆๆฏๅนดๅ›บๅฎšๆ™‚้–“้ปž๏ผ‰ใ€‚
    • ่‡ชๅ‹•ๅฐ‡ๅ„่ณ‡็”ขๆฌŠ้‡ๆขๅพฉ่‡ณไฝฟ็”จ่€…่จญๅฎš็š„ๅˆๅง‹ๆฏ”ไพ‹ใ€‚
  • ๆŠ•่ณ‡็ญ–็•ฅ๏ผšๆŽกๅ–ใ€Œไธ€ๆ—ฆ่ฒทๅ…ฅ๏ผŒๆฐธไธๅ‡บๅ ดใ€็ญ–็•ฅ๏ผŒๅฐˆๆณจๆ–ผ่ณ‡็”ข้…็ฝฎ่ˆ‡ๅ†ๅนณ่กก็š„้•ทๆœŸๅฝฑ้Ÿฟใ€‚
  • ๅฐˆๆฅญ็ธพๆ•ˆๆŒ‡ๆจ™๏ผš
    • ่ณ‡็”ขๆ›ฒ็ทš๏ผšๆฏๆœˆๆทจๅ€ผ่ฎŠๅŒ–็š„่ฆ–่ฆบๅŒ–ๅ‘ˆ็พใ€‚
    • ็ต„ๅˆ็ตฑ่จˆ๏ผšCAGR๏ผˆๅนดๅŒ–่ค‡ๅˆๅขž้•ท็އ๏ผ‰ใ€ๅนดๅŒ–ๆณขๅ‹•ๅบฆใ€ๆœ€ๅคงๅ›žๆ’ค (MDD)ใ€‚
    • ๅ€‹่‚กๅˆ†ๆž๏ผš้‡ๅฐ็ต„ๅˆๅ…งๆฏๆช”่‚ก็ฅจๆไพ›็จ็ซ‹็š„็ธพๆ•ˆๅ›žๅ ฑๆ•ธๆ“šใ€‚

๐Ÿงฑ ๆŠ€่ก“ๆฃงๆžถๆง‹ (Tech Stack)

ๆœฌๅฐˆๆกˆๆŽก็”จ pnpm Monorepo ๆžถๆง‹๏ผŒ็ขบไฟๅ‰ๅพŒ็ซฏ็จ‹ๅผ็ขผ็š„้ซ˜ๆ•ˆ็ฎก็†่ˆ‡ๅž‹ๅˆฅๅŒๆญฅใ€‚

ๅฑค็ดš ๆŠ€่ก“ๅทฅๅ…ท ้—œ้ต่ท่ฒฌ
Monorepo pnpm ๅทฅไฝœๅ€ (Workspace) ็ฎก็†ใ€ไพ่ณดๅ…ฑไบซ่ˆ‡้ซ˜ๆ•ˆๅฎ‰่ฃใ€‚
ๅ‰็ซฏ Next.js (App Router) ไฝฟ็”จ่€…ไป‹้ขใ€Recharts ๅœ–่กจๆธฒๆŸ“ใ€็‹€ๆ…‹็ฎก็†ใ€‚
ๅพŒ็ซฏ FastAPI (Python) ้ซ˜ๆ€ง่ƒฝ API ๆœๅ‹™ใ€ๆฉŸๅ™จๅญธ็ฟ’ๆจกๅž‹ๆŽจ่ซ–ใ€็Ÿฉ้™ฃ้‹็ฎ—่ชฟๅบฆใ€‚
่จˆ็ฎ—ๅผ•ๆ“Ž Pandas, VectorBT ๅ‘้‡ๅŒ–ๅ›žๆธฌ้‹็ฎ—ใ€้‡‘่žๆŒ‡ๆจ™่จˆ็ฎ—ใ€‚
่ณ‡ๆ–™ๅบซ PostgreSQL ๆญทๅฒ่‚กๅƒน็ทฉๅญ˜ใ€ไฝฟ็”จ่€…ๅ›žๆธฌ็ด€้Œ„่ˆ‡่จญๅฎšๅญ˜ๅ–ใ€‚

๐Ÿ“‚ ๅฐˆๆกˆ็›ฎ้Œ„็ตๆง‹

/quant-backtest-monorepo
โ”œโ”€โ”€ .pnpm-workspace.yaml      # pnpm Workspace ้…็ฝฎ
โ”œโ”€โ”€ package.json              # ๆ น็›ฎ้Œ„ๅ…จๅŸŸ Script
โ”œโ”€โ”€ /apps
โ”‚   โ””โ”€โ”€ /web                  # [Next.js] ๅ‰็ซฏไป‹้ข
โ”‚       โ”œโ”€โ”€ /app              # ้ ้ข่ทฏ็”ฑ่ˆ‡ Server Components
โ”‚       โ””โ”€โ”€ /components       # UI ๅ…ƒไปถ่ˆ‡ Recharts ๅœ–่กจ
โ”œโ”€โ”€ /services
โ”‚   โ””โ”€โ”€ /fastapi-api          # [FastAPI] ๅพŒ็ซฏ้‹็ฎ—ไธญๅฟƒ
โ”‚       โ”œโ”€โ”€ /core             # ๆ ธๅฟƒๅ›žๆธฌๅผ•ๆ“Ž (Vectorized Engine)
โ”‚       โ”œโ”€โ”€ /data             # ๆ•ธๆ“š็ฒๅ– (yfinance/DB)
โ”‚       โ””โ”€โ”€ /routers          # API Endpoint ๅฎš็พฉ
โ””โ”€โ”€ /shared                   # ๅ‰ๅพŒ็ซฏๅ…ฑไบซๅฎš็พฉ (Types/Schemas)

โš™๏ธ ๅฟซ้€Ÿ้–‹ๅง‹ (Quick Start)

1. ็’ฐๅขƒ้œ€ๆฑ‚

็ขบไฟๆ‚จ็š„็’ฐๅขƒๅทฒๅฎ‰่ฃ๏ผš

  • Node.js (v18+)
  • pnpm (v9+)
  • Python (3.10+)

2. ไธ€้ตๅฎ‰่ฃ๏ผˆๆŽจ่–ฆ๏ผ‰

# ๅฎ‰่ฃๅ‰็ซฏไพ่ณด + ๅปบ็ซ‹ Python ่™›ๆ“ฌ็’ฐๅขƒ + ๅฎ‰่ฃๅพŒ็ซฏไพ่ณด
pnpm setup:all

3. ๆ‰‹ๅ‹•ๅฎ‰่ฃ

# ๅฎ‰่ฃๅ‰็ซฏ่ˆ‡ๅ…จๅฑ€ไพ่ณด
pnpm install

# ๅปบ็ซ‹ Python ่™›ๆ“ฌ็’ฐๅขƒไธฆๅฎ‰่ฃๅพŒ็ซฏไพ่ณด
cd services/fastapi-api
python3 -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate
pip install -r requirements.txt

4. ็’ฐๅขƒ่ฎŠๆ•ธ่จญๅฎš

่ค‡่ฃฝ .env.example ไธฆๅกซๅ…ฅๆ‚จ็š„่จญๅฎš๏ผš

cp .env.example .env.local

้œ€่ฆ่จญๅฎš็š„่ฎŠๆ•ธ๏ผš

  • GOOGLE_CLIENT_ID - Google OAuth Client ID
  • GOOGLE_CLIENT_SECRET - Google OAuth Client Secret
  • JWT_SECRET_KEY - JWT ๅŠ ๅฏ†้‡‘้‘ฐ๏ผˆๅฏ็”จ openssl rand -hex 32 ็”ข็”Ÿ๏ผ‰

5. ๅ•Ÿๅ‹•้–‹็™ผไผบๆœๅ™จ

ๅœจๅฐˆๆกˆๆ น็›ฎ้Œ„ๅŸท่กŒไธ€้ตๅ•Ÿๅ‹•ๆŒ‡ไปค๏ผš

pnpm dev:all

๐Ÿ” Google OAuth ่ช่ญ‰่จญๅฎš

ๆœฌๅฐˆๆกˆๆ”ฏๆด Google ๅธณ่™Ÿ็™ปๅ…ฅใ€‚่จญๅฎšๆญฅ้ฉŸ๏ผš

  1. ๅ‰ๅพ€ Google Cloud Console
  2. ๅปบ็ซ‹ๅฐˆๆกˆๆˆ–้ธๆ“‡็พๆœ‰ๅฐˆๆกˆ
  3. ๅ•Ÿ็”จ Google+ API
  4. ๅปบ็ซ‹ OAuth 2.0 ๆ†‘่ญ‰๏ผˆWeb Application ้กžๅž‹๏ผ‰
  5. ่จญๅฎšๆŽˆๆฌŠ้‡ๆ–ฐๅฐŽๅ‘ URI๏ผšhttp://localhost:8000/api/v1/auth/google/callback
  6. ๅฐ‡ Client ID ๅ’Œ Client Secret ๅกซๅ…ฅ .env.local

่ช่ญ‰ๆต็จ‹

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Next.js App   โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚   FastAPI API   โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚   SQLite DB     โ”‚
โ”‚   (Frontend)    โ”‚โ—€โ”€โ”€โ”€โ”€โ”‚   (Backend)     โ”‚โ—€โ”€โ”€โ”€โ”€โ”‚   (Storage)     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
        โ”‚                       โ”‚
        โ”‚                       โ–ผ
        โ”‚               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚  Google OAuth   โ”‚
                        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๅ—ไฟ่ญท่ทฏ็”ฑ

  • /options - Options Backtest๏ผˆ้œ€็™ปๅ…ฅ๏ผ‰
  • / - ้ฆ–้ ๏ผˆๅ…ฌ้–‹๏ผ‰

๐Ÿณ Docker ้ƒจ็ฝฒ

ไธ€้ตๅ•Ÿๅ‹•๏ผˆๆŽจ่–ฆ๏ผ‰

็ขบไฟๅทฒๅฎ‰่ฃ Docker ่ˆ‡ Docker Compose๏ผŒ็„ถๅพŒๅŸท่กŒ๏ผš

# ๅปบๆง‹ไธฆๅ•Ÿๅ‹•ๆ‰€ๆœ‰ๆœๅ‹™
docker compose up --build

# ่ƒŒๆ™ฏ้‹่กŒ
docker compose up --build -d

ๅ•Ÿๅ‹•ๅพŒ่จชๅ•๏ผšhttp://localhost

ๆœๅ‹™ๆžถๆง‹

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Nginx (:80)                      โ”‚
โ”‚              (ๅๅ‘ไปฃ็† & ่ฒ ่ผ‰ๅ‡่กก)                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚                           โ”‚
         โ–ผ                           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Next.js       โ”‚         โ”‚   FastAPI       โ”‚
โ”‚   (:3000)       โ”‚         โ”‚   (:8000)       โ”‚
โ”‚   ๅ‰็ซฏไป‹้ข       โ”‚         โ”‚   ๅ›žๆธฌ API      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๅธธ็”จๆŒ‡ไปค

# ๆŸฅ็œ‹ๆ—ฅ่ชŒ
docker compose logs -f

# ๅœๆญขๆœๅ‹™
docker compose down

# ้‡ๆ–ฐๅปบๆง‹ๅ–ฎไธ€ๆœๅ‹™
docker compose build api
docker compose build web

ๅฟซ้€Ÿ่…ณๆœฌ (ๆŽจ่–ฆ)

ไฝฟ็”จ ./scripts/run.sh ็ฐกๅŒ– Docker ๆ“ไฝœ๏ผš

./scripts/run.sh up        # ๅ•Ÿๅ‹•ๆœๅ‹™ (้ ่จญ)
./scripts/run.sh down      # ๅœๆญขๆœๅ‹™
./scripts/run.sh restart   # ้‡ๅ•Ÿๆœๅ‹™
./scripts/run.sh logs      # ๆŸฅ็œ‹ๆ—ฅ่ชŒ
./scripts/run.sh status    # ๆŸฅ็œ‹็‹€ๆ…‹
./scripts/run.sh clean     # ๆธ…็† Docker ่ณ‡ๆบ

ๅ•Ÿๅ‹•ๅพŒ่จชๅ•๏ผšhttp://localhost:1111


โ˜๏ธ ้›ฒ็ซฏ้ƒจ็ฝฒ

ๆŽจ่–ฆๅนณๅฐ

ๅนณๅฐ ่ชชๆ˜Ž ๆŒ‡ไปค
Fly.io ๅ…จ็ƒ้ƒจ็ฝฒใ€ไฝŽๅปถ้ฒ fly launch
Railway ไธ€้ต้ƒจ็ฝฒใ€่‡ชๅ‹• CI/CD ้€ฃ็ต GitHub
DigitalOcean App Platform ้€ฃ็ต GitHub
AWS ECS ไผๆฅญ็ดšๆ“ดๅฑ• ไฝฟ็”จ docker-compose

Fly.io ้ƒจ็ฝฒ็ฏ„ไพ‹

# ๅฎ‰่ฃ Fly CLI
brew install flyctl

# ็™ปๅ…ฅ & ้ƒจ็ฝฒ
fly auth login
fly launch

๐Ÿ“Š ๆ ธๅฟƒ่จˆ็ฎ—ๅ…ฌๅผ

ๅฐˆๆกˆๆ ธๅฟƒๅผ•ๆ“Žไฝฟ็”จไปฅไธ‹ๆ•ธๅญธๆจกๅž‹็ขบไฟ่จˆ็ฎ—ๆบ–็ขบๆ€ง๏ผš

ๅนดๅŒ–่ค‡ๅˆๅขž้•ท็އ (CAGR):$$CAGR = \left( \frac{V_{final}}{V_{initial}} \right)^{\frac{1}{t}} - 1$$

ๆœ€ๅคงๅ›žๆ’ค (Max Drawdown):$$MDD = \frac{Peak - Trough}{Peak}$$

ๅนดๅบฆๅ†ๅนณ่กก:$$W_{t+1} = W_{initial} \cdot TotalValue_{t}$$

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

US stock backtesting

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors