일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- gapminder
- DataAnalysis
- n8n
- 프롬프트
- 전환분석
- 인과추론
- data-analysis
- 데이터디스커버리플랫폼
- EDA
- pandasai
- 야구
- PyGWalker
- 벅슨의역설
- 아하모먼트
- productanalysis
- 시각화
- 데이터분석가
- 신기효과
- 데이터
- 성장
- 주가데이터
- 글또
- 프롬프트엔지니어링
- DataAnalyst
- 분석한스푼
- aha-moment
- retentioneering
- 트위먼의법칙
- 데이터분석
- data
데이터 생존 로그
yfinance(야후 파이낸스)로 주가 데이터 손질하기 본문
해당 게시글에서는 주가 데이터를 받아 원하는 형태로 전처리를 해보도록 하겠습니다.
야후 파이낸스의 주가 데이터를 받아올 수 있는 'yfinance'라는 파이썬 라이브러리를 활용하겠습니다.
개인적으로 궁금한 것들을 몇 가지 정해놓고, 주가 데이터를 통해 확인해봅시다!
제가 확인해볼 것들은 다음 내용들입니다.
- 2023년 가장 많이 상승(하락)한 종목은?
- 2023년 거래량이 가장 많았던 종목은?
- 2023년 중, 어느 시기에 거래량이 많았(적었)을까?
Ticker 정보 가져오기
yfinance에서 데이터를 불러올 때, Ticker(티커)라는 것을 인자로 넣어준다고 합니다.
따라서 보고싶은 종목의 데이터를 보기 위해서는 그 종목은 Ticker를 알아야 합니다.
Ticker는 야후 파이낸스 홈페이지에 원하는 종목을 검색하면 Ticker를 볼 수 있습니다.
위와 같이 메타의 ticker는 META인 것을 확인할 수 있습니다.
그런데, 만약 보고싶은 종목이 아주 많다면, ticker의 목록 데이터가 필요할 것 같습니다.
ticker의 목록 데이터는 해당 링크에서 받아주도록 할게요.
나스닥 기준 시가총액(MARKET CAP)이 높으면서, 기술주(SECTOR가 Technology)들의 Ticker 리스트를 받아줬습니다.
이제 Ticker 리스트도 받았으니 이 종목들의 주가 데이터를 받아오겠습니다.
위에서 받은 Ticker 리스트를 ticker.csv라는 파일의 형태로 저장하고 불러옵니다.
import yfinance as yf
import pandas as pd
import plotly.graph_objects as go
import plotly.express as px
tickers = pd.read_csv('ticker.csv')
tickers.head()
tickers는 위와 같은 형태로 구성되어있네요.
Symbol 컬럼에 제가 원하는 Ticker 정보가 들어있습니다.
yfinance로 주가 데이터 불러오기
그럼 이번엔 yfinance로 주가 데이터를 불러오도록 하겠습니다.
위에서 검색했던 META의 주가를 예시로 불러오겠습니다.
meta = yf.download('META', start="2023-01-01", end="2023-12-31")
meta.head()
야후 파이낸스에서 메타의 주가를 불러왔습니다.
일별로 구성되어있고, 시가(Open) 고가(High) 저가(Low) 종가(Close) 조정종가(Adj Close) 거래량(Volume) 값이 담겨있네요.
간단한 시각화를 해보겠습니다.
2023년 4분기(10월 이후) meta의 주가를 candle stick으로 표현하겠습니다.
meta = meta.reset_index()
meta = meta[meta['Date']>='2023-10-01']
fig = go.Figure(data=[go.Candlestick(x=meta['Date'],
open=meta['Open'],
high=meta['High'],
low=meta['Low'],
close=meta['Close'])])
fig.update_layout(xaxis_rangeslider_visible=False)
fig.show()
이제 더 많은 주가 데이터를 불러올까요?
아까 tickers.csv에 담았던 Ticker 목록을 한 번에 불러오겠습니다.
stock = yf.download(tickers['Symbol'].tolist(),start="2023-01-01",end="2023-12-31")
stock
각 종목의 정보들(시가, 종가 등)이 컬럼에 들어있는 것을 확인할 수 있습니다.
궁금증 해결하기
2023년 가장 많이 상승(하락)한 종목부터 찾아보겠습니다.
2023년 1월 3일 시가와 2023년 12월 29일의 종가를 비교해서 찾습니다.
stock = stock.reset_index()
starts = stock[stock['Date']=='2023-01-03']['Open'].transpose()
starts = starts.reset_index()
ends = stock[stock['Date']=='2023-12-29']['Close'].transpose()
ends = ends.reset_index()
starts.columns = ['Ticker', 'START']
ends.columns = ['Ticker', 'END']
stocks_ = pd.merge(starts, ends, how='left', left_on='Ticker', right_on='Ticker')
stocks_['rate'] = (stocks_['END'] - stocks_['START']) / stocks_['START']
stocks_ = stocks_.sort_values('rate', ascending=False)
stocks_
결과를 간단히 시각화해볼까요?
fig = px.bar(stocks_, y='rate', x='Ticker')
fig.show()
상승율이 높은 종목은 (APP, SMCI, NVDA, META) 순서네요.
반대로, 가장 하락율이 큰 종목은 ENPH로 관찰됩니다. -51% 정도 하락했네요.
이번엔 거래량(Volumes)을 보겠습니다.
volumes = stock['Volume'].sum().reset_index()
volumes.columns = ['Ticker', 'Volume']
volumes = volumes.sort_values('Volume', ascending=False)
volumes
fig = px.bar(volumes, y='Volume', x='Ticker')
fig.show()
거래량이 가장 많았던 종목은 (AMD, AAPL, NVDA, INTC) 순서네요.
마지막으로 가장 거래량이 많은 시기를 찾아보겠습니다.
stock_volume = stock[['Date','Volume']]
stock_volume['SUM'] = stock_volume.iloc[:, 1:].sum(axis=1)
stock_volume_ = stock_volume[['Date', 'SUM']]
monthly_sum = stock_volume_.resample('MS').sum()
monthly_sum = monthly_sum.reset_index()
fig = px.line(monthly_sum, x="Date", y="SUM")
fig.show()
weekly_sum = stock_volume_.resample('W-Mon').sum()
weekly_sum = weekly_sum.reset_index()
fig = px.line(weekly_sum, x="Date", y="SUM")
fig.show()
fig = px.line(stock_volume, x="Date", y="SUM")
fig.show()
3월의 거래량이 가장 많았고, 4월이 가장 낮았네요.
일별로 본다면 12월 15일에 가장 많은 거래량, 11월 24일에 가장 적은 거래량을 기록했습니다.
정리
yfinance는 위에서 활용했던 주가 데이터 이외에도 종목들의 정보도 제공하고 있습니다.
대부분의 주식 관련 정보는 검색하면 나오지만, 다량의 데이터를 활용해서 새로운 사실을 발견할 때 활용하면 좋을 것 같습니다.
'생존 도구🏹' 카테고리의 다른 글
GPT한테 SQL 쿼리 짜달라고 하기 (0) | 2024.03.17 |
---|---|
Python으로 이해하는 주가지표① - RSI(Relative Strength Index) (feat. 엔비디아) (0) | 2024.03.03 |
Retentioneering: 그 복잡한 product data를 간단하고 자유도 높게 다룰 수 있다고? (2) | 2023.12.17 |
아하모먼트: 왜 우리 서비스를 계속 써요? (0) | 2023.12.08 |
[Streamlit] 간단한 대시보드 배포하기(with. KBO 타격지표) (0) | 2023.07.02 |