주가 분석

코딩다시시작·2024년 11월 27일

빅데이터분석

목록 보기
19/19

양자컴퓨터 데이터 분석을 해보자

총 5개의 양자컴퓨터 주식

  1. IONQ
  2. IBM
  3. Intel
  4. Alpha
  5. HON

python 코드


라이브러리 및 데이터 불러오기

import pandas as pd
import datetime
import numpy as np
import matplotlib.pyplot as plt
from pandas.plotting import scatter_matrix
import yfinance as yf
#%matplotlib inline

start = "2021-11-26"
end = '2024-11-26'
IONQ = yf.download('IONQ',start,end)
IBM = yf.download('IBM',start,end)
Intel = yf.download('INTC',start,end)
Alpha = yf.download('GOOG',start,end)
HON = yf.download('HON',start,end)
  • from pandas.plotting import scatter_matrix 는 2차원 산점도 분석을 위해 사용
  • yfinance로 주가 데이터를 쉽게 불러올 수 있다.
  • start, end 보면 2021/11/26년 부터 2024/11/26년도 까지 데이터를 불러온다.

탐색적 데이터 분석 (EDA)

IONQ.info()

out:

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 754 entries, 2021-11-26 to 2024-11-25
Data columns (total 6 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   (Adj Close, IONQ)  754 non-null    float64
 1   (Close, IONQ)      754 non-null    float64
 2   (High, IONQ)       754 non-null    float64
 3   (Low, IONQ)        754 non-null    float64
 4   (Open, IONQ)       754 non-null    float64
 5   (Volume, IONQ)     754 non-null    int64  
dtypes: float64(5), int64(1)
memory usage: 41.2 KB

Alpha.head()

out:

  • dtype이 다 int 아니면 float이라 라벨링 필요 없음
  • 결측치 없음
  • open 시가
  • close 종가
  • Volume 거래량

주가 시각화

ig = plt.figure()

IONQ[('Open', 'IONQ')].plot(label = 'IONQ', figsize = (15,7))
IBM[('Open', 'IBM')].plot(label = "IBM")
Intel[('Open', 'INTC')].plot(label = 'Intel')
Alpha[('Open', 'GOOG')].plot(label='Alpha')
HON[('Open', 'HON')].plot(label='HON')


plt.grid()

plt.legend()

plt.title('Stock Price')

plt.show()

out:

  • 5개 회사의 주가를 한 눈으로 비교할 수 있다.
  • ig = plt.figure()는 figure가 다음 cell에서 안겹치기 위해 사용
  • IONQ[('Open', 'IONQ')].plotMultiIndex

거래량 보기

# 각 데이터의 Volume 열 추출 (MultiIndex를 올바르게 참조)
plt.figure(figsize=(15, 7))  # 그래프 크기 지정
IONQ[('Volume', 'IONQ')].plot(label='IONQ')
IBM[('Volume', 'IBM')].plot(label='IBM')
Intel[('Volume', 'INTC')].plot(label='Intel')
Alpha[('Volume', 'GOOG')].plot(label='Alpha')
HON[('Volume', 'HON')].plot(label='HON')

# 그래프 제목 및 범례 추가
plt.title('Volume of Stock Traded')
plt.xlabel('Date')
plt.ylabel('Volume')
plt.legend()
plt.show()

out:

  • 거래량을 한 눈에 비교 가능

시가 총액 계산

#Market Capitalisation
IONQ['MarktCap'] = IONQ['Open'] * IONQ['Volume']
IBM['MarktCap'] = IBM['Open'] * IBM['Volume']
Intel['MarktCap'] = Intel['Open'] * Intel['Volume']
Alpha['MarktCap'] = Alpha['Open'] * Alpha['Volume']
HON['MarktCap'] = HON['Open'] * HON['Volume']


IONQ['MarktCap'].plot(label = 'IONQ', figsize = (15,7))
IBM['MarktCap'].plot(label = 'IBM')
Intel['MarktCap'].plot(label = 'Intel')
Alpha['MarktCap'].plot(label='Alpha')
HON['MarktCap'].plot(label='HON')
plt.title('Market Cap')
plt.legend()

out:

  • open * volume으로 하루 당 시가로 총 거래액 확인

단기(50일) 장기(200)일 이동 평균 계산

IONQ['MA50'] = IONQ['Open'].rolling(50).mean()
IONQ['MA200'] = IONQ['Open'].rolling(200).mean()
IONQ['Open'].plot(figsize = (15,7))
IONQ['MA50'].plot()
IONQ['MA200'].plot()

out:

  • rolling(50).mean():
    • IONQ의 시가(Open) 데이터를 기준으로 50일 이동 평균 계산
    • 최근 50일 동안의 주가 평균을 구해 갱신
  • rolling(200).mean():
    • IONQ의 시가 데이터를 기준으로 200일 이동 평균 계산
    • 최근 200일 동안의 주가 평균을 구해 매일 갱신

이동평균의 의미

  1. MA50 (50일 이동 평균):

    • 단기적인 주가 추세를 파악하는 데 사용
    • 주가가 MA50 위에 있으면 단기적으로 강세를 나타냄
    • 주가가 MA50 아래로 떨어지면 약세를 나타냄
  2. MA200 (200일 이동 평균):

    • 장기적인 주가 추세를 파악하는 데 사용
    • 주가가 MA200 위에 있으면 장기적으로 강세
    • 주가가 MA200 아래로 떨어지면 약세

그래프의 해석

  1. 단기 vs 장기 추세 비교:

    • MA50(50일선)과 MA200(200일선)의 교차점에서 중요한 신호를 포착
      • 골든 크로스(Golden Cross): MA50이 MA200을 상향 돌파 → 상승 신호.
      • 데드 크로스(Dead Cross): MA50이 MA200을 하향 돌파 → 하락 신호.
  2. 주가와 이동 평균선의 위치:

    • 주가(Open)가 이동 평균선 위에 있으면 상승 추세.
    • 주가가 이동 평균선 아래에 있으면 하락 추세.
  3. 추세의 안정성:

    • MA200은 장기 추세를 반영하므로, MA50보다 덜 민감하고 부드러운 곡선을 그림.
    • MA50은 MA200보다 주가 변화에 민감하여 더 빠르게 반응.

산점도로 상관관계 살펴보기

data = pd.concat([IONQ['Open'],IBM['Open'],Intel['Open'],Alpha['Open'],HON['Open']],axis = 1)
data.columns = ['IONQOpen','IBMOpen','IntelOpen','AlphaOpen','HONOpen']
scatter_matrix(data, figsize = (8,8), hist_kwds= {'bins':250})

out:

  • 여러 변수 간의 관계시각적으로 분석
  • 직선에 가까운 패턴을 보이면 두 변수 간의 상관관계가 높음
  • 점들이 무작위로 분포한다면 상관관계가 낮거나 없음을 나타냄
  • AlphaOpenIntelOpen의 산점도를 보면, 점들이 대체로 증가하는 직선에 가깝게 분포 → 양의 상관관계를 나타냄.
  • IBMOpenIONQOpen은 산점도가 흩어진 형태 → 상관관계가 낮음.

수익률 계산

#Volatility
IONQ['returns'] = (IONQ['Close']/IONQ['Close'].shift(1)) -1
IBM['returns'] = (IBM['Close']/IBM['Close'].shift(1))-1
Intel['returns'] = (Intel['Close']/Intel['Close'].shift(1)) - 1
Alpha['returns'] = (Alpha['Close']/Alpha['Close'].shift(1))-1
HON['returns'] = (HON['Close']/HON['Close'].shift(1)) - 1

IONQ['returns'].hist(bins = 100, label = 'IONQ', alpha = 0.5, figsize = (15,7))
IBM['returns'].hist(bins = 100, label = 'IBM', alpha = 0.5)
Intel['returns'].hist(bins = 100, label = 'Intel', alpha = 0.5)
Alpha['returns'].hist(bins = 100, label = 'Alpha', alpha = 0.5)
HON['returns'].hist(bins = 100, label = 'HON', alpha = 0.5)


plt.legend()

수익률=오늘의 종가어제의 종가1\text{수익률} = \frac{\text{오늘의 종가}}{\text{어제의 종가}} - 1
IONQ['returns'] = (IONQ['Close']/IONQ['Close'].shift(1)) -1
  • shift(1): 데이터를 한칸 아래, 즉 이전 날 종가

  • 수익률 분포를 비교하여 변동성을 시각적으로 평가

    • 스토그램의 폭이 넓으면 해당 주식의 수익률 변동성이 크다는 것
    • 폭이 좁고 중심에 몰려 있으면 변동성이 작다는 것

참고:
https://www.analyticsvidhya.com/blog/2021/07/stock-prices-analysis-with-python/

profile
gpt로 다시 배우는 개발

0개의 댓글