Skip to content

Phase 1 · Event Encoder (20 channels)

Priority: High Status: Pending Depends on: None

  • Brainstorm report: plans/reports/brainstorm-260423-0059-event-conditioned-kronos-research.md
  • Economic calendar data: economic_calendar table (Supabase)
  • Event types: FOMC, CPI, NFP, GDP, PCE, earnings, rate decisions

Build a standalone module that maps economic calendar events + cross-asset leaders to aligned (T, 20) feature tensors matching OHLCV candle timestamps.

  • Query economic_calendar for events within a date range
  • Compute continuous surprise z-score per event type (NOT sign() — magnitude matters)
  • Align events to OHLCV timestamps (daily: fire on event day; intraday: fire on release hour)
  • Encode days-until-event as sinusoidal features (anticipatory vol)
  • Fetch cross-asset leader returns (BTC, SPY, DXY, VIX) with prior-close-only enforcement
  • Output: numpy array (seq_len, 20) aligned with OHLCV input
  • No external API calls at inference time (calendar + leader data pre-loaded)
  • Support both daily and intraday timeframes
  • Cache historical surprise std per event type
  • Mask cross-asset channels when leader market closed (no forward-fill bias)
IndexChannelValuesSource
0is_fomc0/1economic_calendar
1is_cpi0/1economic_calendar
2is_nfp0/1economic_calendar
3is_gdp0/1economic_calendar
4is_pce0/1economic_calendar
5cpi_surprise_zcontinuous float(actual - forecast) / σ, clip to [-3,3]
6fomc_hawkish_scorecontinuous floatstatement tone NLP, range [-1,1]
7nfp_surprise_zcontinuous float(actual - forecast) / σ, clip to [-3,3]
8is_earnings0/1earnings calendar
9is_rate_decision0/1central_bank_rates
10days_to_fomc_sin[-1,1]sin(2π · days_to_next_fomc / 30)
11days_to_fomc_cos[-1,1]cos(2π · days_to_next_fomc / 30)
12days_to_cpi_sin[-1,1]sin(2π · days_to_next_cpi / 30)
13days_to_cpi_cos[-1,1]cos(2π · days_to_next_cpi / 30)
14btc_log_return_1hcontinuousprior bar only
15spy_log_return_1hcontinuousprior bar only, mask when NYSE closed
16dxy_log_return_1hcontinuousprior bar only, mask when FX session closed
17vix_level_zcontinuousz-scored VIX level
18reserved0future expansion
19reserved0future expansion

Surprise Computation (continuous, not discrete)

Section titled “Surprise Computation (continuous, not discrete)”
surprise_z = (actual - forecast) / rolling_std(past_20_surprises)
# keep continuous value, clip to [-3, 3] to bound outliers
# DO NOT quantize to {-1, 0, +1} — magnitude carries signal
def get_leader_return(leader_symbol, target_timestamp):
# MUST use bar STRICTLY before target_timestamp
prior_bar = query_ohlcv(leader_symbol, end=target_timestamp - 1_bar)
return log(prior_bar.close / prior_prior_bar.close)
# If market closed (SPY on weekend, during target's session):
# return (value=0, mask=1) — paired mask channel

Leakage rule: Leader bar timestamp MUST be < target bar timestamp. Never == or >.

For hourly candles:

  • CPI/NFP release at 8:30 ET (13:30 UTC) → flag on 13:00 or 14:00 UTC bar
  • FOMC statement at 14:00 ET (19:00 UTC) → flag on 19:00 or 20:00 UTC bar
  • For daily candles: flag entire day
  1. Create kronos-service/event_encoder.py
  2. Implement EventEncoder.__init__() — load calendar, compute surprise stats
  3. Implement EventEncoder.encode(timestamps, timeframe) — returns (T, 20) tensor
  4. Implement EventEncoder._compute_surprise_z() — continuous z-score per event
  5. Implement EventEncoder._days_until_sinusoidal() — channels 10–13
  6. Implement EventEncoder._fetch_leader_returns() — BTC/SPY/DXY/VIX w/ leakage guard
  7. Implement EventEncoder._align_to_candles() — timestamp alignment
  8. Add unit tests for edge cases (no events, multi-event day, market-closed leader, leakage guard)
  • Create: kronos-service/event_encoder.py
  • Read: scripts/kronos-batch-predict.py (DB connection pattern)
  • Read: scripts/daily-refresh.py (FRED_SERIES list)
  • Read: Supabase economic_calendar schema
  • Produces (T, 20) array for any symbol/timeframe/date_range
  • Handles missing forecast/actual gracefully (outputs 0)
  • Unit tests pass for: no events, single event, multi-event, intraday alignment
  • Cross-asset leader leakage guard verified (timestamp strict <)
  • Market-closed leader channels correctly masked (no forward-fill)
  • Inference <5ms per encode call (added leader fetch cost)