Beispiel #1
0
	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()
Beispiel #3
0
		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 )