
데이터 불러오기: 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
'데이터 > 데이터 예측' 카테고리의 다른 글
Pandas, Numpy, LSTM, ARIMA, Prophet을 이용한 코인 예측 예제 (0) | 2024.03.22 |
---|