이번 포스팅에서는 Python을 활용한 주식 데이터 분석 방법에 대해서 알아 보겠습니다. 실습 데이터는 지난 3개월간 Apple, Microsoft, Amazon, Google 주가입니다. 지난 3개월 동안 위의 주가 4개를 분석한 결과를 보여 드리겠습니다.
데이터 가져오기
먼저, 주식 시장 데이터를 수집하는 인기 오픈 소스 라이브러리인 yfinance와 분석을 위한 기타 중요한 라이브러리를 가져옵니다.
!pip install yfinance
import pandas as pd
import yfinance as yf
import plotly.express as px
from datetime import datetime
분석을 위한 시작 날짜 및 종료 데이터를 정의합니다. (지난 3개월 데이터)
startDate = datetime.now() - pd.DateOffset(months = 3)
endDate = datetime.now()
거래 목적으로 증권에 할당된 고유한 일련의 문자인 티커를 정의하겠습니다. 앞서 언급 했듯이 Apple, Microsoft, Amazon 및 Google 주식에 대해 분석하겠습니다.
tickers = ['AAPL', 'MSFT', 'AMZN', 'GOOGL']
여기에서 위에 정의된 날짜의 주식 데이터를 가져와서 살펴 보겠습니다. 각 주식을 반복하고 데이터를 가져온 다음 해당 데이터를 리스트에 추가합니다.
# 빈 리스트 정의
dfList = []
for ticker in tickers:
data = yf.download(ticker, start = startDate, end = endDate)
dfList.append(data)
stockData = pd.concat(dfList, keys = tickers, names = ['Ticker', 'Date'])
stockData = stockData.reset_index()
stockData.head(100)
----------------------------------------------------------------------------------------------
Ticker Date Open High Low Close Adj Close Volume
0 AAPL 2023-09-25 174.199997 176.970001 174.149994 176.080002 175.848328 46172700
1 AAPL 2023-09-26 174.820007 175.199997 171.660004 171.960007 171.733749 64588900
2 AAPL 2023-09-27 172.619995 173.039993 169.050003 170.429993 170.205750 66921800
3 AAPL 2023-09-28 169.339996 172.029999 167.619995 170.690002 170.465424 56294400
4 AAPL 2023-09-29 172.020004 173.070007 170.339996 171.210007 170.984741 51814200
... ... ... ... ... ... ... ... ...
95 MSFT 2023-11-08 361.679993 363.869995 360.549988 363.200012 362.464325 26767800
96 MSFT 2023-11-09 362.299988 364.790009 360.359985 360.690002 359.959412 24847300
97 MSFT 2023-11-10 361.489990 370.100006 361.070007 369.670013 368.921234 28042100
98 MSFT 2023-11-13 368.220001 368.470001 365.899994 366.679993 365.937256 19986500
99 MSFT 2023-11-14 371.010010 371.950012 367.350006 370.269989 369.519989 27683900
100 rows × 8 columns
데이터를 준비한 후 분석 요구 사항을 정의합니다.
요구사항 식별
요구사항 식별은 “위의 데이터로 무엇을 하시겠습니까?”라는 간단한 질문으로 시작할 수 있습니다.
- 지난 3개월 동안 4개 주식에 대한 주식 성과(측정항목: 종가) 비교
- 10단계와 30단계의 롤링 창을 사용하여 이동 평균 비교
(롤링 창 지표는 기술 분석에 널리 사용되며 금융 시장 분석을 위해 거래자와 투자자 사이에서 인기 있는 도구입니다) - 모든 회사 주식의 변동성 시각화
- 애플과 구글 주가의 상관관계 분석
지난 3개월 동안 4개 주식에 대한 주식 성과(측정항목: 종가) 비교
fig = px.line(df, x = 'Date',
y = 'Close',
color = 'Ticker',
title = "지난 3개월 동안의 주식 성과")
fig.show()
다른 관점을 분석해 볼 수 있습니다.
fig = px.area(stockData, x = 'Date', y='Close',
facet_col='Ticker',
labels={'Date':'Date', 'Close':'Closing Price', 'Ticker':'Company'},
title='Stock Prices for Apple, Microsoft, Amazon, and Google')
fig.show()
10단계와 30단계의 롤링 윈도우를 사용한 이동 평균 비교
롤링 윈도우 지표는 기술적 분석에 널리 사용되며 금융 시장 분석을 위해 트레이더와 투자자들 사이에서 인기 있는 도구입니다.
stockData['MA10'] = stockData.groupby('Ticker')['Close'].rolling(window = 10).mean().reset_index(0, drop = True)
stockData['MA20'] = stockData.groupby('Ticker')['Close'].rolling(window = 30).mean().reset_index(0, drop = True)
- 코드설명
- stockData.groupby(‘Ticker’)[‘Close’]: DataFrame ‘stockData’를 ‘Ticker’ 열로 그룹화하고 각 그룹에 대해 ‘Close’ 열을 선택
- .rolling(window=10).mean(): 각 ‘Close’ 가격 그룹에 대해 창 크기 10의 이동 평균을 계산합니다. 그룹 내 각 행에 대해 현재 값을 포함하여 이전 10개 값의 평균을 계산합니다.
- .reset_index(0, drop=True): 결과 Series의 인덱스를 0부터 시작하도록 재설정하고 이전 인덱스를 삭제합니다. Series를 다시 DataFrame으로 변환합니다.
- stockData[‘MA10’] = …: 계산된 이동 평균 값을 ‘stockData’ DataFrame의 ‘MA10’이라는 새 열에 할당합니다.
for ticker, group in stockData.groupby('Ticker'):
fig = px.line(group, x = 'Date', y = ['Close', 'MA10', 'MA30'],title = f"{ticker} 이동 평균")
fig.show()
모든 회사 주식의 변동성 시각화
주식 분석의 맥락에서 변동성은 주식 가격이나 전체 시장 가격의 변동 정도를 나타냅니다. 특정 기간 동안 주식 등 금융 상품의 가격이 오르거나 내리는 비율을 측정합니다.
stockData['Volatility'] = stockData.groupby('Ticker')['Close'].pct_change().rolling(window = 10).std().reset_index(0, drop = True)
fig = px.line(stockData, x = 'Date', y = 'Volatility',
color = 'Ticker',
title = '모든 회사의 변동성 시각화')
fig.show()
- 코드 설명
- stockData[‘Volatility’] = stockData.groupby(‘Ticker’)[‘Close’].pct_change()
- stockData.groupby(‘Ticker’)[‘Close’]: DataFrame ‘stockData’를 ‘Ticker’ 열로 그룹화하고 각 그룹에 대해 ‘Close’ 열을 선택
- .pct_change(): 각 그룹의 ‘종가’ 가격 변동률을 계산합니다. 현재 값과 이전 값 간의 백분율 차이를 계산합니다.
- stockData[‘Volatility’] = …: 계산된 백분율 변화 값을 ‘stockData’ DataFrame의 ‘Volatility’라는 새 열에 할당합니다.
- .rolling(window=10).std().reset_index(0, drop=True)
- .rolling(window=10): 이전 단계에서 계산된 ‘Volatility’ 값에 크기 10의 롤링 윈도우를 적용합니다. 10개의 연속 기간으로 구성된 그룹으로 값을 그룹화합니다.
- .std(): 각 롤링 창 내 ‘변동성’ 값의 표준 편차를 계산합니다. 표준 편차는 값 집합의 분산 또는 변동성을 측정합니다.
- .reset_index(0, drop=True): 결과 Series의 인덱스를 0부터 시작하도록 재설정하고 이전 인덱스를 삭제합니다. Series를 다시 DataFrame으로 변환합니다.
- stockData[‘Volatility’] = stockData.groupby(‘Ticker’)[‘Close’].pct_change()
출력에는 각각 다른 회사를 나타내는 4개의 개별 그래프가 표시됩니다.
애플과 구글 주가의 상관관계 분석
# 애플과 구글의 주가를 가지는 데이터 프레임 생성
apple = stockData.loc[stockData['Ticker'] == 'AAPL', ['Date', 'Close']].rename(columns = {'Close': 'AAPL'})
google = stockData.loc[stockData['Ticker'] == 'MSFT', ['Date', 'Close']].rename(columns = {'Close': 'GOOGL'})
appleGoogleCorr = pd.merge(apple, google, on = 'Date')
# 상관관계를 보여주는 scatter plot 생성하기
fig = px.scatter(appleGoogleCorr, x = 'AAPL', y = 'GOOGL',
trendline='ols',
title='애플과 구글의 상관관계')
fig.show()
- 코드 설명
- stockData.loc[stockData[‘Ticker’] == ‘AAPL’, [‘Date’, ‘Close’]].rename(columns={‘Close’: ‘AAPL’}):
- stockData[‘Ticker’] == ‘AAPL’: 이 조건은 ‘Ticker’ 열이 ‘AAPL’과 동일한 ‘stockData’ DataFrame의 행을 필터링합니다.
- [‘Date’, ‘Close’]: 필터링된 행에 대한 ‘Date’ 및 ‘Close’ 열을 선택합니다.
- .rename(columns={‘Close’: ‘AAPL’}): 결과 DataFrame에서 ‘Close’ 열의 이름을 ‘AAPL’로 변경합니다.
- stockData.loc[stockData[‘Ticker’] == ‘AAPL’, [‘Date’, ‘Close’]].rename(columns={‘Close’: ‘AAPL’}):
두 회사의 주식 실적은 업계 동향, 시장 상황, 공유 비즈니스 파트너 또는 고객과 같은 요인의 영향을 받을 가능성이 큰 상관 관계를 나타냅니다.
이러한 긍정적인 상관관계는 투자자들이 두 회사에 투자하여 포트폴리오를 다양화할 수 있는 기회를 제공합니다. 그렇게 함으로써 두 주식이 제공하는 비슷한 수준의 수익과 위험으로부터 잠재적으로 이익을 얻을 수 있습니다.
이번 포스팅에서는 Python을 활용한 주식 데이터 분석 방법을 간단한 예제를 통하여 수행해 보았습니다. 이러한 접근을 익혀 데이터 분석에 대한 접근 방법을 배워 나가면 좋겠습니다.
감사합니다.