💡 비트코인(BTC) 가격을 머신러닝을 활용해 예측해봅시다!


1️⃣ 비트코인 가격 예측이 가능한가요?

📌 비트코인(BTC)은 변동성이 매우 크지만, 과거 데이터를 분석하여 예측할 수 있습니다.
LSTM(Long Short-Term Memory) 모델을 활용하면 시계열 데이터(과거 가격)를 기반으로 미래 가격을 예측할 수 있음
✔ 하지만 시장 뉴스, 규제, 글로벌 경제 상황 등 외부 변수 때문에 100% 정확한 예측은 어려움

🎯 오늘은 LSTM을 사용해 비트코인 가격을 예측하는 머신러닝 모델을 만들어보겠습니다!


2️⃣ 사용 도구 & 라이브러리

비트코인 가격 데이터를 가져오고 머신러닝 모델을 학습하기 위해 Python 라이브러리를 사용합니다.

🔹 필수 라이브러리 설치

!pip install pandas numpy matplotlib tensorflow scikit-learn pandas-datareader

🔹 라이브러리 불러오기

import numpy as np  
import pandas as pd  
import matplotlib.pyplot as plt  
import pandas_datareader as web  
import tensorflow as tf  

from sklearn.preprocessing import MinMaxScaler  
from tensorflow.keras.models import Sequential  
from tensorflow.keras.layers import Dense, LSTM

3️⃣ 비트코인 가격 데이터 가져오기

📌 야후 파이낸스(Yahoo Finance)에서 비트코인(BTC-USD) 데이터를 가져옵니다.

# 비트코인(BTC) 가격 데이터 불러오기
df = web.DataReader('BTC-USD', data_source='yahoo', start='2014-01-01', end='2025-01-01')

# 데이터 확인
print(df.head())

# 종가(Close) 시각화
plt.figure(figsize=(12, 6))
plt.plot(df['Close'], label='Bitcoin Price')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.legend()
plt.show()

4️⃣ 데이터 전처리

📌 LSTM 모델을 위해 데이터 정규화 및 훈련/테스트 데이터 분할이 필요합니다.
MinMaxScaler를 사용하여 데이터 정규화
훈련 데이터(Training Set)와 테스트 데이터(Test Set) 분리

# 종가(Close) 데이터만 사용
data = df.filter(['Close'])

# numpy 배열로 변환
dataset = data.values  

# 데이터 정규화 (0~1 사이 값으로 변환)
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(dataset)

# 훈련 데이터 80%, 테스트 데이터 20%로 분할
training_data_len = int(len(scaled_data) * 0.8)

train_data = scaled_data[:training_data_len]
test_data = scaled_data[training_data_len:]

5️⃣ LSTM 모델을 위한 데이터 준비

📌 LSTM 모델은 일정 기간(예: 60일) 동안의 데이터를 학습하여 다음 날의 가격을 예측합니다.

# 훈련 데이터셋 만들기 (과거 60일 데이터를 사용하여 다음 날 가격 예측)
x_train, y_train = [], []
for i in range(60, len(train_data)):
    x_train.append(train_data[i-60:i, 0])
    y_train.append(train_data[i, 0])

# numpy 배열로 변환
x_train, y_train = np.array(x_train), np.array(y_train)

# LSTM 입력 형태에 맞게 데이터 reshape (samples, time steps, features)
x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))

6️⃣ LSTM 모델 만들기 & 학습

📌 LSTM 모델 구조
✔ 2개의 LSTM 레이어
✔ 1개의 Dense(출력) 레이어
✔ 손실 함수: mean_squared_error (MSE)

# LSTM 모델 생성
model = Sequential([
    LSTM(50, return_sequences=True, input_shape=(x_train.shape[1], 1)),
    LSTM(50, return_sequences=False),
    Dense(25),
    Dense(1)
])

# 모델 컴파일
model.compile(optimizer='adam', loss='mean_squared_error')

# 모델 학습
model.fit(x_train, y_train, batch_size=16, epochs=50)

7️⃣ 모델 테스트 & 예측

📌 테스트 데이터로 예측해보기

# 테스트 데이터 준비
x_test, y_test = [], test_data[60:]

for i in range(60, len(test_data)):
    x_test.append(test_data[i-60:i, 0])

x_test = np.array(x_test)
x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))

# 예측 수행
predictions = model.predict(x_test)

# 데이터 원래 값으로 변환 (정규화 복원)
predictions = scaler.inverse_transform(predictions)


 

8️⃣ 예측 결과 시각화

📌 실제 종가와 예측값을 비교하는 그래프 그리기

# 실제 값과 예측 값 비교
train = data[:training_data_len]
valid = data[training_data_len:].copy()
valid['Predictions'] = predictions

# 그래프 그리기
plt.figure(figsize=(14, 6))
plt.plot(train['Close'], label='Train')
plt.plot(valid['Close'], label='Actual Price')
plt.plot(valid['Predictions'], label='Predicted Price')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.legend()
plt.show()
 
 

9️⃣ 모델 성능 평가 (RMSE)

📌 **RMSE(Root Mean Squared Error)**를 사용하여 모델 정확도를 측정

from sklearn.metrics import mean_squared_error

rmse = np.sqrt(mean_squared_error(valid['Close'], valid['Predictions']))
print(f'📊 모델 RMSE: {rmse:.2f}')

RMSE 값이 낮을수록 모델이 더 정확합니다!


🎯 마무리

오늘은 LSTM을 활용한 비트코인 가격 예측 모델을 만들었습니다!
✅ Yahoo Finance에서 비트코인 가격 데이터 가져오기
✅ 데이터 전처리 & 정규화
✅ LSTM 모델 설계 & 학습
✅ 실제 데이터와 예측값 비교
✅ 모델 성능 평가

💡 더 높은 정확도를 원한다면 더 많은 데이터, 하이퍼파라미터 튜닝, 추가적인 피처 엔지니어링이 필요합니다! 🚀

 

+ Recent posts