---
## ๐ ์๊ฐ
### QuantDinger๋ ๋ฌด์์ธ๊ฐ์?
QuantDinger๋ **๋ก์ปฌ ์ฐ์ , ํ๋ผ์ด๋ฒ์ ์ฐ์ ์ ์
ํ ํธ์คํ
์ ๋ ๊ฑฐ๋ ์ธํ๋ผ**์
๋๋ค. ๊ทํ์ ๋จธ์ /์๋ฒ์์ ์คํ๋๋ฉฐ, **PostgreSQL ๊ธฐ๋ฐ ๋ฉํฐ ์ ์ ๊ณ์ **์ ์ ๊ณตํ๋ฉด์๋ ์ ๋ต, ๊ฑฐ๋ ๋ฐ์ดํฐ ๋ฐ API ํค๋ฅผ ์์ ํ ์ ์ดํ ์ ์์ต๋๋ค.
### ์ ๋ก์ปฌ ์ฐ์ ์ธ๊ฐ์?
๋ฐ์ดํฐ์ ์ ๋ต์ ํด๋ผ์ฐ๋์ ์ ๊ทธ๋ SaaS ํ๋ซํผ๊ณผ ๋ฌ๋ฆฌ, QuantDinger๋ ๋ก์ปฌ์์ ์คํ๋ฉ๋๋ค. ๊ทํ์ ์ ๋ต, ๊ฑฐ๋ ๋ก๊ทธ, API ํค ๋ฐ ๋ถ์ ๊ฒฐ๊ณผ๋ ๋ชจ๋ ๊ทํ์ ๋จธ์ ์ ์ ์ฅ๋ฉ๋๋ค. ๋ฒค๋ ์ ๊ธ ์์, ๊ตฌ๋
๋ฃ ์์, ๋ฐ์ดํฐ ์ ์ถ ์์.
### ๋๊ตฌ๋ฅผ ์ํ ๊ฒ์ธ๊ฐ์?
QuantDinger๋ ๋ค์์ ์ํ ์ฌ์ฉ์๋ฅผ ์ํด ๊ตฌ์ถ๋์์ต๋๋ค:
- ๋ฐ์ดํฐ ์ฃผ๊ถ๊ณผ ํ๋ผ์ด๋ฒ์๋ฅผ ์ค์ํ๋ ํธ๋ ์ด๋, ์ฐ๊ตฌ์ ๋ฐ ์์ง๋์ด
- ํฌ๋ช
ํ๊ณ ๊ฐ์ฌ ๊ฐ๋ฅํ ๊ฑฐ๋ ์ธํ๋ผ๋ฅผ ์ํ๋ ์ฌ๋
- ๋ง์ผํ
๋ณด๋ค ์์ง๋์ด๋ง์ ์ ํธํ๋ ์ฌ๋
- ์์ ํ ์ํฌํ๋ก์ฐ๊ฐ ํ์ํ ์ฌ๋: ๋ฐ์ดํฐ, ๋ถ์, ๋ฐฑํ
์คํ
๋ฐ ์คํ
### ํต์ฌ ๊ธฐ๋ฅ
QuantDinger๋ ์น์์ ๊ธ์ต ์ ๋ณด๋ฅผ ์์งํ๊ณ , ๋ก์ปฌ ์์ฅ ๋ฐ์ดํฐ์ ๊ฒฐํฉํ์ฌ ๋ถ์ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๋ ๋ด์ฅ **LLM ๊ธฐ๋ฐ ๋ฉํฐ ์์ด์ ํธ ๋ฆฌ์์น ์์คํ
**์ ํฌํจํฉ๋๋ค. ์ด๊ฒ์ ์ ๋ต ๊ฐ๋ฐ, ๋ฐฑํ
์คํ
๋ฐ ์ค๊ฑฐ๋ ์ํฌํ๋ก์ฐ์ ํตํฉ๋ฉ๋๋ค.
### ํต์ฌ ๊ฐ์น
- **๐ Apache 2.0 ์คํ์์ค(์ฝ๋)**: ํ์ฉ์ ์ด๋ฉฐ ์์
์ ์ผ๋ก ์นํ์ ์
๋๋ค. Apache 2.0 ๋ฒ์์์ fork/์์ ์ด ๊ฐ๋ฅํ์ง๋ง, ๋ผ์ด์ ์ค/์ ์๊ถ ๊ณ ์ง ๋ฑ ํ์ํ ํ๊ธฐ๋ ์ ์งํด์ผ ํฉ๋๋ค.
- **๐ ํ์ด์ฌ ๋ค์ดํฐ๋ธ & ๋น์ฃผ์ผ**: ํ์ค ํ์ด์ฌ์ผ๋ก ์งํ๋ฅผ ์์ฑ(PineScript๋ณด๋ค ์ฌ์)ํ๊ณ AI์ ์ง์์ ๋ฐ์ผ์ธ์. ์ฐจํธ์์ ์ ํธ๋ฅผ ์ง์ ์๊ฐํํ์ฌ "๋ก์ปฌ ๋ฒ์ ์ TradingView" ๊ฒฝํ์ ๊ตฌ์ถํ์ธ์.
- **๐ค AI ๋ฃจํ ์ต์ ํ**: ์ ๋ต์ ์คํํ ๋ฟ๋ง ์๋๋ผ, AI๊ฐ ๋ฐฑํ
์คํธ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ํ์ฌ ๋งค๊ฐ๋ณ์ ์กฐ์ (์์ ๋งค/์ด์ต์คํ/MACD ์ค์ )์ ์ ์ํ๊ณ ํ๋ฃจํ ์ต์ ํ๋ฅผ ํ์ฑํฉ๋๋ค.
- **๐ ๊ธ๋ก๋ฒ ๋ง์ผ ์ก์ธ์ค**: ์ํธํํ(์ค๊ฑฐ๋), ๋ฏธ๊ตญ/์ค๊ตญ ์ฃผ์, ์ธํ ๋ฐ ์ ๋ฌผ(๋ฐ์ดํฐ/์๋ฆผ)์ ์ง์ํ๋ ํตํฉ ์์คํ
.
- **โก Docker & ํด๋ฆฐ ์ํคํ
์ฒ**: 4์ค ๋ช
๋ น์ด๋ก ๋น ๋ฅธ ๋ฐฐํฌ. ๋ชจ๋ ๊ธฐ์ ์คํ(Vue + Python), ํด๋ฆฐ ์ํคํ
์ฒ, ๊ด์ฌ์ฌ ๋ถ๋ฆฌ.
---
## ๐บ ๋์์ ๋ฐ๋ชจ
์ ๋์์์ ํด๋ฆญํ์ฌ QuantDinger ํ๋ก์ ํธ ์๊ฐ๋ฅผ ์์ฒญํ์ธ์
---
## ๐ ๋ฌธ์
### ๊ฐ๋ฐ ๊ฐ์ด๋
- [Python ์ ๋ต ๊ฐ๋ฐ ๊ฐ์ด๋](docs/STRATEGY_DEV_GUIDE_KO.md)
- [Interactive Brokers (IBKR) ํธ๋ ์ด๋ฉ ๊ฐ์ด๋](docs/IBKR_TRADING_GUIDE_EN.md) ๐
- [MetaTrader 5 (MT5) ํธ๋ ์ด๋ฉ ๊ฐ์ด๋](docs/MT5_TRADING_GUIDE_EN.md) ๐
### ์๋ฆผ ์ค์
- [Telegram ์๋ฆผ ์ค์ ](docs/NOTIFICATION_TELEGRAM_CONFIG_EN.md)
- [์ด๋ฉ์ผ (SMTP) ์๋ฆผ ์ค์ ](docs/NOTIFICATION_EMAIL_CONFIG_EN.md)
- [SMS (Twilio) ์๋ฆผ ์ค์ ](docs/NOTIFICATION_SMS_CONFIG_EN.md)
## ๐ธ ๋น์ฃผ์ผ ํฌ์ด
๐บ๏ธ ์์คํ
์ํคํ
์ฒ ๊ฐ์
QuantDinger์ AI ๊ธฐ๋ฐ ๋ฆฌ์์น, ๋ฐฑํ
์คํ
๋ฐ ์๋ํ ๊ฑฐ๋ ๊ธฐ๋ฅ ์ ์ฒด ๊ฐ์.
๐ ์ ๋ฌธ ํํธ ๋์๋ณด๋
์์ฅ ์ญํ, ์์ฐ ๋ฐ ์ ๋ต ์ํ์ ๋ํ ์ค์๊ฐ ๋ชจ๋ํฐ๋ง.
๐ค AI ๋ฅ ๋ฆฌ์์น
์์ฅ ์ฌ๋ฆฌ ๋ฐ ๊ธฐ์ ์ ๋ถ์์ ์ํ ๋ฉํฐ ์์ด์ ํธ ํ์
.
|
๐ฌ ์ค๋งํธ ํธ๋ ์ด๋ฉ ์ด์์คํดํธ
์ฆ๊ฐ์ ์ธ ์์ฅ ํต์ฐฐ๋ ฅ์ ์ํ ์์ฐ์ด ์ธํฐํ์ด์ค.
|
๐ ๋ํํ ์งํ ๋ถ์
๋๋๊ทธ ์ค ๋๋กญ ๋ถ์์ด ๊ฐ๋ฅํ ํ๋ถํ ๊ธฐ์ ์ ์งํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
|
๐ Python ์ ๋ต ์์ฑ
AI ์ง์ ์ ๋ต ์ฝ๋ฉ์ด ๊ฐ๋ฅํ ๋ด์ฅ ์๋ํฐ.
|
๐ ํฌํธํด๋ฆฌ์ค ๋ชจ๋ํฐ
ํฌ์ง์
์ถ์ , ์๋ฆผ ์ค์ , ์ด๋ฉ์ผ/Telegram์ผ๋ก AI ๋ถ์ ๋ณด๊ณ ์ ์์ .
|
---
## โจ ์ฃผ์ ๊ธฐ๋ฅ
### 1. ๋น์ฃผ์ผ ํ์ด์ฌ ์ ๋ต ์ํฌ๋ฒค์น
*PineScript๋ณด๋ค ๊ฐ๋ ฅํ๊ณ , SaaS๋ณด๋ค ๋๋ํฉ๋๋ค.*
- **ํ์ด์ฌ ๋ค์ดํฐ๋ธ**: ํ์ด์ฌ์ผ๋ก ์งํ์ ์ ๋ต์ ์์ฑํ์ธ์. PineScript์ ๊ฐ์ ์ ์ฉ ์ธ์ด ๋์ ์์ ํ ํ์ด์ฌ ์ํ๊ณ(Pandas, Numpy, TA-Lib)๋ฅผ ํ์ฉํ์ธ์.
- **"Mini-TradingView" ๊ฒฝํ**: ๋ด์ฅ๋ K-๋ผ์ธ ์ฐจํธ์์ ํ์ด์ฌ ์งํ๋ฅผ ์ง์ ์คํํ์ธ์. ๊ณผ๊ฑฐ ๋ฐ์ดํฐ์์ ๋งค์/๋งค๋ ์ ํธ๋ฅผ ์๊ฐ์ ์ผ๋ก ๋๋ฒ๊น
ํ์ธ์.
- **AI ์ง์ ์ฝ๋ฉ**: ๋ด์ฅ AI๊ฐ ๋ณต์กํ ๋ก์ง์ ์์ฑํ๋๋ก ํ์ธ์. ์์ด๋์ด์์ ์ฝ๋๊น์ง ๋จ ๋ช ์ด๋ฉด ๋ฉ๋๋ค.
### 2. ์์ ํ ๊ฑฐ๋ ๋ผ์ดํ์ฌ์ดํด
*์งํ์์ ์คํ๊น์ง, ๋งค๋๋ฝ๊ฒ.*
1. **์งํ**: ์์ฅ ์ง์
/์ฒญ์ฐ ์ ํธ๋ฅผ ์ ์ํ์ธ์.
2. **์ ๋ต ์ค์ **: ์ํ ๊ด๋ฆฌ ๊ท์น(ํฌ์ง์
์ฌ์ด์ง, ์์ ๋งค, ์ด์ต์คํ)์ ์ถ๊ฐํ์ธ์.
3. **๋ฐฑํ
์คํธ & AI ์ต์ ํ**: ๋ฐฑํ
์คํธ๋ฅผ ์คํํ๊ณ , ํ๋ถํ ์ฑ๊ณผ ์งํ๋ฅผ ํ์ธํ๋ฉฐ, **AI๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ํ์ฌ ๊ฐ์ ์ฌํญ์ ์ ์**ํ๋๋ก ํ์ธ์(์: "MACD ์๊ณ๊ฐ์ X๋ก ์กฐ์ ").
4. **์คํ ๋ชจ๋**:
- **์ค๊ฑฐ๋**:
- **์ํธํํ**: ์ง์ API ์คํ, 10๊ฐ ์ด์์ ๊ฑฐ๋์(Binance, OKX, Bitget, Bybit ๋ฑ) ์ง์
- **๋ฏธ๊ตญ/ํ์ฝฉ ์ฃผ์**: Interactive Brokers (IBKR) ๊ฒฝ์ ๐
- **์ธํ**: MetaTrader 5 (MT5) ๊ฒฝ์ ๐
- **์ ํธ ์๋ฆผ**: ์ค๊ฑฐ๋๋ฅผ ์ง์ํ์ง ์๋ ์์ฅ(A์ฃผ/์ ๋ฌผ)์ ๊ฒฝ์ฐ, Telegram, Discord, Email, SMS ๋๋ Webhook์ ํตํด ์ ํธ๋ฅผ ์ ์กํ์ธ์.
### 3. AI ๋ถ์ ์์คํ
*๋น ๋ฅด๊ณ , ์ ํํ๋ฉฐ, ์ ๋ฌธ์ ์ธ ๋ฆฌํฌํธ.*
QuantDinger๋ ํจ์จ์ ์ธ AI ๋ถ์ ์์คํ
์ ํ์ฌ:
- **๋น ๋ฅธ ๋ถ์ ๋ชจ๋**: ๋จ์ผ LLM ํธ์ถ ์ํคํ
์ฒ๋ก ๋น ๋ฅด๊ณ ์ ํํ ๋ถ์ (๋ณต์กํ ๋ฉํฐ ์์ด์ ํธ ์์คํ
๋์ฒด)
- **๊ธ๋ก๋ฒ ์์ฅ ํตํฉ**: ์ค์๊ฐ ์์ฅ ๋ฐ์ดํฐ, ํํธ๋งต, ๊ฒฝ์ ์บ๋ฆฐ๋๋ฅผ ๋ถ์ ํ์ด์ง์ ํตํฉ
- **ATR ๊ธฐ๋ฐ ๊ฑฐ๋ ์์ค**: ๊ธฐ์ ์ ๋ถ์(ATR, ์ง์ง/์ ํญ์ )์ ๊ธฐ๋ฐํ ์์ ๋งค ๋ฐ ์ด์ต์คํ ๊ถ์ฅ
- **๋ถ์ ๋ฉ๋ชจ๋ฆฌ**: ์ด๋ ฅ ๊ฒํ ๋ฐ ์ง์์ ํ์ต์ ์ํ ๋ถ์ ๊ฒฐ๊ณผ ์ ์ฅ
- **์ ๋ต ํตํฉ**: AI ๋ถ์์ ์ ๋ต์ "์์ฅ ํํฐ"๋ก ์ฌ์ฉ ๊ฐ๋ฅ
### 4. ๋ฒ์ฉ ๋ฐ์ดํฐ ์์ง
QuantDinger๋ ์ฌ๋ฌ ์์ฅ์ ๊ฑธ์น ํตํฉ ๋ฐ์ดํฐ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค:
- **์ํธํํ**: ๊ฑฐ๋๋ฅผ ์ํ ์ง์ API ์ฐ๊ฒฐ๏ผ10๊ฐ ์ด์์ ๊ฑฐ๋์๏ผ๋ฐ ์์ฅ ๋ฐ์ดํฐ๋ฅผ ์ํ CCXT ํตํฉ๏ผ100๊ฐ ์ด์์ ์์ค๏ผ
- **์ฃผ์**: Yahoo Finance, Finnhub, Tiingo๏ผ๋ฏธ๊ตญ ์ฃผ์๏ผ๋ฐ AkShare๏ผ์ค๊ตญ/ํ์ฝฉ ์ฃผ์๏ผ
- **์ ๋ฌผ/์ธํ**: OANDA ๋ฐ ์ฃผ์ ์ ๋ฌผ ๋ฐ์ดํฐ ์์ค
- **ํ๋ก์ ์ง์**: ์ ํ๋ ๋คํธ์ํฌ ํ๊ฒฝ์ ์ํ ๋ด์ฅ ํ๋ก์ ๊ตฌ์ฑ
### 5. ๐ง ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ ์์ด์ ํธ(Memory-Augmented Agents)
QuantDinger์ ์์ด์ ํธ๋ ๋งค๋ฒ โ์ฒ์๋ถํฐโ ์์ํ์ง ์์ต๋๋ค. ๋ฐฑ์๋์๋ **๋ก์ปฌ ๋ฉ๋ชจ๋ฆฌ DB + ๋ฆฌํ๋ ์
(๊ฒ์ฆ) ๋ฃจํ**๊ฐ ๋ด์ฅ๋์ด ์์ด, ๊ณผ๊ฑฐ ๊ฒฝํ์ ๊ฒ์ํด system prompt์ ์ฃผ์
ํ๋ RAG ์คํ์ผ์ ๊ฐํ๊ฐ ๋์ํฉ๋๋ค.
- **๋ฌด์์ธ๊ฐ**: ๊ฒฝํ ๊ฒ์ ๊ธฐ๋ฐ ํ๋กฌํํธ ๊ฐํ(๋ชจ๋ธ ํ์ธํ๋/ํ์ต์ด ์๋)
- **์ ์ฅ ์์น**: ๋ก์ปฌ SQLite (`backend_api_python/data/memory/`)
#### ํ๋ฆ๋(์์ฒญ โ ๋ฉ๋ชจ๋ฆฌ ํ๋ฃจํ)
```mermaid
flowchart TB
%% ===== ๐ ์ง์
๋ ์ด์ด =====
subgraph Entry["๐ API ์ง์
์ "]
A["๐ก POST /api/analysis/multi"]
A2["๐ POST /api/analysis/reflect"]
end
%% ===== โ๏ธ ์๋น์ค ๋ ์ด์ด =====
subgraph Service["โ๏ธ ์๋น์ค ์ค์ผ์คํธ๋ ์ด์
"]
B[AnalysisService]
C[AgentCoordinator]
D["๐ ์ปจํ
์คํธ ๊ตฌ์ฑ
price ยท kline ยท news ยท indicators"]
end
%% ===== ๐ค ๋ฉํฐ์์ด์ ํธ ์ํฌํ๋ก์ฐ =====
subgraph Agents["๐ค ๋ฉํฐ์์ด์ ํธ ์ํฌํ๋ก์ฐ"]
subgraph P1["๐ Phase 1 ยท ๋ค์ฐจ์ ๋ถ์๏ผ๋ณ๋ ฌ๏ผ"]
E1["๐ MarketAnalyst
๊ธฐ์ ์ ๋ถ์"]
E2["๐ FundamentalAnalyst
ํ๋๋ฉํธ"]
E3["๐ฐ NewsAnalyst
๋ด์ค"]
E4["๐ญ SentimentAnalyst
์ฌ๋ฆฌ"]
E5["โ ๏ธ RiskAnalyst
๋ฆฌ์คํฌ ํ๊ฐ"]
end
subgraph P2["๐ฏ Phase 2 ยท ๊ฐ์ธ/์ฝ์ธ ๋
ผ์๏ผ๋ณ๋ ฌ๏ผ"]
F1["๐ BullResearcher
๊ฐ์ธ ๋
ผ๊ฑฐ"]
F2["๐ป BearResearcher
์ฝ์ธ ๋
ผ๊ฑฐ"]
end
subgraph P3["๐น Phase 3 ยท ๊ฑฐ๋ ๊ฒฐ์ "]
G["๐ฐ TraderAgent
์ข
ํฉ ํ๋จ โ BUY / SELL / HOLD"]
end
end
%% ===== ๐ง ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์ด =====
subgraph Memory["๐ง ๋ก์ปฌ SQLite ๋ฉ๋ชจ๋ฆฌ๏ผdata/memory/๏ผ"]
M1[("market_analyst")]
M2[("fundamental")]
M3[("news_analyst")]
M4[("sentiment")]
M5[("risk_analyst")]
M6[("bull_researcher")]
M7[("bear_researcher")]
M8[("trader_agent")]
end
%% ===== ๐ ๋ฆฌํ๋ ์
๋ฃจํ =====
subgraph Reflect["๐ ๋ฆฌํ๋ ์
๋ฃจํ๏ผ์ต์
๏ผ"]
R[ReflectionService]
RR[("reflection_records.db")]
W["โฐ ReflectionWorker"]
end
%% ===== ๋ฉ์ธ ํ๋ฆ =====
A --> B --> C --> D
D --> P1 --> P2 --> P3
%% ===== ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ/์ฐ๊ธฐ =====
E1 <-.-> M1
E2 <-.-> M2
E3 <-.-> M3
E4 <-.-> M4
E5 <-.-> M5
F1 <-.-> M6
F2 <-.-> M7
G <-.-> M8
%% ===== ๋ฆฌํ๋ ์
ํ๋ฆ =====
C --> R --> RR
W --> RR
W -.->|"๊ฒ์ฆ + ํ์ต"| M8
A2 -.->|"์๋ ํ๊ณ "| M8
```
#### ๊ฒ์ ๋ญํน(๊ฐ๋ต)
\[
score = w_{sim}\cdot sim + w_{recency}\cdot recency + w_{returns}\cdot returns\_score
\]
#### ํ์ต ๊ฒฝ๋ก
- **์๋ ํ๊ณ (์ถ์ฒ)**: `POST /api/analysis/reflect`๋ก ์ค์ ๊ฒฐ๊ณผ(returns/result)๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๊ธฐ๋ก
- **์๋ ๊ฒ์ฆ(์ต์
)**: `ENABLE_REFLECTION_WORKER=true`, `REFLECTION_WORKER_INTERVAL_SEC`๋ก ์ฃผ๊ธฐ์ ๊ฒ์ฆโ๋ฉ๋ชจ๋ฆฌ ๋ฐ์
#### ์ฃผ์ ํ๊ฒฝ ๋ณ์(`.env`)
- `ENABLE_AGENT_MEMORY`, `AGENT_MEMORY_TOP_K`, `AGENT_MEMORY_CANDIDATE_LIMIT`
- `AGENT_MEMORY_ENABLE_VECTOR`, `AGENT_MEMORY_EMBEDDING_DIM`
- `AGENT_MEMORY_HALF_LIFE_DAYS`, `AGENT_MEMORY_W_SIM`, `AGENT_MEMORY_W_RECENCY`, `AGENT_MEMORY_W_RETURNS`
- `ENABLE_REFLECTION_WORKER`, `REFLECTION_WORKER_INTERVAL_SEC`
### 6. ์ ๋ต ๋ฐํ์
- **์ค๋ ๋ ๊ธฐ๋ฐ ์คํ๊ธฐ**: ์ ๋ต ์คํ์ ์ํ ๋
๋ฆฝ์ ์ธ ์ค๋ ๋ ํ
- **์๋ ๋ณต๊ตฌ**: ์์คํ
์ฌ์์ ํ ์คํ ์ค์ธ ์ ๋ต ์ฌ๊ฐ
- **์ฃผ๋ฌธ ๋๊ธฐ์ด**: ์ฃผ๋ฌธ ์คํ์ ์ํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ปค
### 7. ๋ฉํฐ LLM ์ ๊ณต์ ์ง์
QuantDinger๋ ์๋ ๊ฐ์ง ๊ธฐ๋ฅ์ ๊ฐ์ถ ์ฌ๋ฌ AI ์ ๊ณต์๋ฅผ ์ง์ํฉ๋๋ค:
| ์ ๊ณต์ | ํน์ง |
|--------|------|
| **OpenRouter** | ๋ฉํฐ๋ชจ๋ธ ๊ฒ์ดํธ์จ์ด(๊ธฐ๋ณธ๊ฐ), 100+ ๋ชจ๋ธ |
| **OpenAI** | GPT-4o, GPT-4o-mini |
| **Google Gemini** | Gemini 1.5 Flash/Pro |
| **DeepSeek** | DeepSeek Chat(๊ฐ์ฑ๋น ์ข์) |
| **xAI Grok** | Grok Beta |
`.env`์์ ์ ํธํ๋ ์ ๊ณต์์ API ํค๋ง ์ค์ ํ๋ฉด ์์คํ
์ด ์ฌ์ฉ ๊ฐ๋ฅํ ์ ๊ณต์๋ฅผ ์๋ ๊ฐ์งํฉ๋๋ค.
### 8. ์ธ๋์ผ์ดํฐ ์ปค๋ฎค๋ํฐ
*๊ณต์ , ๋ฐ๊ฒฌ, ๊ฑฐ๋.*
- **๊ฒ์ ๋ฐ ๊ณต์ **: ํ์ด์ฌ ์ธ๋์ผ์ดํฐ๋ฅผ ์ปค๋ฎค๋ํฐ์ ๊ณต์
- **๊ตฌ๋งค ์์คํ
**: ๋ค๋ฅธ ์ฌ์ฉ์๋ก๋ถํฐ ํ๋ฆฌ๋ฏธ์ ์ธ๋์ผ์ดํฐ ๊ตฌ๋งค
- **ํ์ ๋ฐ ๋ฆฌ๋ทฐ**: ๊ตฌ๋งคํ ์ธ๋์ผ์ดํฐ ํ๊ฐ ๋ฐ ๋ฆฌ๋ทฐ
- **๊ด๋ฆฌ์ ๊ฒํ **: ํ์ง ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋๋ ์ด์
์์คํ
### 9. ์ฌ์ฉ์ ๊ด๋ฆฌ ๋ฐ ๋ณด์
- **๋ฉํฐ์ ์ ์ง์**: PostgreSQL ๊ธฐ๋ฐ ์ฌ์ฉ์ ๊ณ์ , ์ญํ ๊ธฐ๋ฐ ๊ถํ ๊ด๋ฆฌ
- **OAuth ๋ก๊ทธ์ธ**: Google ๋ฐ GitHub OAuth ํตํฉ
- **์ด๋ฉ์ผ ์ธ์ฆ**: ์ด๋ฉ์ผ ์ธ์ฆ ์ฝ๋๋ฅผ ํตํ ๋ฑ๋ก ๋ฐ ๋น๋ฐ๋ฒํธ ์ฌ์ค์
- **๋ณด์ ๊ธฐ๋ฅ**: Cloudflare Turnstile ์บก์ฐจ, IP/๊ณ์ ์๋ ์ ํ
- **๋ฐ๋ชจ ๋ชจ๋**: ๊ณต๊ฐ ๋ฐ๋ชจ๋ฅผ ์ํ ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋
### 10. ๊ธฐ์ ์คํ
- **๋ฐฑ์๋**: Python (Flask) + PostgreSQL + Redis๏ผ์ต์
๏ผ
- **ํ๋ก ํธ์๋**: Vue 2 + Ant Design Vue + KlineCharts/ECharts
- **๋ฐฐํฌ**: Docker Compose
- **ํ์ฌ ๋ฒ์ **: V2.1.1 ([๋ณ๊ฒฝ ๋ก๊ทธ](docs/CHANGELOG.md))
---
## ๐ ์ง์๋๋ ๊ฑฐ๋์ ๋ฐ ๋ธ๋ก์ปค
QuantDinger๋ ๋ค์ํ ์์ฅ ์ ํ์ ๋ํด ์ฌ๋ฌ ์คํ ๋ฐฉ๋ฒ์ ์ง์ํฉ๋๋ค:
### ์ํธํํ ๊ฑฐ๋์(์ง์ API)
| ๊ฑฐ๋์ | ์์ฅ |
|:--------:|:---------|
| Binance | ํ๋ฌผ, ์ ๋ฌผ, ๋ง์ง |
| OKX | ํ๋ฌผ, ๋ฌด๊ธฐํ, ์ต์
|
| Bitget | ํ๋ฌผ, ์ ๋ฌผ, ์นดํผ ํธ๋ ์ด๋ฉ |
| Bybit | ํ๋ฌผ, ์ ํ ์ ๋ฌผ |
| Coinbase Exchange | ํ๋ฌผ |
| Kraken | ํ๋ฌผ, ์ ๋ฌผ |
| KuCoin | ํ๋ฌผ, ์ ๋ฌผ |
| Gate.io | ํ๋ฌผ, ์ ๋ฌผ |
| Bitfinex | ํ๋ฌผ, ํ์์ํ |
| Deepcoin | ํ๋ฌผ, ๋ฌด๊ธฐํ |
### ์ ํต์ ์ธ ๋ธ๋ก์ปค
| ๋ธ๋ก์ปค | ์์ฅ | ํ๋ซํผ |
|:------:|:--------|:---------|
| **Interactive Brokers (IBKR)** | ๋ฏธ๊ตญ ์ฃผ์, ํ์ฝฉ ์ฃผ์ | TWS / IB Gateway ๐ |
| **MetaTrader 5 (MT5)** | ์ธํ | MT5 ํฐ๋ฏธ๋ ๐ |
### ์์ฅ ๋ฐ์ดํฐ(CCXT ๊ฒฝ์ )
Bybit, Gate.io, Kraken, KuCoin, HTX ๋ฐ 100๊ฐ ์ด์์ ๊ธฐํ ๊ฑฐ๋์๊ฐ ์์ฅ ๋ฐ์ดํฐ์ฉ์ผ๋ก ์ง์๋ฉ๋๋ค.
---
### ๋ค๊ตญ์ด ์ง์
QuantDinger๋ ํฌ๊ด์ ์ธ ๊ตญ์ ํ๋ฅผ ํตํด ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํด ๊ตฌ์ถ๋์์ต๋๋ค:
๋ชจ๋ UI ์์, ์ค๋ฅ ๋ฉ์์ง ๋ฐ ๋ฌธ์๋ ์๋ฒฝํ๊ฒ ๋ฒ์ญ๋์ด ์์ต๋๋ค. ์ธ์ด๋ ๋ธ๋ผ์ฐ์ ์ค์ ์ ๋ฐ๋ผ ์๋์ผ๋ก ๊ฐ์ง๋๊ฑฐ๋ ์ฑ์์ ์๋์ผ๋ก ์ ํํ ์ ์์ต๋๋ค.
---
### ์ง์๋๋ ์์ฅ
| ์์ฅ ์ ํ | ๋ฐ์ดํฐ ์์ค | ๊ฑฐ๋ |
|-------------|--------------|---------|
| **์ํธํํ** | Binance, OKX, Bitget, + 100 ๊ฑฐ๋์ | โ
์์ ์ง์ |
| **๋ฏธ๊ตญ ์ฃผ์** | Yahoo Finance, Finnhub, Tiingo | โ
IBKR ๊ฒฝ์ ๐ |
| **ํ์ฝฉ ์ฃผ์** | AkShare, East Money | โ
IBKR ๊ฒฝ์ ๐ |
| **์ค๊ตญ ์ฃผ์(A์ฃผ)** | AkShare, East Money | โก ๋ฐ์ดํฐ๋ง |
| **์ธํ** | Finnhub, OANDA | โ
MT5 ๊ฒฝ์ ๐ |
| **์ ๋ฌผ** | ๊ฑฐ๋์ API, AkShare | โก ๋ฐ์ดํฐ๋ง |
---
### ์ํคํ
์ฒ (ํ์ฌ ๋ ํฌ์งํ ๋ฆฌ)
```text
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ quantdinger_vue โ
โ (Vue 2 + Ant Design Vue) โ
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ HTTP (/api/*)
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ backend_api_python โ
โ (Flask + ์ ๋ต ๋ฐํ์) โ
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โโ SQLite (quantdinger.db)
โโ Redis (์ต์
์บ์)
โโ ๋ฐ์ดํฐ ์ ๊ณต์ / LLMs / ๊ฑฐ๋์
```
---
### ๋ ํฌ์งํ ๋ฆฌ ๊ตฌ์กฐ
```text
.
โโ backend_api_python/ # Flask API + AI + ๋ฐฑํ
์คํธ + ์ ๋ต ๋ฐํ์
โ โโ app/
โ โโ env.example # ๋ก์ปฌ ๊ตฌ์ฑ์ ์ํด .env๋ก ๋ณต์ฌ
โ โโ requirements.txt
โ โโ run.py # ์ํธ๋ฆฌ ํฌ์ธํธ
โโ quantdinger_vue/ # Vue 2 UI (๊ฐ๋ฐ ์๋ฒ๋ /api๋ฅผ ๋ฐฑ์๋๋ก ํ๋ก์)
```
---
## ๋น ๋ฅธ ์์
### ์ต์
1: Docker ๋ฐฐํฌ (๊ถ์ฅ)
QuantDinger๋ฅผ ์คํํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์
๋๋ค.
#### 1. ์ํด๋ฆญ ์์
**Linux / macOS**
```bash
git clone https://github.com/brokermr810/QuantDinger.git && \
cd QuantDinger && \
cp backend_api_python/env.example backend_api_python/.env && \
docker-compose up -d --build
```
**Windows (PowerShell)**
```powershell
git clone https://github.com/brokermr810/QuantDinger.git
cd QuantDinger
Copy-Item backend_api_python\env.example -Destination backend_api_python\.env
docker-compose up -d --build
```
#### 2. ์ ์ ๋ฐ ๊ตฌ์ฑ
- **ํ๋ก ํธ์๋ UI**: http://localhost:8888
- **๊ธฐ๋ณธ ๊ณ์ **: `quantdinger` / `123456`
> **์ฐธ๊ณ **: AI ๊ธฐ๋ฅ์ด๋ ํ๋ก๋์
ํ๊ฒฝ์ ๋ณด์์ ์ํด, `backend_api_python/.env`๋ฅผ ํธ์งํ์ฌ( `OPENROUTER_API_KEY` ์ถ๊ฐ, ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ) `docker-compose restart backend`๋ก ์๋น์ค๋ฅผ ์ฌ์์ํ์ญ์์ค.
#### 3. ์ ํ๋ฆฌ์ผ์ด์
์ก์ธ์ค
- **ํ๋ก ํธ์๋ UI**: http://localhost
- **๋ฐฑ์๋ API**: http://localhost:5000
#### Docker ๋ช
๋ น ์ฐธ์กฐ
```bash
# ์คํ ์ํ ๋ณด๊ธฐ
docker-compose ps
# ๋ก๊ทธ ๋ณด๊ธฐ
docker-compose logs -f
# ์๋น์ค ์ค์ง
docker-compose down
# ๋ณผ๋ฅจ ์ค์ง ๋ฐ ์ ๊ฑฐ (๊ฒฝ๊ณ : ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ญ์ ๋ฉ๋๋ค!)
docker-compose down -v
```
#### ๋ฐ์ดํฐ ์ง์์ฑ
๋ค์ ๋ฐ์ดํฐ๋ ํธ์คํธ์ ๋ง์ดํธ๋๋ฉฐ ์ปจํ
์ด๋ ์ฌ์์ ํ์๋ ์ ์ง๋ฉ๋๋ค:
```yaml
volumes:
- ./backend_api_python/logs:/app/logs # ๋ก๊ทธ
- ./backend_api_python/data:/app/data # ๋ฐ์ดํฐ ๋๋ ํ ๋ฆฌ(quantdinger.db ํฌํจ)
- ./backend_api_python/.env:/app/.env # ๊ตฌ์ฑ ํ์ผ
```
---
### ์ต์
2: ๋ก์ปฌ ๊ฐ๋ฐ
**์ ์ ์กฐ๊ฑด**
- Python 3.10+ ๊ถ์ฅ
- Node.js 16+ ๊ถ์ฅ
#### 1. ๋ฐฑ์๋ ์์ (Flask API)
```bash
cd backend_api_python
pip install -r requirements.txt
cp env.example .env # Windows: copy env.example .env
python run.py
```
๋ฐฑ์๋๋ `http://localhost:5000`์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
#### 2. ํ๋ก ํธ์๋ ์์ (Vue UI)
```bash
cd quantdinger_vue
npm install
npm run serve
```
ํ๋ก ํธ์๋ ๊ฐ๋ฐ ์๋ฒ๋ `http://localhost:8000`์์ ์คํ๋๋ฉฐ `/api/*`๋ฅผ `http://localhost:5000`์ผ๋ก ํ๋ก์ํฉ๋๋ค.
---
### ๊ตฌ์ฑ (.env)
`backend_api_python/env.example`์ ํ
ํ๋ฆฟ์ผ๋ก ์ฌ์ฉํ์ญ์์ค. ์ผ๋ฐ์ ์ธ ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- **์ธ์ฆ**: `SECRET_KEY`, `ADMIN_USER`, `ADMIN_PASSWORD`
- **์๋ฒ**: `PYTHON_API_HOST`, `PYTHON_API_PORT`, `PYTHON_API_DEBUG`
- **๋ฐ์ดํฐ๋ฒ ์ด์ค**: `DATABASE_URL` (PostgreSQL ์ฐ๊ฒฐ ๋ฌธ์์ด)
- **AI / LLM**: `LLM_PROVIDER` (openrouter/openai/google/deepseek/grok), ๊ฐ ์ ๊ณต์ API ํค
- **OAuth**: `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET`, `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET`
- **๋ณด์**: `TURNSTILE_SITE_KEY`, `TURNSTILE_SECRET_KEY`, `ENABLE_REGISTRATION`
- **์น ๊ฒ์**: `SEARCH_PROVIDER`, `SEARCH_GOOGLE_*`, `SEARCH_BING_API_KEY`
- **์ฃผ๋ฌธ ์คํ**: `ORDER_MODE` (maker/market), `MAKER_WAIT_SEC`, `MAKER_OFFSET_BPS`
- **ํ๋ก์ (์ต์
)**: `PROXY_PORT` ๋๋ `PROXY_URL`
- **๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค**: `ENABLE_PENDING_ORDER_WORKER`, `ENABLE_PORTFOLIO_MONITOR`
---
## ๐ค ์ปค๋ฎค๋ํฐ ๋ฐ ์ง์
- **๊ธฐ์ฌ**: [๊ธฐ์ฌ ๊ฐ์ด๋](CONTRIBUTING.md) ยท [๊ธฐ์ฌ์](CONTRIBUTORS.md)
- **Telegram**: [QuantDinger ๊ทธ๋ฃน](https://t.me/quantdinger)
- **Discord**: [์๋ฒ ์ฐธ์ฌ](https://discord.gg/vwJ8zxFh9Q)
- **๐บ ๋์์ ๋ฐ๋ชจ**: [ํ๋ก์ ํธ ์๊ฐ](https://youtu.be/HPTVpqL7knM)
- **YouTube**: [@quantdinger](https://youtube.com/@quantdinger)
- **Email**: [brokermr810@gmail.com](mailto:brokermr810@gmail.com)
- **GitHub Issues**: [๋ฒ๊ทธ ์ ๊ณ / ๊ธฐ๋ฅ ์์ฒญ](https://github.com/brokermr810/QuantDinger/issues)
---
## ๐ผ ์์ฉ ๋ผ์ด์ ์ค & ์คํฐ์(Commercial License & Sponsorship)
QuantDinger์ ์ฝ๋๋ **Apache License 2.0**์ผ๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ค๋ง **Apache 2.0์ ์ํ๊ถ์ ๋ถ์ฌํ์ง ์์ต๋๋ค**. QuantDinger์ ์ด๋ฆ/๋ก๊ณ /๋ธ๋๋ฉ์ ์ํ ๋ฐ ๋ธ๋๋ ์ ์ฑ
์ ์ ์ฉ์ ๋ฐ์ผ๋ฉฐ(์ฝ๋ ๋ผ์ด์ ์ค์ ๋ณ๊ฐ):
- **์ ์๊ถ/ํ๊ธฐ**: LICENSE/NOTICE ๋ฑ ํ์ํ ์ ์๊ถยท๋ผ์ด์ ์ค ๊ณ ์ง๋ ์ ์งํด์ผ ํฉ๋๋ค.
- **์ํ(์ด๋ฆ/๋ก๊ณ /๋ธ๋๋ฉ)**: QuantDinger์ ์ด๋ฆ/๋ก๊ณ /๋ธ๋๋ฉ์ ์ฌ์ฉํด ์ถ์ฒ๋ฅผ ์ค์ธ์ํค๊ฑฐ๋ ๋ณด์ฆ(endorsement)์ ์์ํด์๋ ์ ๋ฉ๋๋ค. ์์ ๋ฒ์ ์ ์ฌ๋ฐฐํฌํ ๋๋ ์๋ฉด ํ๊ฐ๊ฐ ์๋ ํ QuantDinger ๋ธ๋๋ฉ์ ์ ๊ฑฐ/๋์ฒดํด์ผ ํ ์ ์์ต๋๋ค.
์ฌ๋ฐฐํฌ๋ฌผ์์ QuantDinger ๋ธ๋๋ฉ์ **์ ์ง/์์ **ํ๊ณ ์ถ๋ค๋ฉด(UI ๋ก๊ณ ์ฌ์ฉ ํฌํจ) **์์ฉ ๋ผ์ด์ ์ค**๋ฅผ ๋ฌธ์ํด ์ฃผ์ธ์.
์ฐธ๊ณ : `TRADEMARKS.md`
### ์์ฉ ๋ผ์ด์ ์ค๋ก ์ ๊ณต๋๋ ๊ฒ
- ํฉ์๋ ๋ฒ์ ๋ด **๋ธ๋๋ฉ/ํ์์ ์์ฉ ํ๊ฐ**
- **์ด์ ์ง์**: ๋ฐฐํฌ, ์
๊ทธ๋ ์ด๋, ์ฅ์ ๋์, ์ ์ง๋ณด์ ๊ฐ์ด๋
- **์ปจ์คํ
**: ์ํคํ
์ฒ ๋ฆฌ๋ทฐ, ์ฑ๋ฅ ํ๋, ์ ๋ต ์ํฌํ๋ก์ฐ ์ปจ์คํ
- **์คํฐ์ ์ต์
**: ์คํฐ์๋ก์ ๋ก๊ณ /๊ด๊ณ ๋
ธ์ถ(README/์น์ฌ์ดํธ/์ฑ ๋ด ๋ฑ ํฉ์์ ๋ฐ๋ฆ)
### ์ฐ๋ฝ์ฒ
- **Telegram**: [QuantDinger Group](https://t.me/worldinbroker)
- **Email**: [brokermr810@gmail.com](mailto:brokermr810@gmail.com)
---
### ๐ ์ง์ ์ง์(๊ธฐ๋ถ)
๊ทํ์ ๊ธฐ์ฌ๋ QuantDinger์ ์ ์ง ๋ฐ ๊ฐ์ ์ ๋์์ด ๋ฉ๋๋ค.
**์ํธํํ ๊ธฐ๋ถ (ERC-20 / BEP-20 / Polygon / Arbitrum)**
```
0x96fa4962181bea077f8c7240efe46afbe73641a7
```
---
### ๐ ์ง์ ํํธ๋
์์ ๊ธ์ต ๊ต์ก ๋ฐ ์ฐ๊ตฌ๋ฅผ ๋ฐ์ ์ํค๋ ํ์ ๊ธฐ๊ด๊ณผ ์กฐ์ง์ ์ง์์ ๋ฐ๊ฒ ๋์ด ์๋์ค๋ฝ์ต๋๋ค.
์์ ๊ธ์ตํํ (QFS)
์ธ๋์ ๋ ๋ํ๊ต ๋ธ๋ฃจ๋ฐํด
์ฐจ์ธ๋ ์์ ๊ธ์ต ์ ๋ฌธ๊ฐ ์์ฑ
|
> ๐ก **์ง์ ํํธ๋๊ฐ ๋๋ ๋ฐ ๊ด์ฌ์ด ์์ผ์ ๊ฐ์?** ๋ํ, ์ฐ๊ตฌ ๊ธฐ๊ด ๋ฐ ์กฐ์ง๊ณผ์ ํ๋ ฅ์ ํ์ํฉ๋๋ค. [brokermr810@gmail.com](mailto:brokermr810@gmail.com) ๋๋ [Telegram](https://t.me/worldinbroker)์ผ๋ก ์ฐ๋ฝ์ฃผ์ธ์.
---
### ๊ฐ์ฌ์ ๋ง
QuantDinger๋ Flask, Pandas, CCXT, Vue.js, Ant Design Vue, KlineCharts ๋ฑ๊ณผ ๊ฐ์ ํ๋ฅญํ ์คํ ์์ค ํ๋ก์ ํธ์ ์ด๊นจ ์์ ์ ์์ต๋๋ค.
๋ชจ๋ ๊ด๋ฆฌ์์ ๊ธฐ์ฌ์์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! โค๏ธ