[트레이딩] KOSPI 로그 수익률 기반 Z-Score 분석과 매매 전략

 

KOSPI 로그 수익률 기반 Z-Score 분석과 매매 전략

안녕하세요! 오늘은 파이썬과 FinanceDataReader를 활용해 KOSPI 일봉 데이터를 기반으로 **로그 수익률(Log Return)**의 Z-score를 계산하고, 이를 활용한 간단한 매매 전략까지 소개해 드리겠습니다.


1. 로그 수익률(Log Return)이란?

주식의 가격 변동을 분석할 때 우리는 보통 수익률을 계산합니다.
여기서 흔히 사용하는 두 가지 수익률은:

  • 단순 수익률: PtPt1Pt1\frac{P_t - P_{t-1}}{P_{t-1}}

  • 로그 수익률: log(PtPt1)\log\left(\frac{P_t}{P_{t-1}}\right)

로그 수익률은 시계열 수익률의 합산, 통계적 특성(정규분포 근사)에 유리해 금융 분야에서 많이 사용됩니다.


2. Z-score란?

Z-score는 데이터가 평균에서 얼마나 떨어져 있는지를 표준편차 단위로 나타낸 값입니다.

Z=xμσ​

여기서 xx는 현재 로그 수익률, μ\mu는 최근 일정 기간 이동평균, σ\sigma는 이동 표준편차입니다.


3. 오늘의 데이터: KOSPI 5년치 분석

import FinanceDataReader as fdr import pandas as pd import numpy as np import matplotlib.pyplot as plt from datetime import datetime, timedelta end_date = datetime.today() start_date = end_date - timedelta(days=5*365) df = fdr.DataReader('KS11', start_date.strftime('%Y-%m-%d')) df['LogReturn'] = np.log(df['Close'] / df['Close'].shift(1)) window = 60 df['LR_MA60'] = df['LogReturn'].rolling(window).mean() df['LR_STD60'] = df['LogReturn'].rolling(window).std() df['Z-score'] = (df['LogReturn'] - df['LR_MA60']) / df['LR_STD60'] df = df.dropna() latest_date = df.index[-1] latest_z = df.loc[latest_date, 'Z-score'] latest_log_return = df.loc[latest_date, 'LogReturn'] print(f"[{latest_date.date()}] 로그 수익률: {latest_log_return:.5f}, Z-score(60일): {latest_z:.2f}") plt.figure(figsize=(16, 8)) plt.subplot(2, 1, 1) plt.plot(df.index, df['LogReturn'], label='Log Return', color='gray') plt.axhline(0, color='black', linestyle='--') plt.title('KOSPI Log Return (Last 5 Years)') plt.grid(True) plt.legend() plt.subplot(2, 1, 2) plt.plot(df.index, df['Z-score'], label='Z-score (60-day)', color='purple') plt.axhline(0, color='gray', linestyle='--') plt.axhline(2, color='red', linestyle='--', label='Z = 2') plt.axhline(-2, color='blue', linestyle='--', label='Z = -2') plt.scatter(latest_date, latest_z, color='black') plt.text(latest_date, latest_z, f'{latest_z:.2f}', ha='right', va='bottom', fontsize=10) plt.title('Z-score of Log Returns (KOSPI, 60-day Window)') plt.grid(True) plt.legend() plt.tight_layout() plt.show()

4. 분석 결과 해석

  • 로그 수익률이 양수면 상승, 음수면 하락입니다.

  • Z-score가 +2 이상이면 과매수 상태, -2 이하이면 과매도 상태로 볼 수 있습니다.

  • ±1 사이면 보통 범위 내 움직임입니다.

예를 들어, Z-score가 -2 이하인 경우는 가격이 최근 평균보다 현저히 낮게 움직였다는 뜻이므로 반등 가능성에 주목할 수 있습니다.


5. Z-score 기반 간단 매매 전략

매수 조건

  • Z-score가 -2 이하일 때 매수
    → 최근 60일 로그 수익률 평균 대비 크게 하락한 상태
    → 통계적으로 평균 회귀 현상이 기대됨

매도 조건

  • Z-score가 0 이상으로 회복할 때 매도
    → 가격이 정상 범위로 돌아왔음을 의미


6. 간단 전략 예시 코드 (의사 코드)

position = False # 보유 여부 buy_price = 0 for date, row in df.iterrows(): z = row['Z-score'] price = row['Close'] if not position and z <= -2: position = True buy_price = price print(f"{date.date()} 매수: {price:.2f}, Z-score: {z:.2f}") elif position and z >= 0: position = False sell_price = price profit = sell_price - buy_price print(f"{date.date()} 매도: {sell_price:.2f}, 수익: {profit:.2f}")

7. 마무리

이번 글에서는 KOSPI의 로그 수익률을 바탕으로 60일 이동 Z-score를 계산하고, 이를 활용해 간단한 평균회귀 매매 전략을 소개했습니다.

  • Z-score를 활용하면 통계적 근거에 따른 진입·청산 시점을 잡을 수 있습니다.

  • 물론, 실제 투자에는 추가적인 위험관리, 트렌드 분석, 거래 비용 등을 고려해야 합니다.

댓글

이 블로그의 인기 게시물

공압 속도 제어: 미터인 vs 미터아웃

[PLC] PLC 아날로그 입출력 기본

[주식] 한국거래소(KRX) 데이터 API 입문 가이드

[PLC] 절연 변압기 (Isolation Transformer)

[수학] 정규 분포란? 왜 종 모양을 띠고 있을까?

[농사] 식물의 광합성과 호흡

제너 다이오드에 저항을 연결하는 이유

[자동화] 안쓰는 안드로이드폰을 활용한 식물 성장 타임랩스 촬영

[스마트팜] EC/pH 미터 만들기: 아두이노로 전기 전도도 및 pH 측정

[PLC] 래더 다이어그램과 PLC