From 85f5dbe07533e99743b3c7327ce159135e710903 Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Mon, 30 Sep 2024 21:02:49 +0200 Subject: [PATCH] improvement of ai model --- app/cron_ai_score.py | 6 ++--- .../__pycache__/score_model.cpython-310.pyc | Bin 5106 -> 5126 bytes app/ml_models/score_model.py | 24 +++++++++--------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/cron_ai_score.py b/app/cron_ai_score.py index 815e102..51dff03 100644 --- a/app/cron_ai_score.py +++ b/app/cron_ai_score.py @@ -317,7 +317,7 @@ async def process_symbol(ticker, con, start_date, end_date): split_size = int(len(df) * (1-test_size)) test_data = df.iloc[split_size:] #selected_features = [col for col in df.columns if col not in ['date','price','Target']] - best_features = ['freeCashFlowYield', 'cci', 'daily_return', 'cashAndCashEquivalents_to_cashAndShortTermInvestments', 'longTermDebt_to_totalLiabilitiesAndStockholdersEquity', 'longTermDebt_to_totalAssets', 'totalStockholdersEquity_to_totalLiabilitiesAndStockholdersEquity', 'totalStockholdersEquity_to_totalAssets'] + best_features = ['williams', 'stoch', 'fdi', 'revenue_to_cashAndCashEquivalents', 'revenue_to_cashAndShortTermInvestments', 'costOfRevenue_to_cashAndCashEquivalents', 'costOfRevenue_to_cashAndShortTermInvestments', 'ebitda_to_cashAndShortTermInvestments', 'incomeTaxExpense_to_cashAndCashEquivalents', 'incomeTaxExpense_to_cashAndShortTermInvestments', 'capitalExpenditure_to_cashAndCashEquivalents', 'capitalExpenditure_to_cashAndShortTermInvestments', 'totalCurrentLiabilities_to_cashAndShortTermInvestments', 'netDebt_to_cashAndShortTermInvestments', 'inventory_to_cashAndShortTermInvestments'] print(f"For the Ticker: {ticker}") data = predictor.evaluate_model(test_data[best_features], test_data['Target']) @@ -391,7 +391,7 @@ async def train_process(tickers, con): predictor = ScorePredictor() #print(selected_features) selected_features = [col for col in df_train if col not in ['price','date','Target']] - best_features = predictor.feature_selection(df_train[selected_features], df_train['Target'],k=8) + best_features = predictor.feature_selection(df_train[selected_features], df_train['Target'],k=15) print(best_features) predictor.train_model(df_train[best_features], df_train['Target']) predictor.evaluate_model(df_test[best_features], df_test['Target']) @@ -406,7 +406,7 @@ async def run(): if train_mode: #Train first model - cursor.execute("SELECT DISTINCT symbol FROM stocks WHERE marketCap >= 50E9 AND symbol NOT LIKE '%.%'") + cursor.execute("SELECT DISTINCT symbol FROM stocks WHERE marketCap >= 500E9 AND symbol NOT LIKE '%.%'") stock_symbols = [row[0] for row in cursor.fetchall()] print('Number of Stocks') print(len(stock_symbols)) diff --git a/app/ml_models/__pycache__/score_model.cpython-310.pyc b/app/ml_models/__pycache__/score_model.cpython-310.pyc index 0eedab52b1646b1585bf39129016ee0633783e4e..a9b1b4e3cb73bbcdb24b1dc5272a4fa1f30dc5b2 100644 GIT binary patch delta 573 zcmXX@OKTHR6rMA$OlC4M!H6gp16}C2G(IqbQxvHnCDu(vqIJwn#vx-8Z*G*>2`-{t zh@f&dJ`mbX!7c=eKS2<|Zdw!^T z&8_;zYjZ<6v5hGUVx@DKXUO@{`p=6Y#_HQN%&L6(^m zv80wYf3EOq^4smZ*i}Em#PDot5nyWgT{{h0fp?e443_or@;Va?U+sj?;QxO4V|D84 zIop!S4AZe%XFs(Fxi}KngXU~Vf`xey$Ps*~pM(mo>TB=|myGc$l_O~YAViWYxWYZr z73<ak_g{q6tS7<5{BV{1=RjU2BQdD+jUddjCrX$r=3&H@N3vTMgs3Vne zEK>p*r!#wvFf#iF2u-+g1?MtF<2)OU9OYESrOf5yRc87tA2`0){&(|t})Fv#D5$zhUDi+=%FJg2(= delta 520 zcmXYtO=uHQ5Xawa_A9&l+5{|uN*n1xw>?;!1+7$41)&!uDndX};%1vH2WzQ=6QTV7Fg{|fe4KcP|aFv7sW63j|(Jz=g zdvAY#xq82dPxP;FsdwGj0JzrsYhD3!TH4)|DB+wnJ}o?{l2HjUOMO+8Wa{e+azjgq z+XK-EoA>G>e6tKJ$>F+n8H%`VZNV;nu*dO-ee|LlX&cbdB0W}Ot*dnO$T+Nw$gHSc z04B2*rDMIKA7Nd1%__!v>Y$H#Cl4l8oiV!>^NtOy2@mez3nypaq>r5=c=*w|3mzWl zqq%B+5L<=nt2K(x1=mXGdP$nBQ+SK#&&Yu{th1F($I`EB@LEhsZJ`R;-{f`X!NqfK8(aPeU^|ToFoLel9{lp pRMrU3aWiuQUgGym2^#2Sy^+D<8}wEutP<9+lYI*Fz5m&?vJV%LjsgGx diff --git a/app/ml_models/score_model.py b/app/ml_models/score_model.py index 27d8753..198f2bd 100644 --- a/app/ml_models/score_model.py +++ b/app/ml_models/score_model.py @@ -38,24 +38,24 @@ class ScorePredictor: clear_session() # Input layer - inputs = Input(shape=(8,)) + inputs = Input(shape=(15,)) # First dense layer - x = Dense(512, activation='relu')(inputs) - x = Dropout(0.5)(x) + x = Dense(64, activation='leaky_relu')(inputs) + x = Dropout(0.3)(x) x = BatchNormalization()(x) # Additional dense layers - for units in [256,128]: - x = Dense(units, activation='relu')(x) - x = Dropout(0.5)(x) + for units in [64,32]: + x = Dense(units, activation='leaky_relu')(x) + x = Dropout(0.3)(x) x = BatchNormalization()(x) # Reshape for attention mechanism - x = Reshape((128, 1))(x) + x = Reshape((32, 1))(x) # Attention mechanism - attention = Dense(128, activation='relu')(x) + attention = Dense(32, activation='leaky_relu')(x) attention = Dense(1, activation='softmax')(attention) # Apply attention @@ -71,7 +71,7 @@ class ScorePredictor: model = Model(inputs=inputs, outputs=outputs) # Optimizer with a lower learning rate - optimizer = Adam(learning_rate=0.001, clipnorm=1.0) + optimizer = Adam(learning_rate=0.01, clipnorm=1.0) # Compile the model model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy']) @@ -95,8 +95,8 @@ class ScorePredictor: checkpoint = ModelCheckpoint('ml_models/weights/ai-score/weights.keras', save_best_only=True, save_freq = 1, monitor='val_loss', mode='min') - early_stopping = EarlyStopping(monitor='val_loss', patience=50, restore_best_weights=True) - reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=30, min_lr=0.001) + early_stopping = EarlyStopping(monitor='val_loss', patience=20, restore_best_weights=True) + reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=10, min_lr=0.001) self.model.fit(X_train, y_train, epochs=100_000, batch_size=32, validation_split=0.1, callbacks=[checkpoint, early_stopping, reduce_lr]) @@ -112,7 +112,7 @@ class ScorePredictor: # Get the model's predictions test_predictions = self.model.predict(X_test) - #print(test_predictions) + print(test_predictions) # Extract the probabilities for class 1 (index 1 in the softmax output) class_1_probabilities = test_predictions[:, 1]