Exemple #1
0
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 반환(필터링 대상)
Exemple #2
0
# 최적화 알고리즘 선택
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)