코인시장이 커지면서 글로벌과 국내 시장을 함께 보는 것이 중요해졌다. 전 세계 거래량 1위는 바이낸스(Binance)이고, 국내 대표 거래소는 업비트(Upbit)이다. 최근 업비트가 ‘Market Insight’를 도입하며 데이터 기반 투자 지원을 강화했다 [출처] 또한 2025년 6월 기준 한국 암호화폐 시장이 세계 2위 규모라는 보도도 있었다 [출처]
온체인 거래는 블록체인에 모든 기록이 남지만, 중앙화 거래소(CEX)는 체결이 내부 시스템에서 이루어지기 때문에 블록체인에는 입출금만 남는다. 따라서 CEX 안에서의 거래 내역을 분석하려면 각 거래소의 API로 데이터를 직접 수집·관리해야 한다 [더 알아보기]
문제는 거래소마다 데이터 구조·명칭·단위가 달라 그대로는 비교가 어렵다는 점이다. 이에 본 글에서는 Binance와 Upbit의 퍼블릭 API를 기준으로 **심볼 표준화(dim_market)**와 사실 테이블(체결·오더북·캔들) 설계를 제시하고, ERD와 필드 매핑 규칙을 통해 교차거래소 기준의 일관된 기초 분석 마트를 설계하였다.
거래쌍 식별자를 공통 규칙으로 표현하기 위해 **심볼정보 테이블(dim_market)**을 설계하였다. dim_market은 전역 표준 라벨 **market_code(BASE-QUOTE)**와 내부 식별자 **market_id**로 유일 식별하며, base_asset/quote_asset과 필요 시 자산 한·영명(asset_name_kr/asset_name_en)을 보관한다. 모든 사실 테이블은 market_id를 FK로 참조하여 연결하며, 거래소 간 표기 차이와 무관하게 동일 의미의 거래를 한 축으로 비교·집계할 수 있다.
Binance는 baseAsset/quoteAsset로 만들고, Upbit는 market(예: KRW-BTC)를 분리해 뒤집어BTC-KRW로 만든다.
현재가/24h 통계 (Ticker)
티커는 시점별 현재가와 24시간 통계를 스냅샷으로 저장하는 지표이다. 거래소별 서로 다른 필드를 표준 컬럼으로 통일하고, exchange_code와 market_id를 함께 보관하여 교차거래소 비교와 합산 집계를 모두 지원하도록 설계하였다. 기준 시각은 ts_utc(UTC, ms)로 통일한다.
표준화: 현재가·고저·24h 거래량/대금을 공통 컬럼으로 변환하고 market_code를 생성한다.
DIM 조회/증분: market_code로 dim_market을 조회해 market_id를 얻고, 신규 마켓만 업서트한다.
FACT 적재: (exchange_code, market_id, ts_utc) 기준으로 fact_ticker에 업서트한다. ts_utc는 원본 이벤트 시각이 있으면 그 값을, 없으면 load_ts를 사용한다.
원본 필드 맵핑 기획
의미
Binance
Upbit
표준 필드
최종 저장 위치
스냅샷 시각
event_ts_utc 또는 수집시각
응답시각 또는 수집시각
ts_utc(UTC, ms)
fact_ticker
현재가
lastPrice
trade_price
price_last
fact_ticker
24h 고/저
highPrice/lowPrice
high_price/low_price
high_24h/low_24h
fact_ticker
24h 거래량(베이스)
volume
acc_trade_volume_24h
volume_base_24h
fact_ticker
24h 거래대금(쿼트)
quoteVolume
acc_trade_price_24h
volume_quote_24h
fact_ticker
24h 변화량/변동률
priceChange/priceChangePercent
signed_change_price/signed_change_rate(없으면 파생)
chg_abs_24h/chg_pct_24h
fact_ticker
최종 테이블 fact_ticker
컬럼
타입/키
설명
값 예시
비고
exchange_code
PK(복합)
데이터 출처 거래소 코드이다.
BINANCE, UPBIT
문자열
market_id
PK(복합), FK
표준 마켓 식별자이다. dim_market.market_id를 참조한다.
101
FK
ts_utc
PK(복합)
스냅샷 기준 시각(UTC, ms)이다.
1732608000000
BIGINT(ms)
price_last
NOT NULL, DECIMAL
현재가이다.
9876.500000000000000000
누락 시 적재하지 않는다.
high_24h
DECIMAL
24시간 고가이다.
10050.000000000000000000
low_24h
DECIMAL
24시간 저가이다.
9500.000000000000000000
volume_base_24h
DECIMAL, CHECK(>=0)
24시간 거래량(베이스)이다.
1234.567000000000000000
코인 수량 단위
volume_quote_24h
DECIMAL, CHECK(>=0)
24시간 거래대금(쿼트)이다.
12345678.900000000000000000
결제통화 금액
chg_abs_24h
DECIMAL
24시간 가격 변화량이다.
-120.500000000000000000
chg_pct_24h
DECIMAL
24시간 변화율(%)이다.
-1.20
load_ts
NOT NULL, TIMESTAMP
적재 시각이다.
2025-06-01 00:00:05Z
파이프라인 기록
date_utc
생성 컬럼
DATE(ts_utc)이다.
2025-06-01
파티션/보존용
date_kst
생성 컬럼
DATE(ts_utc + 9 HOUR)이다.
2025-06-01
리포트용
PK: (exchange_code, market_id, ts_utc)이다.
ts_utc: 원본 이벤트 시각이 있으면 그 값을 쓰고, 없으면 load_ts로 대체한다.
지표 타입: 가격·금액·수량은 DECIMAL(38,18)로 저장한다.
인덱스: (market_id, ts_utc DESC), (exchange_code, ts_utc DESC)를 각각 생성한다.
조회는 fact_ticker → dim_market 조인으로 market_code를 붙여 사용한다.
최근 체결(Trades)
체결 데이터는 거래가 발생할 때마다 기록되는 행 단위 사실(Fact) 이다. 거래소별 원본 스키마를 표준 필드로 통일하고, exchange_code와 market_id를 함께 보관하여 교차거래소 비교·집계를 가능하게 한다. 기준 시각은 trade_ts_utc(UTC, ms) 로 통일한다.
시간 정책: trade_ts_utc는 원본 이벤트 시각(UTC, ms)으로 저장한다. 없으면 load_ts로 대체한다.
사이드 매핑: Binance isBuyerMaker=true→'SELL', false→'BUY'; Upbit ASK→'SELL', BID→'BUY'이다.
인덱스 권장: (market_id, trade_ts_utc DESC), (exchange_code, trade_ts_utc DESC)를 각각 생성한다.
파티션 권장: date_utc 기준 일(일자) 파티션이다.
조회: fact_trades → dim_market 조인으로 market_code를 붙여 분석한다
오더북 (order book)
오더북은 시점별로 매수(BID)/매도(ASK) 레벨과 잔량을 스냅샷으로 기록하는 사실 테이블이다. 거래소별 응답(bids/asks 배열, orderbook_units)을 레벨 단위 행으로 표준화하고, exchange_code와 market_id를 함께 보관하여 교차거래소 비교·집계를 가능하게 하였다.
Trades의 taker_side('BUY'/'SELL') 는 체결의 테이커 방향, Orderbook의 side('BID'/'ASK') 는 장부 방향이다. 용어만 다르며 의미가 다름을 글에 명시하였다.
처리 흐름 요약
원본 적재: Binance/Upbit 오더북을 스테이징에 적재(bids/asks 또는 orderbook_units → 레벨 전개).
시간 정책: book_ts_utc는 원본 이벤트 시각(UTC, ms)으로 저장, 없으면 book_ts_utc = load_ts.
파티션: PARTITION BY date_utc = DATE(book_ts_utc) 권장.
레벨 규칙: BID=고가→저가 1..N / ASK=저가→고가 1..N.
캔들 (candles)
캔들은 일정 구간(분·시·일 등) 동안의 OHLCV를 집계한 스냅샷이다. 거래소별 포맷 차이를 표준 컬럼으로 통일하고, exchange_code와 market_id를 함께 보관하여 교차거래소 비교·집계를 가능하게 하였다. 봉의 기준 시각은 open_ts_utc(봉 시작, UTC ms) 로 통일한다.
해당 글은 표준 마켓 차원 dim_market과 세 가지 사실 테이블 fact_candles, fact_trades, fact_orderbook까지, CEX 분석에 필요한 핵심 4개 테이블을 설계하였다. 이 구조만으로도 가격·수익률·유동성·체결 흐름을 교차거래소 기준으로 일관되게 분석할 수 있으나, 더 심도 깊은 분석을 위해서는 본 스키마를 축으로 확장이 필요하다. 확장 항목은 추후 순차적으로 업데이트할 예정이다.