주식 데이터 시각화: 종가와 RSI 그래프 그리기
주식 시장에서 기술적 지표를 분석하는 것은 투자 결정을 내리는 데 중요한 역할을 합니다. 이번 포스트에서는 파이썬을 사용하여 주가 데이터에서 RSI(Relative Strength Index)를 계산하고, 이를 시각화하는 방법을 알아보겠습니다. matplotlib와 yfinance를 사용하여 데이터를 다운로드하고 그래프를 생성하는 과정을 단계별로 설명합니다.
라이브러리 설치
먼저 필요한 라이브러리를 설치합니다. 이 예제에서는 yfinance, pandas, numpy, matplotlib을 사용합니다. 설치가 되어 있지 않다면, 아래 명령어로 설치할 수 있습니다.
pip install yfinance pandas numpy matplotlib
코드 설명
아래는 주식 데이터와 RSI를 계산하고 시각화하는 파이썬 코드입니다.
import pandas as pd
import numpy as np
import yfinance as yf
import matplotlib.pyplot as plt
def calculate_rsi(data, window=14):
delta = data['Adj Close'].diff(1)
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
avg_gain = gain.rolling(window=window).mean()
avg_loss = loss.rolling(window=window).mean()
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs))
return rsi
# 주가 데이터를 다운로드 (티커는 035420.KS, 네이버)
ticker = '035420.KS'
df = yf.download(ticker, start='2023-08-27', end='2024-08-27')
# RSI 계산
df['RSI'] = calculate_rsi(df)
# 그래프 생성
plt.figure(figsize=(14, 10))
# 종가 그래프
plt.subplot(2, 1, 1)
plt.plot(df.index, df['Close'], color='#0000ff', label='Close')
plt.title(f'{ticker} Closing Price')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend(loc='best')
# RSI 그래프
plt.subplot(2, 1, 2)
plt.plot(df.index, df['RSI'], color='purple', label='RSI')
plt.axhline(70, color='red', linestyle='--', label='Overbought (70)')
plt.axhline(30, color='green', linestyle='--', label='Oversold (30)')
plt.title(f"{ticker} RSI (Relative Strength Index)")
plt.xlabel('Date')
plt.ylabel('RSI')
plt.legend(loc='best')
plt.tight_layout()
plt.show()
코드 상세 설명
라이브러리 임포트
import pandas as pd
import numpy as np
import yfinance as yf
import matplotlib.pyplot as plt
- pandas: 데이터 처리 및 분석을 위한 라이브러리입니다.
- numpy: 수치 연산을 위한 라이브러리입니다.
- yfinance: Yahoo Finance에서 주식 데이터를 다운로드하는 라이브러리입니다.
- matplotlib.pyplot: 데이터 시각화를 위한 라이브러리입니다.
RSI 계산 함수 정의
def calculate_rsi(data, window=14):
delta = data['Adj Close'].diff(1)
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
avg_gain = gain.rolling(window=window).mean()
avg_loss = loss.rolling(window=window).mean()
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs))
return rsi
- delta: Adj Close의 일일 차이를 계산합니다.
- gain: 상승분만을 추출합니다. 하락분은 0으로 설정합니다.
- loss: 하락분만을 추출합니다. 상승분은 0으로 설정하고 부호를 변경합니다.
- avg_gain, avg_loss: 지정된 윈도우(기본값: 14) 기간 동안의 평균 상승과 하락을 계산합니다.
- rs: 평균 상승을 평균 하락으로 나누어 상대 강도 지수를 계산합니다.
- rsi: 최종 RSI를 계산하여 반환합니다.
주가 데이터 다운로드
ticker = '035420.KS'
df = yf.download(ticker, start='2023-08-27', end='2024-08-27')
- ticker: 네이버의 티커 심볼입니다.
- yf.download(): 지정된 기간 동안의 주가 데이터를 다운로드합니다.
RSI 계산 및 데이터프레임에 추가
df['RSI'] = calculate_rsi(df)
- calculate_rsi(df): RSI를 계산하여 데이터프레임에 추가합니다.
그래프 생성 및 표시
plt.figure(figsize=(14, 10))
# 종가 그래프
plt.subplot(2, 1, 1)
plt.plot(df.index, df['Close'], color='#0000ff', label='Close')
plt.title(f'{ticker} Closing Price')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend(loc='best')
# RSI 그래프
plt.subplot(2, 1, 2)
plt.plot(df.index, df['RSI'], color='purple', label='RSI')
plt.axhline(70, color='red', linestyle='--', label='Overbought (70)')
plt.axhline(30, color='green', linestyle='--', label='Oversold (30)')
plt.title(f"{ticker} RSI (Relative Strength Index)")
plt.xlabel('Date')
plt.ylabel('RSI')
plt.legend(loc='best')
plt.tight_layout()
plt.show()
- plt.figure(figsize=(14, 10)): 전체 그래프의 크기를 설정합니다.
- plt.subplot(2, 1, 1): 2행 1열의 첫 번째 서브플롯을 설정합니다.
- plt.plot(): 종가 데이터를 시각화합니다.
- plt.subplot(2, 1, 2): 2행 1열의 두 번째 서브플롯을 설정합니다.
- plt.axhline(): RSI의 과매수 및 과매도 수준을 표시하는 수평선을 추가합니다.
- plt.tight_layout(): 그래프 레이아웃을 조정하여 겹침을 방지합니다.
- plt.show(): 그래프를 화면에 표시합니다.
결과

결론
위 코드를 통해 주식 데이터의 종가와 RSI를 시각화하는 방법을 배웠습니다. 종가 그래프와 RSI 그래프를 함께 표시하여 데이터 분석에 유용한 시각적 정보를 제공할 수 있습니다. 이를 통해 주가의 변동성과 기술적 지표를 한눈에 확인할 수 있으며, 투자 결정을 내리는 데 도움을 받을 수 있습니다.
이 블로그 포스트는 파이썬을 활용하여 주식 데이터와 RSI를 분석하고 시각화하는 기본적인 방법을 설명합니다. 다양한 데이터 시각화 기법을 활용하여 데이터 분석의 깊이를 더해보세요!