def stock_report(ticker): try: long_period = stock_sources.long_period_df(ticker) short_period = stock_sources.short_period_df(ticker) # Find the current price current_price = stock_sources.only_close(short_period)[ticker][-1:] except Exception as e: print(f"Error: {e}") # print(current_price) # # Find the 200 day moving average. two_hundred_day_ma = stock_sources.only_close( long_period ).rolling(window=200).mean().iloc[-1:, :] # If a stock's 200ma > it's current price, then print true for stock, price in two_hundred_day_ma.items(): report = pd.DataFrame( { 'Current': [1], '200 ma': [1] }, index=ticker ) # Print statements test to make sure the values are correct # print(price.values) # print(current_price[stock].values) # If the 200 ma is greater than the current price add it to the list to email. if price.values > current_price[stock].values: # print(f'{stock}\'s Current Price is BELOW its\'s 200 ma') report.loc[stock, 'Current'] = round( current_price[stock].values[0], 2) report.loc[stock, '200 ma'] = round(price.values[0], 2) # Give me only the stocks that have a lower current value than the 200ma mask = report['Current'] != 1 report_to_email = report[mask] report_to_email.sort_index(inplace=True) report_to_email = report_to_email.to_html( notebook=True) return report_to_email else: pass
def main(): ####################### IMPORTS ########################################## # Personal Modules from read_config import export_variables from Email.email_test import send_email # from data_analysis import stock_report from crypto_data_collection import get_close_data from arima_test import arima_prediction import stock_sources import read_config from random_walk import random_walk_benchmark from default_analysis import default_analysis, plot_dataframe, plot_dataframe_zoomed # Personal information to be used in the program email, password, crypto_api = read_config.export_variables( env_location) ####################### Stock Data ###################################### stock_df = stock_sources.long_period_df(stock_ticker) stock_close_df = stock_sources.only_close(stock_df) ####################### Stock Predictions ############################### print("Training the Model") stock_train_prediction_mse, stock_prediction_df = arima_prediction( stock_close_df) ###################### Stock Benchmark ################################# stock_prediction_benchmark_mse = random_walk_benchmark(stock_close_df) # stock_report = stock_report(stock_ticker) ####################### Crypto Data #################################### # end = datetime.date.today() # 2 Years according to stock data # start = end - datetime.timedelta(days=505) # crypto_close_df = get_close_data(crypto_ticker, start, end, crypto_api) ####################### Crypto Predictions ############################### # crypto_train_prediction_mse, crypto_prediction = arima_prediction( # crypto_close_df # ) # crypto_prediction_mse, crypto_prediction = arima_prediction( # crypto_close_df) ###################### Crypto Prediction Benchmark ####################### # crypto_prediction_benchmark_mse = random_walk_benchmark(crypto_close_df) # good_stock_prediction = False # good_crypto_prediction = False # good_stock_prediction = True if stock_train_prediction_mse < stock_prediction_benchmark_mse else False # good_crypto_prediction = True if crypto_train_prediction_mse < crypto_prediction_benchmark_mse else False # print('\n\n\n') # print(f"Good Stock Prediction: {good_stock_prediction}") # print(f"Good Crypto Prediction: {good_crypto_prediction}") # If stock_train_prediction_mse IS LESS than random_walk_benchmark, then use it. # Else Don't and only email the user moving averages graph ####################### Default Analysis ################################ current_stock_price = stock_sources.current_price(stock_ticker) # DEFAULT stock_analysis_df = default_analysis( stock_prediction_df, current_stock_price).copy() # crypto_default_analysis = default_analysis( # crypto_prediction, current_crypto_price) # Crypto Data probably will only show daily results # current_crypto_price = pd.DataFrame(crypto_close_df[-1]) # print(current_crypto_price) # print(crypto_close_df) # crypto_default_analysis = default_analysis( # crypto_close_df['Close'], current_crypto_price) # print(f"Default Crypto Analysis Says: {crypto_default_analysis}") ####################### STRATEGY ####################################### # If this is True, email them everything ####################### EMAIL ########################################## # Should contain: MSEs, Predictions, Current Price, Moving Average Chart # If no move to be made, moving averaage chart should be sent regardless along with a different title # If the predicted price is close to the 50 day or 100 ma, then email. # conditions = [ # good_stock_prediction == True and stock_default_analysis_response == True # crypto_default_analysis == True # ] # Stock Graphs plot_dataframe(stock_ticker, stock_analysis_df) plot_dataframe_zoomed(stock_ticker, stock_analysis_df) # Crypto Graphs # plot_dataframe(crypto_ticker, crypto_prediction) # plot_dataframe_zoomed(crypto_ticker, crypto_prediction) # SENDING THE ACTUAL EMAIL # send_email(email, password) print(f'\nPredicted Prices and Moving Averages for {stock_ticker}\n') print(stock_analysis_df.tail(10)) print("---------------------------------------------------------") print(f"\nRandom Walk RMSE: {stock_prediction_benchmark_mse}") print(f"ARIMA Train RMSE: {stock_train_prediction_mse}")
test_forecast = pd.DataFrame( test_results.forecast(5)[0], columns=['Close'] ) test_predictions = test.append(test_forecast) return train_mse, test_predictions if __name__ == '__main__': print('\n\n\n\nSTOCK DATA') ticker = 'AAPL' df = long_period_df(ticker) # Chopping that dataframe down to Close only information close_df = only_close(df) # Finding the percent change of the closing data standard_returns = close_df.pct_change().dropna() arima_prediction(close_df) # # print('\n\n\n\nCrypto Data') # ticker = 'BTC' # end = datetime.date.today() # start = end - datetime.timedelta(days=505) # import read_config # env_location = '../../Data/.env' # user_name, password, crypto_api = read_config.export_variables(