[파이썬] 엔비디아 주식 예측 머신러닝 모델 만들고 평가까지 (최종)

2025. 1. 23. 10:32·Project/주식 & 비트코인 분석

개요

이전 편에서 데이터의 시각화를 통해 데이터에 대한 어느 정도의 인사이트를 얻었다. 

데이터를 보고 시각화 등의 기법을 통해, 데이터를 다각도로 살펴보고 의미있는 방점들을 찾아내는 것을

보통 EDA(Exploratory Data Analysis)라고 한다. 전처리 후엔 EDA를 수행한다.

이번 편에는 데이터의 이상치를 제거한 후, sklearn에서 제공하는 여러 모델들을 통해 간단하게 주식 예측 모델 학습과 평가를 해볼 것이다.

 

 

이상치

plt.figure(figsize = (5,3))
sns.boxplot(data = df)
plt.show()

이상치 확인은 여러 방식으로 할 수 있지만, 박스플롯이 가장 직관적이기에 좋다.

주가 데이터에 대한 박스플롯. Volume(거래량)에 이상치가 포진되어 있다.
주가 데이터에 대한 박스플롯. Volume(거래량)에 이상치가 포진되어 있다.

 

가격들은 비교적 안정적인 반편, 거래량은 가끔씩 껑충 뛰어오를 때가 있나보다. 이상치(흰 점)가 있는 모습.

 

Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
lb = Q1 - 1.5*IQR
ub = Q3 + 1.5*IQR
filter = ((df >= lb) & (df <= ub))
df_clean = df[filter.all(axis=1)]

중요한 코드다. 주의할 점도 있다. 일단 퍼센타일과 IQR을 구해서 상방과 하방을 만드는 건 쉽다.

6번째 줄 코드에 있는 조건문을 데이터프레임에 넣는 논리에서 all이라는 코드가 사용되었다.

  • df객체를 사용하고 있기 때문에, lb와 ub 역시 여러 열을 가진다.
  • 그렇기 때문에, filter 뒤에 all(모든 열이 조건에 충족되어야 참)을 넣는다. (axis=1은 열을 의미.)

 

plt.figure(figsize = (5,3))
sns.boxplot(df_clean)

이상치인 흰 점이 사라진 모습!
이상치인 흰 점이 사라진 모습!

 

모델 학습

from sklearn.model_selection import train_test_split
X = df_clean.drop('Open',axis=1)
y = df_clean['Open']
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2)

사실 모든 가격 종류에 대해 학습은 가능하지만, 시가로 골랐다.

데이터 나눠주고, 분리까지 바로 수행.

 

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, AdaBoostRegressor
from sklearn.svm import SVR
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

필요한 모델 및 평가치를 import 해준다. 사실상 연속형 변수를 예측할 수 있는 대부분의 모델을 사용했다.

선형회귀, 릿지, 라쏘, 의사결정나무, 랜덤포레스트, GBR, Adaboost, 서포트벡터, KNN까지!

개념이나 이해는 유튜브, 사이킷런 공식 홈페이지, ChatGPT 등 다양한 곳에서 도움을 받았다..

 

models = {
    'LinearRegression' : LinearRegression(),
    'Ridge' : Ridge(),
    'Lasso' : Lasso(),
    'DecisionTreeRegressor' : DecisionTreeRegressor(),
    'RandomForestRegressor' : RandomForestRegressor(),
    'GradientBoostingRegressor' : GradientBoostingRegressor(),
    'AdaBoostRegressor' : AdaBoostRegressor(),
    'SVR' : SVR(),
    'KNeighborsRegressor' : SVR()
}

보통은 하나의 모델을 학습한 후에 그 모델에 대한 평가가 이루어지지만, 많은 모델을 배우고 나서 드는 생각은,

각각의 데이터에 적합한 모델을 찾아줘야 한다는 것이다. 모든 모델이 모든 데이터에 적합할 수 없다.

딕셔너리에 모델의 이름과 모델 함수를 쌍으로 넣은 후, for문을 통해 모두 학습시켜 평가하면

각각의 모델을 비교할 수 있다.

 

result = []
for name,model in models.items() :
    model.fit(X_train,y_train)
    y_pred = model.predict(X_test)
    
    r2 = r2_score(y_pred,y_test)
    mse = mean_squared_error(y_pred,y_test)
    mae = mean_absolute_error(y_pred,y_test)

    scores = {
        'model' : name,
        'r2_score' : r2,
        'mse' : mse,
        'mae' : mae
    }
    result.append(scores)
    
result = pd.DataFrame(result)
  • models.items : 딕셔너리 객체 뒤에 items를 붙이게 되면, key와 value를 튜플 형태로 반환한다.
  • result 라는 빈 리스트에 scores라는 딕셔너리를 append(추가)한다.
  • 딕셔너리가 있는 리스트에 pd.DataFrame을 수행하게 되면, key가 열이 되고, value가 행이 된다.

 

model, r2_score, mse, mae 가 열이 된 모습.
model, r2_score, mse, mae 가 열이 된 모습.

 

우리의 목적은 모델별로 각각의 수치를 막대 그래프로 나타내는 것이다.

"모델별" 이라는 것은 X = 'model' 으로 할 수 있지만, "각각의 수치" 는 Seaborn의 hue 옵션이 필요하다.

hue는 하나의 열을 기준으로 수행하기 때문에, melt를 통해 행/열 변환을 수행한다.

 

result_melted = result.melt(id_vars='model', var_name = 'metric', value_name = 'score')
  • id_vars : 행/열 변환에서 변하지 않는 기준점.
  • var_name : 열(r2_score, mse, mae)이 변환되어 만들어질 범주형 변수의 열 이름.
  • value_name : 기존 연속형 변수들이 포함될 열에 붙일 열 이름. 

 

행/열 변환이 잘 된 모습.
행/열 변환이 잘 된 모습.

 

plt.figure(figsize = (10,5))

result_melted.iloc[2,2] = 0

sns.barplot(data = result_melted, x = 'model', y = 'score', hue = 'metric', palette = 'hls')
plt.xticks(rotation=90)
plt.title('NVDA Stock Price : Scores of Regression Models')
plt.show()

result_melted 의 값 중 하나가 0으로 지정되는 코드가 있는데, 저 변수는 라쏘 모델의 r2_score 이다.

막대그래프 코드의 경우, 하나의 값이 매우 극단적이면 상대적으로 일반적인 다른 변수들은

거의 볼 수 없게 만들어진다. 그래서 0으로 치환하여 표현하기도 한다.

 

평가 최종 결과

학습한 모델들의 평가치 결과. 라쏘 모델을 제외하고 대부분 훌륭한 결과가 나타났다.
학습한 모델들의 평가치 결과. 라쏘 모델을 제외하고 대부분 훌륭한 결과가 나타났다.

 

후기

사실 가격 간의 선형성은 크게 엇나가지 않는 한 모델 학습의 결과가 좋을 수 밖에 없다.

그렇기 때문에, 다음 편에서는 특정 산업군의 여러 주식을 비교하거나, ETF 등 파생상품 등을 비교해서

더욱 의미있는 분석을 해보고 싶다!

 

 

관련 포스팅

 

[파이썬] 엔비디아 주가 분포 & 추세 분석하기 (시각화 편)

개요이전 편에서 야후 금융 데이터를 받아서 필요한 전처리를 모두 수행했다. 올바른 데이터가 모두 갖춰졌다면 분석을 통해서 인사이트를 얻고, 그것을 직관적인 형태로 보고까지 해야한다."

skrrdevlog.tistory.com

 

 

[파이썬] 야후 주식API와 파이썬으로 엔비디아 주가분석 (전처리/스케일링 편)

개요데이터분석에 대한 기본 개념과 파이썬이라는 언어에 익숙해졌다면, 여러 종류의 데이터를 가지고 연습을 해봐야실력이 늘기 마련이다. 여러 도메인 (경제, 사회, 자연어, 정치 등) 에 대한

skrrdevlog.tistory.com

 

 

[파이썬/Python] Seaborn + Matplotlib 으로 시각화 총정리 (1)

개요파이썬의 시각화 라이브러리 하면 Matplotlib 이지만, 코드가 너무 자유로운 탓에 다양한 시각화를 하기엔코드가 길어질 수 있다. Heatmap, Grid 등 유용한 플롯들을 코드 한두줄로 작성할 수 있는

skrrdevlog.tistory.com

 

'Project > 주식 & 비트코인 분석' 카테고리의 다른 글

[파이썬/Python] AI 반도체 주식 분석하기!📉📈(이동평균 & 수익률)  (3) 2025.01.28
[파이썬/Python] 나스닥 AI 반도체 주요 기업들 주식 분석하기!📉📈(주가 편)  (10) 2025.01.25
[파이썬] 엔비디아 주식 분포 & 추세 분석하기 (시각화 편)  (16) 2025.01.21
[파이썬] 야후 주식API와 파이썬으로 엔비디아 주가분석 (전처리/스케일링 편)  (2) 2025.01.19
'Project/주식 & 비트코인 분석' 카테고리의 다른 글
  • [파이썬/Python] AI 반도체 주식 분석하기!📉📈(이동평균 & 수익률)
  • [파이썬/Python] 나스닥 AI 반도체 주요 기업들 주식 분석하기!📉📈(주가 편)
  • [파이썬] 엔비디아 주식 분포 & 추세 분석하기 (시각화 편)
  • [파이썬] 야후 주식API와 파이썬으로 엔비디아 주가분석 (전처리/스케일링 편)
흑석동사는시골쥐
흑석동사는시골쥐
문과 경영학도 숫자 배우기 프로젝트
  • 흑석동사는시골쥐
    NaN
    흑석동사는시골쥐
  • 전체
    오늘
    어제
  • 링크

    • 독서 일지
    • 올리고 싶은 거 올려요
    • 분류 전체보기 (75)
      • Coding & Data Analysis (52)
        • Python (23)
        • R (21)
        • Excel & Data (2)
        • Git & Github (4)
        • Certificate (2)
      • Project (15)
        • 일자리 스크래핑 서비스 (8)
        • 최적의 인스타 피드 (2)
        • 주식 & 비트코인 분석 (5)
      • Economics (1)
        • 경제기사 스크랩 (1)
      • Records & Thoughts (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 공지사항

  • 인기 글

  • 태그

    심장병 데이터
    데이터분석
    전처리
    비전공자
    AI반도체
    데이터
    기초
    코랩
    데이터수집
    엔비디아
    자격증
    git
    개발
    시각화
    adsp공부법
    지도
    ADSP
    주가분석
    웹스크래퍼
    동아리
    프로그래밍
    파이썬
    다항회귀
    Colab
    Python
    r
    주식
    머신러닝
    matplotlib
    FLASK
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
흑석동사는시골쥐
[파이썬] 엔비디아 주식 예측 머신러닝 모델 만들고 평가까지 (최종)
상단으로

티스토리툴바