본문으로 건너뛰기

경제 달력

cMind는 자체 경제 달력을 제공합니다 — 1차 당국(중앙은행 및 국가 통계 기관)에서 소싱된 릴리스 일정, 실적, 예측, 개정 및 데이터 기반 영향 모델 포함, ForexFactory, FXStreet, Investing.com 또는 기타 집합원의 어떤 종속성도 없이. 시점 정확하며 ≥10년 이상의 히스토리를 유지하며, 거래, 공개 API, MCP, cBots, AI, 알림 및 백테스트에 연결됩니다. 이것은 분리된 모듈입니다: 거래 핵심에 영향을 주지 않고 비활성화할 수 있습니다.

상태. P0–P4가 구현 및 출시되었습니다. 도메인 핵심, 영속성(EF calendar 스키마, append-only 읽기/쓰기, FRED + BLS + 중앙은행 일정 소스, 소스별 신선도 추적 기능을 갖춘 구성 게이트 적용 ingestion 워커), 버전화된 JWT REST API, 모바일 우선 /economic-calendar UI, MCP 도구, cBot JWT API, 고영향 이벤트 알림, 카피트레이딩 뉴스 차단 일시 정지, 백테스트 이벤트 오버레이, SSE 스트림, HMAC 서명 웹훅, 그리고 타입화된 CmindCalendarClient가 모두 구현 및 통합 테스트되었습니다. P5 추가 기능(서프라이즈 분석, iCal/CSV 내보내기, 키워드 검색, 플러그형 컨센서스)이 남은 항목입니다 — 아래 롤아웃 단계를 참조하세요.

다른 점​

주요 달력에 대한 반복적인 불만은 우리의 설계 제약 조건이 되었습니다:

  • 조용한 영향 등급 변경 없음. 영향 등급은 결정론적, 버전화 및 감사 가능합니다. 모든 변경은 기록된 개정으로 timestamp와 함께 저장됩니다 — 결코 조용한 덮어쓰기 아님. 사용자는 이벤트가 왜 High인지 정확히 알 수 있습니다.
  • 이벤트당 하나의 UTC 앵커. 모든 이벤트는 1차 출처의 공식 일정에서 단일 UTC 인스턴트로 고정됩니다; 출처의 자체 표준시간대가 저장되며, 사용자별 렌더링은 명시적 IANA 표준시간대와 DST를 영역 데이터베이스에서 처리합니다 — 결코 수동 ±1h 토글 아님.
  • 전체 개정 체인, 어디서나. 원본 값과 모든 개정은 1차 클래스로, API, MCP 및 cBot 노출에 동일하게 표시됩니다.
  • ≥10년 히스토리, 벽 없음. 제한 없는 浏览 범위; 60일 상한, 등록 게이트 없음.
  • 시점 정확 내재. 모든 사실은 KnownAt(우리가 그것을 배운 시점)과 EffectiveAt(이벤트 인스턴트)을携带합니다. "시간 T에 보았던 달력"은 1차 클래스로 쿼리되므로, 백테스트된 뉴스 규칙은 라이브와 정확히 동일하게 동작합니다 — 과거의 개정된 값을 사용하는 룩어헤드 없음.

영향 모델​

영향 점수는 [0, 100]의 순수 결정론적 함수이며 Low / Medium / High / Critical로 구분됩니다. 입력은 scoring 시간에 알려진 데이터만입니다(미래 유출 없음):

  • 시리즈 사전 — 지표 클래스당 기준 가중치(금리 결정이 CPI를 능가하고, CPI가 부차적인 설문调查中 능가).
  • 실현 변동성 발자국 — 이 시리즈의 과거 릴리스 후 기본 영향 심볼의 중간 절대 수익률: "이 릴리스는 historically 가격이 이렇게 움직였습니다."
  • 서프라이즈 민감도 — 절대 서프라이즈(z-스코어)가 사후 이동과 historically 얼마나 강하게 상관되었는지.

점수가 고정 가중치로混合되고 ImpactModelVersion을 표시합니다. 재계산은 명시적 로깅 작업으로 새 개정을 생성합니다 — 결코 변형이 아니므로 점수는 항상 입력에서 재현할 수 있습니다.

국가 → 통화 → 심볼 매핑​

가장 많이 인용되는 알고 통합 문제점은 한 번 해결됩니다, 순수 함수로: 국가는 its 통화에 매핑됩니다(모든 유로 지역 구성원이 EUR로 팬인), 및 통화는 어느 leg에서든 이를 인용하는 워치리스트 심볼에 매핑됩니다. 그래서 EURUSD는 EU 및 US 이벤트 모두의 영향을받습니다; XAUUSD는 USD에 노출됩니다; US500은 USD에 매핑됩니다. 이것은 뉴스 필터, 영향받는 심볼 해결 및 차아웃 수학을驱动합니다.

뉴스 윈도우 정책​

NewsWindowRule은 { minImpact, beforeMinutes, afterMinutes, currencies?, series? }입니다. 단일 공유 순수 구현이 "인스턴트 T가 심볼 S에 대한 차아웃 안에 있는지?"에 답합니다 — cBot 뉴스 필터, 카피트레이딩 일시 중지 및 AI 리스크 가드에 의해 사용되므로 절대 발산할 수 없습니다. 불확실성 시 차아웃 답은 구성된 보수적 기본값으로 기본 설정됩니다(기본적으로 실패 닫힘)이므로 데이터 격차가 높은 영향 릴리스를 통해 거래를 자동으로 녹색으로 만들지 않습니다.

시점 정확성 및 개정​

실적, 예측 및 영향 점수는 추가 전용입니다. 각 이벤트는 KnownAt의 단조로운 순서를 가진 순서가 지정된 개정 체인을 소유합니다:

  • Scheduled — 이벤트가 처음 예약되었습니다(사전 영향, 실적 없음).
  • Released — 첫 번째 인쇄된 실적이 도착했습니다.
  • Revised — 나중에 개정된 값이 도착했습니다.
  • Rescheduled — 출처가 릴리스 인스턴트를 이동했습니다(감사 가능, 알림 가능).
  • Rescored — 새로운 모델 버전에서 영향 점수가 재계산되었습니다.

과거 인스턴트 as of로 쿼리하면 그때 알려진 정확히 그 개정이 반환됩니다 — 백테스트된 뉴스 규칙에서 룩어헤드를 죽이는 보장입니다.

예측 /コン센서스​

경제학자들의 설문 중앙값은 1차 출처에서 무료로 공개되지 않습니다 — 그것은 집합자들의 독점적 가치-added이며 우리는 그것을 제조하지 않습니다. 이벤트 스키마는 nullable Forecast를携带합니다; 배포는 선택적 IForecastProvider 포트(자체 키 가져오기, 기본값 꺼짐)를 통해 라이센스된コン센서스 피드를 연결할 수 있습니다. 이전 값 및 개정은 항상 공식 출처에서 가져옵니다.

데이터 소스​

두 개의 분리된 레이어, 모두 1차 — 집합자 절대 아닙니다:

  • 일정 / 타이밍: FRED 릴리스 달력; 국가 통계 기관(BLS, BEA, Census, Eurostat, ONS, Destatis, INSEE, e-Stat, ABS, StatCan); 중앙은행 회의 달력(Fed, ECB, BoE, BoJ, RBA, BoC, SNB, RBNZ).
  • 실제 값: FRED(개정 및 시점 정확성을 위한 빈티지 날짜 포함), plus BLS, BEA, Census, ECB SDW, Eurostat 및 OECD SDMX API.

사망한 소스는 해당 소스만 커버리지 저하를 냅니다; 달력은 다른 모든 것을 계속 제공하며 갭을 신선도 메트릭으로 표면화합니다.

속도 제한 및 백업 계획​

외부 공급자는 속도 제한을 게시합니다(FRED는 ~120 요청/분 허용). 달력은 공급자의 제한을 절대 초과하지 않도록 구축되었으며, 스로틀되거나 차단되어도 읽기 저하가 절대 없습니다:

  • 능동적 속도 게이팅. 모든 소스의 HTTP 클라이언트는 구성된 예산(App:Calendar:FredRequestsPerMinute, 기본값 100 — 의도적으로 공급자 상한 아래)으로 아웃바운드 요청을 간격시키는 공유 스레드 안전 속도 게이트를 통과합니다. 요청은 큐에 대기되고 페이드되지만 버스트되지 않습니다.
  • **429 Retry-After 존중.** 공급자가 429 Too Many Requests를 반환하면 게이트는 다음 호출 전에 서버 요청 냉각(또는 App:Calendar:RateLimitBackoff`, 기본값 60초) 동안 전체 소스를 백오프합니다 — 긴 재시도 루프 없음.
  • 표준 회복력. 각 소스 클라이언트도 앱 전체 회복력 핸들러(백오프 + 지터가 있는 재시도, 서킷 브레이커, 시간 제한)를 상속하므로 일시적 블립이 흡수되고 지속적으로 실패하는 소스가 다른 것에 영향을 주지 않고 주차됩니다(커버리지 저하).
  • 백업 계획 — 내구성 읽기 스루 캐시. 읽기는 공급자 호출로 절대 제공되지 않습니다. 범위가 가져온 후 Postgres에 추가 전용으로 지속되고 그 이후로 거기서 제공됩니다(§"온디맨드 로드" 참조). 따라서 소스가 속도 제한되거나 다운되어도 달력은 캐시된 시점 정확한 데이터로 계속 응답합니다; 누락된 스팬은 단순히 미 couverts로 유지되고 다음 ingestion 주기에서 재시도됩니다. 차아웃 답은 불확실성 하에서 보수적 기본값으로 실패하여 추가되므로 데이터 격차가 릴리스를 통한 거래를 녹색으로 만들지 않습니다.
  • 저렴한 폴링. 조건부 가져오기(ETag / If-Modified-Since / 소스 빈티지 커서) 및 "범위를 한 번 가져오면 다시는 안 함" 캐시가 실제 요청 볼륨을 일반 작동에서 모든 제한 아래로 유지합니다 — 속도 게이트는 안전망이지 공통 경로가 아닙니다.

활성화 / 비활성화​

두 개의 독립적인 계층, 다른 cMind 기능과 정확히 동일합니다:

  • 계층 1 — 런타임 기능 토글 (Feature.EconomicCalendar) Features 관리 UI에서 전환; 재배치 없음, 라이브로 적용.
  • 계층 2 — 화이트레이블 하드 게이트 (App:Branding:EnableEconomicCalendar, 기본값 true). 리셀러는 false로 설정하여 기능을 완전히 제거합니다; 그런 다음 운영자는 다시 활성화할 수 없습니다.

유효 상태는 Branding.EnableEconomicCalendar && FeatureToggle.EconomicCalendar입니다. 비활성화되면 내비게이션 항목이 숨겨지고 /economic-calendar, /api/calendar/** 및 MCP 달력 도구가 깨끗한 기능 비활성화 404를 반환합니다 — 절대 500 아닙니다. 런타임 토글 오프 시 지속된 히스토리가 유지되므로 재활성화는 즉각적입니다.

롤아웃 단계​

  • P0 — 도메인 핵심 (구현됨): aggregate, 값 개체, 포트, 영향 모델, 국가→심볼 매핑, 뉴스 윈도우 정책, 2계층 게이팅, 전체 단위 제품군.
  • P1 — 지속 + 한 소스 (구현됨): EF calendar 스키마(자체 테이블, 추가 전용, 핫 인덱스), 시점 정확 asOf의 추가 전용 쓰기 서비스, 복원력 있는 유형 클라이언트 뒤의 FRED 커넥터, 구성 게이트 적용 ingestion 워커; Testcontainers 통합 테스트(지속, PIT, 멱등성, 차아웃).
  • P2 — 공개 JWT REST API + Web UI (구현됨): 버전화된 JWT 보안 /api/calendar/v1 API — 클라이언트 발급, 토큰 교환 및 핵심 읽기 엔드포인트(이벤트, 히스토리, 시리즈, 서프라이즈, 다음, 차아웃, 영향받는 심볼, 헬스), 범위 적용 및 2계층 게이팅, 통합 테스트됨. plus 모바일 우선 /economic-calendar 페이지 — 선택된 영향칩이 있는 전화 친화적 카드 형태의 upcoming 릴리스 연간, MudBlazor 필터 대화상자(통화 + 최소 영향 + 시작일 피커로 히스토리 전체의 모든 과거 날짜로 점프 — 60일 상한, 벽 없음); 내비게이션 항목, 스모크/모바일/a11y/E2E 테스트됨. 지표별 시리즈 히스토리 페이지(/economic-calendar/series/{code}, 각 이벤트에서 링크됨)는 시리즈의 전체 인쇄 히스토리를 나열합니다. 서프라이즈 차트 + 무한 스크롤 브라우저가 이어집니다.
  • P3 — 더 많은 소스 및 워밍업 (시작됨): 핵심 시리즈 카탈로그(CPI, Core CPI, NFP, 실업률, GDP, PCE, Fed funds, 소매 판매 → 해당 FRED ID)가 시작 시 자동으로 시드되고, 원샷 멱등 연도 청크 능동적 백필이 ≥10년 히스토리를 가져와서 일반적인 경우가 기다림 없이 따뜻해집니다. ingestion은 기본적으로 켜져 있습니다(App:Calendar:IngestionEnabled, 기본값 true): 중앙은행 일정 소스는 API 키가 필요하지 않으므로 FOMC / ECB / BoE 결정 달력이 즉시 채워집니다 — 백필은 최근 히스토리와 포워드 Horiz ​​oon 모두에서 이러한 회의 날짜를 씨앗하므로 지난 달을 浏览(또는 любой 과거 창)을 보면 FRED/BLS 키가 구성되기 전에도 회의가 표시됩니다; 가치 시리즈는 키가 설정되면 채워집니다. 워커는 달력의 2계층 게이트를 존중합니다 — 화이트레이블 배포 또는 소유자가 경제 달력 기능을 끄면 ingestion이 중지되고 App:Calendar:IngestionEnabled=false가 명시적으로 끕니다. 소스별 신선도도 지금 실제입니다: 워커는 각 소스의 마지막 성공적인 폴, 연속 실패 카운트 및 실행 해제된 서킷 플래그(앱 설정에 지속, 크로스 프로세스)를 기록하며 /health 엔드포인트 + calendar_health MCP 도구가 소스당 진실한 stale verdict를 보고합니다. BLS(2번째 가치 소스) 및 중앙은행 일정 소스(FOMC / ECB / BoE 결정 날짜, 히스토리 전체 및 워커가 포워드 창으로 동기화된)가 있습니다. 아직 제공 예정: BEA/Census/ECB-SDW/Eurostat/OECD 가치 소스 및 조정 통과.
  • P4 — 심층 통합: MCP 도구 (구현됨 — 전체 읽기 API 패리티: calendar_events, calendar_event, calendar_history, calendar_series, calendar_surprises, calendar_next, calendar_blackout, calendar_affected_symbols, calendar_health, 기능 게이트 적용) 및 알림 EconomicEvent 트리거 (구현됨 — 선택한 영향 이상의 upcoming 릴리스 N분 전에 발사하는 AlertRule, 선택적으로 통화로 좁힘; AI 없이 기존 알림 워커에서 평가, 각 릴리스별 중복 제거; POST /api/alerts/rules/economic-event 통해 생성). prop-guard 뉴스 차아웃 게이트 및 카피트레이딩 차아웃 일시 중지가 있습니다(§5.1 — 선택적 App:Copy:NewsPauseEnabled, 기본값 꺼짐: Criti cal 영향 차아웃에 있는 심볼의 소스가 열면 건너뜀, 꺼져 있을 때 바이트 идентичные 핫パス). 백테스트 이벤트 오버레이가 있습니다 — GET /api/calendar/v1/for-symbol 및 calendar_events_for_symbol MCP 도구가 창에서 심볼에 영향을 미치는 시점 정확한 이벤트를 반환하며, 인스턴스/백테스트 보고서 페이지가 equity 곡선 아래 백테스트 창 내에 떨어진 고 영향 릴리스를 렌더링합니다(따라서 작성자는 NFP에서 어떤 거래가 landed는지 확인). 전체 계획이 이제 구현되었습니다.
  • P5 — 추가 기능: 서프라이즈 분석, iCal/CSV 내보내기, 키워드 검색, 플러그형コン센서스.

통합 표면은 cBot & REST API 참조 참조.

데이터 소스가 필요합니다(없으면 기능이 숨겨짐)​

달력은 구성된 값 소스(FRED 또는 BLS)에서만 실적/예측/이전 값을 표시합니다. App:Calendar:FredApiKey 또는 App:Calendar:BlsApiKey가 없으면 기능이 내비게이션에서 숨겨집니다; 키 없이 기능이 강제 활성화되면(화이트레이블/소유자) 페이지에 빈 값 대신 실행 가능한 "데이터 소스 구성" 안내가 표시되며, 소스가 설정될 때까지 필터 동작이 숨겨집니다. 이벤트 행은 원시 시리즈 코드 대신 시리즈 이름을 표시합니다(카탈로그에서).