룰 엔진: RSI·MACD 조건식을 JSON DSL로 — Quant Lab 설계 “코딩 없는 전략 빌더”를 어떻게 구현하는가 Quant Lab의 핵심 가치는 프로그래밍 없이 투자 전략을 만들고 검증할 수 있다는 것이다. 사용자가 UI에서 이런 조건을 설정한다: 진입 조건: RSI(14) < 30 ← 과매도 구간 AND MA(5) > MA(20) ← 단기 이동평균이 ... 2026/06/16 Monticker, QuantLab
감정 태그 × 수익률 — 투자 습관을 데이터로 기록하기 투자와 감정 행동재무학(Behavioral Finance)의 핵심 통찰이 있다. 투자자는 합리적 계산이 아니라 감정으로 결정을 내리는 경우가 많다. 공포: 주가가 떨어질 때 손절하지 못하거나, 반대로 패닉 셀링 FOMO: 급등 뉴스에 추격 매수 확증 편향: 자신의 매수 결정을 지지하는 정보만 수집 문제는 이런 패턴을 본인이 인식하기... 2026/06/14 Monticker, InvestmentWallet
잔고를 저장하지 말고 재구성하라 — 이벤트 소싱 원장 설계 잔고를 저장하면 무엇이 문제인가 가장 단순한 방법은 현재 잔고를 users 테이블의 balance 컬럼에 저장하는 것이다. UPDATE users SET balance = balance - 100000 WHERE id = 1; 이 방법은 간단하지만 세 가지 문제가 있다. 1. 이력이 사라진다. “왜 잔고가 이렇게 됐지?”를 물으면 답을 찾을 ... 2026/06/13 Monticker, InvestmentWallet
주문 전 동기 리스크 게이트 설계 — VaR, 집중도, 일일손실 5가지 규칙 왜 모의투자에도 리스크 한도가 필요한가 모의투자는 가상 돈을 쓴다. 잃어도 실제 손해는 없다. 그런데 왜 리스크 한도가 필요할까? 사용자가 투자 전략을 연습하는 과정에서 나쁜 습관을 체계적으로 방지하지 않으면 학습 효과가 떨어진다. “어차피 가상이니까”라는 심리로 현실에서는 불가능한 집중 투자나 손실 무시 패턴이 굳어진다. 리스크 한도는 교육적 ... 2026/06/12 Monticker, MatchingEngine
TreeMap으로 CLOB 호가창 구현하기 — 가격/시간 우선 매칭과 슬리피지 CLOB이란 거래소는 주문을 어떻게 체결하는가? 실제 거래소의 체결 방식은 CLOB(Central Limit Order Book) 이다. 모든 매수/매도 지정가 주문을 하나의 장부에 모아두고, 가격과 시간 순서에 따라 매칭한다. 매도호가 (asks) 매수호가 (bids) 73,300 × 500주 ... 2026/06/10 Monticker, MatchingEngine
EMA 기반 이상 탐지 — 가격 급등과 거래량 서지 실시간 감지 “급등”을 어떻게 정의하는가 가격이 올랐다. 그게 급등인가, 정상 변동인가? 고정 임계값을 쓰면 문제가 생긴다. “3% 이상 오르면 급등”이라고 정의하면, 평소 변동폭이 0.5%인 삼성전자에서는 3%가 확실한 이상이지만, 변동폭이 5%인 중소형주에서는 3%가 노이즈다. 이상 탐지에는 상대적 기준이 필요하다. 최근 추이 대비 얼마나 벗어났는지를 봐... 2026/06/09 Monticker, Realtime
Netty로 수만 연결에 시세 브로드캐스트하기 — NioEventLoopGroup 리액터 패턴 Spring STOMP의 한계 처음에는 Spring의 STOMP over WebSocket으로 시세를 브로드캐스트했다. // Spring STOMP 방식 messagingTemplate.convertAndSend("/topic/stocks/$stockId", priceUpdate) 이 방식의 문제는 스레드 모델에 있다. Spring MVC는 요... 2026/06/08 Monticker, Realtime
Kafka로 시세 파이프라인 분리하기 — 토픽 설계와 at-least-once 왜 Kafka를 넣었는가 초기 monticker는 단순한 구조였다. Worker가 1초마다 가격을 생성하고, Redis에 쓰고, 이벤트를 탐지하고, 캔들을 집계했다. 하나의 @Scheduled 메서드가 모든 걸 순차적으로 처리했다. MockPriceGenerator (1초 주기) → RedisTickWriter → CandleAggregat... 2026/06/06 Monticker, Realtime
Go goroutine으로 202개 종목 동시 수집하기 — Market Gateway 설계 왜 Go인가 시세 수집기를 만들 때 가장 먼저 마주하는 문제는 동시성이다. 202개 종목의 가격 변화를 1초마다 처리하려면, 202개의 독립적인 루프가 동시에 돌아야 한다. JVM(Kotlin/Spring) 위에서도 가능하지만, Go의 goroutine을 사용하면 비용이 훨씬 낮다. 동시성 단위 시작 스택 크... 2026/06/05 Monticker, Realtime
TimescaleDB를 시계열 DB로 고른 이유 — Hypertable과 연속 집계 주식 데이터는 왜 특별한가 주식 시세 데이터에는 일반 OLTP 데이터와 다른 특성이 있다. 쓰기 패턴이 단조롭다 — 항상 현재 시각 기준으로만 INSERT, UPDATE·DELETE 거의 없음 범위 쿼리가 지배적이다 — “최근 1시간 데이터 줘”, “어제 오전 9시~10시 사이 데이터 줘” 오래된 데이터는 정밀도가 낮아도 된다 — 1년... 2026/06/04 Monticker, Architecture