Exemple #1
0
 def get_index_data(self, _date):
     df = pd.DataFrame()
     for code, name in ct.TDX_INDEX_DICT.items():
         self.mysql_client.changedb(CIndex.get_dbname(code))
         data = self.mysql_client.get(
             "select * from day where date=\"%s\";" % _date)
         data['name'] = name
         df = df.append(data)
     self.mysql_client.changedb()
     return df
Exemple #2
0
 def collect(self):
     cdata = dict()
     cdata['name'] = list()
     cdata['price'] = list()
     cdata['volume'] = list()
     cdata['amount'] = list()
     cdict = self.get_combination_dict()
     if 0 == len(cdict): return False
     for code in ct.INDEX_DICT:
         df_byte = self.redis.get(
             CIndex.get_redis_name(CIndex.get_dbname(code)))
         if df_byte is None: continue
         df = _pickle.loads(df_byte)
         price = float(df.last_price.tolist()[0])
         p_volume = float(df.volume.tolist()[0])
         p_amount = float(df.turnover.tolist()[0])
         cdata['name'].append(ct.INDEX_DICT[code])
         cdata['price'].append(price)
         cdata['volume'].append(p_volume)
         cdata['amount'].append(p_amount)
     for code in cdict:
         key = cdict[code]
         df_byte = self.redis.get(Combination.get_redis_name(code))
         if df_byte is None: continue
         df = _pickle.loads(df_byte)
         price = float(df.price.tolist()[0])
         p_volume = float(df.volume.tolist()[0])
         p_amount = float(df.amount.tolist()[0])
         cdata['name'].append(key)
         cdata['price'].append(price)
         cdata['volume'].append(p_volume)
         cdata['amount'].append(p_amount)
     df = pd.DataFrame.from_dict(cdata)
     df['time'] = datetime.fromtimestamp(time.time()).strftime('%H:%M:%S')
     df['date'] = datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d')
     self.mysql_client.set(df, self.table)
     return True
Exemple #3
0
class BullStockRatio:
    def __init__(self, index_code, dbinfo=ct.DB_INFO, redis_host=None):
        self.dbinfo = dbinfo
        self.index_code = index_code
        self.index_obj = CIndex(index_code,
                                dbinfo=self.dbinfo,
                                redis_host=redis_host)
        self.db_name = self.index_obj.get_dbname(index_code)
        self.logger = getLogger(__name__)
        self.ris = RIndexStock(dbinfo, redis_host)
        self.bull_stock_ratio_table = self.get_table_name()
        self.redis = create_redis_obj(
        ) if redis_host is None else create_redis_obj(redis_host)
        self.mysql_client = CMySQL(self.dbinfo,
                                   dbname=self.db_name,
                                   iredis=self.redis)
        if not self.create(): raise Exception("create emotion table failed")

    def delete(self):
        self.mysql_client.delete(self.bull_stock_ratio_table)

    def get_table_name(self):
        return "%s_%s" % (self.db_name, ct.BULLSTOCKRATIO_TABLE)

    def create(self):
        if self.bull_stock_ratio_table not in self.mysql_client.get_all_tables(
        ):
            sql = 'create table if not exists %s(date varchar(10) not null, ratio float, PRIMARY KEY (date))' % self.bull_stock_ratio_table
            if not self.mysql_client.create(sql, self.bull_stock_ratio_table):
                return False
        return True

    def is_date_exists(self, table_name, cdate):
        if self.redis.exists(table_name):
            return cdate in set(
                str(tdate, encoding=ct.UTF8)
                for tdate in self.redis.smembers(table_name))
        return False

    def get_k_data_between(self, start_date, end_date):
        sql = "select * from %s where date between \"%s\" and \"%s\"" % (
            self.get_table_name(), start_date, end_date)
        return self.mysql_client.get(sql)

    def get_components(self, cdate):
        df = self.index_obj.get_components_data(cdate)
        if df is None: return list()
        if df.empty: return list()
        if self.index_code == '000001': df = df[df.code.str.startswith('6')]
        return df.code.tolist()

    def get_data(self, cdate):
        return self.ris.get_data(cdate)

    def update(self, end_date=None, num=30):
        if end_date is None: end_date = datetime.now().strftime('%Y-%m-%d')
        #start_date = "1997-12-30"
        start_date = get_day_nday_ago(end_date, num=num, dformat="%Y-%m-%d")
        succeed = True
        code_list = self.get_components(end_date)
        if 0 == len(code_list):
            self.logger.error("%s code_list for %s is empty" %
                              (end_date, self.index_code))
            return False
        for mdate in get_dates_array(start_date, end_date):
            if CCalendar.is_trading_day(mdate, redis=self.redis):
                if not self.set_ratio(code_list, mdate):
                    self.logger.error("set %s score for %s set failed" %
                                      (self.index_code, mdate))
                    succeed = False
        return succeed

    def get_profit_stocks(self, df):
        data = df[df.profit >= 0]
        return data.code.tolist()

    def set_ratio(self,
                  now_code_list,
                  cdate=datetime.now().strftime('%Y-%m-%d')):
        if self.is_date_exists(self.bull_stock_ratio_table, cdate):
            self.logger.debug("existed date:%s, date:%s" %
                              (self.bull_stock_ratio_table, cdate))
            return True
        code_list = self.get_components(cdate)
        if len(code_list) == 0: code_list = now_code_list
        df = self.get_data(cdate)
        if df is None: return False
        if df.empty: return False
        df = df[df.code.isin(code_list)]
        if df.empty: return True
        profit_code_list = self.get_profit_stocks(df)
        bull_stock_num = len(profit_code_list)
        bull_ration = 100 * bull_stock_num / len(df)
        data = {'date': [cdate], 'ratio': [bull_ration]}
        df = pd.DataFrame.from_dict(data)
        if self.mysql_client.set(df, self.bull_stock_ratio_table):
            return self.redis.sadd(self.bull_stock_ratio_table, cdate)
        return False