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 0eedab5..a9b1b4e 100644 Binary files a/app/ml_models/__pycache__/score_model.cpython-310.pyc and b/app/ml_models/__pycache__/score_model.cpython-310.pyc differ 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]