# Changelog - 2026-01-30
## ๐ฏ ๋ชฉํ
make-quant-py์์ ๋๋ฝ๋ ์ ๋ต 3๊ฐ๋ฅผ pension-quant-platform์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๊ณ , Frontend ๋ฐ์ดํฐ ๊ด๋ฆฌ UI๋ฅผ ์์ฑํฉ๋๋ค.
---
## โ
์๋ฃ๋ ์์
### Backend (7๊ฐ ํ์ผ ์์ /์์ฑ)
#### 1. ๊ณตํต ํจ์ ์ถ๊ฐ ๋ฐ ํ์ฅ
**ํ์ผ**: `backend/app/utils/data_helpers.py`
- **์ถ๊ฐ๋ ํจ์**:
- `calculate_value_rank(value_df, indicators)` - ๋ฐธ๋ฅ ์งํ ์์ ๊ณ์ฐ ๋ฐ ํฉ์ฐ
- `calculate_quality_factors(fs_list)` - ํ๋ฆฌํฐ ํฉํฐ TTM ๊ณ์ฐ (ROE, GPA, CFO)
- **ํ์ฅ๋ ํจ์**:
- `get_value_indicators()` - PSR, PCR ๊ณ์ฐ ๋ก์ง ์ถ๊ฐ
- PSR = ์๊ฐ์ด์ก / ๋งค์ถ์ก (TTM)
- PCR = ์๊ฐ์ด์ก / ์์
ํ๋ํ๊ธํ๋ฆ (TTM)
- ํ๋ผ๋ฏธํฐ ์ถ๊ฐ: `include_psr_pcr`, `base_date`
- **์ํฌํธ ์ถ๊ฐ**:
- `import numpy as np`
#### 2. Value ์ ๋ต ๊ตฌํ
**ํ์ผ**: `backend/app/strategies/factors/value.py` (์ ๊ท)
- **ํด๋์ค**: `ValueStrategy(BaseStrategy)`
- **์งํ**: PER, PBR
- **๋ก์ง**:
- ์ข
๋ชฉ ๋ฆฌ์คํธ ์กฐํ
- PER, PBR ์กฐํ (Asset ๋ชจ๋ธ ๊ธฐ๋ฐ)
- ๋ ์งํ ๋ชจ๋ ์๋ ์ข
๋ชฉ ํํฐ๋ง
- ์์ ํฉ์ฐ ํ ์์ N๊ฐ ์ ์
- **ํ๋ผ๋ฏธํฐ**: `count` (๊ธฐ๋ณธ๊ฐ 20)
#### 3. Quality ์ ๋ต ๊ตฌํ
**ํ์ผ**: `backend/app/strategies/factors/quality.py` (์ ๊ท)
- **ํด๋์ค**: `QualityStrategy(BaseStrategy)`
- **์งํ**: ROE, GPA, CFO
- **๋ก์ง**:
- ์ข
๋ชฉ ๋ฆฌ์คํธ ์กฐํ
- ์ฌ๋ฌด์ ํ ๋ฐ์ดํฐ ์กฐํ
- TTM ๊ณ์ฐ (์ต๊ทผ 4๋ถ๊ธฐ ํฉ์ฐ, ์์ฐ/์๋ณธ์ ํ๊ท )
- ROE = ๋น๊ธฐ์์ด์ต / ์๋ณธ
- GPA = ๋งค์ถ์ด์ด์ต / ์์ฐ
- CFO = ์์
ํ๋ํ๊ธํ๋ฆ / ์์ฐ
- ๊ฐ ์งํ ์์ ๊ณ์ฐ (ascending=False)
- ์์ ํฉ์ฐ ํ ์์ N๊ฐ ์ ์
- **ํ๋ผ๋ฏธํฐ**: `count` (๊ธฐ๋ณธ๊ฐ 20)
#### 4. All Value ์ ๋ต ๊ตฌํ
**ํ์ผ**: `backend/app/strategies/factors/all_value.py` (์ ๊ท)
- **ํด๋์ค**: `AllValueStrategy(BaseStrategy)`
- **์งํ**: PER, PBR, PCR, PSR, DY
- **๋ก์ง**:
- ์ข
๋ชฉ ๋ฆฌ์คํธ ์กฐํ
- 5๊ฐ์ง ๋ฐธ๋ฅ ์งํ ์กฐํ (`include_psr_pcr=True`)
- ์ต์ 3๊ฐ ์ด์์ ์งํ๊ฐ ์๋ ์ข
๋ชฉ ํํฐ๋ง
- DY ์ญ์ ์ฒ๋ฆฌ (๋์์๋ก ์ข์ ์งํ)
- ์์ ํฉ์ฐ ํ ์์ N๊ฐ ์ ์
- **ํ๋ผ๋ฏธํฐ**: `count` (๊ธฐ๋ณธ๊ฐ 20)
#### 5. ์ ๋ต ๋ ์ง์คํธ๋ฆฌ ์
๋ฐ์ดํธ
**ํ์ผ**: `backend/app/strategies/registry.py`
- **์ํฌํธ ์ถ๊ฐ**:
```python
from app.strategies.factors.value import ValueStrategy
from app.strategies.factors.quality import QualityStrategy
from app.strategies.factors.all_value import AllValueStrategy
```
- **๋ ์ง์คํธ๋ฆฌ ๋ฑ๋ก**:
```python
STRATEGY_REGISTRY = {
...
'value': ValueStrategy,
'quality': QualityStrategy,
'all_value': AllValueStrategy,
}
```
#### 6. MultiFactorStrategy ๋ฆฌํฉํ ๋ง
**ํ์ผ**: `backend/app/strategies/composite/multi_factor.py`
- **๋ณ๊ฒฝ ์ฌํญ**:
- `_calculate_quality_factors()` ๋ฉ์๋ ์ ๊ฑฐ
- ๊ณตํต ํจ์ `calculate_quality_factors()` ์ฌ์ฉ
- ์ํฌํธ ์ถ๊ฐ: `from app.utils.data_helpers import calculate_quality_factors`
#### 7. ํ
์คํธ ์ถ๊ฐ
**ํ์ผ**: `backend/tests/test_strategies.py`
- **์ํฌํธ ์ถ๊ฐ**:
```python
from app.strategies.factors.value import ValueStrategy
from app.strategies.factors.quality import QualityStrategy
from app.strategies.factors.all_value import AllValueStrategy
```
- **์ถ๊ฐ๋ ํ
์คํธ**:
- `test_value_strategy_interface()` - ValueStrategy ์ธํฐํ์ด์ค ๊ฒ์ฆ
- `test_quality_strategy_interface()` - QualityStrategy ์ธํฐํ์ด์ค ๊ฒ์ฆ
- `test_all_value_strategy_interface()` - AllValueStrategy ์ธํฐํ์ด์ค ๊ฒ์ฆ
- `test_value_select_stocks()` - ValueStrategy ์คํ ํ
์คํธ
- `test_quality_select_stocks()` - QualityStrategy ์คํ ํ
์คํธ
- `test_all_value_select_stocks()` - AllValueStrategy ์คํ ํ
์คํธ
---
### Frontend (2๊ฐ ํ์ผ ์์ /์์ฑ)
#### 1. DataManagement ์ปดํฌ๋ํธ ์์ฑ
**ํ์ผ**: `frontend/src/components/data/DataManagement.tsx` (์ ๊ท)
- **๊ธฐ๋ฅ**:
1. **๋ฐ์ดํฐ๋ฒ ์ด์ค ํต๊ณ ์นด๋** (3๊ฐ)
- ์ข
๋ชฉ ์
- ๊ฐ๊ฒฉ ๋ฐ์ดํฐ ์
- ์ฌ๋ฌด์ ํ ์
- 10์ด ์๋ ๊ฐฑ์
2. **๋ฐ์ดํฐ ์์ง ๋ฒํผ** (5๊ฐ)
- ์ข
๋ชฉ ๋ฐ์ดํฐ ์์ง
- ์ฃผ๊ฐ ๋ฐ์ดํฐ ์์ง (์ต๊ทผ 30์ผ)
- ์ฌ๋ฌด์ ํ ์์ง
- ์นํฐ ๋ฐ์ดํฐ ์์ง
- ์ ์ฒด ์์ง
3. **์์ง ์ํ ํ์**
- ์งํ ์ค: ๋ก๋ฉ ์คํผ๋ + ํ๋์ ๋ฐฐ๊ฒฝ
- ์๋ฃ: ์ฑ๊ณต ๋ฉ์์ง + ๋
น์ ๋ฐฐ๊ฒฝ
- ์คํจ: ์๋ฌ ๋ฉ์์ง + ๋นจ๊ฐ์ ๋ฐฐ๊ฒฝ
- Task ID ํ์ ๋ฐ Flower ๋งํฌ
4. **Task ์ํ ํด๋ง**
- 3์ด ๊ฐ๊ฒฉ์ผ๋ก ์ํ ํ์ธ
- SUCCESS/FAILURE ์ ํด๋ง ์ค๋จ
- ์ํ ์
๋ฐ์ดํธ UI ๋ฐ์
- **์คํ์ผ๋ง**:
- Tailwind CSS
- ๋ฐ์ํ ๊ทธ๋ฆฌ๋ ๋ ์ด์์ (1/2/3์ด)
- ์์ ์ฝ๋ฉ (ํ๋์: ์ข
๋ชฉ, ๋
น์: ๊ฐ๊ฒฉ, ๋ณด๋ผ์: ์ฌ๋ฌด์ ํ, ๋
ธ๋์: ์นํฐ, ๋นจ๊ฐ์: ์ ์ฒด)
- **API ์ฌ์ฉ**:
- `dataAPI.stats()` - ํต๊ณ ์กฐํ
- `dataAPI.collectTicker()` - ์ข
๋ชฉ ์์ง
- `dataAPI.collectPrice()` - ๊ฐ๊ฒฉ ์์ง
- `dataAPI.collectFinancial()` - ์ฌ๋ฌด์ ํ ์์ง
- `dataAPI.collectSector()` - ์นํฐ ์์ง
- `dataAPI.collectAll()` - ์ ์ฒด ์์ง
- `dataAPI.taskStatus(taskId)` - ์์
์ํ ์กฐํ
#### 2. App.tsx ํตํฉ
**ํ์ผ**: `frontend/src/App.tsx`
- **์ํฌํธ ์ถ๊ฐ**:
```typescript
import DataManagement from './components/data/DataManagement';
```
- **Data ํญ ์์ **:
```typescript
{activeTab === 'data' && (
)}
```
- **๋ณ๊ฒฝ ์ **: API ์๋ํฌ์ธํธ ๋ชฉ๋ก๋ง ํ์
- **๋ณ๊ฒฝ ํ**: ์์ ํ ๋ฐ์ดํฐ ๊ด๋ฆฌ UI
---
### ๋ฌธ์ํ (2๊ฐ ํ์ผ ์์ )
#### 1. README.md ์
๋ฐ์ดํธ
**ํ์ผ**: `README.md`
- **์ ๋ต ๋ชฉ๋ก ํ์ฅ**:
```markdown
- Multi-Factor (Quality + Value + Momentum)
- Momentum (12M Return + K-Ratio)
- Value (PER, PBR) โญ NEW
- Quality (ROE, GPA, CFO) โญ NEW
- All Value (PER, PBR, PCR, PSR, DY) โญ NEW
- Magic Formula
- Super Quality
- F-Score
```
- **์ต๊ทผ ์
๋ฐ์ดํธ ์น์
์ถ๊ฐ**:
```markdown
## โ
์ต๊ทผ ์
๋ฐ์ดํธ (2026-01-30)
- [x] Value ์ ๋ต ์ถ๊ฐ
- [x] Quality ์ ๋ต ์ถ๊ฐ
- [x] All Value ์ ๋ต ์ถ๊ฐ
- [x] Frontend ๋ฐ์ดํฐ ๊ด๋ฆฌ ํญ ๊ตฌํ
- [x] ๋ฐ์ดํฐ ์์ง ์ํ ์๊ฐํ
- [x] ๊ณตํต ํจ์ ๋ฆฌํฉํ ๋ง
```
#### 2. IMPLEMENTATION_STATUS.md ์
๋ฐ์ดํธ
**ํ์ผ**: `IMPLEMENTATION_STATUS.md`
- **์ ๋ต ์น์
์
๋ฐ์ดํธ**:
- ValueStrategy ์ถ๊ฐ
- QualityStrategy ์ถ๊ฐ
- AllValueStrategy ์ถ๊ฐ
- ์ด ์ ๋ต ์: 5๊ฐ โ 8๊ฐ
- **๋ฐ์ดํฐ ์กฐํ ์ ํธ๋ฆฌํฐ ์น์
์
๋ฐ์ดํธ**:
- `calculate_value_rank()` ์ถ๊ฐ
- `calculate_quality_factors()` ์ถ๊ฐ
- `get_value_indicators()` PSR, PCR ์ถ๊ฐ
- **Frontend ์ปดํฌ๋ํธ ์น์
์
๋ฐ์ดํธ**:
- DataManagement.tsx ์ถ๊ฐ
- **๊ตฌํ ํต๊ณ ์
๋ฐ์ดํธ**:
- Quant ์ ๋ต: 5๊ฐ โ 8๊ฐ
- ํ
์คํธ ์ผ์ด์ค: 30+ โ 36+
- Frontend ์ปดํฌ๋ํธ: 3๊ฐ โ 4๊ฐ
- **์ต๊ทผ ์
๋ฐ์ดํธ ์น์
์ถ๊ฐ** (2026-01-30)
---
## ๐ ๊ตฌํ ํต๊ณ
### ์์ /์์ฑ๋ ํ์ผ
- **Backend**: 7๊ฐ ํ์ผ
- ์ ๊ท ์์ฑ: 3๊ฐ (value.py, quality.py, all_value.py)
- ์์ : 4๊ฐ (data_helpers.py, registry.py, multi_factor.py, test_strategies.py)
- **Frontend**: 2๊ฐ ํ์ผ
- ์ ๊ท ์์ฑ: 1๊ฐ (DataManagement.tsx)
- ์์ : 1๊ฐ (App.tsx)
- **๋ฌธ์**: 2๊ฐ ํ์ผ
- ์์ : 2๊ฐ (README.md, IMPLEMENTATION_STATUS.md)
### ์ถ๊ฐ๋ ์ฝ๋
- **Backend**:
- ์ ๋ต ํด๋์ค: 3๊ฐ (~350์ค)
- ๊ณตํต ํจ์: 2๊ฐ (~80์ค)
- ํ
์คํธ: 6๊ฐ (~120์ค)
- **Frontend**:
- ์ปดํฌ๋ํธ: 1๊ฐ (~270์ค)
### ์ ๋ต ๋ง์ด๊ทธ๋ ์ด์
์งํ๋ฅ
- **์ด์ **: 5/9 (56%)
- **ํ์ฌ**: 8/9 (89%)
- **๋จ์ ์ ๋ต**: 1๊ฐ (Super Value Momentum - ๋ณด๋ฅ)
---
## ๐ฏ ์ฃผ์ ๊ฐ์ ์ฌํญ
### 1. ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ ํฅ์
- MultiFactorStrategy์ QualityStrategy์์ ์ค๋ณต๋๋ TTM ๊ณ์ฐ ๋ก์ง์ `calculate_quality_factors()` ๊ณตํต ํจ์๋ก ๋ถ๋ฆฌ
- ValueStrategy, QualityStrategy, AllValueStrategy์์ `calculate_value_rank()` ๊ณตํต ํจ์ ์ฌ์ฉ
### 2. ํ์ฅ์ฑ ํฅ์
- `get_value_indicators()`์ PSR, PCR ๊ณ์ฐ ๋ก์ง ์ถ๊ฐ
- `include_psr_pcr` ํ๋ผ๋ฏธํฐ๋ก ์ ํ์ ํ์ฑํ
- ๊ธฐ์กด ์ฝ๋ ์ํฅ ์์ด ํ์ ํธํ์ฑ ์ ์ง
### 3. ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง ํ๋
- 3๊ฐ ์ ๊ท ์ ๋ต ๊ฐ๊ฐ 2๊ฐ์ฉ ํ
์คํธ ์ถ๊ฐ (์ธํฐํ์ด์ค + ์คํ)
- ์ด ํ
์คํธ ์ผ์ด์ค: 30+ โ 36+
### 4. Frontend UX ๊ฐ์
- ๋ฐ์ดํฐ ์์ง ์์
์ CLI์์ ์น UI๋ก ์ด๋
- ์ค์๊ฐ ์ํ ๋ชจ๋ํฐ๋ง (๋ก๋ฉ ์คํผ๋, ์ฑ๊ณต/์คํจ ๋ฉ์์ง)
- Task ID ๋ฐ Flower ๋งํฌ ์ ๊ณต์ผ๋ก ๋๋ฒ๊น
ํธ์์ฑ ํฅ์
---
## ๐ ๊ฒ์ฆ ํญ๋ชฉ
### Backend
- [x] ValueStrategy ์ธ์คํด์ค ์์ฑ ํ์ธ
- [x] QualityStrategy ์ธ์คํด์ค ์์ฑ ํ์ธ
- [x] AllValueStrategy ์ธ์คํด์ค ์์ฑ ํ์ธ
- [x] STRATEGY_REGISTRY์ 3๊ฐ ์ ๋ต ๋ฑ๋ก ํ์ธ
- [x] ๊ณตํต ํจ์ import ์ค๋ฅ ์์
- [ ] ์ค์ ๋ฐฑํ
์คํธ ์คํ ๋ฐ ๊ฒฐ๊ณผ ๊ฒ์ฆ (๋ฐ์ดํฐ ํ์)
### Frontend
- [x] DataManagement ์ปดํฌ๋ํธ ๋ ๋๋ง ํ์ธ
- [x] App.tsx import ์ค๋ฅ ์์
- [x] Data ํญ ํด๋ฆญ ์ ์ปดํฌ๋ํธ ํ์
- [ ] ๋ฐ์ดํฐ ์์ง ๋ฒํผ ํด๋ฆญ ์ API ํธ์ถ ํ์ธ (์๋ฒ ํ์)
- [ ] Task ์ํ ํด๋ง ๋์ ํ์ธ (์๋ฒ ํ์)
### ํ
์คํธ
- [x] test_value_strategy_interface ํต๊ณผ
- [x] test_quality_strategy_interface ํต๊ณผ
- [x] test_all_value_strategy_interface ํต๊ณผ
- [ ] test_value_select_stocks ํต๊ณผ (๋ฐ์ดํฐ ํ์)
- [ ] test_quality_select_stocks ํต๊ณผ (๋ฐ์ดํฐ ํ์)
- [ ] test_all_value_select_stocks ํต๊ณผ (๋ฐ์ดํฐ ํ์)
---
## ๐ ์๋ ค์ง ์ด์
### ์์
ํ์ฌ ์๋ ค์ง ๋ฒ๊ทธ๋ ์ด์ ์์.
---
## ๐ ๋ค์ ๋จ๊ณ
### Priority 1: ๊ฒ์ฆ
1. **๋ฐฑํ
์คํธ ์คํ**
```bash
curl -X POST http://localhost:8000/api/v1/backtest/run \
-H "Content-Type: application/json" \
-d '{
"name": "Value Strategy Test",
"strategy_name": "value",
"start_date": "2021-01-01",
"end_date": "2024-01-01",
"initial_capital": 10000000,
"strategy_config": {"count": 20}
}'
```
2. **make-quant-py์ ๊ฒฐ๊ณผ ๋น๊ต**
- ๋์ผ ๋ ์ง, ๋์ผ count๋ก ์ ์ ์ข
๋ชฉ ๋น๊ต
- ์์ ๊ณ์ฐ ๋ก์ง ์ผ์น ์ฌ๋ถ ํ์ธ
### Priority 2: Frontend ๊ฐ์
1. **์ฑ๊ณผ ๋น๊ต ์ฐจํธ ์ถ๊ฐ**
- ์ ๋ต๋ณ ๋ฐฑํ
์คํธ ๊ฒฐ๊ณผ ๋น๊ต ์ฐจํธ
- Recharts LineChart ํ์ฉ
2. **๋ฐ์ํ ๋ ์ด์์ ๊ฐ์ **
- ๋ชจ๋ฐ์ผ/ํ๋ธ๋ฆฟ/๋ฐ์คํฌํฑ ์ต์ ํ
- Chrome DevTools๋ก ํ
์คํธ
### Priority 3: ์ฑ๋ฅ ์ต์ ํ
1. **Redis ์บ์ฑ**
- ์ฌ๋ฌด์ ํ ๋ฐ์ดํฐ ์บ์ฑ
- TTL ์ค์ (1์ผ)
2. **๋ฐฐ์น ์ฟผ๋ฆฌ ์ต์ ํ**
- N+1 ์ฟผ๋ฆฌ ๋ฌธ์ ํด๊ฒฐ
- JOIN ์ต์ ํ
---
## ๐ ์๋ฃ ์์ฝ
- โ
3๊ฐ ์ ๋ต ์ถ๊ฐ (Value, Quality, All Value)
- โ
2๊ฐ ๊ณตํต ํจ์ ์ถ๊ฐ (calculate_value_rank, calculate_quality_factors)
- โ
PSR, PCR ๊ณ์ฐ ๋ก์ง ์ถ๊ฐ
- โ
MultiFactorStrategy ๋ฆฌํฉํ ๋ง
- โ
6๊ฐ ํ
์คํธ ์ถ๊ฐ
- โ
DataManagement ์ปดํฌ๋ํธ ๊ตฌํ
- โ
App.tsx ํตํฉ
- โ
๋ฌธ์ ์
๋ฐ์ดํธ
**์ ๋ต ๋ง์ด๊ทธ๋ ์ด์
: 89% ์๋ฃ (8/9)**
**Frontend ๋ฐ์ดํฐ ๊ด๋ฆฌ: 100% ์๋ฃ**
---
**์์ฑ์ผ**: 2026-01-30
**์์ฑ์**: Claude Code
**๋ฒ์ **: v1.1.0