`pykrx` 모듈을 활용하여 삼성전자의 OHLCV 데이터를 가져오고, LSTM 모델을 통해 주가를 예측하는 코드를 아래와 같이 작성할 수 있습니다.
1. `pykrx` 모듈로 OHLCV 데이터 및 펀더멘털 지표를 가져오기
2. 종가와 PER를 입력으로 LSTM 모델 구성
3. 모델 학습 및 주가 예측
4. 결과 시각화
먼저, 코드를 구성해봅니다.
```python
# 필요한 라이브러리 설치
!pip install pykrx tensorflow matplotlib pandas numpy scikit-learn
# 라이브러리 임포트
from pykrx import stock
from pykrx import bond
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from datetime import datetime, timedelta
# 1. 삼성전자의 OHLCV와 펀더멘털 지표 가져오기
def get_samsung_data():
ticker = "005930" # 삼성전자 종목코드
today = datetime.today().strftime("%Y%m%d")
one_year_ago = (datetime.today() - timedelta(days=365)).strftime("%Y%m%d")
# OHLCV 데이터 가져오기
ohlcv = stock.get_market_ohlcv_by_date(one_year_ago, today, ticker)
# 펀더멘털 데이터 가져오기
fundamentals = stock.get_market_fundamental_by_date(one_year_ago, today, ticker)
# OHLCV와 펀더멘털 데이터를 합치기
data = pd.concat([ohlcv, fundamentals], axis=1)
return data
data = get_samsung_data()
# 2. 데이터 전처리 (종가와 PER을 입력으로 사용)
def preprocess_data(data):
df = data[['종가', 'PER']].dropna() # 종가와 PER만 사용
# MinMaxScaler로 데이터 정규화
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(df)
# LSTM 입력에 맞게 시퀀스 데이터 만들기
X, y = [], []
seq_length = 10 # 10일 동안의 데이터를 사용하여 다음날을 예측
for i in range(len(scaled_data) - seq_length):
X.append(scaled_data[i:i+seq_length])
y.append(scaled_data[i+seq_length, 0]) # 종가를 예측
X = np.array(X)
y = np.array(y)
return X, y, scaler
X, y, scaler = preprocess_data(data)
# 3. LSTM 모델 생성 및 학습
def create_lstm_model():
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X.shape[1], X.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(units=50))
model.add(Dropout(0.2))
model.add(Dense(1)) # 종가 예측을 위한 출력층
model.compile(optimizer='adam', loss='mean_squared_error')
return model
model = create_lstm_model()
# 모델 학습
model.fit(X, y, epochs=20, batch_size=32)
# 4. 주가 예측 및 시각화
def predict_future_prices(model, data, scaler, days=7):
# 최근 10일간의 데이터를 가져와서 예측에 사용
recent_data = data[-10:]
scaled_recent_data = scaler.transform(recent_data[['종가', 'PER']].values)
# 예측할 일주일 동안의 데이터
predictions = []
for _ in range(days):
input_data = scaled_recent_data[-10:].reshape(1, 10, 2)
predicted_price = model.predict(input_data)
predictions.append(predicted_price[0, 0])
# 새로운 예측값을 기존 데이터에 추가
scaled_recent_data = np.vstack([scaled_recent_data, [[predicted_price[0, 0], scaled_recent_data[-1, 1]]]])
# 예측된 종가 값을 스케일링 복원
predicted_prices = scaler.inverse_transform(np.array(predictions).reshape(-1, 1))
return predicted_prices
predicted_prices = predict_future_prices(model, data, scaler)
# 실제 종가와 예측 종가 시각화
def plot_predictions(data, predicted_prices):
plt.figure(figsize=(10,6))
# 실제 데이터 시각화
plt.plot(data.index, data['종가'], label='Actual Prices')
# 예측 데이터 시각화
future_dates = pd.date_range(start=data.index[-1], periods=len(predicted_prices) + 1, closed='right')
plt.plot(future_dates, predicted_prices, label='Predicted Prices', linestyle='--')
plt.title("Samsung Stock Price Prediction")
plt.xlabel("Date")
plt.ylabel("Price")
plt.legend()
plt.show()
plot_predictions(data, predicted_prices)
```
### 코드 설명
1. `get_samsung_data()` 함수는 삼성전자의 종목 코드를 사용하여 최근 1년간의 OHLCV와 펀더멘털 데이터를 가져옵니다.
2. `preprocess_data()` 함수는 종가와 PER 데이터를 사용해 시퀀스 데이터로 변환하고 정규화를 진행합니다.
3. `create_lstm_model()` 함수는 LSTM 모델을 생성합니다.
4. `predict_future_prices()` 함수는 LSTM 모델을 사용하여 향후 일주일간의 주가를 예측합니다.
5. `plot_predictions()` 함수는 실제 주가와 예측된 주가를 그래프로 시각화합니다.
이 코드를 실행하면 삼성전자의 OHLCV 데이터를 바탕으로 LSTM 모델을 통해 주가 예측 결과를 확인할 수 있습니다.