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))
Exemple #2
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')
                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))
Exemple #3
0
    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)
Exemple #5
0
    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
Exemple #7
0
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)
Exemple #8
0
    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
Exemple #9
0
    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
Exemple #11
0
    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()
Exemple #12
0
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))
Exemple #13
0
    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
Exemple #14
0
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)
Exemple #15
0
 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)
Exemple #16
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))