calcul model sur bouton

This commit is contained in:
Jérôme Delacotte
2025-05-12 13:37:51 +02:00
parent 16783a79be
commit edaf3dbcfb
8 changed files with 139 additions and 42 deletions

View File

@@ -15,6 +15,10 @@ from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.utils import plot_model
from keras.models import Sequential
from keras.layers import Dense
from ann_visualizer.visualize import ann_viz
app = Flask(__name__)
FREQTRADE_USERDATA_DIR = '/mnt/external'
@@ -128,43 +132,6 @@ def read_feather(filename):
# dataframe['min200'] = talib.MIN(dataframe['close'], timeperiod=200)
# dataframe['max200'] = talib.MAX(dataframe['close'], timeperiod=200)
# Choisir les colonnes techniques comme variables d'entrée (X)
feature_cols = ['rsi', 'sma20', 'sma5_1h', 'volume']
df = dataframe
# Variable cible
df['target'] = df['futur_price_1h']
# Supprimer les lignes avec des NaN
df.dropna(subset=feature_cols + ['target'], inplace=True)
X = df[feature_cols].values
y = df['target'].values
# Normalisation
scaler = StandardScaler()
X = scaler.fit_transform(X)
# Split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# Modèle
model = Sequential([
Dense(64, input_dim=X.shape[1], activation='relu'),
Dense(32, activation='relu'),
Dense(1) # Prédiction continue
])
model.compile(optimizer='adam', loss='mse', metrics=['mae'])
# Entraînement
model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test))
loss, mae = model.evaluate(X_test, y_test)
print(f"Erreur moyenne absolue : {mae:.4f}")
model.summary()
plot_model(model, show_shapes=True, show_layer_names=True, to_file=FREQTRADE_USERDATA_DIR + "/reports/model.png")
return dataframe.to_json(orient="records")
except Exception as e:
print(e)
@@ -229,8 +196,57 @@ def get_chart_data():
return df.to_json(orient="records") #jsonify(chart_data)
@app.route('/model')
def show_model():
@app.route('/generate_model')
def generate_model():
filename = request.args.get('filename', '')
path = os.path.join(FREQTRADE_USERDATA_DIR + "/data/binance/", filename)
print(path)
# indicators = request.args.get('indicators', '').split(',')
df = pd.read_feather(path)
# Choisir les colonnes techniques comme variables d'entrée (X)
feature_cols = ['close', 'rsi', 'sma5', 'sma10', 'sma20', 'sma5_1h', 'volume', 'sma5_1h']
# Variable cible 2 heures
df['target'] = (df['close'].shift(-24) - df['close']) / df['close']
# Supprimer les lignes avec des NaN
df.dropna(subset=feature_cols + ['target'], inplace=True)
X = df[feature_cols].values
y = df['target'].values
# Normalisation
scaler = StandardScaler()
X = scaler.fit_transform(X)
# Split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# Modèle
model = Sequential([
Dense(64, input_dim=X.shape[1], activation='relu'),
Dense(32, activation='relu'),
Dense(1) # Prédiction continue
])
model.compile(optimizer='adam', loss='mse', metrics=['mae'])
# Entraînement
model.fit(X_train, y_train, epochs=100, batch_size=64, validation_data=(X_test, y_test))
loss, mae = model.evaluate(X_test, y_test)
print(f"Erreur moyenne absolue : {mae:.4f}")
model.summary()
plot_model(model, show_shapes=True, show_layer_names=True, to_file=FREQTRADE_USERDATA_DIR + "/reports/model.png")
model.save(FREQTRADE_USERDATA_DIR + "/reports/model.h5")
# ann_viz(model, title="Mon réseau", filename=FREQTRADE_USERDATA_DIR + "/reports/network.gv", view=True)
# Créer un exemple de modèle si non encore généré
model_path = FREQTRADE_USERDATA_DIR + "/reports/model.png"
if not os.path.exists(model_path):
@@ -242,6 +258,7 @@ def show_model():
plot_model(model, to_file=model_path, show_shapes=True, show_layer_names=True)
return render_template('model.html', model_image=model_path)
# Route pour servir les fichiers statiques (optionnelle si bien configuré)
@app.route('/static/<path:filename>')
def static_files(filename):