Exemple #1
0
def main():
    # Initialize Argument Parser
    parser = argparse.ArgumentParser()
    parser.add_argument("-u", "--update", help="Daily Update Data (Execute Before Market Starts)",
                        action="store_true")
    parser.add_argument("-fu", "--force_update",
                        help="Force Update All Data Up to Max. Allowed Years (USE WITH CAUTION)", action="store_true")
    parser.add_argument("-d", "--database", help="Store All CSV Data to Database", action="store_true")

    # Retrieve file names for all strategies as the argument option
    strategy_list = [Path(file_name).name[:-3] for file_name in glob.glob("./strategies/*.py") if
                     "__init__" not in file_name and "Strategies" not in file_name]
    parser.add_argument("-s", "--strategy", type=str, choices=strategy_list,
                        help="Execute HFT using Pre-defined Strategy")

    # Retrieve file names for all strategies as the argument option
    filter_list = [Path(file_name).name[:-3] for file_name in glob.glob("./filters/*.py") if
                   "__init__" not in file_name and "Filters" not in file_name]
    parser.add_argument("-f", "--filter", type=str, choices=filter_list, nargs="+",
                        help="Filter Stock List based on Pre-defined Filters")
    parser.add_argument("-en", "--email_name", type=str, help="Name of the applied stock filtering techniques")

    # Evaluate Arguments
    args = parser.parse_args()

    # Initialization Connection
    futu_trade = trading_engine.FutuTrade()
    email_handler = email_engine.Email()

    # Initialize Config Parser
    config = configparser.ConfigParser()
    config.read("config.ini")

    # Initialize Stock List
    stock_list = json.loads(config.get('TradePreference', 'StockList'))
    if not stock_list:
        stock_list = data_engine.DatabaseInterface(
            database_path=config.get('Database', 'Database_path')).get_stock_list()

    if args.filter:
        filtered_stock_list = init_stock_filter(args.filter)
        filtered_stock_dict = YahooFinanceInterface.get_stocks_email(filtered_stock_list)
        subscription_list = json.loads(config.get('Email', 'SubscriptionList'))
        for subscriber in subscription_list:
            filter_name = args.email_name if args.email_name else "Default Stock Filter"
            email_handler.write_daily_stock_filter_email(subscriber, filter_name, filtered_stock_dict)
    if args.update:
        # Daily Update Data
        daily_update_data(futu_trade=futu_trade, stock_list=stock_list, force_update=args.force_update)
    if args.database:
        # Update ALl Data to Database
        futu_trade.store_all_data_database()
    if args.strategy:
        # Initialize Strategies
        stock_list = filtered_stock_list if args.filter else stock_list
        stock_list.extend(data_engine.YahooFinanceInterface.get_top_30_hsi_constituents())
        init_day_trading(futu_trade, stock_list, args.strategy)
        futu_trade.display_quota()
 def validate_stock(self, equity_code):
     quant_data = YahooFinanceInterface.get_stock_history(equity_code)
     quant_data.columns = [item.lower().strip() for item in quant_data]
     # info_data = YahooFinanceInterface.get_stock_info(equity_code)
     info_data = {}
     if all([stock_filter.validate(quant_data, info_data) for stock_filter in self.stock_filters]):
         self.default_logger.info(
             f"{equity_code} is selected based on stock filter {[type(stock_filter).__name__ for stock_filter in self.stock_filters]}")
         return equity_code
     return None
 def validate_stock_individual(self, equity_code):
     quant_data = YahooFinanceInterface.get_stock_history(equity_code)
     quant_data.columns = [item.lower().strip() for item in quant_data]
     # info_data = YahooFinanceInterface.get_stock_info(equity_code)
     info_data = {}
     output_list = []
     for stock_filter in self.stock_filters:
         if stock_filter.validate(quant_data, info_data):
             self.default_logger.info(
                 f"{equity_code} is selected based on stock filter {type(stock_filter).__name__}")
             output_list.append((type(stock_filter).__name__, equity_code))
     return output_list
 def parse_stock_info(self, stock_code):
     return (stock_code, YahooFinanceInterface.get_stock_info(stock_code))