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년도 까지 데이터를 불러온다.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:

ig = plt.figure()는 figure가 다음 cell에서 안겹치기 위해 사용IONQ[('Open', 'IONQ')].plot 은 MultiIndex# 각 데이터의 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으로 하루 당 시가로 총 거래액 확인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():Open) 데이터를 기준으로 50일 이동 평균 계산rolling(200).mean():MA50 (50일 이동 평균):
MA200 (200일 이동 평균):
단기 vs 장기 추세 비교:
주가와 이동 평균선의 위치:
추세의 안정성:
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:

여러 변수 간의 관계를 시각적으로 분석AlphaOpen과 IntelOpen의 산점도를 보면, 점들이 대체로 증가하는 직선에 가깝게 분포 → 양의 상관관계를 나타냄.IBMOpen과 IONQOpen은 산점도가 흩어진 형태 → 상관관계가 낮음.#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()

IONQ['returns'] = (IONQ['Close']/IONQ['Close'].shift(1)) -1
shift(1): 데이터를 한칸 아래, 즉 이전 날 종가
수익률 분포를 비교하여 변동성을 시각적으로 평가
참고:
https://www.analyticsvidhya.com/blog/2021/07/stock-prices-analysis-with-python/