diff --git a/docs/DATA_COVERAGE.md b/docs/DATA_COVERAGE.md index 1c3e31a..b68157e 100644 --- a/docs/DATA_COVERAGE.md +++ b/docs/DATA_COVERAGE.md @@ -12,7 +12,9 @@ | 엔드포인트 | 데이터 소스 | DB 저장 | 현재 보유 범위 | 이론적 최대 범위 | 백필 필요 | |---|---|---|---|---|---| | `/price` | Yahoo Finance | ✅ | 2018-04-24 ~ 현재 (1682 티커) | 20년+ | 요청 기반 자동 누적 | -| `/alpaca/bars`, `/alpaca/data` | Alpaca API | ✅ | 테스트 데이터만 | ~20년 | 필요시 수동 | +| `/alpaca/intraday` (SIP, 과거) | Alpaca SIP | ✅ | 요청 기반 자동 누적 | 2016년~어제 | 요청 기반 자동 누적 | +| `/alpaca/intraday/today` (IEX, 당일) | Alpaca IEX | ✅ | 당일만 | 오늘 장 중 | 해당 없음 | +| `/alpaca/snapshot` | Alpaca IEX | ❌ | 실시간만 | 없음 | 해당 없음 | | `/finra/short-volume` | FINRA CDN | ✅ | **2026-02-10 ~ 현재 (28거래일)** | 수년치 | **⚠️ 백필 권장** | | `/etf/holdings` | SEC EDGAR (NPORT) | ✅ (스냅샷) | 요청 기반 자동 누적 | 2019년~ | 요청 기반 자동 누적 | | `/filings/search` | SEC EDGAR | ✅ | 1994-01-05 ~ 현재 (1598 티커) | 1994년~ | 요청 기반 자동 누적 | @@ -54,24 +56,35 @@ curl -X POST "http://localhost:18001/api/v1/price/data" \ --- -### `/api/v1/alpaca` — 주가 (Alpaca API) +### `/api/v1/alpaca` — 분봉 (Alpaca API) -**현재 DB 보유**: 테스트 데이터만 (AAPL 27일치). 실 운용 데이터 없음. +**엔드포인트 구성**: -**조회 파라미터**: -- `start_date` + `end_date` 필수 -- `interval`: `1m` `5m` `15m` `1h` `1d` `1w` `1mo` +| 엔드포인트 | 피드 | 용도 | DB 저장 | +|---|---|---|---| +| `GET /alpaca/intraday` | **SIP** | 과거 분봉 (2016년~어제) | ✅ | +| `GET /alpaca/intraday/today` | **IEX** | 당일 실시간 분봉 | ✅ | +| `GET /alpaca/snapshot` | **IEX** | 현재가 스냅샷 | ❌ | +| `GET /alpaca/status` | — | API 키 유효성 확인 | ❌ | + +**피드 차이**: +- **SIP**: 전체 미국 거래소 통합 데이터. 거래량 100% 정확. 과거 데이터(어제까지) 무료 접근. +- **IEX**: IEX 거래소 단일. 실시간이지만 거래량은 실제의 2~5%. 당일 데이터 전용. **필수 조건**: `ALPACA_API_KEY`, `ALPACA_SECRET_KEY` 환경 변수 설정 필요. -**백필**: `/alpaca/data/{ticker}` 엔드포인트 호출 시 자동으로 DB에 저장됨. +**이론적 범위**: 2016년~ (Alpaca 무료 플랜 기준) ```bash -# Alpaca 과거 데이터 수동 백필 -curl "http://localhost:18001/api/v1/alpaca/data/AAPL?start_date=2020-01-01&end_date=2024-12-31&interval=1d" -``` +# 과거 5분봉 조회 (SIP, DB 저장) +curl "http://localhost:18001/api/v1/alpaca/intraday?tickers=AAPL,MSFT&interval=5m&start_date=2025-01-01&end_date=2025-01-31" + +# 당일 실시간 분봉 (IEX) +curl "http://localhost:18001/api/v1/alpaca/intraday/today?tickers=AAPL,MSFT&interval=5m" -> ⚠️ `/alpaca/bars`는 DB에 저장되지 않음 (raw 조회 전용). DB 저장은 `/alpaca/data`만 해당. +# 현재가 스냅샷 +curl "http://localhost:18001/api/v1/alpaca/snapshot?tickers=AAPL,MSFT,SPY" +``` --- diff --git a/docs/PYTHON_CLIENT.md b/docs/PYTHON_CLIENT.md index 85208a9..33f98b5 100644 --- a/docs/PYTHON_CLIENT.md +++ b/docs/PYTHON_CLIENT.md @@ -171,40 +171,35 @@ BASE = "http://localhost:18001/api/v1" status = requests.get(f"{BASE}/alpaca/status").json() print(f"Alpaca configured: {status['configured']}") -# Get daily bars with DB storage -resp = requests.get(f"{BASE}/alpaca/data/AAPL", params={ - "interval": "1d", - "start_date": "2025-01-01", +# ── 과거 분봉 (SIP 피드, DB 저장, 어제까지) ────────────────────────── +# 백테스트, 과거 OHLCV 분석용. 거래량 100% 정확. +hist = requests.get(f"{BASE}/alpaca/intraday", params={ + "tickers": "AAPL,MSFT,NVDA", + "interval": "5m", + "start_date": "2025-01-02", "end_date": "2025-01-31", }).json() -print(f"Alpaca bars: {resp['metadata']['data_points']} data points") - -# Get raw bars (no DB) -bars = requests.get(f"{BASE}/alpaca/bars/TSLA", params={ - "interval": "1d", - "start_date": "2025-03-01", - "end_date": "2025-03-10", -}).json() -for bar in bars["bars"][:3]: - print(f" {bar['timestamp']}: close={bar['close']}, vwap={bar['vwap']}") - -# Intraday candles -candles = requests.get(f"{BASE}/alpaca/intraday/NVDA", params={ - "interval": "1h", - "start_date": "2025-03-10", - "end_date": "2025-03-10", +print(f"Historical bars: {hist['count']} tickers") +for ticker, bars in hist["bars"].items(): + print(f" {ticker}: {len(bars)} bars") + +# ── 당일 실시간 분봉 (IEX 피드, 오늘만) ───────────────────────────── +# 당일 ORB 전략, 실시간 장 중 모니터링. +# 거래량은 실제의 2~5% (IEX 거래소 거래만 집계). +today = requests.get(f"{BASE}/alpaca/intraday/today", params={ + "tickers": "AAPL,MSFT,NVDA", + "interval": "5m", }).json() -print(f"Intraday candles: {candles['count']}") - -# Real-time snapshot — single ticker (no cache, direct Alpaca call) -snap = requests.get(f"{BASE}/alpaca/snapshot/SPY").json() -print(f"SPY price: {snap['price']}, change: {snap['change_pct']}%") -print(f" bid={snap['bid']} ask={snap['ask']}") - -# Real-time snapshots — multiple tickers -multi = requests.get(f"{BASE}/alpaca/snapshot", params={"tickers": "SPY,QQQ,AAPL"}).json() -for s in multi["snapshots"]: - print(f" {s['ticker']}: {s['price']} ({s['change_pct']:+.2f}%)") +for ticker, bars in today["bars"].items(): + if bars: + latest = bars[-1] + print(f" {ticker}: last bar {latest['timestamp']} close={latest['close']}") + +# ── 실시간 스냅샷 (IEX 피드, 캐시 없음) ───────────────────────────── +# 단일 종목도 tickers= 쿼리 파라미터로 조회 가능. +snap = requests.get(f"{BASE}/alpaca/snapshot", params={"tickers": "SPY,QQQ,AAPL"}).json() +for s in snap["snapshots"]: + print(f" {s['ticker']}: {s['price']} ({s['change_pct']:+.2f}%) bid={s['bid']} ask={s['ask']}") ``` ### 7. FINRA Short Volume