def main(): task() sentry.captureMessage(f"现在是 {datetime.datetime.today()}, 开始增量 stock.calendars 交易日历 ") schedule.every().day.at("16:00").do(task) while True: logger.info(schedule.jobs) schedule.run_pending() time.sleep(300) logger.info("no work to do, waiting ...")
def convert_8code(self, code): """ 股票格式转换: 转换为前缀模式 :param code: :return: """ if re.match(self.stock_format[1], code): # 600001.XSHG code = self.little8code(code[6:]) + code[:6] elif re.match(self.stock_format[0], code): # SH600001 pass else: logger.info("股票格式错误.") return code
def index_run(self): self.log("开始今天的指数更新服务 {}".format(self.check_date)) logger.info("开始今天的指数更新服务 {}".format(self.check_date)) self.process_daily(self.check_date) # self.month_sync() if (self.check_date + datetime.timedelta(days=1)).month != self.check_date.month: logger.info("开始本月的指数【月更新】服务") self.month_sync()
def generate_secucode_weight(self, connection, indexcode): """ select SecuCode, Weight from index_indexcomponentsweight where IndexCode = 1 and EndDate = (SELECT max(EndDate) FROM index_indexcomponentsweight where IndexCode = 1); 因为涉及到更新时间是当前这个指数的最新更新时间 所以查询单个进行 而非批量 """ query_sql = """select SecuCode, Weight from index_indexcomponentsweight where IndexCode = {} and EndDate = (SELECT max(EndDate) FROM index_indexcomponentsweight where IndexCode = {}); """.format(indexcode, indexcode) logger.info(query_sql) # self.log(query_sql) ret_dict = dict( ) # bson.errors.InvalidDocument: key '000059.XSHE' must not contain '.' try: with connection.cursor() as cursor: cursor.execute(query_sql) res = cursor.fetchall() for column in res: code = self.convert_8code(column[0]) ret_dict.update({code: float(column[1])}) finally: connection.commit() # print(ret_dict) return ret_dict
def month_sync(self): mysql_con = self.DC() coll = self.gen_index_coll() inner_code_map = self.generate_index_code(mysql_con) logger.info(inner_code_map) self.log(inner_code_map) # 显示InnerCode 与 SeCucode 之间的关系 # {3477: '399319', 3478: '399320', 3479: '399321', 3873: '399322', 4078: '399324', ...} inner_code_list = list(inner_code_map.keys()) for inner_code in inner_code_list: logger.info("") logger.info("inner_code: {}".format(inner_code)) self.log(inner_code) # 生成权重数据 index_secucode_weight_dict = self.generate_secucode_weight( mysql_con, inner_code) # self.log(index_secucode_weight_dict) front_index_code = self.month_code().get( inner_code_map.get(inner_code)) to_insert = dict(date=self.check_date, index=front_index_code, index_info=index_secucode_weight_dict) self.log(to_insert) logger.info(to_insert) try: coll.insert_one(to_insert) except pymongo.errors.DuplicateKeyError: self.log("重复") logger.warning("插入重复") except Exception: traceback.print_exc() raise Exception else: logger.info("插入成功") self.log("插入成功 ") logger.info(f"""insert success: \n date: {self.check_date} \n index: {front_index_code} \n index_info: {index_secucode_weight_dict}""")
def process_daily(self, dt: datetime.datetime): """ 日更新流程 :param dt: 要更新的某日 :return: """ logger.info("开始今天的指数【日更新】服务") dt = dt.strftime("%Y-%m-%d %H:%M:%S") coll = self.gen_index_coll() conn = self.DC2() daily_map = self.daily_code() self.log("需要进行日更新的相关代码信息是 {}".format(daily_map)) for index_code in list(daily_map.keys()): logger.info("") # 在日志中清晰空行 logger.info(f"index_code: {index_code}") self.log(index_code) conn.execute("use datacenter;") query_sql = f""" SELECT B.Date, B.IndexCode, A.SecuCode, B.Weight from const_secumainall A,index_weight B WHERE A.SecuCategory=1 AND A.SecuMarket IN(83,90) AND A.ListedSector IN(1,2,6,7) AND A.InnerCode=B.InnerCode AND B.IndexCode= '{index_code}' AND B.Date='{dt}' AND B.Flag=3; """ # self.log(f"query_sql: \n {query_sql}") res = conn.execute(query_sql).fetchall() if not res: logger.info("{} 今日 {} 无更新".format(index_code, dt)) self.log("{} 今日 {} 无更新".format(index_code, dt)) continue infos = dict() for r in res: infos.update({self.convert_6code(r[2]): float(r[3])}) data = { # 如果有更新的话 其插入的时间是当天的更新时间 check_date "date": self.check_date, # 插入的代码是前缀模式的代码 "index": daily_map.get(index_code), "index_info": infos, } self.log(data) try: coll.insert_one(data) except pymongo.errors.DuplicateKeyError: self.log("重复插入") logger.warning("重复插入") except Exception: logger.warning("插入失败 ") traceback.print_exc() raise Exception else: self.log("插入成功 ") logger.info("插入成功")