[PYTHON] yfinance를 활용하여 웹 상의 데이터 받아 분석하기

2023. 9. 22. 11:24DATA PROGRAMMING/PYTHON

import yfinance as yf
import datetime
import pandas as pd

print(yf.__version__)
print(pd.__version__)

start_date = datetime.datetime(2021, 7, 1)
end_date = datetime.datetime(2021, 12, 31)

df = yf.download('AAPL', start=start_date, end=end_date)

print(df)

데이터를 받아오기 위해 yfinance라는 모듈을 사용한다. 이 모듈은 웹상의 데이터를 파이썬 안으로 가져오는 역할을 한다.

2021년 7월 1일부터 2021년 12월 31일까지의 데이터를 가져올 것이다. AAPL이라는 애플의 티커를 입력하고 가져올 데이터의 시작과 끝 기간을 인자로 대입한다.

 

 

컬럼은 순서대로 ['Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume']를 나타낸다.

 

 

df = yf.download('AAPL')

plt.plot(df['Adj Close'])
plt.show()​

기간을 정하지 않으면 80년도부터 현재까지 애플의 데이터를 받아올 수 있다. 여기서 matplotlib패키지를 활용하여 수정 종가 그래프를 그릴 수 있다.

 

이동평균선 분석

 

이번엔 주식 분석을 할 때, 자주 사용하는 지표인 이동평균선을 만들어 보려고 한다. 이는 소위 이평선이라고 말한다. 이동평균선이란 특정 기간 동안 주가의 평균을 낸 후 그들을 그래프로 표현한 것이다. 예를 들면 7일 이동평균선이라고 하면, 오늘 기준으로 7일 전부터 오늘까지의 7일 주가 평균이 오늘의 값이 되는 것이다. 이렇게 하루하루 모든 값을 계산한 이후에 그래프를 그린다.

 

df = yf.download('AAPL', start_date, end_date)
df = df[df['Volume'] != 0 ]

ma = df['Adj Close'].rolling(window=5).mean()

df에서 Volume(거래량)이 0인 값들을 빼준다. 이때는 공휴일 등의 이유로 주식거래가 이루어지지 않은 날이므로 이평선 계산에서 빼는 것이다.

또한 rolling함수를 사용하는데 window인자를 5로 지정함으로써 4칸 전의 데이터부터 현재 칸의 데이터까지 총 5개의 데이터를 연속적으로 집계한다. 마지막으로 mean()함수를 통해 이 값의 평균을 구해주면 된다.

5일 이평선 그래프

 

 

주식의 기술적 분석에서는 5일 이평선, 20일 이평선, 60일 이평선 등 많은 이평선들이 교차하는 지점을 중요한 매매 타이밍으로 보고 있다. 그래서 기존에 volumn이 0 이 아닌 데이터들로 만든 새로운 데이터프레임에 각 이평선 값들을 구해 새로운 컬럼으로 대입해서 분석하려고 한다.

 

ma5 = df['Adj Close'].rolling(window=5).mean()
df.insert(len(df.columns), "MA5", ma5)

ma20 = df['Adj Close'].rolling(window=20).mean()
df.insert(len(df.columns), "MA20", ma20)

ma60 = df['Adj Close'].rolling(window=60).mean()
df.insert(len(df.columns), "MA60", ma60)

ma120 = df['Adj Close'].rolling(window=120).mean()
df.insert(len(df.columns), "MA120", ma120)

 

plt.plot(df.index, df['Adj Close'], label='Adj Close')
plt.plot(df.index, df['MA5'], label='MA5')
plt.plot(df.index, df['MA20'], label='MA20')
plt.plot(df.index, df['MA60'], label='MA60')
plt.plot(df.index, df['MA120'], label='MA120')

plt.legend(loc="best")
plt.grid()
plt.show()

이제 plt를 통해 그래프를 그려준다.

조금 더 세밀하게 분석하고 싶다면 기간을 짧게 잡으면 된다.