docs(plan): 데이터 소스 pykrx → FDR + 네이버 스크래핑 (Task 0.1/0.3)
실측 결과 pykrx의 시장 전체 함수 (get_market_ticker_list, get_market_cap, get_market_ohlcv_by_ticker)가 모두 KRX 인증 요구로 깨짐. Task 0.1 의존성을 finance-datareader + bs4 + lxml 로 교체하고 Task 0.3 snapshot.py는 FDR + 네이버 frgn 스크래핑 방식으로 재작성 (implementer dispatch 시 인라인 안내). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -34,8 +34,16 @@ python -m venv .venv
|
|||||||
.\.venv\Scripts\Activate.ps1
|
.\.venv\Scripts\Activate.ps1
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
pip install pytest httpx pandas
|
pip install pytest httpx pandas
|
||||||
# (requirements.txt에 pykrx 추가는 Task 0.1에서 진행. 그 이후 다음으로 pykrx도 설치:)
|
# (requirements.txt 변경은 Task 0.1에서. 추가 의존성 설치:)
|
||||||
# pip install pykrx
|
# pip install finance-datareader beautifulsoup4 lxml
|
||||||
|
|
||||||
|
# ⚠️ 데이터 소스 변경 노트 (2026-05-12 실측 후 결정):
|
||||||
|
# plan의 spec은 "pykrx 하이브리드"였으나, 실측 결과 pykrx의 시장 전체 함수
|
||||||
|
# (get_market_ticker_list / get_market_cap / get_market_ohlcv_by_ticker)가 모두 KRX
|
||||||
|
# 인증 요구로 인해 비인증 호출 시 깨짐. 따라서 실제 구현은:
|
||||||
|
# - 종목 마스터 + 당일 일봉 + 5년치 일봉: FinanceDataReader (fdr)
|
||||||
|
# - 외국인/기관 수급: 네이버 금융 종목별 frgn 페이지 스크래핑 (시총 상위 500종목)
|
||||||
|
# Task 0.3 snapshot.py 코드는 implementer dispatch 시 새 방향으로 안내됨.
|
||||||
```
|
```
|
||||||
|
|
||||||
| 작업 | 어디서 실행 |
|
| 작업 | 어디서 실행 |
|
||||||
@@ -60,9 +68,17 @@ pip install pytest httpx pandas
|
|||||||
- Create: `web-backend/stock-lab/app/screener/__init__.py`
|
- Create: `web-backend/stock-lab/app/screener/__init__.py`
|
||||||
- Modify: `web-backend/stock-lab/app/db.py` (스크리너 스키마 함수 호출 1줄 추가)
|
- Modify: `web-backend/stock-lab/app/db.py` (스크리너 스키마 함수 호출 1줄 추가)
|
||||||
|
|
||||||
- [ ] **Step 1: requirements.txt에 pykrx 추가**
|
- [ ] **Step 1: requirements.txt에 데이터 라이브러리 추가**
|
||||||
|
|
||||||
`web-backend/stock-lab/requirements.txt`에 `pykrx>=1.0.45` 한 줄 추가. (기존 줄 위 또는 아래 어느 곳이든.)
|
`web-backend/stock-lab/requirements.txt`에 다음 의존성 추가:
|
||||||
|
|
||||||
|
```
|
||||||
|
finance-datareader>=0.9.96
|
||||||
|
beautifulsoup4>=4.12
|
||||||
|
lxml>=5.0
|
||||||
|
```
|
||||||
|
|
||||||
|
(`httpx`는 보통 이미 있으나 없으면 함께 추가.) 기존 pykrx 라인은 추가하지 않습니다 (실측 결과 시장 전체 함수가 KRX 인증 요구로 깨짐).
|
||||||
|
|
||||||
- [ ] **Step 2: screener 패키지 생성**
|
- [ ] **Step 2: screener 패키지 생성**
|
||||||
|
|
||||||
@@ -100,32 +116,33 @@ See docs/superpowers/specs/2026-05-12-stock-screener-board-design.md
|
|||||||
__all__ = []
|
__all__ = []
|
||||||
```
|
```
|
||||||
|
|
||||||
- [ ] **Step 3: 로컬 venv에 pykrx 설치**
|
- [ ] **Step 3: 로컬 venv에 데이터 라이브러리 설치**
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
cd C:\Users\jaeoh\Desktop\workspace\web-backend\stock-lab
|
cd C:\Users\jaeoh\Desktop\workspace\web-backend\stock-lab
|
||||||
.\.venv\Scripts\Activate.ps1
|
.\.venv\Scripts\Activate.ps1
|
||||||
pip install pykrx
|
pip install finance-datareader beautifulsoup4 lxml
|
||||||
```
|
```
|
||||||
|
|
||||||
Expected: 설치 성공. 실패하면 numpy/pandas 호환성 점검(pykrx는 pandas≥1.5 요구).
|
Expected: 설치 성공.
|
||||||
|
|
||||||
> NAS 운영 컨테이너 재빌드는 본 plan 마지막의 **최종 배포** 단계에서 `git push` → webhook으로 자동 수행. 지금은 로컬 venv 동작만 검증.
|
> NAS 운영 컨테이너 재빌드는 본 plan 마지막의 **최종 배포** 단계에서 `git push` → webhook으로 자동 수행. 지금은 로컬 venv 동작만 검증.
|
||||||
|
|
||||||
- [ ] **Step 4: pykrx 동작 smoke test (one-off, 로컬 venv)**
|
- [ ] **Step 4: FDR + 네이버 동작 smoke test (one-off, 로컬 venv)**
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
python -c "from pykrx import stock; print(stock.get_market_ticker_list('20260512', market='KOSPI')[:5])"
|
python -c "import FinanceDataReader as fdr; df = fdr.StockListing('KRX'); print('rows:', df.shape[0]); print(df.head(3)[['Code','Name','Market','Marcap','Close']])"
|
||||||
|
python -c "import httpx; from bs4 import BeautifulSoup; r = httpx.get('https://finance.naver.com/item/frgn.naver?code=005930', headers={'User-Agent':'Mozilla/5.0'}); print('status:', r.status_code); soup = BeautifulSoup(r.text,'lxml'); print('rows:', len(soup.select('table.type2 tr')))"
|
||||||
```
|
```
|
||||||
|
|
||||||
Expected: 5개 KOSPI 종목 코드 출력. 실패 시 IP 차단/네트워크 확인.
|
Expected: FDR rows ≥ 2,800. naver status 200, table rows > 5.
|
||||||
|
|
||||||
- [ ] **Step 5: Commit**
|
- [ ] **Step 5: Commit**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd C:\Users\jaeoh\Desktop\workspace\web-backend
|
cd C:\Users\jaeoh\Desktop\workspace\web-backend
|
||||||
git add stock-lab/requirements.txt stock-lab/app/screener/__init__.py
|
git add stock-lab/requirements.txt stock-lab/app/screener/__init__.py
|
||||||
git commit -m "chore(stock-lab): pykrx 의존성 + screener 패키지 골격"
|
git commit -m "chore(stock-lab): FDR/네이버 데이터 의존성 + screener 패키지 골격"
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
Reference in New Issue
Block a user