데이터 분석 공부 기록

[kaggle] Tesla Stock Price Data 테슬라 주가 데이터 (2000-2025)

note818 2025. 3. 26. 23:24

Tesla Stock Price Data (2000-2025)

 

Tesla Stock Price Data (2000-2025)

Historical daily stock prices of Tesla from 2000 to 2025

www.kaggle.com

 

이번 포스팅에서는 테슬라(Tesla Inc.)의 2000년 1월부터 2025년 3월까지의 주가 데이터를 분석해보려고 합니다.
데이터에는 매일의 시가(Open), 고가(High), 저가(Low), 종가(Close), 거래량(Volume) 등의 정보가 담겨 있어, 시계열 분석이나 주가 패턴 탐색, 간단한 머신러닝 실험까지도 해볼 수 있을거같습니다 .

 

 

 

1. 테슬라 데이터 시각화

import matplotlib.pyplot as plt

# 시계열 그래프: 전체 기간 Close(종가) 추이
plt.figure(figsize=(14, 6))
plt.plot(df['Date'], df['Close'], label='Close Price')
plt.title('Tesla Stock Price (Close) Over Time')
plt.xlabel('Date')
plt.ylabel('Close Price')
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()

 

 

2019~2021년 사이 주가 급등



2020년 12월, 테슬라는 S&P 500 지수에 편입

지수 추종 펀드와 기관 투자자들의 대규모 매수를 유발하여 주가 상승을 촉진

 

전기차 시장의 성장과 생산 확대: 전 세계적으로 전기차에 대한 수요가 증가함에 따라, 테슬라는 모델 3와 모델 Y의 생산을 확대하고 중국 상하이 공장을 가동하여 시장 점유율을 높였습니다

 

주식 분할과 소매 투자자들의 관심 증가 2020년 8월, 테슬라는 5대 1 주식 분할을 단행하여 주식 접근성을 높였습니다.

 

 

가장 큰 하락폭을 기록한 날들

 

2021년 11월 9일

2022년 4월 26일

2024년 12월 18일 

하루에 30~46달러 이상 급락

 

 

1. 2021년 11월 9일:

  • 일론 머스크의 주식 매각 발표: 머스크 CEO는 자신의 테슬라 지분 10%를 매각할 의사를 트위터를 통해 밝혔습니다. 이로 인해 투자자들은 주가 하락을 우려하며 매도에 나섰습니다.

2. 2022년 4월 26일:

  • 트위터 인수에 따른 우려: 머스크의 트위터 인수 소식이 전해지면서, 투자자들은 그가 테슬라 경영에 집중하지 못할 것을 우려했습니다. 또한 인수 자금을 마련하기 위해 테슬라 주식을 추가로 매각할 가능성도 제기되었습니다. 

3. 2024년 12월 18일:

  • 연방준비제도이사회(Fed)의 금리 정책 발표: 이날 연준은 금리 인하를 발표했지만, 향후 금리 정책에 대한 불확실성이 커지면서 전체 주식시장이 하락했습니다. 특히 기술주인 테슬라도 이러한 시장 변동성의 영향을 받았습니다.

 

2. 지난날을 기준으로 다음 날의 주가를 예측할 수 있는가?

랜덤 포레스트 / XGBoost: 날짜, 이전 가격, 이동 평균, 거래량 등 다양한 특성을 기반으로 예측

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRegressor
from sklearn.metrics import mean_squared_error, r2_score

# 1. 데이터 불러오기
df = pd.read_csv('tesla.csv')

# 2. 헤더 재정의 및 정제
df.columns = df.iloc[0]
df = df.iloc[2:].copy()
df.columns = ['Date', 'Close', 'High', 'Low', 'Open', 'Volume']
df['Date'] = pd.to_datetime(df['Date'])
for col in ['Close', 'High', 'Low', 'Open', 'Volume']:
    df[col] = pd.to_numeric(df[col], errors='coerce')
df.dropna(inplace=True)

# 3. 파생 변수 생성
df['MA_5'] = df['Close'].rolling(5).mean()
df['MA_20'] = df['Close'].rolling(20).mean()
df['MA_60'] = df['Close'].rolling(60).mean()
df['Prev_Close'] = df['Close'].shift(1)
df['Prev_Volume'] = df['Volume'].shift(1)
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Day'] = df['Date'].dt.day
df['DayOfWeek'] = df['Date'].dt.dayofweek
df['Target'] = df['Close'].shift(-1)

df.dropna(inplace=True)

# 4. 입력값과 타깃값 설정
features = ['MA_5', 'MA_20', 'MA_60', 'Prev_Close', 'Prev_Volume', 'Year', 'Month', 'Day', 'DayOfWeek']
X = df[features]
y = df['Target']

# 5. 학습/테스트 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, shuffle=False, test_size=0.2)

# 6. 랜덤 포레스트 학습
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
rf_preds = rf_model.predict(X_test)

# 7. XGBoost 학습 (속도 고려해 estimator 줄임)
xgb_model = XGBRegressor(n_estimators=50, random_state=42)
xgb_model.fit(X_train, y_train)
xgb_preds = xgb_model.predict(X_test)

# 8. 성능 평가
print("🔎 Random Forest")
print("RMSE:", np.sqrt(mean_squared_error(y_test, rf_preds)))
print("R2:", r2_score(y_test, rf_preds))

print("\n🔎 XGBoost")
print("RMSE:", np.sqrt(mean_squared_error(y_test, xgb_preds)))
print("R2:", r2_score(y_test, xgb_preds))

# 9. 시각화
plt.figure(figsize=(14, 6))
plt.plot(y_test.values, label='Actual', linewidth=1.5)
plt.plot(rf_preds, label='RF Predicted', alpha=0.7)
plt.plot(xgb_preds, label='XGB Predicted', alpha=0.7)
plt.title('Actual vs Predicted Close Prices')
plt.xlabel('Test Data Index')
plt.ylabel('Close Price')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

결과값:

Random Forest 

RMSE: 22.469014986248165 

R2: 0.8827070239061944 

XGBoost RMSE:

23.764903684100492

R2: 0.8687872447544138

파란 선(실제 종가)을 중심으로 주황색(RF), 초록색(XGB) 선이 거의 유사한 흐름을

 

RMSE (Root Mean Squared Error)

  • 평균적으로 예측값이 실제값과 약 22~23달러 차이가 난다는 의미예요.
  • 테슬라 주가가 100~400달러 선을 오가는 걸 고려하면, 꽤 괜찮은 정확도입니다.

R² (설명력, 결정계수)

  • 0.88, 0.87은 88%, 87% 정도 예측이 설명 가능하다는 의미예요.
  • 일반적으로 0.8 이상이면 꽤 좋은 예측 성능으로 간주됩니다.
특히 추세 변화는 잘 잡아내고 있지만, 급등/급락일에는 약간의 오차발생


아무래도 주식은 차트 이외에도 뉴스나 외부 상황에도 영향을 받으니 그런것같다 (연준 금리나 회사 발표 이런것들)

급등 대응이 안되지만 전체적인 흐름으로는 좋은 성능을 보여줘서 

큰 흐름으로 투자 선택할때 참고용 자료로 쓰면 좋을거같다는 결론이다 

 

 

다음에는 한국 주식 자료도 가져와서 해보도록 하겠습니다.