Beispiel #1
0
def report_top_stats(periods=[7, 30, 180, 365], ignore_new_stock=True):
    latest_day: Stock1dHfqKdata = Stock1dHfqKdata.query_data(order=Stock1dHfqKdata.timestamp.desc(), limit=1,
                                                             return_type='domain')
    current_timestamp = latest_day[0].timestamp
    email_action = EmailInformer()

    # 至少上市一年
    filters = None
    if ignore_new_stock:
        pre_year = next_date(current_timestamp, -365)

        stocks = get_entity_ids(provider='joinquant', entity_schema=Stock, filters=[Stock.timestamp <= pre_year])
        filters = [Stock1dHfqKdata.entity_id.in_(stocks)]

    stats = []
    ups = []
    downs = []
    msg = ''
    for period in periods:
        start = next_date(current_timestamp, -period)
        df, _ = get_top_performance_entities(start_timestamp=start, filters=filters, pct=1, show_name=True)
        df.rename(columns={'score': f'score_{period}'}, inplace=True)
        ups.append(tabulate(df.iloc[:50], headers='keys'))
        downs.append(tabulate(df.iloc[:-100], headers='keys'))

        stats.append(tabulate(df.describe(), headers='keys'))

        # 最近一个月最靓仔的
        if period == 30:
            # add them to eastmoney
            try:
                try:
                    eastmoneypy.del_group('最靓仔')
                except:
                    pass
                eastmoneypy.create_group('最靓仔')
                for entity_id in df.index[:50]:
                    _, _, code = decode_entity_id(entity_id)
                    eastmoneypy.add_to_group(code=code, group_name='最靓仔')
            except Exception as e:
                logger.exception(e)
                email_action.send_message("*****@*****.**", f'report_top_stats error',
                                          'report_top_stats error:{}'.format(e))

        # 一年内没怎么动的
        if period == 365:
            stable_df = df[(df['score_365'] > -0.1) & (df['score_365'] < 0.1)]
            vol_df = get_top_volume_entities(entity_ids=stable_df.index.tolist(), start_timestamp=start)

            # add them to eastmoney
            try:
                try:
                    eastmoneypy.del_group('躺尸一年')
                except:
                    pass
                eastmoneypy.create_group('躺尸一年')
                for entity_id in vol_df.index[:50]:
                    _, _, code = decode_entity_id(entity_id)
                    eastmoneypy.add_to_group(code=code, group_name='躺尸一年')
            except Exception as e:
                logger.exception(e)
                email_action.send_message("*****@*****.**", f'report_top_stats error',
                                          'report_top_stats error:{}'.format(e))

    for s in stats:
        msg = msg + s + '\n'

    for up in ups:
        msg = msg + up + '\n'

    for down in downs:
        msg = msg + down + '\n'

    email_action.send_message('*****@*****.**', f'{current_timestamp} 统计报告', msg)
Beispiel #2
0
def report_top_entities(
    entity_provider,
    data_provider,
    periods=None,
    ignore_new_stock=True,
    ignore_st=True,
    entity_ids=None,
    entity_type="stock",
    adjust_type=None,
    top_count=30,
    turnover_threshold=100000000,
    turnover_rate_threshold=0.02,
    informer: EmailInformer = None,
    em_group=None,
    em_group_over_write=True,
    return_type=TopType.positive,
):
    error_count = 0

    while error_count <= 10:
        try:
            if periods is None:
                periods = [7, 30, 365]
            if not adjust_type:
                adjust_type = default_adjust_type(entity_type=entity_type)
            kdata_schema = get_kdata_schema(entity_type=entity_type,
                                            adjust_type=adjust_type)
            entity_schema = get_entity_schema(entity_type=entity_type)

            target_date = get_latest_kdata_date(provider=data_provider,
                                                entity_type=entity_type,
                                                adjust_type=adjust_type)

            filter_entity_ids = get_entity_ids_by_filter(
                provider=entity_provider,
                ignore_st=ignore_st,
                ignore_new_stock=ignore_new_stock,
                entity_schema=entity_schema,
                target_date=target_date,
                entity_ids=entity_ids,
            )

            if not filter_entity_ids:
                msg = f"{entity_type} no entity_ids selected"
                logger.error(msg)
                informer.send_message(zvt_config["email_username"],
                                      "report_top_stats error", msg)
                return

            filter_turnover_df = kdata_schema.query_data(
                filters=[
                    kdata_schema.turnover >= turnover_threshold,
                    kdata_schema.turnover_rate >= turnover_rate_threshold,
                ],
                provider=data_provider,
                start_timestamp=target_date,
                index="entity_id",
                columns=["entity_id", "code"],
            )
            if filter_entity_ids:
                filter_entity_ids = set(filter_entity_ids) & set(
                    filter_turnover_df.index.tolist())
            else:
                filter_entity_ids = filter_turnover_df.index.tolist()

            if not filter_entity_ids:
                msg = f"{entity_type} no entity_ids selected"
                logger.error(msg)
                informer.send_message(zvt_config["email_username"],
                                      "report_top_stats error", msg)
                return

            logger.info(
                f"{entity_type} filter_entity_ids size: {len(filter_entity_ids)}"
            )
            filters = [kdata_schema.entity_id.in_(filter_entity_ids)]
            selected = []
            for i, period in enumerate(periods):
                interval = period
                if target_date.weekday() + 1 < interval:
                    interval = interval + 2
                start = next_date(target_date, -interval)
                positive_df, negative_df = get_top_performance_entities(
                    entity_type=entity_type,
                    start_timestamp=start,
                    kdata_filters=filters,
                    pct=1,
                    show_name=True,
                    entity_provider=entity_provider,
                    data_provider=data_provider,
                    return_type=return_type,
                )

                if return_type == TopType.positive:
                    df = positive_df
                else:
                    df = negative_df
                selected = selected + df.index[:top_count].tolist()
                selected = list(dict.fromkeys(selected))

            inform(
                informer,
                entity_ids=selected,
                target_date=target_date,
                title=f"{entity_type} {em_group}({len(selected)})",
                entity_provider=entity_provider,
                entity_type=entity_type,
                em_group=em_group,
                em_group_over_write=em_group_over_write,
            )
            break
        except Exception as e:
            logger.exception("report error:{}".format(e))
            time.sleep(30)
            error_count = error_count + 1
Beispiel #3
0
    least_start_day_nums = 60
    filters = None
    pre_date = next_date(current_timestamp, -least_start_day_nums)
    stocks = get_entity_ids(provider='joinquant',
                            entity_schema=Stock,
                            filters=[Stock.timestamp <= pre_date])
    filters = [Stock1dHfqKdata.entity_id.in_(stocks)]

    # 任一rps 大于90
    top_rps_stocks = []
    rps_rank_limit = 1000
    periods = [50, 120, 250]
    for period in periods:
        start = next_date(current_timestamp, -period)
        updf, _ = get_top_performance_entities(start_timestamp=start,
                                               filters=filters,
                                               pct=1,
                                               show_name=True)
        top_rps_stocks.extend(updf.iloc[:rps_rank_limit].index.tolist())

    top_stocks = list(set(top_holding_stocks) & set(top_rps_stocks))

    start_day_nums = 420
    if latest_day:
        target_date = latest_day[0].timestamp
    else:
        target_date = now_pd_timestamp()
    start_date = target_date - timedelta(start_day_nums)
    factor = TSIFactor(entity_schema=Stock,
                       provider='joinquant',
                       level=IntervalLevel.LEVEL_1DAY,
                       entity_ids=top_stocks,
Beispiel #4
0
def report_top_stats(
    entity_provider,
    data_provider,
    periods=[7, 30, 180, 365],
    ignore_new_stock=True,
    entity_type="stock",
    adjust_type=None,
    top_count=30,
    turnover_threshold=100000000,
    turnover_rate_threshold=0.02,
    em_group_over_write=True,
):
    if not adjust_type:
        adjust_type = default_adjust_type(entity_type=entity_type)
    kdata_schema = get_kdata_schema(entity_type=entity_type,
                                    adjust_type=adjust_type)
    entity_schema = get_entity_schema(entity_type=entity_type)
    latest_day = kdata_schema.query_data(provider=data_provider,
                                         order=kdata_schema.timestamp.desc(),
                                         limit=1,
                                         return_type="domain")
    current_timestamp = latest_day[0].timestamp
    email_action = EmailInformer()

    # 至少上市一年
    filter_entity_ids = []
    if ignore_new_stock:
        pre_year = next_date(current_timestamp, -365)

        entity_ids = get_entity_ids(
            provider=entity_provider,
            entity_schema=entity_schema,
            filters=[entity_schema.timestamp <= pre_year])

        if not entity_ids:
            msg = f"{entity_type} no entity_ids listed one year"
            logger.error(msg)
            email_action.send_message(zvt_config["email_username"],
                                      "report_top_stats error", msg)
            return
        filter_entity_ids = entity_ids

    filter_turnover_df = kdata_schema.query_data(
        filters=[
            kdata_schema.turnover >= turnover_threshold,
            kdata_schema.turnover_rate >= turnover_rate_threshold,
        ],
        provider=data_provider,
        start_timestamp=current_timestamp,
        index="entity_id",
        columns=["entity_id", "code"],
    )
    if filter_entity_ids:
        filter_entity_ids = set(filter_entity_ids) & set(
            filter_turnover_df.index.tolist())
    else:
        filter_entity_ids = filter_turnover_df.index.tolist()

    if not filter_entity_ids:
        msg = f"{entity_type} no entity_ids selected"
        logger.error(msg)
        email_action.send_message(zvt_config["email_username"],
                                  "report_top_stats error", msg)
        return

    logger.info(
        f"{entity_type} filter_entity_ids size: {len(filter_entity_ids)}")
    filters = [kdata_schema.entity_id.in_(filter_entity_ids)]

    stats = []
    ups = []
    downs = []

    for period in periods:
        start = next_date(current_timestamp, -period)
        df, _ = get_top_performance_entities(
            entity_type=entity_type,
            start_timestamp=start,
            filters=filters,
            pct=1,
            show_name=True,
            entity_provider=entity_provider,
            data_provider=data_provider,
        )
        df.rename(columns={"score": f"score_{period}"}, inplace=True)
        ups.append(tabulate(df.iloc[:top_count], headers="keys"))
        downs.append(tabulate(df.iloc[-top_count:], headers="keys"))

        stats.append(tabulate(df.describe(), headers="keys"))

        # 最近一个月和一周最靓仔的
        if period == 7 or period == 30:
            try:
                codes = [
                    decode_entity_id(entity_id)[2]
                    for entity_id in df.index[:top_count]
                ]
                add_to_eastmoney(codes=codes,
                                 entity_type=entity_type,
                                 group="最靓仔",
                                 over_write=em_group_over_write)
            except Exception as e:
                logger.exception(e)
                email_action.send_message(
                    zvt_config["email_username"], f"report_top_stats error",
                    "report_top_stats error:{}".format(e))

        # 一年内跌幅最大的
        if period == 365:
            try:
                codes = [
                    decode_entity_id(entity_id)[2]
                    for entity_id in df.index[-top_count:]
                ]
                add_to_eastmoney(codes=codes,
                                 entity_type=entity_type,
                                 group="谁有我惨",
                                 over_write=em_group_over_write)
            except Exception as e:
                logger.exception(e)
                email_action.send_message(
                    zvt_config["email_username"], f"report_top_stats error",
                    "report_top_stats error:{}".format(e))

    msg = "\n"
    for s in stats:
        msg = msg + s + "\n"
    email_action.send_message(zvt_config["email_username"],
                              f"{current_timestamp} {entity_type}统计报告", msg)

    msg = "\n"
    for up in ups:
        msg = msg + up + "\n"
    email_action.send_message(zvt_config["email_username"],
                              f"{current_timestamp} {entity_type}涨幅统计报告", msg)

    msg = "\n"
    for down in downs:
        msg = msg + down + "\n"

    email_action.send_message(zvt_config["email_username"],
                              f"{current_timestamp} {entity_type}跌幅统计报告", msg)