2024. 1. 24. 19:02ㆍ자동매매/업비트
https://skydance.tistory.com/54
아래의 코드를 실행해서 지난번과 동일하게 비트코인 가격에 대한 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() |
위의 그래프들은 'Actual Close'는 해당일의 종가(Close)에 해당하고, 'Predicted Close'는 내일의 종가(Y)에 해당하므로, 파란색 그래프 보다 녹색 그래프가 먼저 움직여야 하는데, 상승과 하락시점이 동일하게 움직이는 것을 확인할 수 있다. 이는 이번 예측에서 사용된 지표들이 후행지표라서 'Close' 값을 시프트 해도 예측값이 실제값 보다 미리 움직일 수 없는 것이 아닌가 하는 생각을 해보며, 좀 더 정확한 예측을 위해서는 '일목균형표'와 같은 선행지표가 필요할 것 같다.
'자동매매 > 업비트' 카테고리의 다른 글
[파이썬] 업비트 비트코인 머신러닝 가격예측 1 (0) | 2023.12.02 |
---|---|
[파이썬] 업비트 코인별 가격 데이터 - 크롤링 (1) | 2023.09.30 |
[파이썬] 업비트 티커 리스트 - 상장 400일 이하 제거 (1) | 2023.05.20 |
[파이썬] 업비트 티커 리스트 - 크롤링 (0) | 2023.05.17 |
[파이썬] 업비트 지표 구하기 - RSI(상대강도지수) (2) | 2023.03.06 |