1. 시스템 개요
NEWSGLOBE는 RSS 뉴스를 실시간 수집하여 9개 레이어(L0~L9)에 걸친 파이프라인으로 처리합니다. 각 레이어는 독립적으로 실행되며, 상위 레이어의 출력이 하위 레이어의 입력이 됩니다.
2. 데이터 수집 (L0-L1)
크론 스케줄
*/5 * * * * // 5분마다 RSS 수집 실행
소스 티어
| 티어 | 대표 소스 | 보너스 |
|---|---|---|
| Tier 1 | Reuters, AP, 연합뉴스 | +5점 |
| Tier 2 | BBC, Bloomberg, Al Jazeera | +3점 |
| Tier 3 | 기타 주요 언론 | 0점 |
| Tier 4+ | 소규모 / 비검증 소스 | -3점 |
Jaccard 중복 제거
제목과 본문의 토큰 집합을 비교합니다. 유사도가 0.55 이상이면 동일 기사로 판정하여 제거합니다.
Jaccard(A, B) = |A ∩ B| / |A ∪ B|
3. 지오코딩 & 지도 매핑
수집된 뉴스의 제목과 본문에서 지명을 추출하여 위도/경도 좌표를 부여합니다. 좌표가 매핑된 뉴스만 세계지도 위에 마커로 표시됩니다.
작동 흐름
뉴스 수집 → geocodeText(title + description) 호출 → geo-db.json에서 지명 매칭 → 매칭 성공 시 latitude, longitude, location 저장 → 세계지도에 마커 표시
매칭 우선순위
더 구체적인 지명을 먼저 매칭합니다. 같은 단계 내에서는 긴 이름이 우선됩니다.
| 우선순위 | 유형 | 예시 | 설명 |
|---|---|---|---|
| 1순위 | 도시/초크포인트 | Tehran, Strait of Hormuz | 가장 구체적인 위치 |
| 2순위 | 국가/지역/조직 | Iran, NATO, ASEAN | 넓은 범위 매핑 |
다국어 매칭 방식
| 언어 | 매칭 방식 | 예시 |
|---|---|---|
| 영어 (4자+) | 단순 포함 검사 (대소문자 무시) | "Tehran", "Netanyahu" |
| 영어 (1~3자) | 단어 경계(\b) 정규식 매칭 | "US", "UK", "EU" — "business"의 "us" 오매칭 방지 |
| 한국어/CJK | 직접 포함 검사 | "이란", "미국", "호르무즈" |
Alias 유형
각 지명에는 다양한 유형의 alias가 등록되어 폭넓은 매칭을 지원합니다.
| 유형 | 예시 | 매핑 대상 |
|---|---|---|
| 공식 명칭 | United States, Russian Federation | 해당 국가 |
| 약칭 | US, UK, PRC, DPRK | 해당 국가 (단어 경계 매칭) |
| 한국어 | 미국, 러시아, 이란, 호르무즈해협 | 해당 위치 |
| 인물명 | Trump, Putin, Xi Jinping, Netanyahu | 해당 인물의 국가 |
| 인물명 (한국어) | 트럼프, 푸틴, 시진핑, 젤렌스키 | 해당 인물의 국가 |
| 기관/조직 | Pentagon, Kremlin, White House, IRGC | 해당 기관의 위치 |
| 한국어 기관명 | 백악관, 크렘린, 혁명수비대 | 해당 기관의 위치 |
geo-db.json 구조
{
"cities": [
{
"name": "Tehran",
"aliases": ["테헤란"],
"lat": 35.69,
"lon": 51.39,
"country": "Iran"
},
...
],
"chokepoints": [
{
"name": "Strait of Hormuz",
"aliases": ["Hormuz", "호르무즈", "호르무즈해협"],
"lat": 26.57,
"lon": 56.25
},
...
],
"countries": [
{
"name": "Iran",
"aliases": ["Iranian", "이란", "IRGC",
"Khamenei", "하메네이", "혁명수비대"],
"lat": 35.69,
"lon": 51.39
},
...
]
}커버리지 분포
| 지역 | 도시 수 | 국가 수 | 주요 항목 |
|---|---|---|---|
| 동아시아 | 18 | 7 | 서울, 도쿄, 베이징, 타이베이, 평양 |
| 중동 | 16 | 11 | 테헤란, 예루살렘, 가자, 리야드, 바그다드 |
| 유럽 | 22 | 25 | 런던, 파리, 베를린, 키이우, 모스크바 |
| 북미 | 6 | 3 | 워싱턴, 뉴욕, 오타와, 멕시코시티 |
| 동남아 | 10 | 9 | 싱가포르, 방콕, 자카르타, 하노이 |
| 아프리카 | 10 | 9 | 카이로, 나이로비, 라고스 |
| 남미 | 7 | 6 | 상파울루, 부에노스아이레스, 보고타 |
| 해상/전략지점 | - | - | 호르무즈, 남중국해, 수에즈, 발트해 등 19개 |
재스코어링
geo-db 확장 후 기존 뉴스에도 새 좌표를 적용하려면 POST /api/rescore를 호출합니다. 모든 뉴스의 제목+본문을 최신 geo-db로 재매칭하여 좌표를 갱신합니다.
4. 키워드 스코어링 (L2)
키워드 구조
{
term: string, // 영어 키워드
category: string, // 분류
weight: 1~8, // 기본 가중치
active: boolean, // 활성 여부
ko: string, // 한국어 매칭 텍스트
patterns: string[], // 추가 패턴 목록
}점수 공식
rawScore = (baseScore + comboBonus + sourceBonus + timeBonus)
× categoryWeight × dirMult
normalizedScore = min(100, max(0,
round((rawScore / 90) × 1000) / 10
))매칭 방식
| 언어 | 방식 | 설명 |
|---|---|---|
| 영어 단어 | 토큰 Set O(1) 조회 | 공백 분리 후 Set 교집합 |
| 영어 구문 | \b 정규식 경계 매칭 | 다중 단어 구문 처리 |
| 한국어 | rawText.includes(ko) | CJK는 \b 미지원 → 직접 포함 검사 |
보너스 체계
| 항목 | 조건 | 보너스 |
|---|---|---|
| 콤보 — 2항 | 2개 키워드 동시 매칭 | +10 |
| 콤보 — 3항 | 3개 키워드 동시 매칭 | +25 |
| 콤보 — 최고급 | 특정 고위험 조합 | +40 |
| 소스 Tier1 | Reuters, AP, 연합뉴스 | +5 |
| 소스 Tier2 | BBC, Bloomberg 등 | +3 |
| 소스 Tier4+ | 소규모 소스 | -3 |
| 시간 1h 이내 | 최신 기사 | +10 |
| 시간 6h 이내 | 최근 기사 | +5 |
| 시간 24h 이내 | 당일 기사 | 0 |
| 시간 72h 이내 | 3일 이내 | -5 |
| 시간 72h 초과 | 오래된 기사 | -10 |
우선순위 분류
5. 방향성 엔진 (L6)
각 뉴스에 위기/완화 방향성을 부여하고, 16개 도메인 규칙과 7단계 강도 배율을 적용합니다.
7단계 강도 배율
| 단계 | 값 | 설명 |
|---|---|---|
| strong_crisis | 1.8× | 초위기 — 즉각적 충격 |
| crisis | 1.5× | 위기 — 심각한 상황 |
| mild_crisis | 1.2× | 경미한 위기 |
| neutral | 1.0× | 중립 |
| mild_relief | 0.85× | 경미한 완화 |
| relief | 0.7× | 완화 신호 |
| strong_relief | 0.5× | 강한 안정화 |
16개 방향 규칙 도메인
부정어 보정
방향성 키워드 앞 4단어 이내에 부정어("not", "denied", "no", "false" 등)가 감지되면 반대 방향으로 0.5를 가산합니다.
crisisConf = negCount / (negCount + posCount) // 위기 신호와 완화 신호의 비율로 신뢰도 산출
6. 시나리오 추적 (L3-L4)
단계 활성화 조건
| 조건 유형 | 설명 |
|---|---|
| 키워드 매칭 | 단계 정의 키워드가 최근 뉴스에서 감지됨 |
| 방향 필터 | 해당 단계의 요구 방향성(crisis/relief) 충족 |
| 선행조건 hard | 반드시 충족해야 하는 이전 단계 조건 |
| 선행조건 soft | 가중치 감소 없이 선택적으로 충족하는 조건 |
| TTL 만료 | 활성화 후 설정 시간 경과 시 자동 만료 |
진행률 및 위험도
진행률 = activeCount / totalCount × 100 위험도: 0% → low < 40% → medium < 80% → high ≥ 80% → critical
영향도 구조
{
target: string, // 영향 대상 (유가, 달러 등)
direction: "up"|"down"|"mixed",
strength: 0~5, // 영향 강도
}완화 / 악화 요인
| 유형 | 트리거 | 효과 |
|---|---|---|
| 완화 | "ceasefire", "peace deal" 키워드 감지 | 영향 strength -40% |
| 악화 | 특정 고위험 키워드 감지 | strength 증가 |
7. 패턴 엔진 (L5)
7개 거시 패턴은 여러 지표의 충족 비율(matchRatio)이 임계값을 초과할 때 활성화됩니다.
matchRatio = Σ(충족 지표 가중치) / Σ(전체 가중치)
7개 거시 패턴
| ID | 패턴 이름 | 임계값 | 관련 도메인 |
|---|---|---|---|
| P1 | 지정학 폭풍 | 0.60 | 이란, 러-우, 대만, 북한, 중동 |
| P2 | 경제 도미노 | 0.50 | 관세, 금리, 인플레이션 |
| P3 | 기술 분열 | 0.50 | 반도체, AI, 수출통제 |
| P4 | 시장 패닉 | 0.60 | 주식, 채권, 환율 |
| P5 | 에너지 위기 | 0.50 | 유가, 홍해, 에너지 |
| P6 | 금융 전염 | 0.50 | 은행, 신용, 채권 |
| P7 | 다중 위기 수렴 | 0.70 | P1+P2+P4 동시 활성 |
심각도 단계
8. 수학 모듈 (6종)
7-1. 키워드 MACD
키워드 점수 시계열에 EMA(지수이동평균)를 적용해 모멘텀 전환점을 감지합니다.
EMA(12) - EMA(26) = MACD선 EMA(9, MACD선) = 신호선 히스토그램 = MACD선 - 신호선 강도 = |히스토그램| / max(최근 20봉) 골든크로스: MACD선이 신호선 위로 돌파 → 상승 모멘텀 데드크로스: MACD선이 신호선 아래로 이탈 → 하락 모멘텀
7-2. 베이지안 확률
사전확률과 증거(뉴스 이벤트)를 결합해 사후확률을 갱신합니다. 5개 이벤트 유형, 각 4~5개 증거 항목.
odds(prior) = prior / (1 - prior) odds(posterior) = odds(prior) × likelihoodRatio posterior = odds(posterior) / (1 + odds(posterior)) // 클램핑: 확률 범위 [0.01, 0.99]
7-3. 교차 상관관계 & 시차
두 키워드 시계열의 피어슨 상관계수를 최대 14일 시차에서 계산합니다.
r = (nΣXY - ΣXΣY)
/ √((nΣX² - (ΣX)²)(nΣY² - (ΣY)²))| 원인 이벤트 | 결과 지표 | 시차(일) |
|---|---|---|
| 이란 제재 강화 | 유가 상승 | 2 |
| 관세 발표 | 인플레이션 | 14 |
| 반도체 수출규제 | 기술주 하락 | 3 |
| 금리 인상 | 달러 강세 | 1 |
| 전쟁 확전 | 안전자산 수요 | 1 |
| 에너지 공급 차질 | CPI 상승 | 7 |
| 중앙은행 발언 | 채권 수익률 | 0 |
| 경기침체 신호 | 주식 하락 | 2 |
7-4. 이벤트 임팩트
9개 이벤트 유형의 역사적 평균 영향%와 신뢰구간을 제공합니다.
신뢰도 = min(0.95, 0.5 + sampleSize × 0.08) 68% 구간 = [avg - σ, avg + σ ] 95% 구간 = [avg - 2σ, avg + 2σ ]
7-5. 확률 체인
10개 연쇄 시나리오(각 3~4단계)의 누적 발생 확률을 계산합니다.
누적확률 = P(A) × P(B|A) × P(C|B) Wilson Score 신뢰구간으로 불확실성 범위 산출
7-6. 앙상블 신뢰도
6개 모듈의 출력을 가중 합산하여 최종 신뢰도를 도출합니다.
| 모듈 | 가중치 | 역할 |
|---|---|---|
| 베이지안 | 0.25 | 사전/사후 확률 갱신 |
| 확률 체인 | 0.20 | 연쇄 시나리오 누적확률 |
| 이벤트 임팩트 | 0.15 | 역사적 영향 추정 |
| 키워드 MACD | 0.15 | 모멘텀 방향성 |
| 시나리오 상태 | 0.15 | 현재 활성 단계 |
| 교차 상관관계 | 0.10 | 시차 패턴 일치 |
일관성 = max(up, down) / total 해석: 신뢰도 ≥ 70% + 일관성 ≥ 0.80 → 높은 신뢰도 예측 신뢰도 < 50% → 예측 보류 권장
9. 리스크 지수 (L7)
4개 핵심 구성요소와 2개 선택 요소를 가중 합산하여 0~100 사이의 글로벌 리스크 지수를 산출합니다.
구성요소 가중치
| 구성요소 | 가중치 | 설명 |
|---|---|---|
| keywordSeverity | 0.30 | P1/P2 기사 비율과 최고 점수 기반 |
| crisisRatio | 0.25 | 위기 방향 뉴스 비율 |
| p1Density | 0.25 | P1 긴급기사 밀도 |
| scenarioPressure | 0.20 | 활성 시나리오 위험도 압력 |
| trendMomentum | 0.10 | (선택) MACD 모멘텀 |
| lagPressure | 0.05 | (선택) 시차 상관 누적 압력 |
위험 단계
| 단계 | 범위 | 색상 |
|---|---|---|
| low | 0 ~ 20 | 정상 |
| elevated | 20 ~ 40 | 관찰 |
| high | 40 ~ 60 | 주의 |
| severe | 60 ~ 80 | 심각 |
| extreme | 80 ~ 100 | 극단 |
10. 예측 엔진 (L9)
다중 조건 매칭 배율
조건 3/3 충족 → 1.0× (확신) 조건 2/3 충족 → 0.6× (가능) 조건 1/3 충족 → 0.3× (낮은 확률)
신뢰도 조정 (L9-3)
| 조건 | 조정값 | 방향 |
|---|---|---|
| 복수 소스 확인 | +5% | 상향 |
| 24시간 내 시나리오 활성 | +10% | 상향 |
| 48시간 뉴스 없음 | -10% | 하향 |
| 공식 부인 감지 | -20% | 하향 |
예측 만료 기간
| 분류 | 만료 | 예시 |
|---|---|---|
| 즉시~1주 | 7일 | 단기 가격 움직임 |
| 1~2주 | 14일 | 정책 반응 |
| 1개월 | 30일 | 중기 추세 |
| 1~3개월 | 90일 | 구조적 변화 |
정확도 추적
모든 예측은 PredictionLog 테이블에 기록됩니다. 만료 후 결과(correct / incorrect / partial)를POST /api/predictions/resolve로 기록하면 통계가 자동 집계됩니다.
11. API 엔드포인트
| 메서드 | 경로 | 설명 |
|---|---|---|
| GET | /api/news | 스코어링된 뉴스 목록 조회 |
| GET | /api/collect | RSS 수집 즉시 실행 |
| GET | /api/rescore | 전체 뉴스 재스코어링 |
| GET | /api/scenarios | 시나리오 현재 상태 |
| GET | /api/trends | 키워드 트렌드 |
| GET | /api/predictions | 예측 생성 (수학 보강) |
| GET | /api/predictions/accuracy | 예측 정확도 통계 |
| POST | /api/predictions/resolve | 예측 결과 기록 |
| GET | /api/stocks | 주가 / 환율 / 암호화폐 |
| GET | /api/cleanup | 오래된 뉴스 정리 |
12. 핵심 상수
| 파라미터 | 값 | 설명 |
|---|---|---|
| NORMALIZER | 90 | 점수 정규화 기준값 |
| 중복 임계값 | 0.55 | Jaccard 유사도 기준 |
| P1 임계값 | 60 | 긴급 뉴스 기준 점수 |
| P2 임계값 | 40 | 주요 뉴스 기준 점수 |
| MACD 기간 | 12 / 26 / 9 | Fast / Slow / Signal EMA |
| 확률 범위 | [0.01, 0.99] | 베이지안 클램핑 경계 |
| 최대 시차 | 14일 | 상관관계 탐색 범위 |
| 패턴 임계값 | 0.5 ~ 0.7 | 지표 충족 비율 |
| 수집 주기 | 5분 | RSS 크론 주기 |
| 키워드 수 | 3,508개 | 4개 카테고리 합계 |
| 시나리오 수 | 11개 | G1~G5, E1~E6, A1, M1~M4 |
| 예측 템플릿 | 31개 | 16 시나리오 + 10 트렌드 + 4 통계 + 1 기타 |