Ejemplo n.º 1
0
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 ...")
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
    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()
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
    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}""")
Ejemplo n.º 6
0
    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("插入成功")