Files
KArtSell.Aegis/docs/contracts/architecture/VS-03_SLICE_SPEC.md
T
kjh2064 f680579134 feat: Complete VS-03 DOMAIN - Market Data Ingestion (Batch 2 - 3/7)
Implements market data validation and normalization:

 GOV: Market data ingestion specification
   - KRX/OpenDart data sources
   - Daily scheduling (9:00 KST)
   - Quality SLAs (99.5% availability)

 DATA: PIT-compliant schema (4 tables)
   - daily_prices: OHLCV with versioning
   - indices: Market indices snapshots
   - companies: Master data
   - ingestion_jobs: Audit trail

 DOMAIN: Policy logic (12 tests, 12/12 PASS)
   - ValidatePrice: OHLC constraints, date checks
   - IsDuplicate: Prevent redundant entries
   - NormalizePrice: Rounding, filtering
   - ClassifyQualityIssue: Quality scoring (0-100)
   - ValidateBatch: Aggregate metrics

AGENTS.md v16.0 compliance:
 Necessity: WBS Phase 2 Batch 2
 Simplicity: Pure validation logic, no I/O
 Idempotency: By (symbol, trading_date)
 Safety: Immutable history with versioning
 Quality gates: Data quality scoring

Phase 2 Progress: 1/4 Batches (VS-03 GOV+DATA+DOMAIN COMPLETE)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-05 21:16:29 +09:00

137 lines
3.6 KiB
Markdown

# VS-03: Market Data Ingestion - Vertical Slice Specification
**Slice ID:** VS-03
**Batch:** 2 (depends on VS-00, VS-02, which are complete)
**Status:** 📋 SPECIFICATION
**Created:** 2026-08-05
---
## Executive Summary
Establish **Market Data Ingestion** system that pulls stock prices, indices, and financial data from external sources (KRX, OpenDart) and normalizes them for downstream signal generation.
**User Goal:** Automated, daily market data collection from Korean exchanges with minimal latency and maximum reliability.
**Non-Goal:**
- Real-time tick data (use Bloomberg/Refinitiv for that)
- Cryptocurrency data
- Forex integration
---
## Acceptance Criteria
### 1. Data Sources ✅
- **KRX OpenAPI:** Stock prices, indices, trading volumes
- **OpenDart API:** Financial statements, disclosure documents
- **Fallback:** Stub data (for testing/demo)
### 2. Data Model ✅
- **Market Daily (PIT):** Date, symbol, open, high, low, close, volume
- **Indices:** KRX 200, KOSPI, KOSDAQ snapshots
- **Company Info:** Sector, industry classification, listing status
### 3. Ingestion Pipeline ✅
- **Schedule:** Daily 9:00 KST (before market open)
- **Retry:** Exponential backoff (3 attempts)
- **Validation:** Schema conformance, duplicate detection
- **Idempotency:** By date + symbol (upsert)
- **Audit:** Correlation ID, row count, error logs
### 4. API Contracts ✅
**Endpoint: POST /api/market/ingest**
```
Request: { dataSource: "KRX|OpenDart", fromDate: "2026-01-01", toDate: "2026-12-31" }
Response: 202 Accepted { jobId, expectedRowCount, status }
```
**Endpoint: GET /api/market/ingest/{jobId}**
```
Response: 200 { status, rowsProcessed, rowsFailed, completedAt }
```
### 5. Data Quality Checks ✅
- No NULL prices (OHLCV)
- Volume >= 0
- High >= Low >= Open >= Close (within reason)
- No future dates
- Deduplication by (date, symbol)
---
## Failure Modes & Recovery
| Scenario | Expected | Recovery |
|----------|----------|----------|
| API timeout | 503, retry in 30s | Auto-retry, exponential backoff |
| Bad data format | DQ quarantine | Manual review, adjust parser |
| Duplicate rows | Idempotent upsert | No effect (already stored) |
| Partial ingestion | Rollback, log error | Retry entire day's batch |
---
## Performance SLAs
| Metric | Target |
|--------|--------|
| Daily ingestion latency | <60 seconds |
| Data freshness | <= 1 trading day old |
| Availability | 99.5% (allow 1 failure/week) |
| Max rows/day | 100,000 (stocks + indices) |
---
## Dependencies
### Inbound (Blocked By)
-**VS-00:** Platform foundation (complete)
-**VS-02:** Permission model (complete)
### Outbound (Unblocks)
- 🔄 **VS-04:** Trade Execution (uses VS-03's price data)
- 🔄 **VS-05:** Signal Generation (consumes VS-03 data)
- 🔄 **VS-06:** Portfolio Optimization (requires clean price history)
---
## Component Breakdown (7 items)
| Component | Status |
|-----------|--------|
| **GOV** | 📋 This spec |
| **DATA** | ⏳ Next: PIT schema |
| **DOMAIN** | ⏳ Data validation + normalization |
| **BE** | ⏳ Ingestion API |
| **ASYNC** | ⏳ Hangfire scheduler + event publishing |
| **FE** | ⏳ Ingestion status dashboard |
| **TESTOPS** | ⏳ Data quality tests |
**Total Duration:** ~6 hours (wall-clock 1 day)
---
## Branching Strategy
All work on `Phase-2-Batch-2` branch, squash to main.
**Commits:**
1. GOV + DATA (spec + contract)
2. DOMAIN (validation logic)
3. BE + ASYNC (API + scheduler)
4. FE + TESTOPS (dashboard + tests)
---
## Sign-Off
| Role | Status | Date |
|------|--------|------|
| Architect | ✅ Draft | 2026-08-05 |
| Data Quality | ⏳ Review | TBD |