def report_bull(): while True: error_count = 0 email_action = EmailInformer() try: latest_day: Stock1dHfqKdata = Stock1dHfqKdata.query_data(order=Stock1dHfqKdata.timestamp.desc(), limit=1, return_type='domain') target_date = latest_day[0].timestamp # 计算均线 start = '2019-01-01' my_selector = TargetSelector(start_timestamp=start, end_timestamp=target_date) # add the factors factor1 = BullFactor(start_timestamp=start, end_timestamp=target_date) factor2 = CrossMaVolumeFactor(start_timestamp=start, end_timestamp=target_date, windows=[5, 120, 250]) my_selector.add_factor(factor1) my_selector.add_factor(factor2) my_selector.run() long_stocks = my_selector.get_open_long_targets(timestamp=target_date) msg = 'no targets' if long_stocks: stocks = get_entities(provider='joinquant', entity_schema=Stock, entity_ids=long_stocks, return_type='domain') # add them to eastmoney try: try: eastmoneypy.del_group('bull') except: pass eastmoneypy.create_group('bull') for stock in stocks: eastmoneypy.add_to_group(stock.code, group_name='bull') except Exception as e: email_action.send_message(zvt_config['email_username'], f'report_bull error', 'report_bull error:{}'.format(e)) infos = stocks_with_info(stocks) msg = '\n'.join(infos) + '\n' logger.info(msg) email_action.send_message(zvt_config['email_username'], f'{target_date} bull选股结果', msg) break except Exception as e: logger.exception('report_bull error:{}'.format(e)) time.sleep(60 * 3) error_count = error_count + 1 if error_count == 10: email_action.send_message(zvt_config['email_username'], f'report_bull error', 'report_bull error:{}'.format(e))
def report_core_company(): while True: error_count = 0 email_action = EmailInformer() try: # StockTradeDay.record_data(provider='joinquant') # Stock.record_data(provider='joinquant') # FinanceFactor.record_data(provider='eastmoney') # BalanceSheet.record_data(provider='eastmoney') target_date = to_time_str(now_pd_timestamp()) my_selector: TargetSelector = FundamentalSelector( start_timestamp='2015-01-01', end_timestamp=target_date) my_selector.run() long_targets = my_selector.get_open_long_targets( timestamp=target_date) if long_targets: stocks = get_entities(provider='joinquant', entity_schema=Stock, entity_ids=long_targets, return_type='domain') # add them to eastmoney try: try: eastmoneypy.del_group('core') except: pass eastmoneypy.create_group('core') for stock in stocks: eastmoneypy.add_to_group(stock.code, group_name='core') except Exception as e: email_action.send_message( "*****@*****.**", f'report_core_company error', 'report_core_company error:{}'.format(e)) info = [f'{stock.name}({stock.code})' for stock in stocks] msg = ' '.join(info) else: msg = 'no targets' logger.info(msg) email_action.send_message(get_subscriber_emails(), f'{to_time_str(target_date)} 核心资产选股结果', msg) break except Exception as e: logger.exception('report_core_company error:{}'.format(e)) time.sleep(60 * 3) error_count = error_count + 1 if error_count == 10: email_action.send_message( "*****@*****.**", f'report_core_company error', 'report_core_company error:{}'.format(e))
def report_vol_up_250(): while True: error_count = 0 email_action = EmailInformer() try: # 抓取k线数据 # StockTradeDay.record_data(provider='joinquant') # Stock1dKdata.record_data(provider='joinquant') latest_day: Stock1dKdata = Stock1dKdata.query_data(order=Stock1dKdata.timestamp.desc(), limit=1, return_type='domain') target_date = latest_day[0].timestamp # 计算均线 my_selector = TargetSelector(start_timestamp='2018-01-01', end_timestamp=target_date) # add the factors factor1 = VolumeUpMa250Factor(start_timestamp='2018-01-01', end_timestamp=target_date) my_selector.add_filter_factor(factor1) my_selector.run() long_targets = my_selector.get_open_long_targets(timestamp=target_date) if long_targets: stocks = get_entities(provider='joinquant', entity_schema=Stock, entity_ids=long_targets, return_type='domain') # add them to eastmoney try: try: eastmoneypy.del_group('tech') except: pass eastmoneypy.create_group('tech') for stock in stocks: eastmoneypy.add_to_group(stock.code, group_name='tech') except Exception as e: email_action.send_message("*****@*****.**", f'report_vol_up_250 error', 'report_vol_up_250 error:{}'.format(e)) info = [f'{stock.name}({stock.code})' for stock in stocks] msg = ' '.join(info) else: msg = 'no targets' logger.info(msg) email_action.send_message(get_subscriber_emails(), f'{target_date} 放量突破年线选股结果', msg) break except Exception as e: logger.exception('report_vol_up_250 error:{}'.format(e)) time.sleep(60 * 3) error_count = error_count + 1 if error_count == 10: email_action.send_message("*****@*****.**", f'report_vol_up_250 error', 'report_vol_up_250 error:{}'.format(e))
def add_to_eastmoney(codes, group, entity_type="stock", over_write=True): if over_write: try: eastmoneypy.del_group(group_name=group) except: pass try: eastmoneypy.create_group(group_name=group) except: pass for code in codes: eastmoneypy.add_to_group(code=code, entity_type=entity_type, group_name=group)
def record_block(): while True: email_action = EmailInformer() try: Block.record_data(provider='eastmoney', force_update=False) # 只抓取概念行情 df = Block.query_data(filters=[Block.category == BlockCategory.concept.value], index='entity_id') entity_ids = df.index.tolist() Block1dKdata.record_data(provider='em', entity_ids=entity_ids) # 报告新概念 list_date = next_date(current_date(), -90) df = Block.query_data(filters=[Block.category == BlockCategory.concept.value, Block.list_date >= list_date], index='entity_id') # add them to eastmoney try: try: eastmoneypy.create_group('概念') except: pass for code in df['code']: eastmoneypy.add_to_group(code, group_name='概念', entity_type='block') except Exception as e: email_action.send_message(zvt_config['email_username'], f'report_concept error', 'report_concept error:{}'.format(e)) email_action.send_message(zvt_config['email_username'], 'record block finished', '') break except Exception as e: msg = f'record block error:{e}' logger.exception(msg) email_action.send_message(zvt_config['email_username'], 'record block error', msg) time.sleep(60)
def report_state(): while True: error_count = 0 email_action = EmailInformer(ssl=True) try: latest_day: Stock1dKdata = Stock1dKdata.query_data(order=Stock1dKdata.timestamp.desc(), limit=1, return_type='domain') target_date = latest_day[0].timestamp # target_date = to_pd_timestamp('2020-01-02') # 计算均线 my_selector = TargetSelector(start_timestamp='2018-01-01', end_timestamp=target_date) # add the factors factor1 = VolumeUpMa250Factor(start_timestamp='2018-01-01', end_timestamp=target_date) my_selector.add_filter_factor(factor1) my_selector.run() long_stocks = my_selector.get_open_long_targets(timestamp=target_date) msg = 'no targets' # 过滤亏损股 # check StockValuation data pe_date = target_date - datetime.timedelta(10) if StockValuation.query_data(start_timestamp=pe_date, limit=1, return_type='domain'): positive_df = StockValuation.query_data(provider='joinquant', entity_ids=long_stocks, start_timestamp=pe_date, filters=[StockValuation.pe > 0], columns=['entity_id']) bad_stocks = set(long_stocks) - set(positive_df['entity_id'].tolist()) if bad_stocks: stocks = get_entities(provider='joinquant', entity_schema=Stock, entity_ids=bad_stocks, return_type='domain') info = [f'{stock.name}({stock.code})' for stock in stocks] msg = '亏损股:' + ' '.join(info) + '\n' long_stocks = set(positive_df['entity_id'].tolist()) if long_stocks: pre_date = target_date - datetime.timedelta(3 * 365) ma_state = MaStateStatsFactor(entity_ids=long_stocks, start_timestamp=pre_date, end_timestamp=target_date, persist_factor=False) bad_stocks = [] for entity_id, df in ma_state.factor_df.groupby(level=0): if df['current_pct'].max() >= 0.35: bad_stocks.append(entity_id) long_stocks.remove(entity_id) if bad_stocks: stocks = get_entities(provider='joinquant', entity_schema=Stock, entity_ids=bad_stocks, return_type='domain') info = [f'{stock.name}({stock.code})' for stock in stocks] msg = msg + '3年内高潮过:' + ' '.join(info) + '\n' # 过滤风险股 if long_stocks: risky_codes = risky_company(the_date=target_date, entity_ids=long_stocks) if risky_codes: long_stocks = [entity_id for entity_id in long_stocks if get_entity_code(entity_id) not in risky_codes] stocks = get_entities(provider='joinquant', entity_schema=Stock, entity_ids=risky_codes, return_type='domain') info = [f'{stock.name}({stock.code})' for stock in stocks] msg = msg + '风险股:' + ' '.join(info) + '\n' if long_stocks: stocks = get_entities(provider='joinquant', entity_schema=Stock, entity_ids=long_stocks, return_type='domain') # add them to eastmoney try: try: eastmoneypy.del_group('real') except: pass eastmoneypy.create_group('real') for stock in stocks: eastmoneypy.add_to_group(stock.code, group_name='real') except Exception as e: email_action.send_message("*****@*****.**", f'report state error', 'report state error:{}'.format(e)) info = [f'{stock.name}({stock.code})' for stock in stocks] msg = msg + '盈利股:' + ' '.join(info) + '\n' logger.info(msg) email_action.send_message('*****@*****.**', f'{target_date} 放量突破年线state选股结果', msg) break except Exception as e: logger.exception('report state error:{}'.format(e)) time.sleep(60 * 3) error_count = error_count + 1 if error_count == 10: email_action.send_message("*****@*****.**", f'report state error', 'report state error:{}'.format(e))
def report_vol_up_250(): while True: error_count = 0 email_action = EmailInformer() try: # 抓取k线数据 # StockTradeDay.record_data(provider='joinquant') # Stock1dKdata.record_data(provider='joinquant') latest_day: Stock1dHfqKdata = Stock1dHfqKdata.query_data( order=Stock1dHfqKdata.timestamp.desc(), limit=1, return_type='domain') target_date = latest_day[0].timestamp # 计算均线 my_selector = TargetSelector(start_timestamp='2018-10-01', end_timestamp=target_date) # add the factors factor1 = VolumeUpMaFactor(start_timestamp='2018-10-01', end_timestamp=target_date) my_selector.add_filter_factor(factor1) my_selector.run() long_stocks = my_selector.get_open_long_targets( timestamp=target_date) msg = 'no targets' # 过滤亏损股 # check StockValuation data pe_date = target_date - datetime.timedelta(10) if StockValuation.query_data(start_timestamp=pe_date, limit=1, return_type='domain'): positive_df = StockValuation.query_data( provider='joinquant', entity_ids=long_stocks, start_timestamp=pe_date, filters=[StockValuation.pe > 0], columns=['entity_id']) bad_stocks = set(long_stocks) - set( positive_df['entity_id'].tolist()) if bad_stocks: stocks = get_entities(provider='joinquant', entity_schema=Stock, entity_ids=bad_stocks, return_type='domain') info = [f'{stock.name}({stock.code})' for stock in stocks] msg = '亏损股:' + ' '.join(info) + '\n' long_stocks = set(positive_df['entity_id'].tolist()) if long_stocks: stocks = get_entities(provider='joinquant', entity_schema=Stock, entity_ids=long_stocks, return_type='domain') # add them to eastmoney try: try: eastmoneypy.del_group('tech') except: pass eastmoneypy.create_group('tech') for stock in stocks: eastmoneypy.add_to_group(stock.code, group_name='tech') except Exception as e: email_action.send_message( "*****@*****.**", f'report_vol_up_250 error', 'report_vol_up_250 error:{}'.format(e)) info = [f'{stock.name}({stock.code})' for stock in stocks] msg = msg + '盈利股:' + ' '.join(info) + '\n' logger.info(msg) email_action.send_message(get_subscriber_emails(), f'{target_date} 改进版放量突破年线选股结果', msg) break except Exception as e: logger.exception('report_vol_up_250 error:{}'.format(e)) time.sleep(60 * 3) error_count = error_count + 1 if error_count == 10: email_action.send_message( "*****@*****.**", f'report_vol_up_250 error', 'report_vol_up_250 error:{}'.format(e))
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)
def report_vol_up(): while True: error_count = 0 email_action = EmailInformer() try: # 抓取k线数据 # StockTradeDay.record_data(provider='joinquant') # Stock1dKdata.record_data(provider='joinquant') latest_day: Stock1dHfqKdata = Stock1dHfqKdata.query_data( order=Stock1dHfqKdata.timestamp.desc(), limit=1, return_type='domain') target_date = latest_day[0].timestamp start_timestamp = next_date(target_date, -50) # 成交量 vol_df = get_top_volume_entities(entity_type='stock', start_timestamp=start_timestamp, end_timestamp=target_date, pct=0.4) current_entity_pool = vol_df.index.tolist() # 计算均线 start = '2019-01-01' my_selector = TargetSelector(start_timestamp=start, end_timestamp=target_date, select_mode=SelectMode.condition_or) # add the factors factor1 = VolumeUpMaFactor(entity_ids=current_entity_pool, start_timestamp=start, end_timestamp=target_date, windows=[120, 250], over_mode='or') my_selector.add_factor(factor1) my_selector.run() long_stocks = my_selector.get_open_long_targets( timestamp=target_date) msg = 'no targets' if long_stocks: stocks = get_entities(provider='joinquant', entity_schema=Stock, entity_ids=long_stocks, return_type='domain') # add them to eastmoney try: try: eastmoneypy.del_group('tech') except: pass eastmoneypy.create_group('tech') for stock in stocks: eastmoneypy.add_to_group(stock.code, group_name='tech') except Exception as e: email_action.send_message( zvt_config['email_username'], f'report_vol_up error', 'report_vol_up error:{}'.format(e)) infos = stocks_with_info(stocks) msg = '\n'.join(infos) + '\n' logger.info(msg) email_action.send_message(zvt_config['email_username'], f'{target_date} 改进版放量突破(半)年线选股结果', msg) break except Exception as e: logger.exception('report_vol_up error:{}'.format(e)) time.sleep(60 * 3) error_count = error_count + 1 if error_count == 10: email_action.send_message(zvt_config['email_username'], f'report_vol_up error', 'report_vol_up error:{}'.format(e))
def report_real(region): while True: error_count = 0 email_action = EmailInformer(ssl=True) try: latest_day: Stock1dKdata = Stock1dKdata.query_data( region=region, order=Stock1dKdata.timestamp.desc(), limit=1, return_type='domain') target_date = latest_day[0].timestamp # target_date = '2020-02-04' # 计算均线 my_selector = TargetSelector(region=region, start_timestamp='2018-01-01', end_timestamp=target_date) # add the factors factor1 = VolumeUpMa250Factor(region=region, start_timestamp='2018-01-01', end_timestamp=target_date) my_selector.add_filter_factor(factor1) my_selector.run() long_stocks = my_selector.get_open_long_targets( timestamp=target_date) msg = 'no targets' # 过滤亏损股 # check StockValuation data pe_date = target_date - datetime.timedelta(10) if StockValuation.query_data(region=region, start_timestamp=pe_date, limit=1, return_type='domain'): positive_df = StockValuation.query_data( region=region, provider=Provider.JoinQuant, entity_ids=long_stocks, start_timestamp=pe_date, filters=[StockValuation.pe > 0], columns=['entity_id']) bad_stocks = set(long_stocks) - set( positive_df['entity_id'].tolist()) if bad_stocks: stocks = get_entities(region=region, provider=Provider.JoinQuant, entity_schema=Stock, entity_ids=bad_stocks, return_type='domain') info = [f'{stock.name}({stock.code})' for stock in stocks] msg = '亏损股:' + ' '.join(info) + '\n' long_stocks = set(positive_df['entity_id'].tolist()) if long_stocks: # use block to filter block_selector = BlockSelector(region=region, start_timestamp='2020-01-01', long_threshold=0.8) block_selector.run() long_blocks = block_selector.get_open_long_targets( timestamp=target_date) if long_blocks: blocks: List[Block] = Block.query_data( region=region, provider=Provider.Sina, entity_ids=long_blocks, return_type='domain') info = [f'{block.name}({block.code})' for block in blocks] msg = ' '.join(info) + '\n' block_stocks: List[BlockStock] = BlockStock.query_data( region=region, provider=Provider.Sina, filters=[BlockStock.stock_id.in_(long_stocks)], entity_ids=long_blocks, return_type='domain') if block_stocks: # add them to eastmoney try: try: eastmoneypy.del_group('real') except: pass eastmoneypy.create_group('real') for block_stock in block_stocks: eastmoneypy.add_to_group( block_stock.stock_code, group_name='real') except Exception as e: email_action.send_message( "*****@*****.**", f'report_real error', 'report_real error:{}'.format(e)) block_map_stocks = {} for block_stock in block_stocks: stocks = block_map_stocks.get(block_stock.name) if not stocks: stocks = [] block_map_stocks[block_stock.name] = stocks stocks.append( f'{block_stock.stock_name}({block_stock.stock_code})' ) for block in block_map_stocks: stocks = block_map_stocks[block] stock_msg = ' '.join(stocks) msg = msg + f'{block}:\n' + stock_msg + '\n' logger.info(msg) email_action.send_message('*****@*****.**', f'{target_date} 放量突破年线real选股结果', msg) break except Exception as e: logger.exception('report_real error:{}'.format(e)) time.sleep(60 * 3) error_count = error_count + 1 if error_count == 10: email_action.send_message("*****@*****.**", f'report_real error', 'report_real error:{}'.format(e))
def report_state(region): while True: error_count = 0 email_action = EmailInformer(ssl=True) try: latest_day: Stock1dKdata = Stock1dKdata.query_data( region=region, order=Stock1dKdata.timestamp.desc(), limit=1, return_type='domain') target_date = latest_day[0].timestamp # target_date = to_pd_timestamp('2020-01-02') # 计算均线 my_selector = TargetSelector(region=region, start_timestamp='2018-01-01', end_timestamp=target_date) # add the factors factor1 = ImprovedMaFactor(region=region, start_timestamp='2018-01-01', end_timestamp=target_date) my_selector.add_filter_factor(factor1) my_selector.run() long_stocks = my_selector.get_open_long_targets( timestamp=target_date) stock_map_slope = {} logger.info(long_stocks) msg = 'no targets' if long_stocks: pre_date = target_date - datetime.timedelta(2 * 365) ma_state = MaStateStatsFactor(region=region, entity_ids=long_stocks, start_timestamp=pre_date, end_timestamp=target_date, need_persist=False) ma_state.factor_df['slope'] = 100 * ma_state.factor_df[ 'current_pct'] / ma_state.factor_df['current_count'] high_stocks = [] for entity_id, df in ma_state.factor_df.groupby(level=0): if df['current_pct'].max() >= 0.7: high_stocks.append(entity_id) stock_map_slope[entity_id] = round(df['slope'].iat[-1], 2) if high_stocks: stocks = get_entities(region=region, provider=Provider.JoinQuant, entity_schema=Stock, entity_ids=high_stocks, return_type='domain') info = [ f'{stock.name}({stock.code})[{stock_map_slope.get(stock.entity_id)}]' for stock in stocks ] msg = msg + '2年内高潮过:' + ' '.join(info) + '\n' # 过滤风险股 if long_stocks: risky_codes = risky_company(region=region, the_date=target_date, entity_ids=long_stocks, income_yoy=-0.8, profit_yoy=-0.8) if risky_codes: long_stocks = [ entity_id for entity_id in long_stocks if get_entity_code(entity_id) not in risky_codes ] stocks = get_entities(region=region, provider=Provider.JoinQuant, entity_schema=Stock, codes=risky_codes, return_type='domain') info = [ f'{stock.name}({stock.code})[{stock_map_slope.get(stock.entity_id)}]' for stock in stocks ] msg = msg + '风险股:' + ' '.join(info) + '\n' if long_stocks: stocks = get_entities(region=region, provider=Provider.JoinQuant, entity_schema=Stock, entity_ids=long_stocks, return_type='domain') # add them to eastmoney try: try: eastmoneypy.del_group('real') except: pass eastmoneypy.create_group('real') for stock in stocks: eastmoneypy.add_to_group(stock.code, group_name='real') except Exception as e: email_action.send_message( "*****@*****.**", f'report state error', 'report state error:{}'.format(e)) info = [ f'{stock.name}({stock.code})[{stock_map_slope.get(stock.entity_id)}]' for stock in stocks ] msg = msg + '选中:' + ' '.join(info) + '\n' logger.info(msg) email_action.send_message('*****@*****.**', f'{target_date} 放量突破年线state选股结果', msg) break except Exception as e: logger.exception('report state error:{}'.format(e)) time.sleep(60 * 3) error_count = error_count + 1 if error_count == 10: email_action.send_message("*****@*****.**", f'report state error', 'report state error:{}'.format(e))