Exemplo n.º 1
0
def record_fund():
    while True:
        email_action = EmailInformer()

        try:
            # 基金和基金持仓数据
            Fund.record_data(provider='joinquant', sleeping_time=1)
            FundStock.record_data(provider='joinquant', sleeping_time=1)
            # 股票周线后复权数据
            Stock1wkHfqKdata.record_data(provider='joinquant', sleeping_time=0)

            email_action.send_message(zvt_config['email_username'], 'joinquant record fund finished', '')
            break
        except Exception as e:
            msg = f'joinquant record fund error:{e}'
            logger.exception(msg)

            email_action.send_message(zvt_config['email_username'], 'joinquant record fund error', msg)
            time.sleep(60)
Exemplo n.º 2
0
def get_top_fund_holding_stocks(timestamp=None, pct=0.3, by=None):
    if not timestamp:
        timestamp = now_pd_timestamp()
    # 季报一般在report_date后1个月内公布,年报2个月内,年报4个月内
    # 所以取时间点的最近的两个公布点,保证取到数据
    # 所以,这是个滞后的数据,只是为了看个大概,毕竟模糊的正确better than 精确的错误
    report_date = get_recent_report_date(timestamp, 1)
    fund_cap_df = FundStock.query_data(
        filters=[
            FundStock.report_date >= report_date,
            FundStock.timestamp <= timestamp,
        ],
        columns=["stock_id", "market_cap"],
    )
    fund_cap_df = fund_cap_df.groupby(
        "stock_id")["market_cap"].sum().sort_values(ascending=False)

    # 直接根据持有市值返回
    if not by:
        s = fund_cap_df.iloc[:int(len(fund_cap_df) * pct)]

        return s.to_frame()

    # 按流通盘比例
    if by == "trading":
        columns = ["entity_id", "circulating_market_cap"]
    # 按市值比例
    elif by == "all":
        columns = ["entity_id", "market_cap"]

    entity_ids = fund_cap_df.index.tolist()
    start_timestamp = next_date(timestamp, -30)
    cap_df = StockValuation.query_data(
        entity_ids=entity_ids,
        filters=[
            StockValuation.timestamp >= start_timestamp,
            StockValuation.timestamp <= timestamp,
        ],
        columns=columns,
    )
    if by == "trading":
        cap_df = cap_df.rename(columns={"circulating_market_cap": "cap"})
    elif by == "all":
        cap_df = cap_df.rename(columns={"market_cap": "cap"})

    cap_df = cap_df.groupby("entity_id").mean()
    result_df = pd.concat([cap_df, fund_cap_df], axis=1, join="inner")
    result_df["pct"] = result_df["market_cap"] / result_df["cap"]

    pct_df = result_df["pct"].sort_values(ascending=False)

    s = pct_df.iloc[:int(len(pct_df) * pct)]

    return s.to_frame()
Exemplo n.º 3
0
def get_top_fund_holding_stocks(timestamp=None, pct=0.3, by=None):
    if not timestamp:
        timestamp = now_pd_timestamp()
    # 季报一般在report_date后1个月内公布,年报2个月内,年报4个月内
    # 所以取时间点的最近的两个公布点,保证取到数据
    # 所以,这是个滞后的数据,只是为了看个大概,毕竟模糊的正确better than 精确的错误
    report_date = get_recent_report_date(timestamp, 1)
    df = FundStock.query_data(region=Region.CHN,
                              filters=[
                                  FundStock.report_date >= report_date,
                                  FundStock.timestamp <= timestamp
                              ],
                              columns=['stock_id', 'market_cap'])
    fund_cap_df = fund_cap_df.groupby(
        'stock_id')['market_cap'].sum().sort_values(ascending=False)

    # 直接根据持有市值返回
    if not by:
        s = fund_cap_df.iloc[:int(len(fund_cap_df) * pct)]

        return s.to_frame()

    # 按流通盘比例
    if by == 'trading':
        columns = ['entity_id', 'circulating_market_cap']
    # 按市值比例
    elif by == 'all':
        columns = ['entity_id', 'market_cap']

    entity_ids = fund_cap_df.index.tolist()
    start_timestamp = next_date(timestamp, -30)
    cap_df = StockValuation.query_data(
        entity_ids=entity_ids,
        filters=[
            StockValuation.timestamp >= start_timestamp,
            StockValuation.timestamp <= timestamp
        ],
        columns=columns)
    if by == 'trading':
        cap_df = cap_df.rename(columns={'circulating_market_cap': 'cap'})
    elif by == 'all':
        cap_df = cap_df.rename(columns={'market_cap': 'cap'})

    cap_df = cap_df.groupby('entity_id').mean()
    result_df = pd.concat([cap_df, fund_cap_df], axis=1, join='inner')
    result_df['pct'] = result_df['market_cap'] / result_df['cap']

    pct_df = result_df['pct'].sort_values(ascending=False)

    s = pct_df.iloc[:int(len(pct_df) * pct)]

    return s.to_frame()
Exemplo n.º 4
0
def get_top_fund_holding_stocks(timestamp=None, pct=0.3):
    if not timestamp:
        timestamp = now_pd_timestamp()
    # 季报一般在report_date后1个月内公布,年报2个月内,年报4个月内
    # 所以取时间点的最近的两个公布点,保证取到数据
    # 所以,这是个滞后的数据,只是为了看个大概,毕竟模糊的正确better than 精确的错误
    report_date = get_recent_report_date(timestamp, 1)
    df = FundStock.query_data(filters=[FundStock.report_date >= report_date, FundStock.timestamp <= timestamp])
    g = df.groupby('stock_id')
    market = g['market_cap'].sum().sort_values(ascending=False)
    s = market.iloc[:int(len(market) * pct)]

    return s.to_frame()