Python을 활용한 주식 데이터 분석

이번 포스팅에서는 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()
지난 3개월 동안의 애플, 마이크로소프트, 아마존, 구글의 주가 변동

다른 관점을 분석해 볼 수 있습니다.

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()
APPL 이동 평균
AMZN 이동 평균
GOOGL 이동 평균
MSFT 이동 평균



모든 회사 주식의 변동성 시각화

주식 분석의 맥락에서 변동성은 주식 가격이나 전체 시장 가격의 변동 정도를 나타냅니다. 특정 기간 동안 주식 등 금융 상품의 가격이 오르거나 내리는 비율을 측정합니다.

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으로 변환합니다.
모든 회사의 변동성 시각화

출력에는 각각 다른 회사를 나타내는 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’로 변경합니다.

애플과 구글의 상관관계

두 회사의 주식 실적은 업계 동향, 시장 상황, 공유 비즈니스 파트너 또는 고객과 같은 요인의 영향을 받을 가능성이 큰 상관 관계를 나타냅니다.

이러한 긍정적인 상관관계는 투자자들이 두 회사에 투자하여 포트폴리오를 다양화할 수 있는 기회를 제공합니다. 그렇게 함으로써 두 주식이 제공하는 비슷한 수준의 수익과 위험으로부터 잠재적으로 이익을 얻을 수 있습니다.

이번 포스팅에서는 Python을 활용한 주식 데이터 분석 방법을 간단한 예제를 통하여 수행해 보았습니다. 이러한 접근을 익혀 데이터 분석에 대한 접근 방법을 배워 나가면 좋겠습니다.

감사합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다