[알고리즘 트레이딩] 수익률(returns)을 활용한 트렌드 및 변동성 분석

금융 데이터 분석에서 수익률(returns) 을 사용하면 트렌드(trend)와 변동성(volatility) 분석이 더욱 일관성 있게 이루어집니다. 본 글에서는 그 이유를 설명하고, Python을 활용해 업비트(Upbit)에서 가져온 비트코인 가격 데이터를 통해 실습해 보겠습니다.


📌 왜 수익률을 사용할까?

1. 가격 데이터는 비정상성(non-stationary)

주가나 암호화폐 가격 데이터는 시간이 지남에 따라 평균과 분산이 변화하는 비정상(non-stationary) 데이터입니다. 이러한 데이터는 분석과 예측이 어렵습니다.

하지만 수익률(returns)은 대체로 정상성(stationarity)을 갖기 때문에 통계적 분석과 예측이 용이합니다.

2. 트렌드와 변동성 비교가 쉬움

  • 가격 데이터: 절대적인 값이므로 비교가 어렵습니다.

  • 수익률 데이터: 오르면 양수(+), 내리면 음수(-)로 나타나므로 트렌드를 쉽게 분석할 수 있습니다.

  • 수익률의 표준편차를 이용하면 변동성(Volatility)을 측정할 수 있습니다.

3. 로그 수익률(Log Returns)의 장점

  • 로그 변환을 하면 분포가 더 정규분포에 가까워지고, 변동성이 안정적이 됩니다.

  • 장기적인 분석 시 가격 수준의 차이를 보정할 수 있습니다.


📌 Python을 활용한 트렌드 및 변동성 분석 (업비트 예제)

import requests
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 한글 폰트 설정 (Mac, Windows, Linux 호환)
plt.rcParams['font.family'] = 'Malgun Gothic'  # Windows
plt.rcParams['axes.unicode_minus'] = False  # 마이너스 기호 깨짐 방지

# 📌 업비트 API에서 최근 200개 일봉 데이터 가져오기
def get_upbit_ohlcv(market="KRW-BTC", count=200):
    url = "https://api.upbit.com/v1/candles/days"
    params = {"market": market, "count": count}
    headers = {"Accept": "application/json"}
    response = requests.get(url, params=params, headers=headers)
    data = response.json()
    df = pd.DataFrame(data)[["candle_date_time_kst", "trade_price"]]
    df.rename(columns={"candle_date_time_kst": "date", "trade_price": "close"}, inplace=True)
    df["date"] = pd.to_datetime(df["date"])
    df = df.sort_values("date").reset_index(drop=True)
    return df

# 📌 데이터 가져오기
df = get_upbit_ohlcv("KRW-BTC", count=200)

# ✅ 수익률 계산
df["Returns"] = df["close"].pct_change()
df["Log Returns"] = np.log(df["close"] / df["close"].shift(1))

# ✅ 이동평균 (SMA) 적용
df["Returns_SMA20"] = df["Returns"].rolling(window=20).mean()
df["Volatility"] = df["Returns"].rolling(window=20).std()
df["Volatility_SMA20"] = df["Volatility"].rolling(window=20).mean()

# 📈 그래프 그리기
fig, axes = plt.subplots(2, 1, figsize=(12, 10))

# 1️⃣ 수익률 트렌드 그래프
axes[0].plot(df["date"], df["Returns"], label="Daily Returns", color="blue", alpha=0.5)
axes[0].plot(df["date"], df["Returns_SMA20"], label="20-day SMA (Returns)", color="red", linestyle="dashed")
axes[0].set_title("비트코인 수익률 트렌드 (단순 수익률)")
axes[0].set_xlabel("Date")
axes[0].set_ylabel("Returns")
axes[0].legend()

# 2️⃣ 변동성 분석 그래프
axes[1].plot(df["date"], df["Volatility"], label="20-day Std Dev (Returns)", color="purple")
axes[1].plot(df["date"], df["Volatility_SMA20"], label="20-day SMA (Volatility)", color="orange", linestyle="dashed")
axes[1].set_title("비트코인 변동성 분석 (수익률 기반)")
axes[1].set_xlabel("Date")
axes[1].set_ylabel("Volatility")
axes[1].legend()

plt.tight_layout()
plt.show()

📌 결과 분석

1. 트렌드 분석 (수익률 이동평균)

  • 수익률(returns) 이동평균을 사용하면 상승/하락 흐름을 더 쉽게 파악할 수 있습니다.

  • 이동평균이 양수(+) → 상승 추세

  • 이동평균이 음수(-) → 하락 추세

2. 변동성 분석 (수익률의 표준편차)

  • 수익률의 표준편차를 계산하면 변동성이 얼마나 큰지 측정할 수 있습니다.

  • 변동성이 높으면 큰 가격 변동이 예상됩니다.

3. 로그 수익률의 장점

  • 로그 수익률을 사용하면 변동성이 일정하게 유지되어 분석이 더 일관적입니다.

  • 장기 데이터 분석에서 가격 차이를 보정할 수 있습니다.


📌 결론

수익률(returns)을 사용하면 가격 데이터보다 더 안정적으로 트렌드와 변동성을 분석할 수 있음!
로그 수익률(log returns)을 사용하면 변동성이 안정적이며 장기적인 분석이 가능함!
이 정보를 활용해 매매 전략을 설계할 수 있음! 🚀

댓글

이 블로그의 인기 게시물

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

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

전력(kW) 계산하기 (직류, 교류 단상, 교류 삼상)

Industrial Control with Relay: 파워릴레이와 범용릴레이

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

NPN, PNP 트랜지스터 차이점

[아두이노] 가변저항(Potential Divider)과 전압분배(Voltage Divider)

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

[전기 기초] 저항의 정격전력(Watt) 표기의 의미

[스마트팜] pH 시험지를 비전으로 판독하는 저비용 센싱 시스템 만들기 (with OpenCV)