def run(self, save_trade_record=False): self.initialize() # 初始化 account_data if self.account: for account in self.account: Environment.current_account_data = AccountData() Environment.current_account_data.account_id = generate_random_id.generate_random_id(account) Environment.current_account_data.total_balance = self.capital[account] Environment.current_account_data.available = self.capital[account] # Environment.logger(Environment.current_account_data.account_id, Environment.current_account_data.available) Environment.bar_account_data_list.append(Environment.current_account_data) # if self.run_mode == RunMode.TRADE.value: # self.end = self._get_data.get_end_time_tag(benchmark=self.benchmark, period=Period.DAILY.value) # 缓存数据开关,和bar_index的计算 if self.period == Period.DAILY.value: self.daily_data_cache = True elif self.period == Period.ONE_MIN.value: self.one_min_data_cache = True # security_list = copy.copy(self.universe) security_list = list(set(security_list)) if self._daily_data_cache: Environment.daily_data = self._get_data.cache_all_stock_data(dividend_type=self.rights_adjustment) Environment.index_daily_data = self._get_data.cache_all_index_data() if self.one_min_data_cache: Environment.one_min_data = self._get_data.cache_all_stock_data(period=Period.ONE_MIN.value) if self.period == Period.DAILY.value: Environment.benchmark_index = [i for i in Environment.index_daily_data['close'][self.benchmark].index if self.start <= i <= self.end] elif self.period == Period.ONE_MIN.value: Environment.benchmark_index = [data_transfer.date_to_millisecond(str(int(i)), '%Y%m%d') for i in Environment.one_min_data['open'].ix[self.benchmark].index if i >= data_transfer.date_str_to_int(self.start)] self.bar_index = 0 while True: try: # Environment.logger(self.time_tag, Environment.benchmark_index) self.time_tag = Environment.benchmark_index[self.bar_index] except IndexError: if self.run_mode == RunMode.BACKTESTING.value: if save_trade_record: run_backtesting_analysis_engine(self) break # elif self.run_mode == RunMode.TRADE.value: # 读取最新tick, 更新最新的分钟或者日线 # if 读取最新tick, 更新最新的分钟或者日线 == done: # daily_data.append(new_day_data) # self.bar_index += 1 # benchmark_index.append(new_day_time_tag) else: run_bar_engine(self)
def get_all_market_data(self, stock_code=[], field=[], start="", end="", period=Period.DAILY.value, rights_adjustment=RightsAdjustment.NONE.value): """ 复权因子和skip_pause在这做 :param stock_code: :param field: :param start: :param end: :param period: :param rights_adjustment: :return: 代码-n,字段-n,时间-n, return dataframe 行-代码-timetag(多层索引),列-字段 """ if period == Period.DAILY.value: db_name = DatabaseName.MARKET_DATA_DAILY.value end = data_transfer.date_str_to_int(end) values = [] colum = {"_id": 0, "timetag": 1} for i in field: colum[i] = 1 for stock in stock_code: self.conn.check_connected() stock_market_data = self.conn.select_colum( db_name=db_name, table=stock, value={"timetag": { "$lte": end }}, colum=colum) stock_market_data_list = list(stock_market_data) if stock_market_data_list: df = pd.DataFrame(stock_market_data_list) values.append( pd.DataFrame(df[field].values, index=df['timetag'], columns=field)) market_data = pd.concat(values, keys=stock_code) elif period == Period.ONE_MIN.value: db_name = DatabaseName.MARKET_DATA_ONE_MIN.value return market_data
def run(self, save_trade_record=False): self.initialize() # 初始化 account_data if self.account: for account in self.account: Environment.current_account_data = AccountData() Environment.current_account_data.account_id = generate_random_id.generate_random_id( account) Environment.current_account_data.total_balance = self.capital[ account] Environment.current_account_data.available = self.capital[ account] Environment.bar_account_data_list.append( Environment.current_account_data) if self.run_mode == RunMode.TRADE.value: self.end = self._get_data.get_end_timetag( benchmark=self.benchmark, period=Period.DAILY.value) # 缓存数据开关,和bar_index的计算 if self.period == Period.DAILY.value: self.daily_data_cache = True elif self.period == Period.ONE_MIN.value: self.one_min_data_cache = True stock_list = copy.copy(self.universe) stock_list.append(self.benchmark) stock_list = list(set(stock_list)) if self._daily_data_cache: Environment.daily_data = self._get_data.get_all_market_data( stock_code=stock_list, field=["open", "high", "low", "close", "volumn", "amount"], end=self.end, period=Period.DAILY.value) if self.one_min_data_cache: Environment.one_min_data = self._get_data.get_all_market_data( stock_code=stock_list, field=["open", "high", "low", "close", "volumn", "amount"], end=self.end, period=Period.ONE_MIN.value) if self.period == Period.DAILY.value: Environment.benchmark_index = [ data_transfer.date_to_millisecond(str(int(i)), '%Y%m%d') for i in Environment.daily_data["open"].ix[self.benchmark].index if i >= data_transfer.date_str_to_int(self.start) ] elif self.period == Period.ONE_MIN.value: Environment.benchmark_index = [ data_transfer.date_to_millisecond(str(int(i)), '%Y%m%d') for i in Environment.one_min_data["open"].ix[self.benchmark].index if i >= data_transfer.date_str_to_int(self.start) ] # print(self.benchmark, self.start, self.end, self.period, self.rights_adjustment, self.run_mode) self.bar_index = 0 while True: try: self.timetag = Environment.benchmark_index[self.bar_index] except IndexError: if self.run_mode == RunMode.BACKTESTING.value: if save_trade_record: run_backtesting_analysis_engine(self) break elif self.run_mode == RunMode.TRADE.value: '''读取最新tick, 更新最新的分钟或者日线 if 读取最新tick, 更新最新的分钟或者日线 == done: daily_data.append(new_day_data) self.bar_index += 1 benchmark_index.append(new_day_timetag) ''' pass else: date = int( data_transfer.millisecond_to_date(millisecond=self.timetag, format="%Y%m%d")) run_bar_engine(self) @abstractmethod def initialize(self): pass @abstractmethod def handle_bar(self, event): pass
def get_market_data(self, market_data, stock_code=[], field=[], start="", end="", count=-1): """ 从dataframe解析数据成最终的数据格式,count都在在这里做 因为停牌或者其他原因取不到数据的,1 2 3 返回的是-1,其他返回的是pandas的空或者NaN,所以可以使用 >0判断是否取到值 :param market_data: :param stock_code: :param field: :param start: :param end: :param count: :return: """ if start != "": start = data_transfer.date_str_to_int(start) else: start = 0 if end != "": end = data_transfer.date_str_to_int(end) else: end = 0 # (1)代码-1,字段-1,时间-1, return float if len(stock_code) == 1 and len(field) == 1 and ( start == end) and count == -1: try: return market_data[field[0]].ix[stock_code[0], end] # 停牌或者其他情情况取不到数据的返回-1 except: return -1 # (2)代码-n,字段-1,时间-1, return Series elif len(stock_code) > 1 and len(field) == 1 and ( start == end) and count == -1: result_dict = {} for stock in stock_code: try: result_dict[stock] = market_data[field[0]].ix[stock, end] except: result_dict[stock] = -1 return pd.Series(result_dict) # (3)代码-1,字段-n,时间-1, return Series elif len(stock_code) == 1 and len(field) > 1 and ( start == end) and count == -1: result_dict = {} for field_one in field: try: result_dict[field_one] = market_data[field_one].ix[ stock_code[0], end] except: result_dict[field_one] = -1 return pd.Series(result_dict) # (4)代码-1,字段-1,时间-n, return Series elif len(stock_code) == 1 and len(field) == 1 and ( start != end) and count == -1: try: series = market_data[field[0]].ix[stock_code[0]] except KeyError: return pd.Series() series = series[series.index >= start] series = series[series.index <= end] return series # (5)代码-n,字段-1,时间-n, return dataframe 行-timetag,列-代码 elif len(stock_code) > 1 and len(field) == 1 and (start != end) and count == -1: result_dict = {} for stock in stock_code: index = market_data.ix[stock].index index = index[index <= end] index = index[index >= start] result_dict[stock] = market_data[field[0]].ix[stock][index] return pd.DataFrame(result_dict) # (6)代码-n,字段-n,时间-1, return dataframe 行-字段,列-代码 elif len(stock_code) > 1 and len(field) > 1 and ( start == end) and count == -1: result_dict = {} for stock in stock_code: try: result_dict[stock] = market_data.ix[stock].ix[end] except: result_dict[stock] = pd.Series() return pd.DataFrame(result_dict).ix[field] # (7)代码-1,字段-n,时间-n, return dataframe 行-timetag,列-字段 elif len(stock_code) == 1 and len(field) > 1 and (start != end) and count == -1: index = market_data.ix[stock_code[0]].index index = index[index <= end] index = index[index >= start] return market_data.ix[stock_code[0]][field].ix[index] # 代码-n,字段-n,时间-n, return dataframe 行-代码-timetag(多层索引),列-字段 else: result_dict = {} for stock in stock_code: index = market_data.ix[stock].index index = index[index <= end] index = index[index >= start] result_dict[stock] = market_data.ix[stock][field].ix[index] return pd.concat(result_dict, keys=stock_code)