docs: Alpaca 엔드포인트 정리 반영 — DATA_COVERAGE, PYTHON_CLIENT 업데이트

- 요약 테이블: /bars, /data 제거 → /intraday(SIP), /intraday/today(IEX), /snapshot
- Alpaca 섹션: 피드별 차이(SIP/IEX) 설명 추가, 샘플 코드 전면 교체
- 제거된 /bars/{ticker}, /data/{ticker}, /intraday/{ticker}, /snapshot/{ticker} 참조 삭제

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
main
I Luk Kim 4 months ago
parent f528ac751b
commit 3766c00b97

@ -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"
```
---

@ -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

Loading…
Cancel
Save