92 lines
2.3 KiB
Markdown
92 lines
2.3 KiB
Markdown
# Context Tree: Multi-Layered Memory Management
|
|
|
|
## Summary
|
|
|
|
컨텍스트 트리는 L7(실시간)부터 L1(레거시)까지 계층화된 메모리 구조입니다.
|
|
|
|
- L7~L5: 시장별 독립 데이터 중심
|
|
- L4~L1: 글로벌 포트폴리오 통합 데이터
|
|
|
|
## Layer Policy
|
|
|
|
### L7_REALTIME (시장+종목 스코프)
|
|
|
|
- 주요 키 패턴:
|
|
- `volatility_{market}_{stock_code}`
|
|
- `price_{market}_{stock_code}`
|
|
- `rsi_{market}_{stock_code}`
|
|
- `volume_ratio_{market}_{stock_code}`
|
|
|
|
`trading_cycle()`에서 실시간으로 기록합니다.
|
|
|
|
### L6_DAILY (시장 스코프)
|
|
|
|
EOD 집계 결과를 시장별 키로 저장합니다.
|
|
|
|
- `trade_count_KR`, `buys_KR`, `sells_KR`, `holds_KR`
|
|
- `avg_confidence_US`, `total_pnl_US`, `win_rate_US`
|
|
- scorecard 저장 키: `scorecard_KR`, `scorecard_US`
|
|
|
|
### L5_WEEKLY
|
|
|
|
L6 일일 데이터에서 시장별 주간 합계를 생성합니다.
|
|
|
|
- `weekly_pnl_KR`, `weekly_pnl_US`
|
|
- `avg_confidence_KR`, `avg_confidence_US`
|
|
|
|
### L4_MONTHLY 이상
|
|
|
|
글로벌 통합 롤업입니다.
|
|
|
|
- L5 → L4: `monthly_pnl`
|
|
- L4 → L3: `quarterly_pnl`
|
|
- L3 → L2: `annual_pnl`
|
|
- L2 → L1: `total_pnl`, `years_traded`, `avg_annual_pnl`
|
|
|
|
## Aggregation Flow
|
|
|
|
- EOD: `ContextAggregator.aggregate_daily_from_trades(date, market)`
|
|
- 주기 롤업: `ContextScheduler.run_if_due()`
|
|
|
|
`ContextScheduler`는 다음을 처리합니다.
|
|
|
|
- weekly/monthly/quarterly/annual/legacy 집계
|
|
- 일 1회 `ContextStore.cleanup_expired_contexts()` 실행
|
|
- 동일 날짜 중복 실행 방지(`_last_run`)
|
|
|
|
## Usage
|
|
|
|
```python
|
|
from datetime import UTC, datetime
|
|
|
|
from src.context.aggregator import ContextAggregator
|
|
from src.context.scheduler import ContextScheduler
|
|
|
|
aggregator = ContextAggregator(conn)
|
|
scheduler = ContextScheduler(aggregator=aggregator, store=context_store)
|
|
|
|
# EOD market-scoped daily aggregation
|
|
aggregator.aggregate_daily_from_trades(date="2026-02-16", market="KR")
|
|
|
|
# Run scheduled rollups when due
|
|
scheduler.run_if_due(now=datetime.now(UTC))
|
|
```
|
|
|
|
## Retention
|
|
|
|
`src/context/layer.py` 기준:
|
|
|
|
- L1: Forever
|
|
- L2: 10 years
|
|
- L3: 3 years
|
|
- L4: 2 years
|
|
- L5: 1 year
|
|
- L6: 90 days
|
|
- L7: 7 days
|
|
|
|
## Current Notes (2026-02-16)
|
|
|
|
- L7 쓰기와 L6 시장별 집계는 `main.py`에 연결됨
|
|
- scheduler 기반 cleanup/rollup도 연결됨
|
|
- cross-market scorecard 조회는 `PreMarketPlanner`에서 사용 중
|