728x90

 

데이터 불러오기: start_date와 end_date를 설정하여 원하는 기간의 비트코인 가격 데이터를 가져온다. fdr.DataReader() 함수를 사용하여 데이터를 가져온다. 가져온 데이터 중에서 'Close' 컬럼의 값만 선택하여 변수 close_data에 저장한다.

데이터 전처리: MinMaxScaler()를 사용하여 데이터를 0과 1 사이의 범위로 스케일링한다. 스케일링된 데이터는 변수 scaled_data에 저장된다.

이동 평균선 계산: 이동 평균을 계산하기 위해 np.convolve() 함수를 사용한다. moving_avg에 이동 평균선 데이터가 저장된다.

데이터셋 생성 함수: create_dataset() 함수는 입력 데이터와 레이블 데이터를 생성하는 함수이다. 입력 데이터는 이전 일 수(lookback)에 해당하는 데이터로 구성된다.

실제 가격과 예측 가격 비교: df_predictions 데이터프레임에 실제 가격과 예측 가격을 저장한다. 예측 결과를 출력한다.

 

 

데이터 분할: 생성한 데이터셋을 훈련 데이터와 테스트 데이터로 분할한다.

 

테스트 데이터 예측: 테스트 데이터의 마지막 값(마지막 10일의 가격)을 예측 값으로 사용한다.

 

scaler.inverse_transform() 함수를 사용하여 예측 값을 원래 스케일로 변환한다.

 

 

plt.figure() 함수를 사용하여 그래프의 크기를 설정한다.

plt.xlabel(), plt.ylabel(), plt.title() 함수를 사용하여 축 레이블과 그래프 제목을 설정한 후 legend와 show함수를 이용하여 그래프와 범례를 표시한다.

예측 가격 그래프, 이동 평균선 그래프, 추세 그래프를 차례로 그린다.

 

위 그래프는 LSTM은 RNN의 일반적인 문제인 장기 의존성 문제(Long-Term Dependency Problem)를 해결하기 위해 제안된 모델이며 시계열 데이터나 자연어 처리와 같이 시간적인 의존성을 가진 데이터를 처리하는 데에 주로 사용된다.

가장 큰 장점으로는 입력의 길이에 따라 동적으로 확장되거나 축소되는 특성을 가지고 있어, 자연어 처리와 같이 문장의 길이가 다양한 작업에 적합하다. 대신 그만큼 단점으로는 계산 비용이 높고, 모델 구조가 복잡하여 사용하기 어렵다는 게 가장 큰 문제라고 할 수 있다.

import FinanceDataReader as fdr
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

#데이터 불러오기
start_date = '2018-01-01'
end_date = '2022-12-31'
bitcoin_data = fdr.DataReader('BTC/KRW', start_date, end_date)

#데이터 추출
close_data = bitcoin_data['Close'].values.reshape(-1, 1)

#데이터 스케일링
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(close_data)

#데이터 분할
train_size = int(len(scaled_data) * 0.8)
train_data = scaled_data[:train_size]
test_data = scaled_data[train_size:]

#LSTM 입력 데이터 생성
def create_dataset(data, lookback):
X, Y = [], []
for i in range(len(data) - lookback):
    X.append(data[i:(i + lookback), 0])
    Y.append(data[i + lookback, 0])
return np.array(X), np.array(Y)

lookback = 10 # 이전 10일의 데이터를 기반으로 예측
X_train, Y_train = create_dataset(train_data, lookback)
X_test, Y_test = create_dataset(test_data, lookback)

#LSTM 모델 구성
model = Sequential()
model.add(LSTM(32, input_shape=(lookback, 1)))
model.add(Dense(1))

#모델 컴파일 및 학습
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X_train, Y_train, epochs=50, batch_size=16)

#테스트 데이터를 사용하여 예측
predictions = model.predict(X_test)
predictions = scaler.inverse_transform(predictions)

#실제 데이터와 예측 데이터 비교
df_predictions = pd.DataFrame(predictions, columns=['Predictions'])
df_predictions['Actual'] = scaler.inverse_transform(Y_test.reshape(-1, 1))
print(df_predictions)

결과값 :

Predictions Actual

0 50284368.0 50108356.0

1 50338856.0 50834512.0

2 50911044.0 52121544.0

3 52035676.0 50548744.0

4 51556176.0 51299848.0

.. ... ...

351 22036330.0 21274356.0

352 21884058.0 21097826.0

353 21707998.0 20980342.0

354 21548640.0 20950968.0

355 21451494.0 20881450.0

[356 rows x 2 columns]

시각화

import matplotlib.pyplot as plt

#테스트 데이터를 사용하여 예측

predictions = model.predict(X_test)

predictions = scaler.inverse_transform(predictions)

#실제 데이터와 예측 데이터 비교

df_predictions = pd.DataFrame(predictions, columns=['Predictions'])

df_predictions['Actual'] = scaler.inverse_transform(Y_test.reshape(-1, 1))

CSV화

df_predictions.to_csv('bitcoin_predictions.csv', index=False)

 

가져온 데이터 github link : https://github.com/financedata-org/FinanceDataReader

 

GitHub - FinanceData/FinanceDataReader: Financial data reader

Financial data reader. Contribute to FinanceData/FinanceDataReader development by creating an account on GitHub.

github.com

728x90

+ Recent posts