[알고리즘 트레이딩] 수익률(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)을 사용하면 변동성이 안정적이며 장기적인 분석이 가능함!
✔ 이 정보를 활용해 매매 전략을 설계할 수 있음! 🚀
댓글
댓글 쓰기