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)
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()
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()
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()