[파이썬] 업비트 비트코인 머신러닝 가격예측 2

2024. 1. 24. 19:02자동매매/업비트

반응형

https://skydance.tistory.com/54

 

[파이썬] 업비트 비트코인 머신러닝 가격예측 1

우선 파이캐럿을 설치할때 충돌이 있을 수 있으니, 아래의 블로그를 참고해서 가상환경을 새로 만들고, 파이캐럿 설치 및 주피터 노트북 커널 연결까지 완료해서 환경 구축을 완료 한다. https://3

skydance.tistory.com

 

 

 

아래의 코드를 실행해서 지난번과 동일하게 비트코인 가격에 대한 csv 파일을 불러오고, 각종 지표에 대한 내용을 추가한 다음, 내일의 가격을 예측하기 위해서 'Close' 칼럼의 값을 시프트 -1을 해서 'Y' 칼럼에 저장하고 학습용 데이터와 테스트용 데이터로 나눈다.

 

import pandas as pd
import numpy as np
import talib
import random
import os
from pycaret.regression import *


def seed_everything(seed):
    random.seed(seed)
    os.environ['PYTHONHASHSEED'] = str(seed)
    np.random.seed(seed)

seed_everything(42) # Seed 고정

df = pd.read_csv('KRW-BTC.csv')


# 이동평균
df['sma20'] = talib.SMA(df["close"], timeperiod=20)

# 가중이동평균 WMA - Weighted Moving Average
df['wma30'] = talib.WMA(df['close'], timeperiod=30)

# RSI
df['rsi'] = talib.RSI(df["close"], timeperiod=14)

# MACD
df['macd'], df['macd_signal'], df['macd_hist'] = talib.MACD(df["close"], fastperiod=12, slowperiod=26, signalperiod=9)

# Bollinger Bands
df['upper'], df['middle'], df['lower'] = talib.BBANDS(df["close"], timeperiod=20)

# SAR - Parabolic SAR
df['psar'] = talib.SAR(df['high'], df['low'], acceleration=0.02, maximum=0.2)


# Close 칼럼을 한칸씩 올려서 Y 칼럼 생성
df['Y'] = df['close'].shift(-1)

# 마지막 행의 'b' 열 값을 NaN으로 설정
df.at[df.index[-1], 'Y'] = None

# NaN 값을 포함하는 행 삭제
df = df.dropna()

train_df = df[:int(len(df)*0.8)]
test_df = df[int(len(df)*0.8):]

train_x = train_df.drop(['Y'], axis = 1)
train_y = train_df['Y']

test_x = test_df.drop(['Y'], axis = 1)
test_y = test_df['close']

 

 

 

데이터 처리가 완료되면 아래의 코드를 실행해서 파이캐럿으로 해당 데이터에 적합한 모델을 비교하고, 앞에서와 동일하게 상위모델 3개를 선정하여 예측을 진행한다.

 

clf = setup(train_x, target=train_y, session_id=123)

 

 

 

 

best_model = compare_models(n_select = 3)

파이캐럿 모델 비교


 

 

파이캐럿으로 모델 비교가 완료되면 아래의 코드를 실행해서 상위 3개의 모델을 이용하여 예측을 진행한다.

 

b1 = best_model[0]
b2 = best_model[1]
b3 = best_model[2]

predictions_1 = predict_model(b1,data=test_x)
predictions_2 = predict_model(b2,data=test_x)
predictions_3 = predict_model(b3,data=test_x)

 

 

 

예측이 완료되면 아래의 코드로 시각화 해서 예측값과 실측값을 비교해 보는데, 이번에도 역시 1 ~ 3위 사이의 정확도 차이가 확연히 나는 것을 확인할 수 있지만, 이번 예측에서는 '내일의 가격을 예측할 수 있는지'를 확인해보겠다.

 

import matplotlib.pyplot as plt

# 그래프 그리기
plt.figure(figsize=(10, 6))  # 그래프 크기 설정
plt.plot(test_y, label='Actual Close', marker='.')  # test_y 데이터 그래프로 표시
plt.plot(predictions_1['prediction_label'], label='Predicted Close', marker='.')  # pred_y 데이터 그래프로 표시

# 그래프 제목과 레이블 설정
plt.title('Actual vs. Predicted Close Prices')
plt.xlabel('Time')
plt.ylabel('Close Price')

# 범례 표시
plt.legend()

# 그래프 표시
plt.show()

 

 

CatBoost Regressor

 

 

 

Extra Trees Regressor

 

 

 

K Neighbors Regressor

 

 

 

위의 그래프들은 'Actual Close'는 해당일의 종가(Close)에 해당하고, 'Predicted Close'는 내일의 종가(Y)에 해당하므로, 파란색 그래프 보다 녹색 그래프가 먼저 움직여야 하는데, 상승과 하락시점이 동일하게 움직이는 것을 확인할 수 있다. 이는 이번 예측에서 사용된 지표들이 후행지표라서 'Close' 값을 시프트 해도 예측값이 실제값 보다 미리 움직일 수 없는 것이 아닌가 하는 생각을 해보며, 좀 더 정확한 예측을 위해서는 '일목균형표'와 같은 선행지표가 필요할 것 같다.

반응형