def update_divi_data( self ): def download_divi_data( self, year, top ): try: df_tmp = ts.profit_data( year, top ) except: ERROR( 'exception occurs when update divi data of year {0}'.format( year ) ) return pd.DataFrame() else: LOG( 'update divi data of year {0}'.format( year ) ) thread_queue.put( df_tmp ) if not os.path.exists( self.__divi_file_name ): cur_year = time.strftime( '%Y',time.localtime( time.time() ) ) df_tmp_stock_basics = Utils.read_data( self.__basics_file_name ) num_stock = df_tmp_stock_basics.index.size df_divi_data = pd.DataFrame() thread_queue = Queue() list_threads = [] for year in range( 2002, int( Utils.cur_date().split('_')[ 0 ] ) + 1 ): list_threads.append( threading.Thread( target = download_divi_data, \ args=( self, year, num_stock ) ) ) for thread in list_threads: thread.start() for thread in list_threads: thread.join() while not thread_queue.empty(): df_divi_data = df_divi_data.append( thread_queue.get() ) Utils.save_data( df_divi_data, self.__divi_file_name, 'divi data' )
# 18点之前,采用前一个交易日的分析结果 analyse_class = model.spill_wave.Analyse() list_process = [] list_process.append( Process(target=Notify().notify_investment_opportunity)) # list_process.append( Process( target = Notify().notify_realtime_earnings ) ) list_process.append(Process(target=Notify().serve_query_request)) for process in list_process: process.start() for process in list_process: process.join() else: # 当日18点之后方可更新数据 file_date = Utils.cur_date() Data(file_date).update_all() analyse_class = model.spill_wave.Analyse(file_date) # analyse_class.statistics() list_process = [] list_process.append( Process(target=analyse_class.find_spill_wave_stock)) list_process.append(Process(target=Profit().calc_profit_grow)) list_process.append(Process(target=Pe().calc_pe)) for process in list_process: process.start() for process in list_process: process.join()
df_growth_data = self.get_growth_data() df_growth_data = df_growth_data.set_index( 'code' ) df_debtpaying_data = self.get_debtpaying_data() df_debtpaying_data = df_debtpaying_data.set_index( 'code' ) df_cashflow_data = self.get_cashflow_data() df_cashflow_data = df_cashflow_data.set_index( 'code' ) df_divi_data = self.get_divi_data() df_divi_data = df_divi_data.set_index( 'code' ) df_forcast_quarter_report_data = self.get_forcast_quarter_report_data() df_forcast_quarter_report_data = df_forcast_quarter_report_data.set_index( 'code' ) df_restrict_stock_data = self.get_restrict_stock_data() df_restrict_stock_data = df_restrict_stock_data.set_index( 'code' ) df_concept_classified = self.get_concept_classified_data() df_concept_classified = df_concept_classified.set_index( 'code' ) LOG( 'finish loading.' ) return [ df_stock_basics, df_quarter_report_data, df_profit_data, df_operation_data, df_growth_data, df_debtpaying_data, \ df_cashflow_data, df_divi_data, df_forcast_quarter_report_data, df_restrict_stock_data, df_concept_classified ] '''--------------- run ---------------''' if __name__ == '__main__': Data( Utils.cur_date() ).update_all()
def do_realtime_trade( self ): pd.options.mode.chained_assignment = None # 不显示warn信息 default='warn' df_model_basics = Basics().get_basics().set_index( 'code' ) if os.path.exists( self.__file_path_trade ): self.df_trade = Utils.read_data( self.__file_path_trade ) if self.df_trade.index.size >= 1: self.remain_money = self.df_trade.loc[ self.df_trade.index.size - 1 ][ 'remain' ] if os.path.exists( self.__file_path_position ): self.df_position = Utils.read_data( self.__file_path_position ) while True: cur_time = Utils.cur_time() hour = int( cur_time.split( ':' )[ 0 ] ) minute = int( cur_time.split( ':' )[ 1 ] ) if hour < 9 or ( hour == 9 and minute < 30 ): LOG( 'Trade_Simulator: morning\n{0} hours {1} minutes later market open'\ .format( int( Utils.now2market_morning_time() / 3600 ), int( Utils.now2market_morning_time() % 3600 / 60 ) ) ) sleep( Utils.now2market_morning_time() ) elif ( hour == 11 and minute >= 30 ) or hour == 12: LOG( 'Trade_Simulator: nooning\n{0} hours {1} minutes later market open' .format( int( Utils.now2market_nooning_time() / 3600 ), int( Utils.now2market_nooning_time() % 3600 / 60 ) ) ) sleep( Utils.now2market_nooning_time() ) elif hour >= 15: LOG( 'Trade_Simulator: market close' ) break # sell for index in self.df_position.index: code = '%06d' % int( self.df_position.loc[ index ][ 'code' ] ) df_realtime_quotes = Data().get_realtime_quotes( code ) # T + 1 交易 if self.df_position.loc[ index ][ 'buy_date' ] < Utils.cur_date(): name = self.df_position.loc[ index ][ 'name' ] if float( df_realtime_quotes[ 'price' ] ) >= self.df_position.loc[ index ][ 'sell_price' ]: self.remain_money += float( df_realtime_quotes[ 'price' ] ) * float( self.df_position.loc[ index ][ 'position' ] ) total_earn = '{0:.2f}'.format( ( float( df_realtime_quotes[ 'price' ] ) - float( self.df_position.loc[ index ][ 'cost_price' ] ) ) \ * float( self.df_position.loc[ index ][ 'position' ] ) + float( self.df_trade.loc[ self.df_trade.index.size - 1 ][ 'total_earn' ] ) ) self.df_trade.loc[ self.df_trade.index.size ] = [ ' '.join( [ Utils.cur_date(), Utils.cur_time() ] ), code, name, 'sell', \ self.df_position.loc[ index ][ 'position' ], total_earn, self.remain_money ] self.df_position = self.df_position.drop( index ) continue self.df_position[ 'earn' ][ index ] = '{0:.2f}'.format( ( float( df_realtime_quotes[ 'price' ] ) - float( self.df_position.loc[ index ][ 'cost_price' ] ) ) \ * float( self.df_position.loc[ index ][ 'position' ] ) ) sleep( 1 ) # buy for index in self.df_model_stock.index: code = '%06d' % int( self.df_model_stock.loc[ index ][ 'code' ] ) name = self.df_model_stock.loc[ index ][ 'name' ] # 每只在仓股不再买入 if int( code ) in self.df_position[ 'code' ].to_dict().values() or \ code in self.df_position[ 'code' ].to_dict().values(): continue try: df_realtime_quotes = Data().get_realtime_quotes( code ) if float( df_realtime_quotes[ 'price' ] ) >= ( float( self.df_model_stock.loc[ index ][ 'buy_price' ] ) * 0.99 ) and \ float( df_realtime_quotes[ 'price' ] ) <= ( float( self.df_model_stock.loc[ index ][ 'buy_price' ] ) * 1.002 ) and \ float( self.df_model_stock.loc[ index ][ 'expect_earn_rate' ] ) >= 0.2: try: if float( df_model_basics[ 'rank_profit_grow' ][ int( code ) ].split( '/' )[ 0 ] ) / \ float( df_model_basics[ 'rank_profit_grow' ][ int( code ) ].split( '/' )[ 1 ] ) >= 0.5: continue # LOG( '{0} {1}'.format( code, df_model_basics[ 'rank_profit_grow' ][ int( code ) ].split( '/' ) ) ) except:pass buy_hand_num = 0 # 至少剩余买一手的资金 if 100 * float( df_realtime_quotes[ 'price' ] ) <= self.remain_money: buy_hand_num = int( min( self.initial_fund * float( self.df_model_stock.loc[ index ][ 'expect_earn_rate' ] ) * 0.5 / float( df_realtime_quotes[ 'price' ] ) / 100, \ self.max_buy_each_stock / float( df_realtime_quotes[ 'price' ] ) / 100, self.remain_money / float( df_realtime_quotes[ 'price' ] ) / 100 ) ) if self.df_trade.index.size >= 1: total_earn = self.df_trade.loc[ self.df_trade.index.size - 1 ][ 'total_earn' ] else: total_earn = 0 self.remain_money -= buy_hand_num * 100 * float( df_realtime_quotes[ 'price' ] ) self.df_trade.loc[ self.df_trade.index.size ] = [ ' '.join( [ Utils.cur_date(), Utils.cur_time() ] ), code, name, 'buy', \ buy_hand_num * 100, total_earn, self.remain_money ] self.df_position.loc[ self.df_position.index.size ] = [ code, name, Utils.cur_date(), float( df_realtime_quotes[ 'price' ] ), \ float( df_realtime_quotes[ 'price' ] ) * ( 0.2 * float( self.df_model_stock.loc[ index ][ 'expect_earn_rate' ] ) + 1.0 ), \ buy_hand_num * 100, 0 ] sleep( 1 ) except: pass self.save_data( self.df_trade, self.__file_path_trade ) self.save_data( self.df_position, self.__file_path_position )