고빈도 데이터로 실현 변동성과 가격 점프를 계측하는 방법

고빈도 데이터에서 실현 변동성, 바이파워 변동, 점프 검정을 계산하고 잡음·비정규 간격을 운영 환경에서 다루는 방법

2026-08-14 · 최초 발행 2024-04-29

틱 데이터에서 변동성을 읽을 때 남는 문제

초단기 호가와 체결 이벤트를 이용하면 장중 변동성을 빠르게 계측할 수 있다. 다만 틱 시계열은 일정한 간격으로 들어오지 않고, 미세시계 동기 문제와 bid-ask bounce, 체결 규칙 같은 마이크로구조 잡음을 함께 가진다. 단순한 수익률 제곱합만으로는 잡음과 실제 가격 변화가 섞일 수 있다.

고빈도 데이터는 거래소 또는 내부 거래 시스템에서 발생하는 체결·호가 단위 시계열이다. 이 데이터로 계산하는 실현 변동성(Realized Volatility, RV)은 짧은 구간 로그수익률 제곱합을 누적한 값이다. 이상적인 조건에서는 연속 시그마 제곱 적분의 일치 추정량이지만, 잡음에는 취약하다.

바이파워 변동(Realized Bipower Variation, BV)은 인접 수익률 절대값의 곱을 합산해 연속 성분의 변동을 추정한다. 점프에 덜 민감하므로 점프 분리의 기준량으로 쓴다. 연속 확산으로 설명하기 어려운 이산적 가격 급변은 점프(Jump)로 다루며, BNS(Barndorff-Nielsen & Shephard), Lee–Mykland, Aït-Sahalia–Jacod 검정이 여기에 사용된다.

잡음의 상향 편향과 분산 증가를 완화하려면 Two-Scale Realized Volatility(TSRV), Pre-averaging, Realized Kernel(RK) 같은 잡음 강건 추정기를 사용할 수 있다.

데이터 정합부터 집계 결과까지의 흐름

Calendar 1-5mPrev-tickRefresh time(Hayashi–Yoshida for cov)Local thresholdDaily BNS/LM testClock driftBad ticksGapsMarket Data Feed(Trades/Quotes)IngestionKafka/ParquetData Cleaning- Dedup/Sort- Time sync (NTP/PTP)- Outlier filtersSamplingReturns ComputeEstimatorsRV/BV/TSRV/RKJump DetectionIntraday jump flagsDaily jump presenceStorage/AlertsPrometheus/ESErrors

거래소 타임스탬프를 기준으로 시계를 맞추고 타임존과 서머타임을 처리한다. NTP/PTP 동기화를 권장하며, 결측·중복·역순 이벤트는 제거 대상이다. 0·음수 가격이나 반대호가 역전 같은 비정상 호가·체결은 필터링하고, 수익률 기반 MAD/IQR 규칙과 호가 스프레드 기반 규칙을 함께 적용한다.

이후 캘린더 시계 또는 동시성을 확보하는 리프레시 타임으로 데이터를 리샘플링한다. 캘린더 시계는 예를 들어 1–5분 간격을 사용할 수 있으며, 이전틱 보간(Previous-Tick)을 적용한다. U자형 일중 변동성 패턴은 디트렌딩한 뒤 추정량을 계산하는 방식이 권장된다.

처리 결과는 일중·일별 변동성 시계열, 점프 플래그, 보고서와 대시보드로 이어진다. 결측이나 간격 과대 구간에서는 이전틱 보간을 제한하고, 임계 초과 구간은 제외하거나 신뢰도 라벨을 부여한다. 타임스탬프 역전과 중복은 정렬·제거한 뒤 로그로 남기며, 비정상 가격은 가격·수익률 규칙과 호가 스프레드 검증으로 처리한다.

스트리밍 집계에서는 티커·일자를 파티셔닝 키로 고정해 동일 파티션의 순서를 보장한다. 체크포인트 기반 정확히-한번(exactly-once) 처리는 재처리 시에도 집계 일관성을 유지하는 수단이다. 버전, 파라미터, 시계 정합 메타데이터도 함께 기록해야 재현성을 확보할 수 있다.

RV, TSRV, Realized Kernel의 선택 기준

항목 RV (5분) TSRV Realized Kernel
성능(잡음 강건성) 중간, 상향편향 가능 높음, 잡음 보정 높음, 잡음·비정규 간격 강건
확장성(복잡도) 매우 높음, O(N) 높음, O(N) + 튜닝 중간, O(N·L) 커널 연산
일관성(비정규 격자) 보통 보통 높음
안정성(점프 영향) 점프 민감 보통 보통~높음(커널에 따라 상이)
운영 편의 매우 쉬움 중간(파라미터 필요) 중간(대역폭/커널 선택)

RV(5분)는 단순하고 빠르며 실무에서 표준적으로 쓰기 쉽다. 대신 잡음에 민감하므로 서브샘플링이나 어버리징으로 보완할 수 있다. TSRV와 Pre-averaging은 잡음을 보정하지만 윈도 길이와 레그 수를 조정해야 한다. Realized Kernel은 커널과 대역폭 선택이 필요하지만, 잡음과 비정규 간격에 강건하다.

점프 변동은 JV = max(RV−BV, 0)으로 정의할 수 있다. 일중 로컬 임계치로 점프를 표시하고, 정규근사 또는 부트스트랩으로 유의확률을 계산한다. 다중검정을 수행할 때는 FDR 보정을 적용한다.

RV와 BV로 점프를 표시하는 파이프라인

전제조건은 다음과 같다.

  • Python 3.11+, pandas 2.x, numpy 2.x
  • 입력: trades.csv (columns: ts[ISO8601], price[float]) UTC 타임스탬프, 동일 종목 단일 일자 샘플

아래 예제는 5분 캘린더 그리드에 이전틱 보간을 적용하고 로그수익률을 계산한다. 일별 RV/BV를 집계한 뒤 로컬 임계치로 점프 플래그를 만든다. 공식 통계 검정에는 BNS/LM 구현 또는 부트스트랩 사용이 권장된다.

# Python 3.11+, pandas 2.2, numpy 2.1
import numpy as np
import pandas as pd

# 1) 로드 및 정제
df = pd.read_csv("trades.csv", parse_dates=["ts"])
df = df.sort_values("ts").drop_duplicates("ts")
df = df.set_index(pd.DatetimeIndex(df["ts"], tz="UTC")).drop(columns=["ts"])
df = df[(df["price"] > 0) & np.isfinite(df["price"])]

# 간단한 이상치 필터: 수익률 절대값 상한 적용
price = df["price"]
lr = np.log(price).diff()
thr = 0.2  # 단일 틱 수익률 절대값 임계치(도메인별 보정)
df = df[lr.abs().fillna(0) < thr]

# 2) 5분 리샘플 및 이전틱 보간
px_5m = df["price"].resample("5min").last().ffill()

# 3) 로그수익률 및 RV, BV 계산
r = np.log(px_5m).diff().dropna()
M = len(r)  # 일중 구간 수
RV = np.sum(r**2)
BV = (np.pi/2) * np.sum(np.abs(r[1:].values) * np.abs(r[:-1].values))

JV = max(RV - BV, 0.0)  # 점프 변동

# 4) 로컬 점프 플래그(임계치 방식)
sigma_c = np.sqrt(BV / M) if M > 0 else np.nan
k = 4.0  # 경보 민감도(3~5 범위 권장, FDR 보정과 병행)
jump_flags = (np.abs(r) > k * sigma_c)

print(f"M={M}, RV={RV:.6e}, BV={BV:.6e}, JV={JV:.6e}, sigma_c={sigma_c:.6e}")
print(f"Jump intervals: {jump_flags.sum()} / {M}")

# 5) 결과 프레임
out = pd.DataFrame({
    "return": r,
    "jump_flag": jump_flags.astype(int)
})
out.to_csv("hf_rv_bv_jumps.csv", index_label="ts")

다중 종목을 스트리밍으로 처리할 때는 심볼 x 일자 파티션과 상태 저장형 윈도우(예: 1일 롤링)에서 RV/BV를 누적한다. BNS/LM Z-통계량은 분산 추정에 민감하므로, 내부 승격 전에는 부트스트랩 기반 p-값으로 보수적으로 적용한다.

리스크, 거래, 감시에서의 사용 지점

인트라데이 리스크 관리에서는 초단기 VaR/ES 산출을 위한 공분산 행렬을 갱신하고, 장중 레버리지와 헤지 비율을 자동 조정하는 데 활용한다. 마켓메이킹과 알고리즘 트레이딩에서는 실현 변동성을 호가 스프레드, 체결 확률, 인벤토리 페널티 계수에 반영할 수 있다. 점프를 탐지하면 인벤토리 축소나 상위 레벨 취소의 트리거로 연결한다.

파생 헤지와 프라이싱에서는 로컬 변동성을 갱신해 감마·베가 관리 오차를 줄이고 이벤트 구간에서 헤지 전략을 전환한다. 시장 감시에서는 대형 점프 클러스터를 실시간으로 탐지해 서킷 브레이커와 리스크 컷 신호에 연계한다. 퀀트 리서치에서는 공시·매크로 이벤트 윈도를 연구하고, 변동성 시그니처 플롯으로 적절한 샘플링 빈도를 고른다.

잡음 강건 추정기를 도입하면 변동성 추정 MSE가 10~30% 감소할 수 있으며, 그 결과는 데이터와 튜닝에 종속된다. 점프를 분리한 뒤에는 포트폴리오 단기 VaR 백테스트의 예측성이 개선되고 위험예측 위반율에 근접할 수 있다. 장중 리스크 지표의 안정성과 일관성이 높아지고, 오경보·지연 경보가 줄어든다. 데이터 거버넌스와 재현성도 강화돼 컴플라이언스 대응이 쉬워진다.

시간과 저장 구조가 추정기의 성능을 좌우한다

시간 인프라는 거래소 원천 타임스탬프를 우선하고, 백업으로 PTP 동기화를 사용한다. 시간이 맞지 않으면 배치와 스트리밍의 결과가 서로 달라질 수 있다.

저장소는 Parquet의 컬럼형 압축으로 I/O 효율을 확보할 수 있다. 초저지연 경보는 메모리 상태 저장으로 처리하고, 원장성은 객체스토리지 스냅샷으로 남긴다. 5분 RV는 운영이 쉬운 대신 정보 손실 가능성이 있으며, RK와 TSRV는 성능이 우수하지만 튜닝과 계산비가 증가한다.

다중자산 공분산에서는 비동기 거래를 리프레시 타임 또는 Hayashi–Yoshida 추정으로 다룬다. 이 선택은 실행 복잡도와 지연 시간 증가를 동반한다. 초기에는 5분 RV/BV와 로컬 임계치 점프 플래그로 시작하고, 이후 Realized Kernel/TSRV와 공식 검정으로 고도화하는 흐름을 취할 수 있다.

고빈도 데이터실현 변동성점프 검정금융 통계마이크로구조 잡음