chore: phase5 deliverables 문서 및 yfinance_plus 서브모듈 업데이트
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>main
parent
1e9432a6e3
commit
5c9d1f0d93
@ -0,0 +1,44 @@
|
||||
# Phase 5 Deliverables — Attention Overlay Development Docs
|
||||
|
||||
## 목적
|
||||
Phase 5는 Phase 0~4에서 구축한 **공식 이벤트 + 가격 확인 기반 코어 전략** 위에, 무료 attention/crowding 데이터를 **보조 신호(overlay)** 로 추가하는 단계입니다.
|
||||
|
||||
핵심 원칙:
|
||||
- 코어 신호 없이 overlay만으로 진입하지 않는다.
|
||||
- overlay는 **후보 우선순위 조정, 보유기간 조절, 포지션 추가/축소 보조** 에만 사용한다.
|
||||
- 무료 데이터 정책을 유지한다.
|
||||
- 소스별 약관/쿼터/지연/신뢰도 차이를 명시적으로 반영한다.
|
||||
|
||||
## 포함 문서
|
||||
- `attention_overlay_architecture.md`
|
||||
- `source_integration_specs.md`
|
||||
- `feature_design_and_entity_resolution.md`
|
||||
- `overlay_scoring_policy.md`
|
||||
- `implementation_plan.md`
|
||||
- `testing_checklist.md`
|
||||
- `operations_and_monitoring.md`
|
||||
- `youtube_channel_registry_spec.md`
|
||||
- `overlay_feature_record.schema.json`
|
||||
- `overlay_config.schema.json`
|
||||
|
||||
## 범위
|
||||
### 포함
|
||||
- Yahoo Finance RSS headline burst
|
||||
- YouTube whitelist channel monitoring
|
||||
- Wikimedia pageview shock
|
||||
- Google Trends experimental theme heat
|
||||
- FINRA crowding feature integration (Phase 2 데이터 재사용)
|
||||
- attention overlay score 산출
|
||||
- backtester/live trader에 overlay score 연결
|
||||
|
||||
### 제외
|
||||
- X/Twitter API 연동
|
||||
- Reddit 라이브 핵심 의존성화
|
||||
- Stocktwits 신규 핵심 의존성화
|
||||
- 실시간 초단타 소셜 트리거 매매
|
||||
- 자막 전체 전수 수집 기반 파이프라인
|
||||
|
||||
## 성공 기준
|
||||
- overlay 미사용 대비 후보 정렬 품질이 개선되어야 한다.
|
||||
- overlay 추가 후 코어 전략 수익성이 악화되더라도 원인을 attribution 가능해야 한다.
|
||||
- overlay 장애 발생 시 자동으로 core-only 모드로 degrade 되어야 한다.
|
||||
@ -0,0 +1,74 @@
|
||||
# Attention Overlay Architecture
|
||||
|
||||
## 목표
|
||||
공식 문서와 가격 반응으로 생성된 `trade_candidates` 에 대해, 추가적인 **리테일 관심도 / 미디어 확산 / crowding** 신호를 계산해 `overlay_score` 를 부여한다.
|
||||
|
||||
## 설계 원칙
|
||||
1. Overlay는 **후행 확인 신호** 다.
|
||||
2. Overlay 데이터는 소스별 신뢰도 가중치를 갖는다.
|
||||
3. Overlay는 결측이 많을 수 있으므로 sparse-friendly 하게 설계한다.
|
||||
4. Overlay는 독립 장애 도메인으로 분리한다.
|
||||
5. Overlay feature는 모두 타임스탬프와 source provenance를 남긴다.
|
||||
|
||||
## 상위 구조
|
||||
```text
|
||||
source adapters
|
||||
├── yahoo_rss_adapter
|
||||
├── youtube_overlay_adapter
|
||||
├── wikimedia_adapter
|
||||
├── google_trends_adapter (experimental)
|
||||
└── finra_overlay_loader
|
||||
|
||||
normalized events
|
||||
├── headline_mentions
|
||||
├── video_mentions
|
||||
├── pageview_timeseries
|
||||
├── trend_topic_timeseries
|
||||
└── crowding_metrics
|
||||
|
||||
entity resolution layer
|
||||
├── symbol ↔ company aliases
|
||||
├── symbol ↔ wikipedia page
|
||||
├── symbol ↔ youtube mention matcher
|
||||
└── symbol ↔ trend topic map
|
||||
|
||||
feature builder
|
||||
├── headline burst
|
||||
├── publisher breadth
|
||||
├── youtube influence score
|
||||
├── pageview shock
|
||||
├── theme heat
|
||||
└── crowding stress
|
||||
|
||||
overlay scorer
|
||||
├── overlay_score
|
||||
├── overlay_confidence
|
||||
├── hold_extension_hint
|
||||
└── add_on_eligibility
|
||||
```
|
||||
|
||||
## 데이터 흐름
|
||||
1. Phase 2/3에서 `trade_candidates` 생성.
|
||||
2. overlay adapters가 소스별 raw 수집.
|
||||
3. entity resolution이 종목 단위로 정규화.
|
||||
4. feature builder가 observation window 기준 feature 생성.
|
||||
5. overlay scorer가 각 후보에 score 부여.
|
||||
6. backtester/live trader가 score를 사용해 ranking, sizing, holding rule 조정.
|
||||
|
||||
## 장애 격리
|
||||
- overlay adapter 실패는 core signal 생성에 영향 주지 않는다.
|
||||
- 특정 소스 실패 시 나머지 소스로 점수 계산 가능해야 한다.
|
||||
- 모든 overlay feature가 누락되면 `overlay_mode=disabled` 로 자동 강등한다.
|
||||
|
||||
## 추천 배치 순서
|
||||
- T day 18:30 ET: Yahoo RSS / FINRA 수집 완료
|
||||
- T day 20:00 ET: Wikimedia/YouTube/Trends 업데이트
|
||||
- T day 20:30 ET: overlay feature build
|
||||
- T day 21:00 ET: candidate rerank
|
||||
|
||||
## 사용 방식
|
||||
- `candidate_rank_score = core_score * 0.85 + overlay_score * 0.15`
|
||||
- 또는 core score bucket 내 tie-breaker
|
||||
- 또는 holding period extension/trim decision only
|
||||
|
||||
v1 권장: **tie-breaker + hold adjustment only**
|
||||
@ -0,0 +1,79 @@
|
||||
# Feature Design and Entity Resolution
|
||||
|
||||
## 목표
|
||||
이종 소스의 noisy mentions를 종목 단위 overlay feature로 안정적으로 변환한다.
|
||||
|
||||
## Entity Resolution 원칙
|
||||
### symbol matching 단계
|
||||
1. direct ticker token match
|
||||
2. company canonical name match
|
||||
3. approved alias match
|
||||
4. fuzzy match (낮은 신뢰도, manual review 후보)
|
||||
|
||||
### 금지 규칙
|
||||
- 1글자/2글자 일반 단어 ticker를 무조건 매칭하지 않는다.
|
||||
- 맥락 없는 company substring match 금지.
|
||||
- YouTube 제목에 `AI`, `App`, `ON`, `IT` 같은 일반 토큰을 티커로 해석하지 않는다.
|
||||
|
||||
## reference tables
|
||||
- `symbol_master`
|
||||
- `company_aliases`
|
||||
- `youtube_channel_registry`
|
||||
- `wiki_page_map`
|
||||
- `theme_topic_map`
|
||||
|
||||
## Feature group 정의
|
||||
### A. Headline Burst
|
||||
- 최근 6h/24h 헤드라인 수
|
||||
- publisher breadth
|
||||
- deduped article count
|
||||
- positive/negative heuristic headline count
|
||||
|
||||
### B. YouTube Influence
|
||||
- weighted views by channel weight
|
||||
- unique channels mentioning symbol
|
||||
- upload velocity
|
||||
- comments-per-view ratio
|
||||
- mention freshness decay
|
||||
|
||||
### C. Wiki Attention
|
||||
- 1d/3d/7d pageview changes
|
||||
- rolling z-score
|
||||
- percentile rank vs last 90d
|
||||
|
||||
### D. Theme Heat
|
||||
- mapped theme trend value
|
||||
- acceleration
|
||||
- saturation regime
|
||||
|
||||
### E. Crowding
|
||||
- short volume anomaly
|
||||
- recent crowding persistence
|
||||
|
||||
## Normalization
|
||||
- 모든 source-local metric은 source별 robust z-score로 정규화
|
||||
- winsorization 적용 (1% / 99%)
|
||||
- sparse source는 missing 그대로 두고 source confidence penalty 적용
|
||||
|
||||
## Time windows
|
||||
- 6h burst: event propagation detection
|
||||
- 24h burst: overnight attention
|
||||
- 3d persistence: continuation support
|
||||
- 7d trend: theme regime only
|
||||
|
||||
## Leakage 방지
|
||||
- entry decision 시점 이후 수집 데이터 사용 금지
|
||||
- snapshot time 명시
|
||||
- re-run 시 동일 cutoff 적용
|
||||
|
||||
## 출력 예시 필드
|
||||
- symbol
|
||||
- as_of_ts
|
||||
- headline_burst_z
|
||||
- youtube_influence_z
|
||||
- wiki_attention_z
|
||||
- theme_heat_z
|
||||
- crowding_stress_z
|
||||
- overlay_score
|
||||
- overlay_confidence
|
||||
- source_presence_mask
|
||||
@ -0,0 +1,66 @@
|
||||
# Phase 5 Implementation Plan
|
||||
|
||||
## 목표
|
||||
attention overlay 레이어를 구현하여 backtester와 live pipeline에 연결한다.
|
||||
|
||||
## 작업 순서
|
||||
### Step 1. registry tables 구축
|
||||
- youtube_channel_registry
|
||||
- company_aliases 보강
|
||||
- wiki_page_map
|
||||
- theme_topic_map
|
||||
|
||||
### Step 2. raw adapters 구현
|
||||
- yahoo_rss_adapter
|
||||
- youtube_overlay_adapter
|
||||
- wikimedia_adapter
|
||||
- google_trends_adapter (feature flagged)
|
||||
|
||||
### Step 3. normalization pipeline 구현
|
||||
- headline normalization
|
||||
- video normalization
|
||||
- pageview normalization
|
||||
- trend timeseries normalization
|
||||
- entity resolution jobs
|
||||
|
||||
### Step 4. overlay feature builder 구현
|
||||
- per-source feature calculators
|
||||
- missing data handling
|
||||
- source confidence computation
|
||||
- overlay_feature_record 생성
|
||||
|
||||
### Step 5. overlay scorer 구현
|
||||
- weighted scoring
|
||||
- confidence adjustment
|
||||
- band assignment
|
||||
- recommendation flags 생성
|
||||
|
||||
### Step 6. backtester integration
|
||||
- overlay on/off config
|
||||
- tie-breaker mode
|
||||
- weighted rank mode
|
||||
- hold extension mode
|
||||
- add-on eligibility mode
|
||||
|
||||
### Step 7. live pipeline integration
|
||||
- nightly overlay jobs
|
||||
- candidate rerank job
|
||||
- degraded mode handling
|
||||
- source freshness checks
|
||||
|
||||
## 구현 우선순위
|
||||
1. Yahoo RSS
|
||||
2. Wikimedia
|
||||
3. YouTube whitelist
|
||||
4. FINRA overlay join
|
||||
5. Google Trends experimental
|
||||
|
||||
## 완료 조건
|
||||
- overlay feature record가 후보 종목에 대해 안정적으로 생성된다.
|
||||
- backtester에서 overlay on/off ablation이 가능하다.
|
||||
- source failure가 전체 파이프라인 실패로 이어지지 않는다.
|
||||
|
||||
## non-goals
|
||||
- high-frequency social trading
|
||||
- full video transcript NLP pipeline
|
||||
- real-time intraday social scraping
|
||||
@ -0,0 +1,68 @@
|
||||
# Operations and Monitoring
|
||||
|
||||
## 모니터링 목표
|
||||
- source freshness
|
||||
- quota consumption
|
||||
- entity resolution precision drift
|
||||
- overlay coverage ratio
|
||||
- overlay contribution stability
|
||||
|
||||
## 핵심 메트릭
|
||||
### source health
|
||||
- `overlay_source_success_rate`
|
||||
- `overlay_source_last_success_ts`
|
||||
- `overlay_source_latency_seconds`
|
||||
- `overlay_source_quota_remaining`
|
||||
|
||||
### pipeline health
|
||||
- `overlay_records_generated_count`
|
||||
- `overlay_records_missing_source_ratio`
|
||||
- `overlay_degraded_mode_count`
|
||||
- `overlay_review_queue_size`
|
||||
|
||||
### quality
|
||||
- `entity_match_precision_sampled`
|
||||
- `headline_dedupe_rate`
|
||||
- `youtube_false_positive_rate_sampled`
|
||||
- `wiki_map_missing_ratio`
|
||||
|
||||
### strategy impact
|
||||
- `overlay_on_vs_off_delta_return`
|
||||
- `overlay_on_vs_off_delta_sharpe`
|
||||
- `overlay_hold_extension_hit_rate`
|
||||
- `overlay_add_on_hit_rate`
|
||||
|
||||
## 알림 규칙
|
||||
- source freshness SLA 초과
|
||||
- YouTube quota 80% 초과
|
||||
- review queue backlog threshold 초과
|
||||
- overlay coverage ratio 급락
|
||||
- overlay contribution delta 급변
|
||||
|
||||
## degraded mode
|
||||
### trigger
|
||||
- critical source 2개 이상 실패
|
||||
- entity matcher precision alarm
|
||||
- stale overlay snapshot
|
||||
|
||||
### behavior
|
||||
- core-only mode로 전환
|
||||
- overlay-based add-on 금지
|
||||
- hold extension 비활성화
|
||||
- alert 발송
|
||||
|
||||
## 운영 점검 루틴
|
||||
### 일간
|
||||
- 실패한 source job 확인
|
||||
- overlay coverage 확인
|
||||
- review queue triage
|
||||
|
||||
### 주간
|
||||
- source별 precision 샘플 검수
|
||||
- weight calibration 검토
|
||||
- channel registry 변경점 반영
|
||||
|
||||
### 월간
|
||||
- source keep/drop review
|
||||
- topic map refresh
|
||||
- schema/version audit
|
||||
@ -0,0 +1,30 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"title": "OverlayConfig",
|
||||
"type": "object",
|
||||
"required": ["enabled", "mode", "weights"],
|
||||
"properties": {
|
||||
"enabled": {"type": "boolean"},
|
||||
"mode": {
|
||||
"type": "string",
|
||||
"enum": ["tie_breaker", "weighted_rank", "hold_adjustment", "add_on_gate"]
|
||||
},
|
||||
"weights": {
|
||||
"type": "object",
|
||||
"required": ["yahoo", "youtube", "wikimedia", "finra", "google_trends"],
|
||||
"properties": {
|
||||
"yahoo": {"type": "number", "minimum": 0, "maximum": 1},
|
||||
"youtube": {"type": "number", "minimum": 0, "maximum": 1},
|
||||
"wikimedia": {"type": "number", "minimum": 0, "maximum": 1},
|
||||
"finra": {"type": "number", "minimum": 0, "maximum": 1},
|
||||
"google_trends": {"type": "number", "minimum": 0, "maximum": 1}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"strong_threshold": {"type": "number", "minimum": 0, "maximum": 1},
|
||||
"weak_threshold": {"type": "number", "minimum": 0, "maximum": 1},
|
||||
"allow_degraded_mode": {"type": "boolean"},
|
||||
"experimental_sources_enabled": {"type": "boolean"}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
@ -0,0 +1,39 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"title": "OverlayFeatureRecord",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"symbol",
|
||||
"as_of_ts",
|
||||
"overlay_score",
|
||||
"overlay_confidence",
|
||||
"source_presence_mask",
|
||||
"feature_version"
|
||||
],
|
||||
"properties": {
|
||||
"symbol": {"type": "string"},
|
||||
"as_of_ts": {"type": "string", "format": "date-time"},
|
||||
"headline_burst_z": {"type": ["number", "null"]},
|
||||
"youtube_influence_z": {"type": ["number", "null"]},
|
||||
"wiki_attention_z": {"type": ["number", "null"]},
|
||||
"theme_heat_z": {"type": ["number", "null"]},
|
||||
"crowding_stress_z": {"type": ["number", "null"]},
|
||||
"overlay_score": {"type": "number", "minimum": 0, "maximum": 1},
|
||||
"overlay_confidence": {"type": "number", "minimum": 0, "maximum": 1},
|
||||
"source_presence_mask": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"yahoo": {"type": "boolean"},
|
||||
"youtube": {"type": "boolean"},
|
||||
"wikimedia": {"type": "boolean"},
|
||||
"google_trends": {"type": "boolean"},
|
||||
"finra": {"type": "boolean"}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"hold_extension_hint": {"type": ["string", "null"], "enum": ["extend", "neutral", "trim", null]},
|
||||
"add_on_eligibility": {"type": ["boolean", "null"]},
|
||||
"feature_version": {"type": "string"}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
@ -0,0 +1,58 @@
|
||||
# Overlay Scoring Policy
|
||||
|
||||
## 원칙
|
||||
- overlay는 core score를 대체하지 않는다.
|
||||
- overlay가 강해도 core score minimum threshold 미달이면 거래하지 않는다.
|
||||
- overlay는 랭킹 재정렬, 보유기간 조정, add-on 허용 여부에만 사용한다.
|
||||
|
||||
## 권장 v1 반영 방식
|
||||
### candidate ranking
|
||||
```text
|
||||
final_rank_score = core_rank_score * 0.90 + overlay_score * 0.10
|
||||
```
|
||||
|
||||
### optional tie-breaker mode
|
||||
동일 core bucket 내에서 overlay score 높은 순으로 정렬.
|
||||
|
||||
### holding adjustment
|
||||
- overlay_score >= strong_threshold: max_holding_days +1 or +2 검토
|
||||
- overlay_score <= weak_threshold: time stop 보수화
|
||||
|
||||
### add-on eligibility
|
||||
- strong core + strong overlay + market regime ok 일 때만 2차 진입 허용
|
||||
|
||||
## Source weight (v1 권장)
|
||||
- Yahoo headline burst: 0.25
|
||||
- YouTube influence: 0.35
|
||||
- Wikimedia pageview shock: 0.20
|
||||
- FINRA crowding: 0.15
|
||||
- Google Trends experimental: 0.05
|
||||
|
||||
## Source reliability modifier
|
||||
- stale data: penalty
|
||||
- low entity confidence: penalty
|
||||
- duplicated source cluster: penalty
|
||||
- missing data: neutral, not punitive beyond confidence adjustment
|
||||
|
||||
## Overlay score bands
|
||||
- 0.75 ~ 1.00: strong
|
||||
- 0.55 ~ 0.75: supportive
|
||||
- 0.40 ~ 0.55: neutral
|
||||
- < 0.40: weak/no support
|
||||
|
||||
## Allowed actions by band
|
||||
- strong: rank boost, hold extension candidate, add-on candidate
|
||||
- supportive: tie-breaker advantage
|
||||
- neutral: no action
|
||||
- weak: no boost, may shorten hold
|
||||
|
||||
## Explicit 금지
|
||||
- overlay-only entries
|
||||
- overlay만으로 risk budget 상향
|
||||
- 소셜 burst만으로 stop widening
|
||||
- 실험 소스(Google Trends) 단독 영향력 과대부여
|
||||
|
||||
## Calibration
|
||||
- monthly recalibration
|
||||
- source별 information coefficient와 hit rate 모니터링
|
||||
- unstable source는 weight 하향 또는 disable
|
||||
@ -0,0 +1,135 @@
|
||||
# Source Integration Specs
|
||||
|
||||
## 1. Yahoo Finance RSS
|
||||
### 목적
|
||||
티커 관련 뉴스 headline burst와 publisher breadth 측정.
|
||||
|
||||
### 수집 방식
|
||||
- RSS feed polling
|
||||
- 종목 또는 회사명 기반 기사 매칭
|
||||
- 기사 URL canonicalization 및 deduplication
|
||||
|
||||
### 저장 필드
|
||||
- source_name
|
||||
- fetched_at
|
||||
- article_guid
|
||||
- url
|
||||
- title
|
||||
- publisher
|
||||
- published_at
|
||||
- matched_symbols[]
|
||||
- confidence
|
||||
|
||||
### 주요 feature
|
||||
- `headline_count_6h`
|
||||
- `headline_count_24h`
|
||||
- `publisher_breadth_24h`
|
||||
- `headline_burst_zscore`
|
||||
|
||||
### 주의
|
||||
- 같은 보도자료가 여러 매체에 재유통될 수 있으므로 dedupe 필수
|
||||
- 본문 전체를 크롤링하지 말고 headline-level feature 중심 유지
|
||||
|
||||
## 2. YouTube Data API
|
||||
### 목적
|
||||
유명 투자 채널의 종목 언급과 초기 확산 속도 측정.
|
||||
|
||||
### 수집 방식
|
||||
- whitelist channel registry 기반 추적
|
||||
- `uploads` playlist polling 우선
|
||||
- 필요 시 제한적 search
|
||||
- video metadata + comment count 수집
|
||||
|
||||
### 저장 필드
|
||||
- channel_id
|
||||
- channel_title
|
||||
- video_id
|
||||
- published_at
|
||||
- title
|
||||
- description
|
||||
- view_count
|
||||
- like_count
|
||||
- comment_count
|
||||
- matched_symbols[]
|
||||
- channel_weight
|
||||
- collection_snapshot_at
|
||||
|
||||
### 주요 feature
|
||||
- `youtube_mentions_24h`
|
||||
- `youtube_weighted_views_24h`
|
||||
- `youtube_influence_score`
|
||||
- `youtube_comment_velocity`
|
||||
|
||||
### 주의
|
||||
- 자막 다운로드 의존 금지
|
||||
- 전체 유튜브 검색 전수화 금지
|
||||
- 채널 whitelist와 alias matcher 품질이 중요
|
||||
|
||||
## 3. Wikimedia Pageviews
|
||||
### 목적
|
||||
리테일 관심 급증을 정량화.
|
||||
|
||||
### 수집 방식
|
||||
- ticker/company ↔ wiki page map 유지
|
||||
- daily pageviews ingestion
|
||||
|
||||
### 저장 필드
|
||||
- page_title
|
||||
- date
|
||||
- views
|
||||
- project
|
||||
- access
|
||||
- agent
|
||||
- mapped_symbol
|
||||
|
||||
### 주요 feature
|
||||
- `wiki_views_1d`
|
||||
- `wiki_views_3d_change`
|
||||
- `wiki_pageview_zscore_30d`
|
||||
- `wiki_attention_shock_flag`
|
||||
|
||||
### 주의
|
||||
- 다의어 페이지 매핑 오류 주의
|
||||
- 회사 페이지와 제품/인물 페이지 혼동 방지
|
||||
|
||||
## 4. Google Trends (Experimental)
|
||||
### 목적
|
||||
개별 종목보다는 테마/섹터 관심도 측정.
|
||||
|
||||
### 수집 방식
|
||||
- 제한된 topic registry 유지
|
||||
- 일/주 단위 시계열 수집
|
||||
|
||||
### 저장 필드
|
||||
- trend_topic_id
|
||||
- topic_label
|
||||
- geography
|
||||
- granularity
|
||||
- observed_at
|
||||
- interest_value
|
||||
- mapped_themes[]
|
||||
|
||||
### 주요 feature
|
||||
- `theme_heat_7d`
|
||||
- `theme_acceleration_7d`
|
||||
- `theme_heat_regime`
|
||||
|
||||
### 주의
|
||||
- individual ticker trigger로 직접 사용 금지
|
||||
- experimental source로 분류
|
||||
|
||||
## 5. FINRA overlay loader
|
||||
### 목적
|
||||
crowding/short pressure overlay 계산.
|
||||
|
||||
### 입력
|
||||
Phase 2 적재 완료된 short sale volume dataset 재사용.
|
||||
|
||||
### 주요 feature
|
||||
- `short_volume_ratio`
|
||||
- `short_volume_spike_zscore`
|
||||
- `off_exchange_crowding_flag` (if available from OTC transparency datasets)
|
||||
|
||||
### 주의
|
||||
- short interest와 혼동 금지
|
||||
- post-close feature only
|
||||
@ -0,0 +1,47 @@
|
||||
# Phase 5 Testing Checklist
|
||||
|
||||
## A. Unit Tests
|
||||
- [ ] RSS parser가 malformed item을 건너뛴다.
|
||||
- [ ] URL canonicalizer가 tracking query를 제거한다.
|
||||
- [ ] YouTube matcher가 approved alias만 매칭한다.
|
||||
- [ ] Wikimedia page map lookup이 없는 symbol을 안전하게 skip 한다.
|
||||
- [ ] Google Trends adapter가 disabled flag에서 no-op 한다.
|
||||
- [ ] robust z-score 계산이 constant series에서 안전하다.
|
||||
- [ ] overlay scorer가 missing source를 허용한다.
|
||||
|
||||
## B. Entity Resolution Tests
|
||||
- [ ] ambiguous ticker가 잘못 매칭되지 않는다.
|
||||
- [ ] company alias override가 적용된다.
|
||||
- [ ] manual denylist가 강제된다.
|
||||
- [ ] wiki page redirect 처리 후 canonical title이 저장된다.
|
||||
- [ ] video title과 description의 conflicting match를 review queue로 보낸다.
|
||||
|
||||
## C. Integration Tests
|
||||
- [ ] raw → normalized → feature → score 전체 체인이 동작한다.
|
||||
- [ ] trade candidate가 없을 때 overlay pipeline이 정상 종료된다.
|
||||
- [ ] 특정 source 실패 시 나머지 source로 partial score 생성 가능하다.
|
||||
- [ ] overlay score가 backtester config에 따라 반영된다.
|
||||
- [ ] live rerank job이 stale source를 탐지하고 degraded mode로 전환한다.
|
||||
|
||||
## D. Replay Tests
|
||||
- [ ] historical snapshot cutoff 이후 데이터가 사용되지 않는다.
|
||||
- [ ] 동일 cutoff로 재실행 시 동일 overlay score가 재생성된다.
|
||||
- [ ] source update 지연 시 fallback 결과가 일관적이다.
|
||||
|
||||
## E. Quality Tests
|
||||
- [ ] random sample 100건에서 symbol match precision 측정
|
||||
- [ ] YouTube whitelist 외 채널이 잘못 포함되지 않는다.
|
||||
- [ ] duplicated Yahoo headlines가 burst를 과대추정하지 않는다.
|
||||
- [ ] wiki attention shock가 명백한 비종목 이벤트에서 과도하게 오르지 않는다.
|
||||
|
||||
## F. Strategy Impact Tests
|
||||
- [ ] overlay on/off ablation 리포트 생성
|
||||
- [ ] tie-breaker only와 weighted-rank 결과 비교
|
||||
- [ ] hold-extension only 결과 비교
|
||||
- [ ] source별 incremental value 리포트 생성
|
||||
|
||||
## G. Ops Tests
|
||||
- [ ] API quota exhaustion 시 경고 및 soft-fail
|
||||
- [ ] source freshness SLA 위반 알림 발송
|
||||
- [ ] registry update 후 캐시 무효화 정상 동작
|
||||
- [ ] feature store write retry가 idempotent 하다.
|
||||
@ -0,0 +1,41 @@
|
||||
# YouTube Channel Registry Spec
|
||||
|
||||
## 목적
|
||||
무분별한 search API 사용을 피하고, 신뢰 가능한 채널 subset만 추적하기 위한 registry.
|
||||
|
||||
## registry 필드
|
||||
- channel_id
|
||||
- channel_title
|
||||
- category
|
||||
- language
|
||||
- region
|
||||
- subscriber_band
|
||||
- channel_weight
|
||||
- active_flag
|
||||
- watch_mode (`uploads_only` | `uploads_plus_comments`)
|
||||
- symbol_focus_tags[]
|
||||
- notes
|
||||
- created_at
|
||||
- updated_at
|
||||
|
||||
## 포함 기준
|
||||
- 투자/시장 관련 공개 채널
|
||||
- 최근 일정 기간 내 활동 지속
|
||||
- 명확한 채널 정체성
|
||||
- 과도한 spam/scam 패턴 없음
|
||||
|
||||
## 제외 기준
|
||||
- 펌프 앤 덤프 의심
|
||||
- 저품질 클릭베이트 과다
|
||||
- 종목 언급은 많지만 실제 매칭 정밀도가 낮음
|
||||
- 정책/약관 리스크 높은 채널
|
||||
|
||||
## channel_weight 초기값 가이드
|
||||
- 대형/영향력 높음: 1.0
|
||||
- 중간: 0.6
|
||||
- 소형/니치: 0.3
|
||||
|
||||
## 운영 규칙
|
||||
- 신규 채널 추가는 수동 승인
|
||||
- 월 1회 registry review
|
||||
- false positive 높은 채널은 weight 하향 또는 비활성화
|
||||
Loading…
Reference in New Issue