Hi,
ich bin zufällig über diesen Artikel gestolpert: https://towardsdatascience.com/cryptocurrency-price-prediction-using-deep-learning-70cfca50dd3a
Es geht darum, dass angeblich jemand mit Hilfe von einer KI den Bitcoinkurs vorhersagen will. So wie es dort aussieht, müsste er den Heiligen Gral gefunden haben und könnte eigentlich infinite money drucken. Irgendwie ist also klar, dass das so nicht ganz stimmen kann.
Ich habe trotzdem mal ein bisschen damit rumgespielt und dachte mir eigentlich, ich mache mal eine vorhersage für die nächsten Wochen, speichere mir den Graphen und gucke wie er zu der Kursentwicklung passt.
Da ich irgendwie zu blöd war, die vorhersage über die Testdaten hinaus ausgeben zu lassen, habe ich halt die Testdaten so manipuliert, dass sie noch ein paar Wochen den aktuellen Preis halten
Nach meinem Verständnis dürfen die Testdaten ja keinen Einfluss auf die Vorhersage haben. Dass dann die Statistiken über Genauigkeit nicht mehr passen, ist klar, war mir in dem Fall aber egal.
Nun ist es aber so, dass die predict-Funktion kurz nachdem sie bei meinen Pseudodaten angekommen ist abbricht und sich am Ende generell komisch verhält.
Wie gesagt, mir ist klar dass niemand so einfach den Kurs so exakt vorhersagen kann, wie es in dem Beispiel funktioniert. Aber ich verstehe trotzdem nicht, wieso am Ende keine Berechnung mehr erfolgt. Kann mir das jemand vllt genauer erklären? Wie würde man denn mit dem Algorithmus eine "richtige" Vorhersage über die nächsten Tage/Wochen treffen können?
Hier mein angepasster code (ja, quick&dirty):
import tensorflow
import json
import requests
from keras.models import Sequential
from keras.layers import Activation, Dense, Dropout, LSTM
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.metrics import mean_absolute_error
from datetime import datetime
from datetime import timedelta
%matplotlib inline
endpoint = ' https://min-api.cryptocompare.com/data/histoday'
res = requests.get(endpoint + '?fsym=BTC&tsym=USD&limit=2000')
hist = pd.DataFrame(json.loads(res.content)['Data'])
t_today = hist["time"].iloc[-1]
last_close = hist["close"].iloc[-1]
for i in range(1, 60):
t_next = datetime.fromtimestamp(t_today) + timedelta(days = i)
t_next = int(datetime.timestamp(t_next))
l = {"time": t_next, "close": last_close, "high": 0, "low": 0, "open": 0, "volumefrom": 0, "volumeto": 0}
hist = hist.append(l, ignore_index = True)
hist = hist.set_index('time')
hist.index = pd.to_datetime(hist.index, unit='s')
target_col = 'close'
def train_test_split(df, test_size=0.1):
split_row = len(df) - int(test_size * len(df))
train_data = df.iloc[:split_row]
test_data = df.iloc[split_row:]
return train_data, test_data
train, test = train_test_split(hist, test_size=0.1)
def line_plot(line1, line2, label1=None, label2=None, title='', lw=2):
fig, ax = plt.subplots(1, figsize=(13, 7))
ax.plot(line1, label=label1, linewidth=lw)
ax.plot(line2, label=label2, linewidth=lw)
ax.set_ylabel('price [USD]', fontsize=14)
ax.set_title(title, fontsize=16)
ax.legend(loc='best', fontsize=16);
line_plot(train[target_col], test[target_col], 'training', 'test', title='')
def normalise_zero_base(df):
return df / df.iloc[0] - 1
def normalise_min_max(df):
return (df - df.min()) / (data.max() - df.min())
def extract_window_data(df, window_len=5, zero_base=True):
window_data = []
for idx in range(len(df) - window_len):
tmp = df[idx: (idx + window_len)].copy()
if zero_base:
tmp = normalise_zero_base(tmp)
window_data.append(tmp.values)
return np.array(window_data)
def prepare_data(df, target_col, window_len=10, zero_base=True, test_size=0.2):
train_data, test_data = train_test_split(df, test_size=test_size)
X_train = extract_window_data(train_data, window_len, zero_base)
X_test = extract_window_data(test_data, window_len, zero_base)
y_train = train_data[target_col][window_len:].values
y_test = test_data[target_col][window_len:].values
if zero_base:
y_train = y_train / train_data[target_col][:-window_len].values - 1
y_test = y_test / test_data[target_col][:-window_len].values - 1
return train_data, test_data, X_train, X_test, y_train, y_test
def build_lstm_model(input_data, output_size, neurons=100, activ_func='linear',
dropout=0.1, loss='mse', optimizer='adam'):
model = Sequential()
model.add(LSTM(neurons, input_shape=(input_data.shape[1], input_data.shape[2])))
model.add(Dropout(dropout))
model.add(Dense(units=output_size))
model.add(Activation(activ_func))
model.compile(loss=loss, optimizer=optimizer)
return model
np.random.seed(42)
window_len = 5
test_size = 0.1
zero_base = True
lstm_neurons = 100
epochs = 20
batch_size = 32
loss = 'mse'
dropout = 0.1
optimizer = 'adam'
train, test, X_train, X_test, y_train, y_test = prepare_data(
hist, target_col, window_len=window_len, zero_base=zero_base, test_size=test_size)
model = build_lstm_model(
X_train, output_size=1, neurons=lstm_neurons, dropout=dropout, loss=loss,
optimizer=optimizer)
history = model.fit(
X_train, y_train, epochs=epochs, batch_size=batch_size, verbose=1, shuffle=True)
targets = test[target_col][window_len:]
preds = model.predict(X_test).squeeze()
preds = test[target_col].values[:-window_len] * (preds + 1)
preds = pd.Series(index=targets.index, data=preds)
line_plot(targets, preds, 'actual', 'prediction', lw=3)
Original: https://github.com/abhinavsagar/Cryptocurrency-Price-Prediction/blob/master/price_prediction.ipynb
Danke schon mal für jede Hilfe!