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: StockTradeDay = StockTradeDay.query_data( order=StockTradeDay.timestamp.desc(), limit=1, return_type='domain') if latest_day: target_date = latest_day[0].timestamp else: target_date = now_pd_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') info = [f'{stock.name}({stock.code})' for stock in stocks] msg = ' '.join(info) else: msg = 'no targets' logger.info(msg) email_action.send_message("*****@*****.**", 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_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') latest_day: StockTradeDay = StockTradeDay.query_data( order=StockTradeDay.timestamp.desc(), limit=1, return_type='domain') if latest_day: target_date = latest_day[0].timestamp else: target_date = 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') info = [f'{stock.name}({stock.code})' for stock in stocks] msg = ' '.join(info) else: msg = 'no targets' logger.info(msg) email_action.send_message([ '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**' ], 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 record(self, entity, start, end, size, timestamps, http_session): try: trade_day = StockTradeDay.query_data( region=self.region, limit=1, order=StockTradeDay.timestamp.desc(), return_type='domain') if len(trade_day) > 0: start = trade_day[0].timestamp except Exception as _: pass df = pd.DataFrame() dates = self.nyse.schedule(start_date=to_time_str(start), end_date=to_time_str( now_pd_timestamp(Region.US))) dates = dates.index.to_list() self.logger.info(f'add dates:{dates}') df['timestamp'] = pd.to_datetime(dates) df['id'] = [to_time_str(date) for date in dates] df['entity_id'] = 'nyse' df_to_db(df=df, region=self.region, data_schema=self.data_schema, provider=self.provider, force_update=self.force_update)
def record(self, entity, start, end, size, timestamps, http_session): try: trade_day = StockTradeDay.query_data( region=self.region, limit=1, order=StockTradeDay.timestamp.desc(), return_type='domain') if len(trade_day) > 0: start = trade_day[0].timestamp else: start = "1990-12-19" except Exception as _: pass df = pd.DataFrame() dates_df = bao_get_trade_days(start_date=start) dates = dates_df[dates_df['is_trading_day'] == '1']['calendar_date'].to_list() self.logger.info(f'add dates:{dates}') df['timestamp'] = pd.to_datetime(dates) df['id'] = [to_time_str(date) for date in dates] df['entity_id'] = 'chn' df_to_db(df=df, region=self.region, data_schema=self.data_schema, provider=self.provider, force_update=self.force_update)
def run(self): trade_days = StockTradeDay.query_data(region=self.region, order=StockTradeDay.timestamp.desc(), return_type='domain') self.trade_day = [day.timestamp for day in trade_days] super().run()
def evaluate_start_end_size_timestamps(self, entity): start, end, size, timestamps = super().evaluate_start_end_size_timestamps(entity) if start: trade_day = StockTradeDay.query_data(limit=1, order=StockTradeDay.timestamp.desc(), return_type='domain') if trade_day: if is_same_date(trade_day[0].timestamp, start): size = 0 return start, end, size, timestamps
def record_stock(): while True: email_action = EmailInformer() try: Stock.record_data(provider='joinquant', sleeping_time=1) StockTradeDay.record_data(provider='joinquant', sleeping_time=1) email_action.send_message("*****@*****.**", 'joinquant record stock finished', '') break except Exception as e: msg = f'joinquant record stock:{e}' logger.exception(msg) email_action.send_message("*****@*****.**", 'joinquant record stock error', msg) time.sleep(60 * 5)
def process_loop(self, entity, http_session): trade_days = StockTradeDay.query_data(region=self.region, return_type='df') if len(trade_days) > 0: start = to_time_str(trade_days['timestamp'].max(axis=0)) else: start = "1990-12-19" df = bao_get_trade_days(start_date=start) if pd_is_not_null(df): df = self.format(entity, df) self.persist(df) return None
def process_loop(self, entity, http_session): trade_days = StockTradeDay.query_data(region=self.region, return_type='df') if len(trade_days) > 0: start = to_time_str(trade_days['timestamp'].max(axis=0)) else: start = "1980-01-01" dates = jq_get_trade_days(date=start) dates = dates.iloc[:, 0] self.logger.info(f'add dates:{dates}') if len(dates) > 0: df = pd.DataFrame(dates, columns=['timestamp']) df = self.format(df) self.persist(df) return None
def process_loop(self, entity, http_session): calendar = mcal.get_calendar(entity) trade_days = StockTradeDay.query_data(region=self.region, return_type='df') if len(trade_days) > 0: start = to_time_str(trade_days['timestamp'].max(axis=0)) else: start = "1980-01-01" dates = calendar.schedule(start_date=start, end_date=to_time_str( now_pd_timestamp(Region.US))) dates = dates.index.to_list() self.logger.info(f'add dates:{dates}') if len(dates) > 0: df = pd.DataFrame(dates, columns=['timestamp']) df = self.format(entity, df) self.persist(df) return None
def run(self): http_session = get_http_session() trade_days= StockTradeDay.query_data(region=self.region, order=StockTradeDay.timestamp.desc(), return_type='domain') trade_day = [day.timestamp for day in trade_days] stock_detail = StockDetail.query_data(region=self.region, columns=['entity_id', 'end_date'], index=['entity_id'], return_type='df') time.sleep(random.randint(0, self.share_para[1])) process_identity = multiprocessing.current_process()._identity if len(process_identity) > 0: # The worker process tqdm bar shall start at Position 1 worker_id = (process_identity[0]-1)%self.share_para[1] + 1 else: worker_id = 0 desc = "{:02d}: {}".format(worker_id, self.share_para[0]) with tqdm(total=len(self.entities), ncols=80, position=worker_id, desc=desc, leave=self.share_para[3]) as pbar: for entity_item in self.entities: self.process_loop(entity_item, trade_day, stock_detail, http_session) self.share_para[2].acquire() pbar.update() self.share_para[2].release() self.on_finish()
def report_tm(): while True: error_count = 0 discord_informer = DiscordInformer() try: # 抓取k线数据 # StockTradeDay.record_data(provider='baostock', sleeping_time=2) # Stock1dKdata.record_data(provider='baostock', sleeping_time=1.5) latest_day: StockTradeDay = StockTradeDay.query_data(order=StockTradeDay.timestamp.desc(), limit=1,provider='joinquant', return_type='domain') if latest_day: target_date = latest_day[0].timestamp else: target_date = now_pd_timestamp() start_date = target_date - timedelta(60) # 计算 my_selector = TargetSelector(entity_schema=Stock, provider='joinquant', start_timestamp=start_date, end_timestamp=target_date) # add the factors tm_factor = TMFactor(entity_schema=Stock, provider='joinquant', start_timestamp=start_date, end_timestamp=target_date) my_selector.add_filter_factor(tm_factor) my_selector.run() long_targets = my_selector.get_open_long_targets(timestamp=target_date) logger.info(long_targets) msg = 'no targets' # 过滤亏损股 # check StockValuation data pe_date = target_date - 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_targets, start_timestamp=pe_date, filters=[StockValuation.pe > 0], columns=['entity_id']) bad_stocks = set(long_targets) - 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: # use block to filter block_selector = BlockSelector(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 = Block.query_data(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 = BlockStock.query_data(provider='sina', filters=[ BlockStock.stock_id.in_(long_stocks)], entity_ids=long_blocks, return_type='domain') 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' discord_informer.send_message(f'{target_date} TM选股结果 {msg}') break except Exception as e: logger.exception('report_tm error:{}'.format(e)) time.sleep(60 * 3) error_count = error_count + 1 if error_count == 10: discord_informer.send_message(f'report_tm error', 'report_tm error:{}'.format(e))
def record2(self, entity, start, end, size, timestamps): if not end: end = to_time_str(now_pd_timestamp()) if (pd.to_datetime(end) - start).days >= 30: from datetime import timedelta end = to_time_str(start + timedelta(days=30)) start = to_time_str(start) if start == end: return None # 暂不处理港股 if 'hk' in entity.id: return None exchange = 'SH' if 'sh' in entity.id else 'SZ' em_code = entity.code + '.' + exchange columns_list = { 'TOTALSHARE': 'capitalization', # 总股本 'LIQSHARE': 'circulating_cap', # 流通股本 'MV': 'market_cap', # 总市值 'LIQMV': 'circulating_market_cap', # 流通市值 'TURN': 'turnover_ratio', # 换手率 'PELYR': 'pe', # 静态pe 'PETTM': 'pe_ttm', # 动态pe 'PBLYR': 'pb', # 市净率PB(最新年报) 'PBMRQ': 'pb_mrq', # 市净率PB(MRQ) 'PSTTM': 'ps_ttm', # 市销率PS(TTM) 'PCFTTM': 'pcf_ttm', # 市现率PCF(最新年报,经营性现金流) } # df = c.csd(em_code, [i for i in columns_list.keys()], start,end,"ispandas=1,DelType=2") df = get_data(data_schema=StockValuation, entity_id=entity.id, provider='joinquant', start_timestamp=start, end_timestamp=end) if df.empty: df = get_data(data_schema=StockValuation, entity_id=entity.id, provider='joinquant', limit=1) start = df.timestamp[0] end = to_time_str(start + timedelta(days=30)) df = get_data(data_schema=StockValuation, entity_id=entity.id, provider='joinquant', start_timestamp=start, end_timestamp=end) if df.empty: return None df.rename(columns={ "ps": "ps_ttm", "pcf": "pcf_ttm", }, inplace=True) trade_day = StockTradeDay.query_data(order=StockTradeDay.timestamp.desc(), start_timestamp=start, end_timestamp=end) df_capital_all = pd.DataFrame() for tradeday in trade_day.timestamp: df_capital = c.css(em_code, "WACC,DIVIDENDYIELDNEW", f"TradeDate={to_time_str(tradeday)},FrIndex=1,MrIndex=1,ispandas=1") try: df_capital['DATES'] = tradeday except: continue df_capital_all = df_capital_all.append(df_capital) # 'DIVIDENDYIELDNEW': 'div_yield', #股息率 try: if df.empty: return None except: self.logger.info(f'choice数据源的个股估值尚未准备完成,获取失败。' f'股票代码:{em_code}-开始时间:{start}-结束时间:{end}') return None df['CODES'] = df_capital_all.index[0] df['DATES'] = df['timestamp'] df_capital_all['DATES'] = pd.to_datetime(df_capital_all['DATES']) df_capital_all.rename(columns={"DIVIDENDYIELDNEW": "div_yield", "WACC": "wacc"}, inplace=True) df = pd.merge(df, df_capital_all, on=['CODES', 'DATES'], how='outer') df.dropna(subset=['id'],inplace=True) df_to_db(df=df, data_schema=self.data_schema, provider=self.provider, force_update=self.force_update) return None
account_stock_position_response = s.get( f"{beehive3_api}/api/portfolio/position/{portfolio_id}") account_position = account_stock_position_response.json() # 现有持仓 stock_df = pd.DataFrame() for sotck_pos in account_position['industry_info']: for i in sotck_pos['stocks']: stock_df = stock_df.append(pd.DataFrame(i, index=[0])) nowend = '20210909' back_date = [nowend] for ye in back_date: start = f'{ye}' end = nowend trade_data = StockTradeDay.query_data( start_timestamp=pd.to_datetime(start) - np.timedelta64(1, 'Y'), end_timestamp=pd.to_datetime(end)).timestamp trade_data = list(set(str(i.year) for i in trade_data)) # 设置调仓日 relocation_date = '0501' buy_signal = pd.DataFrame() no_symbol = [] for sheet_name in trade_data: print(sheet_name) # data = pd.read_excel("C:/Users/32771/Desktop/选股情况记录/20210801/WACC54结果.xlsx", sheet_name=sheet_name) data = pd.read_excel("C:\\Users\\32771\\Downloads\\好公司2021V2.xlsx", sheet_name=sheet_name) try: # data = data[data.市场 == 'A股'] data.dropna(subset=['智道分类'], inplace=True)
def get_stock_trade_day(provider: Provider, lock, region): # 交易日 StockTradeDay.record_data(provider=provider, share_para=('Trade Day', 0, lock, True, region), sleeping_time=0)
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') latest_day: StockTradeDay = StockTradeDay.query_data( order=StockTradeDay.timestamp.desc(), limit=1, return_type='domain') if latest_day: target_date = latest_day[0].timestamp else: target_date = 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(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))