def filtered_by_basic_lstm(dataset, ai_settings): """ :param dataset: 실제 주가 데이터 :param settings: AI 알고리즘 세팅 :return: ratio_cut(목표 수익률) 보다 ratio가 작으면 True 반환(필터링 대상) """ shuffled_data = load_data(df=dataset.copy(), n_steps=ai_settings['n_steps'], test_size=ai_settings['test_size']) model = create_model(n_steps=ai_settings['n_steps'], loss=ai_settings['loss'], units=ai_settings['units'], n_layers=ai_settings['n_layers'], dropout=ai_settings['dropout']) early_stopping = EarlyStopping(monitor='val_loss', patience=50) # 50번이상 더 좋은 결과가 없으면 학습을 멈춤 model.fit(shuffled_data["X_train"], shuffled_data["y_train"], batch_size=ai_settings['batch_size'], epochs=ai_settings['epochs'], validation_data=(shuffled_data["X_test"], shuffled_data["y_test"]), callbacks=[early_stopping], verbose=1) scaled_data = load_data(df=dataset.copy(), n_steps=ai_settings['n_steps'], test_size=ai_settings['test_size'], shuffle=False) mae = evaluate(scaled_data, model) print(f"Mean Absolute Error: {mae}") # 예측 가격 future_price = predict(scaled_data, model, n_steps=ai_settings['n_steps']) # 스케일링 된 예측 결과 scaled_y_pred = model.predict(scaled_data['X_test']) # 실제 값으로 변환 된 결과 y_pred = np.squeeze(scaled_data['column_scaler']['close'].inverse_transform(scaled_y_pred)) if ai_settings['is_used_predicted_close']: close = y_pred[-1] # 예측 그래프에서의 종가 else: close = dataset.iloc[-1]['close'] # 실제 종가 # ratio : 예상 상승률 ratio = (future_price - close) / close * 100 msg = f"After {ai_settings['lookup_step']}: {int(close)} -> {int(future_price)}" if ratio > 0: # lookup_step(분, 일) 후 상승 예상일 경우 출력 메시지 msg += f' {ratio:.2f}% ⯅ ' elif ratio < 0: # lookup_step(분, 일) 후 하락 예상일 경우 출력 메시지 msg += f' {ratio:.2f}% ⯆ ' print(msg, end=' ') return ai_settings['ratio_cut'] >= ratio # ratio_cut(목표 수익률) 보다 ratio가 작으면 True 반환(필터링 대상)
OPTIMIZER = "adam" # 각 학습 반복에 사용할 데이터 샘플 수 BATCH_SIZE = 64 # 학습 횟수 EPOCHS = 10 try: # shuffle: split을 해주기 이전에 시퀀스를 섞을건지 여부 shuffled_data = load_data(df=df, n_steps=N_STEPS, lookup_step=LOOKUP_STEP, test_size=TEST_SIZE, shuffle=True) except DataNotEnough: print('데이터가 충분하지 않습니다. ') exit(1) model = create_model(n_steps=N_STEPS, loss=LOSS, units=UNITS, cell=CELL, n_layers=N_LAYERS, dropout=DROPOUT) # 학습 시작 history = train(shuffled_data, model, EPOCHS, BATCH_SIZE, verbose=1) # shuffle 되지 않은 df로 다시 new_df에 저장 new_df = pd.read_sql(sql, conn) data = load_data(df=new_df, n_steps=N_STEPS, lookup_step=LOOKUP_STEP, test_size=TEST_SIZE, shuffle=False) mae = evaluate(data, model) print(f"Mean Absolute Error: {mae}") future_price = predict(data, model, n_steps=N_STEPS) print(f"Future price after {LOOKUP_STEP} days is {future_price:.2f}") plot_graph(model, data)