Exemple #1
0
 def updateFpList(self):
     last_day = common.get_lastN_date(self.today, 1)
     last2_day = common.get_lastN_date(self.today, 2)
     day_list = [self.today, last_day, last2_day]
     day_list = [common.format_date(x, "%Y-%m-%d")
                 for x in day_list]  # 关注的复牌日
     results = self.mongodb.stock.FP.find({
         "fp_time": {
             "$in": day_list
         },
         "dp_ratio": {
             "$exists": True
         }
     })
     for result in results:
         if result['delta_days'] < 20:
             continue
         if result['dp_ratio'] >= 0:
             direction = "+"
         else:
             direction = "-"
         self.fpDict[result['stcid']] = [direction, result['target_price']]
     stcid_string = "_".join(self.fpDict.keys())
     # 更新mongo数据库
     self.mongodb.stock.ZDT_by_date.update(
         {"date": self.today}, {"$set": {
             "fp_list": stcid_string
         }}, True, True)
Exemple #2
0
def monitored_fresh(date):
    tardate = common.get_lastN_date(date, 120)
    freshList = set()
    results = mongodb.stock.ZDT_by_date.find({
        "date": {
            "$gte": tardate,
            "$lte": date
        },
        "Add_newStocks": {
            "$exists": True
        }
    })
    for result in results:
        tmp = result['Add_newStocks'].keys()
        if u'未公布' in tmp:
            tmp.remove(u'未公布')
        freshList.update(tmp)
    tmp = list(freshList)
    todayfresh = mongodb.stock.ZDT_by_date.find_one({'date':
                                                     date})['freshStocks']
    tmp = [x for x in freshList if x not in todayfresh]
    freshList = list(set(tmp))
    mongodb.stock.ZDT_by_date.update(
        {"date": date},
        {"$set": {
            "monitorFreshStocks": "_".join(freshList),
            "date": date
        }}, True)
    return freshList
def add_rank_chg(dframe, chg_days=[5, 25], sort_v=5):
    # dframe = dframe.sort('TRADE_DATE', ascending='True')
    dframe = dframe.sort_values(by=['TRADE_DATE'], ascending='True')
    dframe = dframe[[
        'TICKER_SYMBOL', 'TRADE_DATE', 'PRE_CLOSE_PRICE', 'CLOSE_PRICE'
    ]]
    dframe['daily_ratio'] = 100 * (
        dframe['CLOSE_PRICE'] -
        dframe['PRE_CLOSE_PRICE']) / dframe['PRE_CLOSE_PRICE']
    dframe['daily_ratio'] = dframe['daily_ratio'].round(2)
    oframe = pd.DataFrame()
    max_day = max(dframe.TRADE_DATE.values)
    for chg_day in chg_days:
        # 求出最近N天的涨跌幅
        n_day = common.get_lastN_date(max_day, chg_day)
        n_day = common.format_date(n_day, "%Y-%m-%d")

        tmp_frame = dframe[dframe.TRADE_DATE >= n_day]
        for stockid, stockframe in tmp_frame.groupby('TICKER_SYMBOL'):
            oframe.loc[stockid, '%s_ratio' % chg_day] = 100 * (
                np.prod(1 + stockframe['daily_ratio'] / 100) - 1)
    oframe.reset_index(inplace=True)
    oframe.rename(columns={"index": "TICKER_SYMBOL"}, inplace=True)
    oframe['rank'] = oframe['%s_ratio' % sort_v].rank(method='min',
                                                      ascending=False)
    # oframe = oframe.sort("rank")
    oframe = oframe.sort_values(by=["rank"])
    return oframe
Exemple #4
0
    def updatefreshlist(self):
        tardate = common.get_lastN_date(self.today, 120)
        tardate = common.format_date(tardate, "%Y%m%d")

        results = self.mongodb.stock.ZDT_by_date.find({
            "date": {
                "$gte": tardate,
                "$lte": self.today
            },
            "Add_newStocks": {
                "$exists": True
            }
        })
        for result in results:
            tmp = result['Add_newStocks'].keys()
            if u'未公布' in tmp:
                tmp.remove(u'未公布')
            self.freshList.update(tmp)
        tmp = list(self.freshList)
        todayfresh = self.mongodb.stock.ZDT_by_date.find_one(
            {'date': self.yestoday})['freshStocks']
        tmp = [x for x in self.freshList if x not in todayfresh]
        self.freshList = set(tmp)
        self.mongodb.stock.ZDT_by_date.update({"date": self.today}, {
            "$set": {
                "monitorFreshStocks": "_".join(self.freshList),
                "date": self.today
            }
        }, True)
        print "update Monitored fresh stocks finished!"
Exemple #5
0
def study_plot(stcid, date, plot_dir):
    # print stcid,date
    tmp_array = [date, None, stcid, u'买入', 100]
    LearnFrom.study_plot(tmp_array, plot_dir)
    nextdate = common.get_lastN_date(date, -1)
    tmp_array = [nextdate, None, stcid, u'卖出', 100]
    LearnFrom.study_plot(tmp_array, plot_dir)
    print "finish %s" % stcid
 def __init__(self):
     mongoUrl="localhost"
     self.period = 120
     self.mongodb = pymongo.MongoClient(mongoUrl)
     self.today = datetime.date.today().strftime("%Y%m%d")
     self.tday = common.get_lastN_date(self.today,self.period)
     self.highFrame = pd.DataFrame()
     self.dateList = common.getDate(self.tday,self.today)
 def __init__(self):
     mongoUrl = "localhost"
     self.period = 120
     self.mongodb = pymongo.MongoClient(mongoUrl)
     self.today = datetime.date.today().strftime("%Y%m%d")
     self.tday = common.get_lastN_date(self.today, self.period)
     self.highFrame = pd.DataFrame()
     self.dateList = common.getDate(self.tday, self.today)
    def concept_pipeline_html(self, default_period=30, csv_dir=u'D:/Money/modeResee/复盘'):
        concepts = common.get_focused_concepts()    # 热力图的纵轴
        back_day = common.get_lastN_date(self.day, default_period)
        day_list = common.getDate(back_day, self.day)       # 热力图横轴
        zt_concepts_group = [0] * (len(day_list)*len(concepts))
        hd_concepts_group = [0] * (len(day_list)*len(concepts))
        dt_concepts_group = [0] * (len(day_list)*len(concepts))
        meat_concepts_group = [0] * (len(day_list)*len(concepts))
        hole_concepts_group = [0] * (len(day_list)*len(concepts))
        group_list = [zt_concepts_group, hd_concepts_group, dt_concepts_group, meat_concepts_group, hole_concepts_group]
        character_list = ['ZT', 'HD', 'DT', 'meat', 'hole']
        # character_list = ['ZT']
        group_list = group_list[:len(character_list)]
        for i in range(0, len(day_list)):
            tarday = day_list[i]
            print tarday
            tarday = common.format_date(tarday, "%Y%m%d")
            dframe = pd.read_csv(os.path.join(csv_dir, "%s/daydayup.csv" %tarday), encoding='gbk')
            dframe['len_status'] = dframe['stock'].apply(lambda x: len(str(x)))
            dframe = dframe[dframe.len_status > 0]
            for j in range(0, len(concepts)):
                concept = concepts[j]

                # 相近的名称
                if concept in common.close_concept_dict.keys():
                    concept_near_list = common.close_concept_dict[concept]
                elif concept in common.close_concept_value_dict.keys():
                    real_concept = common.close_concept_value_dict[concept]
                    concept_near_list = common.close_concept_dict[real_concept]
                else:
                    concept_near_list = [concept]

                cframe = dframe[dframe.group.isin(concept_near_list)]
                for k in range(0, len(character_list)):
                    tmp_frame = cframe[cframe.type == character_list[k]]
                    stock_name = list(set(list(np.unique(tmp_frame.name.values))))
                    num = len(stock_name)
                    stock_name = "_".join(stock_name)
                    position = j*len(day_list) + i
                    group_list[k][position] = [j, i, num, stock_name]

        dframe_list = []
        day_list = [common.format_date(x, "%m%d") for x in day_list]
        for i in range(0, len(group_list)):
            dframe_list.append(common.get_dataframe_option3(group_list[i], "_".join(concepts), "_".join(day_list), character_list[i]))
        type_list = [3] * len(dframe_list)
        title_list = character_list
        save_day = common.format_date(self.day, "%Y%m%d")
        common.get_html_curve(dframe_list, u"concepts_flow", html_types=type_list, title_list=title_list, save_dir=os.path.join(u"D:/Money/modeResee/复盘/%s"%save_day, ""))
Exemple #9
0
    def updatefreshlist(self):
        tardate = common.get_lastN_date(self.today, 120)
        tardate = common.format_date(tardate, "%Y%m%d")

        results = self.mongodb.stock.ZDT_by_date.find({"date": {"$gte": tardate, "$lte": self.today},"Add_newStocks": {"$exists": True}})
        for result in results:
            tmp = result['Add_newStocks'].keys()
            if u'未公布' in tmp:
                tmp.remove(u'未公布')
            self.freshList.update(tmp)
        tmp = list(self.freshList)
        todayfresh = self.mongodb.stock.ZDT_by_date.find_one({'date':self.yestoday})['freshStocks']
        tmp = [x for x in self.freshList if x not in todayfresh]
        self.freshList = set(tmp)
        self.mongodb.stock.ZDT_by_date.update({"date":self.today},{"$set":{"monitorFreshStocks":"_".join(self.freshList),"date":self.today}},True)
        print "update Monitored fresh stocks finished!"
Exemple #10
0
def add_rank_chg(dframe, chg_days=[5, 25], sort_v=5):
    # dframe = dframe.sort('TRADE_DATE', ascending='True')
    dframe = dframe.sort_values(by=['TRADE_DATE'], ascending='True')
    dframe = dframe[['TICKER_SYMBOL', 'TRADE_DATE', 'PRE_CLOSE_PRICE', 'CLOSE_PRICE']]
    dframe['daily_ratio'] = 100*(dframe['CLOSE_PRICE'] - dframe['PRE_CLOSE_PRICE'])/dframe['PRE_CLOSE_PRICE']
    dframe['daily_ratio'] = dframe['daily_ratio'].round(2)
    oframe = pd.DataFrame()
    max_day = max(dframe.TRADE_DATE.values)
    for chg_day in chg_days:
        # 求出最近N天的涨跌幅
        n_day = common.get_lastN_date(max_day, chg_day)
        n_day = common.format_date(n_day, "%Y-%m-%d")

        tmp_frame = dframe[dframe.TRADE_DATE >= n_day]
        for stockid, stockframe in tmp_frame.groupby('TICKER_SYMBOL'):
            oframe.loc[stockid, '%s_ratio' % chg_day] = 100*(np.prod(1+stockframe['daily_ratio']/100)-1)
    oframe.reset_index(inplace=True)
    oframe.rename(columns={"index":"TICKER_SYMBOL"}, inplace=True)
    oframe['rank'] = oframe['%s_ratio' % sort_v].rank(method='min', ascending=False)
    # oframe = oframe.sort("rank")
    oframe = oframe.sort_values(by=["rank"])
    return oframe
Exemple #11
0
    def parse_content(self, content):
        content = content.replace(u'var kcSTlIop=', u'').replace(
            u'pages', u'"pages"').replace(u'data', u'"data"')
        con_dict = eval(content)

        # 当前时间点
        ttime = time.localtime()
        thour = ttime.tm_hour
        tmin = ttime.tm_min
        day_list = []
        if thour >= 18:  # 晚上6点以后,可以得到当天收盘价了,关注复牌时间点为[明天,今天,昨天]
            for n in range(2 - self.dayRange, 2):
                day_list.append(common.get_lastN_date(self.date, n))
        else:  # 否则,关注时间点为[今天,昨天,前天]
            for n in range(1 - self.dayRange, 1):
                day_list.append(common.get_lastN_date(self.date, n))

        for infos in con_dict['data']:
            elements = infos.split(",")
            if len(elements) < 2:
                continue
            secid = elements[0]
            secname = elements[1]
            tp_time = elements[-2]
            fp_time = elements[-1]
            reason = elements[5]
            db_num = self.mongodb.stock.FP.find({
                "stcid": "%s" % secid,
                "tp_time": "%s" % tp_time,
                "fp_time": "%s" % fp_time,
                "target_ratio": {
                    "$exists": True
                }
            }).count()
            if db_num > 0:
                continue
            else:
                self.mongodb.stock.FP.update(
                    {
                        "stcid": "%s" % secid,
                        "tp_time": "%s" % tp_time
                    }, {
                        "$set": {
                            "stcid": "%s" % secid,
                            "tp_time": "%s" % tp_time,
                            "fp_time": "%s" % fp_time,
                            "reason": "%s" % reason
                        }
                    }, True, True)

            # 仅仅记录目标日期在关注日期内的信息
            if fp_time in day_list:
                # 期间大盘涨幅
                if secid[:2] == '60':
                    dp_stockid = 'ZS000001'
                else:
                    dp_stockid = 'ZS399006'

                dp_frame = common.get_mysqlData(
                    [dp_stockid],
                    [tp_time, common.get_last_date(fp_time)])
                if len(dp_frame) < 2:
                    continue

                dp_ratio = (dp_frame.loc[1, 'CLOSE_PRICE'] -
                            dp_frame.loc[0, 'CLOSE_PRICE']
                            ) / dp_frame.loc[0, 'CLOSE_PRICE']
                dp_ratio = round(dp_ratio, 2)

                # 停牌时价格
                stock_price = common.get_mysqlData(
                    [secid], [tp_time]).loc[0, 'CLOSE_PRICE']
                if dp_ratio > 0:
                    diff = 0.05
                else:
                    diff = -0.05

                # 目标涨幅
                target_ratio = dp_ratio + diff

                # 目标价格
                target_price = round(stock_price * (1 + target_ratio), 2)

                # 停牌时间
                delta_days = common.get_mongoDicts(dateStart=tp_time,
                                                   dateEnd=fp_time).count()

                self.mongodb.stock.FP.update(
                    {
                        "stcid": "%s" % secid,
                        "tp_time": "%s" % tp_time
                    }, {
                        "$set": {
                            "dp_ratio": dp_ratio,
                            "target_ratio": target_ratio,
                            "target_price": target_price,
                            'delta_days': delta_days
                        }
                    }, True, True)
Exemple #12
0
    def plot_stocks_html(self):
        n_day_before = common.get_lastN_date(self.running_day, 80)
        concept_frame_list = []
        all_local_frame = common.FindConceptStocks(n_day_before,
                                                   self.running_day)

        # 收集所有关注概念以及对应的股票代码
        for concept in self.concepts:
            concept_stocks = []
            # 云财经中相关股票
            ycj_stocks = common.get_ycj_stocks(concept)
            # 金融界中相关股票
            jrj_stocks = common.get_jrj_stocks(concept)
            # 本地csv中相关股票
            csv_stocks = all_local_frame.filter_by_concept(concept)
            # 合并到一起
            concept_stocks.extend(ycj_stocks)
            concept_stocks.extend(jrj_stocks)
            concept_stocks.extend(csv_stocks.ticker.values)

            concept_stocks = list(set(concept_stocks))
            tmp_concept_frame = pd.DataFrame({"stockid": concept_stocks})
            tmp_concept_frame['concept'] = concept
            concept_frame_list.append(tmp_concept_frame)
        # index stockid, concept
        concept_frame = pd.concat(concept_frame_list, axis=0)

        daily_stock_list = list(np.unique(concept_frame.stockid.values))
        daily_stock_list.extend(self.extra_stocks)
        daily_stock_list = list(set(daily_stock_list))

        # 拿到这些股票,指定日期的所有日线数据
        daily_frame = common.get_mysqlData(
            daily_stock_list, common.getDate(n_day_before, self.running_day))
        # daily_frame.to_csv(u'all_daily_frame.csv', encoding='gbk')
        daily_frame['rate'] = 100 * (
            daily_frame['CLOSE_PRICE'] -
            daily_frame['PRE_CLOSE_PRICE']) / daily_frame['PRE_CLOSE_PRICE']
        daily_frame['rate'] = daily_frame['rate'].round(2)

        daily_frame['lrate'] = 100 * (
            daily_frame['LOWEST_PRICE'] -
            daily_frame['PRE_CLOSE_PRICE']) / daily_frame['PRE_CLOSE_PRICE']
        daily_frame['lrate'] = daily_frame['lrate'].round(2)

        daily_frame['hrate'] = 100 * (
            daily_frame['HIGHEST_PRICE'] -
            daily_frame['PRE_CLOSE_PRICE']) / daily_frame['PRE_CLOSE_PRICE']
        daily_frame['hrate'] = daily_frame['hrate'].round(2)

        daily_frame['TRADE_DATE'] = daily_frame['TRADE_DATE'].apply(
            lambda x: x.strftime("%Y-%m-%d"))

        # 复权数据,以便画k线图
        fq_daily_frame = common.get_mysqlData(daily_stock_list,
                                              common.getDate(
                                                  n_day_before,
                                                  self.running_day),
                                              db_table='vmkt_equd_adj')
        fq_daily_frame['rate'] = 100 * (fq_daily_frame['CLOSE_PRICE'] -
                                        fq_daily_frame['PRE_CLOSE_PRICE']
                                        ) / fq_daily_frame['PRE_CLOSE_PRICE']
        fq_daily_frame['rate'] = fq_daily_frame['rate'].round(2)

        fq_daily_frame['lrate'] = 100 * (fq_daily_frame['LOWEST_PRICE'] -
                                         fq_daily_frame['PRE_CLOSE_PRICE']
                                         ) / fq_daily_frame['PRE_CLOSE_PRICE']
        fq_daily_frame['lrate'] = fq_daily_frame['lrate'].round(2)

        fq_daily_frame['hrate'] = 100 * (fq_daily_frame['HIGHEST_PRICE'] -
                                         fq_daily_frame['PRE_CLOSE_PRICE']
                                         ) / fq_daily_frame['PRE_CLOSE_PRICE']
        fq_daily_frame['hrate'] = fq_daily_frame['hrate'].round(2)

        fq_daily_frame['TRADE_DATE'] = fq_daily_frame['TRADE_DATE'].apply(
            lambda x: x.strftime("%Y-%m-%d"))

        # 筛选出符合条件的股票
        # 连续3天以上涨停
        # condition1_frame = filter_stock_by_zt_condition(daily_frame, condition='ZT', zt_num=3)

        #{"concept":concept_frame, "concept":concept_frame2}
        # concept_frame: index TICKER_SYMBOL 5_chg 25_chg N_chg rank
        self.concept_rank_dict = {}
        for concept in self.concepts:
            print concept
            concept_stock_list = list(
                concept_frame[concept_frame.concept == concept].stockid.values)
            # 去除掉rmv对应的股票,以及加上mst对于的股票
            if concept in self.rmv_dict.keys():
                concept_stock_list = [
                    x for x in concept_stock_list
                    if x not in self.rmv_dict[concept]
                ]

            if concept in self.mst_dict.keys():
                concept_stock_list.extend(self.mst_dict[concept])

            # 概念对应的所有股票的日线数据
            concept_daily_frame = daily_frame[daily_frame.TICKER_SYMBOL.isin(
                concept_stock_list)]
            # 统计出其涨幅排行
            concept_rank_chg_frame = add_rank_chg(concept_daily_frame,
                                                  chg_days=[5, 25],
                                                  sort_v=5)

            # 得到连续N个涨停以上的股票
            condition1_frame = filter_stock_by_zt_condition(
                daily_frame[daily_frame.TICKER_SYMBOL.isin(
                    concept_stock_list)],
                condition='ZT',
                zt_num=self.direct10_num[concept])
            # print concept,self.direct10_num[concept]

            # 得到涨幅排行前N的股票
            if len(condition1_frame) < 3:
                tail_n = 10 - len(condition1_frame)
            else:
                tail_n = 5
            stock_list = list(
                concept_rank_chg_frame.sort_values(
                    by=['rank'],
                    ascending=False).tail(tail_n).TICKER_SYMBOL.values)
            stock_list.extend(condition1_frame.TICKER_SYMBOL.values)

            # 再加上必须关注的股票
            if concept in self.mst_dict.keys():
                stock_list.extend(self.mst_dict[concept])

            stock_list = list(set(stock_list))
            # 记录到mongo中daily_interesting_concept_stocks
            self.write_mongo_concept_day(stock_list, concept, self.running_day)

            # 画图
            k_line_frame_list = []
            for stock in stock_list:
                stock_frame = fq_daily_frame[
                    fq_daily_frame.TICKER_SYMBOL == stock][[
                        u'TRADE_DATE', 'OPEN_PRICE', 'CLOSE_PRICE',
                        'HIGHEST_PRICE', 'LOWEST_PRICE', 'TURNOVER_VOL',
                        'TICKER_SYMBOL', 'rate', 'lrate', 'hrate',
                        'SEC_SHORT_NAME'
                    ]]
                stock_frame.columns = [
                    'date', 'open', 'close', 'high', 'low', 'volume', 'code',
                    'rate', 'lrate', 'hrate', 'name'
                ]
                stock_frame['name'] = stock_frame['name'].apply(
                    lambda x: x.encode('gb2312'))
                # index row,date,open, close, high, low, volume, code
                # stock_frame = stock_frame.sort('date', ascending='True')
                stock_frame = stock_frame.sort_values(by=['date'],
                                                      ascending='True')
                stock_frame.reset_index(inplace=True)
                stock_frame['name'] = stock_frame['name'].apply(
                    lambda x: x.decode("gbk").encode("utf-8"))
                del stock_frame['index']
                k_line_frame_list.append(stock_frame)

            # 只显示感兴趣的股票的排行和涨幅数据
            concept_rank_chg_frame = concept_rank_chg_frame[
                concept_rank_chg_frame.TICKER_SYMBOL.isin(stock_list)]
            concept_rank_chg_frame = concept_rank_chg_frame.sort_values(
                by=['rank'], ascending=True)
            concept_rank_chg_frame['stock_name'] = concept_rank_chg_frame[
                'TICKER_SYMBOL'].apply(lambda x: common.QueryStockMap(x)[0])
            names = [
                x for x in concept_rank_chg_frame.columns
                if x not in ['stock_name', 'TICKER_SYMBOL']
            ]
            valid_name = ['stock_name']
            valid_name.extend(names)
            concept_rank_chg_frame = concept_rank_chg_frame[valid_name]

            # 构造一个OPTION4&6,左边为K线图,右边为条形图,以及下面一系列的k线图
            plot_frame_list = [[k_line_frame_list[0], concept_rank_chg_frame]]
            plot_frame_list.extend(k_line_frame_list[1:])

            # 构造对应的stock_list,标识对应的股票代码
            plot_stock_list = []
            for kline_frame in k_line_frame_list:
                plot_stock_list.append(kline_frame['code'].values[0])

            html_types = ['4and6']
            html_types.extend([4] * len(k_line_frame_list[1:]))

            title_list = [['A_stock', 'accum_ratio']]
            title_list.extend(['A_stocks'] * len(k_line_frame_list[1:]))

            # 在加一个统计区间涨跌幅
            # range_ratio = {
            #     concept_name:[[start1, end1],[start2, end2], [start3, end3], ...],
            #     concept_name2:[[start1, end1],[start2, end2], [start3, end3], ...],
            # }

            # 说明该概念需要画出不同时期的涨跌幅对比
            if concept in self.range_ratio_dict.keys():
                range_ratio_frame = pd.DataFrame()
                for [sday, eday] in self.range_ratio_dict[concept]:
                    col_name = "%s-%s" % (common.format_date(
                        sday, "%Y%m%d"), common.format_date(eday, "%Y%m%d"))
                    for stock in stock_list:
                        range_ratio_frame.loc[
                            stock, col_name] = common.time_range_accum_ratio(
                                stock, sday, eday)
                range_ratio_frame.reset_index(inplace=True)
                range_ratio_frame.rename(columns={"index": "stock_name"},
                                         inplace=True)
                range_ratio_frame['stock_name'] = range_ratio_frame[
                    'stock_name'].apply(lambda x: common.QueryStockMap(x)[0])
                # 添加到画图中
                plot_frame_list.append(range_ratio_frame)
                plot_stock_list.append(0)
                html_types.append(7)
                title_list.append('ACCUM_RATIO')

            # 输出html
            common.get_html_curve(plot_frame_list,
                                  '%s' % (concept),
                                  html_types=html_types,
                                  title_list=title_list,
                                  save_dir=os.path.join(
                                      self.dump_dir, self.running_day),
                                  chart_connect=1,
                                  plot_stock_list=plot_stock_list,
                                  generate_date=self.running_day)
            logging.getLogger().info("plot html finished for %s, %s" %
                                     (concept, self.running_day))
        print "Finished for %s" % self.running_day
Exemple #13
0
def get_stopDetail(stockid, dates, mysqls):
    global diOut_dict, backTen_dict, tenMonitor_dict
    stockid = '0' * (6 - len(stockid)) + stockid

    edates = common.get_lastN_date(dates, -50)
    dates = common.format_date(dates, "%Y-%m-%d")
    edates = common.format_date(edates, "%Y-%m-%d")
    table = "vmkt_equd"
    query = 'SELECT TICKER_SYMBOL, SEC_SHORT_NAME, TRADE_DATE, PRE_CLOSE_PRICE, OPEN_PRICE, HIGHEST_PRICE, LOWEST_PRICE, CLOSE_PRICE, ACT_PRE_CLOSE_PRICE ' \
                'from %s where TICKER_SYMBOL = "%s" and TRADE_DATE >= "%s" and TRADE_DATE <= "%s"' % (table, stockid, dates, edates)
    z = mysqls.dydb_query(query)
    z['actualRatio'] = (z['CLOSE_PRICE'].astype(np.float64) /
                        z['PRE_CLOSE_PRICE'].astype(np.float64)) - 1
    z['actualRatio'] = (100 * z['actualRatio']).round(2)

    z['priceTen'] = z['PRE_CLOSE_PRICE'].astype(np.float64) * 1.1
    z['priceTen'] = z['priceTen'].round(2)

    z['closeStatus'] = z['CLOSE_PRICE'] - z['priceTen']
    z['closeStatus'] = z['closeStatus'].apply(lambda x: True
                                              if x >= 0 else False)

    z['lowStatus'] = z['LOWEST_PRICE'] - z['priceTen']
    z['lowStatus'] = z['lowStatus'].apply(lambda x: True if x >= 0 else False)
    print stockid
    # 记录第一次的时间点
    # 如果当前还在涨停期间,跳过
    if len(z[z.lowStatus != True].index.values) == 0:
        return 100, "2018-01-01", "No Result", "INF", "2018-01-01", "100"
    print stockid

    first_low_out_index = z[z.lowStatus != True].index.values[0]
    first_low_out_day = z.loc[first_low_out_index, 'TRADE_DATE']

    # 当前还在回封期, 开板日设置为2018-01-01, 开板的index设置为无穷大
    if len(z[z.closeStatus != True].index.values) == 0:
        first_close_out_index = 10000
        first_close_out_day = "2018-01-01"
    else:
        first_close_out_index = z[z.closeStatus != True].index.values[0]
        first_close_out_day = z.loc[first_close_out_index, 'TRADE_DATE']

    if first_low_out_index == first_close_out_index:  # 开板没有回封
        diout_ratio = z.loc[first_close_out_index, 'actualRatio']
        diout_ratio = round(diout_ratio, 2)
        if first_low_out_day not in diOut_dict.keys():
            diOut_dict[first_low_out_day] = {
                "stock": [stockid],
                "ratio": [diout_ratio]
            }
        else:
            diOut_dict[first_low_out_day]['stock'].append(stockid)
            diOut_dict[first_low_out_day]['ratio'].append(diout_ratio)
    else:  # 开板后回封
        diback_ratio = z.loc[first_low_out_index, 'actualRatio']
        diback_ratio = round(diback_ratio, 2)
        # 记录每天的回封个数
        if first_low_out_day not in backTen_dict.keys():
            backTen_dict[first_low_out_day] = {
                "stock": [stockid],
                "ratio": [diback_ratio]
            }
        else:
            backTen_dict[first_low_out_day]['stock'].append(stockid)
            backTen_dict[first_low_out_day]['ratio'].append(diback_ratio)

        # 记录开板
        if first_close_out_index != 10000:
            diout_ratio = z.loc[first_close_out_index, 'actualRatio']
            diout_ratio = round(diout_ratio, 2)
            if first_close_out_day not in diOut_dict.keys():
                diOut_dict[first_close_out_day] = {
                    "stock": [stockid],
                    "ratio": [diout_ratio]
                }
            else:
                diOut_dict[first_close_out_day]['stock'].append(stockid)
                diOut_dict[first_close_out_day]['ratio'].append(diout_ratio)

        # 记录每天回封后的涨幅(即:A日回封,B日不再涨停,记录A+1日到B日至今的涨幅)
        for idx in range(first_low_out_index + 1, first_close_out_index + 1):
            if idx > max(z.index.values):
                break
                # idx = max(z.index.values)
            day = z.loc[idx, 'TRADE_DATE']

            # today = datetime.datetime.now()
            # print day, today
            # if day == datetime.date(2016, 11, 7) and stockid == "300548":
            #     print 'abc'
            # if day > datetime.date(today.year, today.month, today.day):
            #     print 'yes'
            #     break

            # 这里记录的是收盘涨幅,开板再回封的情况暂时不考虑
            ratio = z.loc[idx, 'actualRatio']
            if day not in tenMonitor_dict.keys():
                tenMonitor_dict[day] = {"stock": [stockid], "ratio": [ratio]}
            else:
                tenMonitor_dict[day]['stock'].append(stockid)
                tenMonitor_dict[day]['ratio'].append(ratio)

    ## 此处不全,diOut不仅仅是first_low_out_index, 还包括回封后开板的
    # return
    # 返回涨停数,开板日,开板状态(是否回封), 非涨停日,非涨停日涨幅
    if first_close_out_index == 10000:
        actualRatio = 100
    else:
        actualRatio = z.loc[first_close_out_index, 'actualRatio']
    return first_close_out_index, first_low_out_day, first_close_out_index > first_low_out_index, first_close_out_index - first_low_out_index, first_close_out_day, actualRatio
Exemple #14
0
    def parse_content(self, content):
        content = content.replace(u'var kcSTlIop=', u'').replace(u'pages', u'"pages"').replace(u'data', u'"data"')
        con_dict = eval(content)

        # 当前时间点
        ttime = time.localtime()
        thour = ttime.tm_hour
        tmin = ttime.tm_min
        day_list = []
        if thour >= 18:  # 晚上6点以后,可以得到当天收盘价了,关注复牌时间点为[明天,今天,昨天]
            for n in range(2-self.dayRange, 2):
                day_list.append(common.get_lastN_date(self.date, n))
        else:               # 否则,关注时间点为[今天,昨天,前天]
            for n in range(1-self.dayRange, 1):
                day_list.append(common.get_lastN_date(self.date, n))

        for infos in con_dict['data']:
            elements = infos.split(",")
            if len(elements) < 2:
                continue
            secid = elements[0]
            secname = elements[1]
            tp_time = elements[-2]
            fp_time = elements[-1]
            reason = elements[5]
            db_num = self.mongodb.stock.FP.find({"stcid":"%s" % secid, "tp_time":"%s" % tp_time, "fp_time":"%s" % fp_time, "target_ratio":{"$exists":True}}).count()
            if db_num > 0:
                continue
            else:
                self.mongodb.stock.FP.update({"stcid":"%s" % secid, "tp_time":"%s" % tp_time},
                                             {"$set":{"stcid":"%s" % secid, "tp_time":"%s" % tp_time, "fp_time":"%s" % fp_time, "reason":"%s" %reason}},
                                             True, True)


            # 仅仅记录目标日期在关注日期内的信息
            if fp_time in day_list:
                # 期间大盘涨幅
                if secid[:2] == '60':
                    dp_stockid = 'ZS000001'
                else:
                    dp_stockid = 'ZS399006'

                dp_frame = common.get_mysqlData([dp_stockid], [tp_time, common.get_last_date(fp_time)])
                if len(dp_frame) < 2:
                    continue

                dp_ratio = (dp_frame.loc[1, 'CLOSE_PRICE'] - dp_frame.loc[0, 'CLOSE_PRICE']) / dp_frame.loc[0, 'CLOSE_PRICE']
                dp_ratio = round(dp_ratio, 2)

                # 停牌时价格
                stock_price = common.get_mysqlData([secid], [tp_time]).loc[0, 'CLOSE_PRICE']
                if dp_ratio > 0:
                    diff = 0.05
                else:
                    diff = -0.05

                # 目标涨幅
                target_ratio = dp_ratio + diff

                # 目标价格
                target_price = round(stock_price*(1+target_ratio), 2)

                # 停牌时间
                delta_days = common.get_mongoDicts(dateStart=tp_time,dateEnd=fp_time).count()

                self.mongodb.stock.FP.update({"stcid":"%s" % secid, "tp_time":"%s" % tp_time},
                                             {"$set":{"dp_ratio":dp_ratio, "target_ratio":target_ratio, "target_price": target_price, 'delta_days':delta_days}},
                                             True, True)
Exemple #15
0
def get_stopDetail(stockid, dates, mysqls):
    global diOut_dict, backTen_dict, tenMonitor_dict
    stockid = '0'*(6-len(stockid)) + stockid

    edates = common.get_lastN_date(dates, -50)
    dates = common.format_date(dates,"%Y-%m-%d")
    edates = common.format_date(edates,"%Y-%m-%d")
    table="vmkt_equd"
    query = 'SELECT TICKER_SYMBOL, SEC_SHORT_NAME, TRADE_DATE, PRE_CLOSE_PRICE, OPEN_PRICE, HIGHEST_PRICE, LOWEST_PRICE, CLOSE_PRICE, ACT_PRE_CLOSE_PRICE ' \
                'from %s where TICKER_SYMBOL = "%s" and TRADE_DATE >= "%s" and TRADE_DATE <= "%s"' % (table, stockid, dates, edates)
    z = mysqls.dydb_query(query)
    z['actualRatio'] = (z['CLOSE_PRICE'].astype(np.float64) /z['PRE_CLOSE_PRICE'].astype(np.float64)) - 1
    z['actualRatio'] = (100*z['actualRatio']).round(2)

    z['priceTen'] = z['PRE_CLOSE_PRICE'].astype(np.float64) * 1.1
    z['priceTen'] = z['priceTen'].round(2)

    z['closeStatus'] = z['CLOSE_PRICE'] - z['priceTen']
    z['closeStatus'] = z['closeStatus'].apply(lambda x: True if x >= 0 else False)

    z['lowStatus'] = z['LOWEST_PRICE'] - z['priceTen']
    z['lowStatus'] = z['lowStatus'].apply(lambda x: True if x >= 0 else False)
    print stockid
    # 记录第一次的时间点
    # 如果当前还在涨停期间,跳过
    if len(z[z.lowStatus != True].index.values) == 0:
        return 100, "2018-01-01", "No Result", "INF", "2018-01-01", "100"
    print stockid

    first_low_out_index = z[z.lowStatus != True].index.values[0]
    first_low_out_day = z.loc[first_low_out_index, 'TRADE_DATE']

    # 当前还在回封期, 开板日设置为2018-01-01, 开板的index设置为无穷大
    if len(z[z.closeStatus != True].index.values) == 0:
        first_close_out_index = 10000
        first_close_out_day = "2018-01-01"
    else:
        first_close_out_index = z[z.closeStatus != True].index.values[0]
        first_close_out_day = z.loc[first_close_out_index, 'TRADE_DATE']

    if first_low_out_index == first_close_out_index:     # 开板没有回封
        diout_ratio = z.loc[first_close_out_index, 'actualRatio']
        diout_ratio = round(diout_ratio,2)
        if first_low_out_day not in diOut_dict.keys():
            diOut_dict[first_low_out_day] = {"stock":[stockid], "ratio":[diout_ratio]}
        else:
            diOut_dict[first_low_out_day]['stock'].append(stockid)
            diOut_dict[first_low_out_day]['ratio'].append(diout_ratio)
    else:    # 开板后回封
        diback_ratio = z.loc[first_low_out_index, 'actualRatio']
        diback_ratio = round(diback_ratio,2)
        # 记录每天的回封个数
        if first_low_out_day not in backTen_dict.keys():
            backTen_dict[first_low_out_day] = {"stock":[stockid], "ratio":[diback_ratio]}
        else:
            backTen_dict[first_low_out_day]['stock'].append(stockid)
            backTen_dict[first_low_out_day]['ratio'].append(diback_ratio)

        # 记录开板
        if first_close_out_index != 10000:
            diout_ratio = z.loc[first_close_out_index, 'actualRatio']
            diout_ratio = round(diout_ratio,2)
            if first_close_out_day not in diOut_dict.keys():
                diOut_dict[first_close_out_day] = {"stock":[stockid], "ratio":[diout_ratio]}
            else:
                diOut_dict[first_close_out_day]['stock'].append(stockid)
                diOut_dict[first_close_out_day]['ratio'].append(diout_ratio)


        # 记录每天回封后的涨幅(即:A日回封,B日不再涨停,记录A+1日到B日至今的涨幅)
        for idx in range(first_low_out_index+1, first_close_out_index+1):
            if idx > max(z.index.values):
                break
                # idx = max(z.index.values)
            day = z.loc[idx, 'TRADE_DATE']





            # today = datetime.datetime.now()
            # print day, today
            # if day == datetime.date(2016, 11, 7) and stockid == "300548":
            #     print 'abc'
            # if day > datetime.date(today.year, today.month, today.day):
            #     print 'yes'
            #     break

            # 这里记录的是收盘涨幅,开板再回封的情况暂时不考虑
            ratio = z.loc[idx, 'actualRatio']
            if day not in tenMonitor_dict.keys():
                tenMonitor_dict[day] = {"stock":[stockid], "ratio":[ratio]}
            else:
                tenMonitor_dict[day]['stock'].append(stockid)
                tenMonitor_dict[day]['ratio'].append(ratio)

    ## 此处不全,diOut不仅仅是first_low_out_index, 还包括回封后开板的
    # return
    # 返回涨停数,开板日,开板状态(是否回封), 非涨停日,非涨停日涨幅
    if first_close_out_index == 10000:
        actualRatio = 100
    else:
        actualRatio = z.loc[first_close_out_index, 'actualRatio']
    return first_close_out_index, first_low_out_day, first_close_out_index > first_low_out_index, first_close_out_index - first_low_out_index,first_close_out_day,actualRatio
Exemple #16
0
# coding:utf-8
import pandas as pd
import numpy as np
import hot_district
import common
import dragon_catcher

x = dragon_catcher.DRAGON_POOL()

start_date = "20170908"
while 1:
    if start_date >= "20170918":
        break
    next_date = common.get_lastN_date(start_date, -1)
    next_date = common.format_date(next_date, "%Y%m%d")
    x.copy_pool_dragon(start_date, next_date)
    print "copy %s to %s" %(start_date, next_date)
    start_date = next_date




# daily_frame = pd.read_csv(u'all_daily_frame.csv', encoding='gbk',dtype={"TICKER_SYMBOL":np.str}, index_col=0)
# daily_frame.head()
#
#
# tpath = u'D:/Money/modeResee/彼战'
# concept_frame = pd.read_excel(os.path.join(tpath, u'战区.xlsx'), encoding='gbk', sheetname=u'战区位置')
# concept_frame = concept_frame[concept_frame[u'开战状态'] == 1]
# concepts = concept_frame[u'战区'].values
#
    def concept_pipeline_html(self,
                              default_period=30,
                              csv_dir=u'D:/Money/modeResee/复盘'):
        concepts = common.get_focused_concepts()  # 热力图的纵轴
        back_day = common.get_lastN_date(self.day, default_period)
        day_list = common.getDate(back_day, self.day)  # 热力图横轴
        zt_concepts_group = [0] * (len(day_list) * len(concepts))
        hd_concepts_group = [0] * (len(day_list) * len(concepts))
        dt_concepts_group = [0] * (len(day_list) * len(concepts))
        meat_concepts_group = [0] * (len(day_list) * len(concepts))
        hole_concepts_group = [0] * (len(day_list) * len(concepts))
        group_list = [
            zt_concepts_group, hd_concepts_group, dt_concepts_group,
            meat_concepts_group, hole_concepts_group
        ]
        character_list = ['ZT', 'HD', 'DT', 'meat', 'hole']
        # character_list = ['ZT']
        group_list = group_list[:len(character_list)]
        for i in range(0, len(day_list)):
            tarday = day_list[i]
            print tarday
            tarday = common.format_date(tarday, "%Y%m%d")
            dframe = pd.read_csv(os.path.join(csv_dir,
                                              "%s/daydayup.csv" % tarday),
                                 encoding='gbk')
            dframe['len_status'] = dframe['stock'].apply(lambda x: len(str(x)))
            dframe = dframe[dframe.len_status > 0]
            for j in range(0, len(concepts)):
                concept = concepts[j]

                # 相近的名称
                if concept in common.close_concept_dict.keys():
                    concept_near_list = common.close_concept_dict[concept]
                elif concept in common.close_concept_value_dict.keys():
                    real_concept = common.close_concept_value_dict[concept]
                    concept_near_list = common.close_concept_dict[real_concept]
                else:
                    concept_near_list = [concept]

                cframe = dframe[dframe.group.isin(concept_near_list)]
                for k in range(0, len(character_list)):
                    tmp_frame = cframe[cframe.type == character_list[k]]
                    stock_name = list(
                        set(list(np.unique(tmp_frame.name.values))))
                    num = len(stock_name)
                    stock_name = "_".join(stock_name)
                    position = j * len(day_list) + i
                    group_list[k][position] = [j, i, num, stock_name]

        dframe_list = []
        day_list = [common.format_date(x, "%m%d") for x in day_list]
        for i in range(0, len(group_list)):
            dframe_list.append(
                common.get_dataframe_option3(group_list[i], "_".join(concepts),
                                             "_".join(day_list),
                                             character_list[i]))
        type_list = [3] * len(dframe_list)
        title_list = character_list
        save_day = common.format_date(self.day, "%Y%m%d")
        common.get_html_curve(dframe_list,
                              u"concepts_flow",
                              html_types=type_list,
                              title_list=title_list,
                              save_dir=os.path.join(
                                  u"D:/Money/modeResee/复盘/%s" % save_day, ""))
        results = self.mongodb.concepts.dragon_pool.find({"date":tdate})
        if results.count() > 0:
            save_dict = results[0]

        save_dict[concept_name] = {}
        if len(dragon_list) > 0:
            save_dict[concept_name]['dragon'] = dragon_list

        if len(wind_list) > 0:
            save_dict[concept_name]['wind'] = wind_list

        self.mongodb.concepts.dragon_pool.update({"date":tdate}, save_dict, upsert=True)

        # 将up, down, flat存放到mongo中的pattern, trend表中
        for code_str in catch_dict.keys():
            tmp_list = catch_dict[code_str]
            for ticker in tmp_list:
                self.mongodb.pattern.trend.update({"date":tdate, "ticker":ticker},
                                                  {"date":tdate, "ticker":ticker, "trend": code_str},
                                                  upsert=True)

# 将昨天以及之前记录的龙头、排除等信息更新到存储中,今天生成新的文件就会包含昨天的笔记
if __name__ == '__main__':
    x = DRAGON_POOL()
    # 将上一日的copy到今日
    today = datetime.datetime.today().strftime("%Y%m%d")
    lastday = common.get_lastN_date(today, 1)
    x.copy_pool_dragon(lastday, today)
    x.fresh_dir()
    print "dragon pool update finished!"
Exemple #19
0
    def plot_stocks_html(self):
        n_day_before = common.get_lastN_date(self.running_day, 80)
        concept_frame_list = []
        all_local_frame = common.FindConceptStocks(n_day_before, self.running_day)

        # 收集所有关注概念以及对应的股票代码
        for concept in self.concepts:
            concept_stocks = []
            # 云财经中相关股票
            ycj_stocks = common.get_ycj_stocks(concept)
            # 金融界中相关股票
            jrj_stocks = common.get_jrj_stocks(concept)
            # 本地csv中相关股票
            csv_stocks = all_local_frame.filter_by_concept(concept)
            # 合并到一起
            concept_stocks.extend(ycj_stocks)
            concept_stocks.extend(jrj_stocks)
            concept_stocks.extend(csv_stocks.ticker.values)

            concept_stocks = list(set(concept_stocks))
            tmp_concept_frame = pd.DataFrame({"stockid":concept_stocks})
            tmp_concept_frame['concept'] = concept
            concept_frame_list.append(tmp_concept_frame)
        # index stockid, concept
        concept_frame = pd.concat(concept_frame_list, axis=0)

        daily_stock_list = list(np.unique(concept_frame.stockid.values))
        daily_stock_list.extend(self.extra_stocks)
        daily_stock_list = list(set(daily_stock_list))

        # 拿到这些股票,指定日期的所有日线数据
        daily_frame = common.get_mysqlData(daily_stock_list, common.getDate(n_day_before, self.running_day))
        # daily_frame.to_csv(u'all_daily_frame.csv', encoding='gbk')
        daily_frame['rate'] = 100*(daily_frame['CLOSE_PRICE'] - daily_frame['PRE_CLOSE_PRICE'])/daily_frame['PRE_CLOSE_PRICE']
        daily_frame['rate'] = daily_frame['rate'].round(2)

        daily_frame['lrate'] = 100*(daily_frame['LOWEST_PRICE'] - daily_frame['PRE_CLOSE_PRICE'])/daily_frame['PRE_CLOSE_PRICE']
        daily_frame['lrate'] = daily_frame['lrate'].round(2)

        daily_frame['hrate'] = 100*(daily_frame['HIGHEST_PRICE'] - daily_frame['PRE_CLOSE_PRICE'])/daily_frame['PRE_CLOSE_PRICE']
        daily_frame['hrate'] = daily_frame['hrate'].round(2)

        daily_frame['TRADE_DATE'] = daily_frame['TRADE_DATE'].apply(lambda x: x.strftime("%Y-%m-%d"))

        # 复权数据,以便画k线图
        fq_daily_frame = common.get_mysqlData(daily_stock_list, common.getDate(n_day_before, self.running_day), db_table='vmkt_equd_adj')
        fq_daily_frame['rate'] = 100*(fq_daily_frame['CLOSE_PRICE'] - fq_daily_frame['PRE_CLOSE_PRICE'])/fq_daily_frame['PRE_CLOSE_PRICE']
        fq_daily_frame['rate'] = fq_daily_frame['rate'].round(2)

        fq_daily_frame['lrate'] = 100*(fq_daily_frame['LOWEST_PRICE'] - fq_daily_frame['PRE_CLOSE_PRICE'])/fq_daily_frame['PRE_CLOSE_PRICE']
        fq_daily_frame['lrate'] = fq_daily_frame['lrate'].round(2)

        fq_daily_frame['hrate'] = 100*(fq_daily_frame['HIGHEST_PRICE'] - fq_daily_frame['PRE_CLOSE_PRICE'])/fq_daily_frame['PRE_CLOSE_PRICE']
        fq_daily_frame['hrate'] = fq_daily_frame['hrate'].round(2)

        fq_daily_frame['TRADE_DATE'] = fq_daily_frame['TRADE_DATE'].apply(lambda x: x.strftime("%Y-%m-%d"))


        # 筛选出符合条件的股票
        # 连续3天以上涨停
        # condition1_frame = filter_stock_by_zt_condition(daily_frame, condition='ZT', zt_num=3)

        #{"concept":concept_frame, "concept":concept_frame2}
        # concept_frame: index TICKER_SYMBOL 5_chg 25_chg N_chg rank
        self.concept_rank_dict = {}
        for concept in self.concepts:
            print concept
            concept_stock_list = list(concept_frame[concept_frame.concept==concept].stockid.values)
            # 去除掉rmv对应的股票,以及加上mst对于的股票
            if concept in self.rmv_dict.keys():
                concept_stock_list = [x for x in concept_stock_list if x not in self.rmv_dict[concept]]

            if concept in self.mst_dict.keys():
                concept_stock_list.extend(self.mst_dict[concept])

            # 概念对应的所有股票的日线数据
            concept_daily_frame = daily_frame[daily_frame.TICKER_SYMBOL.isin(concept_stock_list)]
            # 统计出其涨幅排行
            concept_rank_chg_frame = add_rank_chg(concept_daily_frame, chg_days=[5, 25], sort_v=5)

            # 得到连续N个涨停以上的股票
            condition1_frame = filter_stock_by_zt_condition(daily_frame[daily_frame.TICKER_SYMBOL.isin(concept_stock_list)],
                                                            condition='ZT', zt_num=self.direct10_num[concept])
            # print concept,self.direct10_num[concept]

            # 得到涨幅排行前N的股票
            if len(condition1_frame) < 3:
                tail_n = 10 - len(condition1_frame)
            else:
                tail_n = 5
            stock_list = list(concept_rank_chg_frame.sort_values(by=['rank'], ascending=False).tail(tail_n).TICKER_SYMBOL.values)
            stock_list.extend(condition1_frame.TICKER_SYMBOL.values)

            # 再加上必须关注的股票
            if concept in self.mst_dict.keys():
                stock_list.extend(self.mst_dict[concept])

            stock_list = list(set(stock_list))
            # 记录到mongo中daily_interesting_concept_stocks
            self.write_mongo_concept_day(stock_list, concept, self.running_day)

            # 画图
            k_line_frame_list = []
            for stock in stock_list:
                stock_frame = fq_daily_frame[fq_daily_frame.TICKER_SYMBOL == stock][[u'TRADE_DATE', 'OPEN_PRICE', 'CLOSE_PRICE', 'HIGHEST_PRICE', 'LOWEST_PRICE',
                                                                       'TURNOVER_VOL', 'TICKER_SYMBOL', 'rate', 'lrate', 'hrate', 'SEC_SHORT_NAME']]
                stock_frame.columns=['date', 'open', 'close', 'high', 'low', 'volume', 'code', 'rate', 'lrate', 'hrate', 'name']
                stock_frame['name'] = stock_frame['name'].apply(lambda x: x.encode('gb2312'))
                # index row,date,open, close, high, low, volume, code
                # stock_frame = stock_frame.sort('date', ascending='True')
                stock_frame = stock_frame.sort_values(by=['date'], ascending='True')
                stock_frame.reset_index(inplace=True)
                stock_frame['name'] = stock_frame['name'].apply(lambda x: x.decode("gbk").encode("utf-8") )
                del stock_frame['index']
                k_line_frame_list.append(stock_frame)

            # 只显示感兴趣的股票的排行和涨幅数据
            concept_rank_chg_frame = concept_rank_chg_frame[concept_rank_chg_frame.TICKER_SYMBOL.isin(stock_list)]
            concept_rank_chg_frame = concept_rank_chg_frame.sort_values(by=['rank'], ascending=True)
            concept_rank_chg_frame['stock_name'] = concept_rank_chg_frame['TICKER_SYMBOL'].apply(lambda x: common.QueryStockMap(x)[0])
            names = [x for x in concept_rank_chg_frame.columns if x not in ['stock_name', 'TICKER_SYMBOL']]
            valid_name = ['stock_name']
            valid_name.extend(names)
            concept_rank_chg_frame = concept_rank_chg_frame[valid_name]

            # 构造一个OPTION4&6,左边为K线图,右边为条形图,以及下面一系列的k线图
            plot_frame_list = [[k_line_frame_list[0], concept_rank_chg_frame]]
            plot_frame_list.extend(k_line_frame_list[1:])

            # 构造对应的stock_list,标识对应的股票代码
            plot_stock_list = []
            for kline_frame in k_line_frame_list:
                plot_stock_list.append(kline_frame['code'].values[0])

            html_types=['4and6']
            html_types.extend([4]*len(k_line_frame_list[1:]))

            title_list = [['A_stock', 'accum_ratio']]
            title_list.extend(['A_stocks']*len(k_line_frame_list[1:]))

            # 在加一个统计区间涨跌幅
            # range_ratio = {
            #     concept_name:[[start1, end1],[start2, end2], [start3, end3], ...],
            #     concept_name2:[[start1, end1],[start2, end2], [start3, end3], ...],
            # }

            # 说明该概念需要画出不同时期的涨跌幅对比
            if concept in self.range_ratio_dict.keys():
                range_ratio_frame = pd.DataFrame()
                for [sday, eday] in self.range_ratio_dict[concept]:
                    col_name = "%s-%s"%(common.format_date(sday, "%Y%m%d"), common.format_date(eday, "%Y%m%d"))
                    for stock in stock_list:
                        range_ratio_frame.loc[stock, col_name] = common.time_range_accum_ratio(stock, sday, eday)
                range_ratio_frame.reset_index(inplace=True)
                range_ratio_frame.rename(columns={"index":"stock_name"}, inplace=True)
                range_ratio_frame['stock_name'] = range_ratio_frame['stock_name'].apply(lambda x: common.QueryStockMap(x)[0])
                # 添加到画图中
                plot_frame_list.append(range_ratio_frame)
                plot_stock_list.append(0)
                html_types.append(7)
                title_list.append('ACCUM_RATIO')

            # 输出html
            common.get_html_curve(plot_frame_list, '%s' %(concept), html_types=html_types,
                      title_list = title_list, save_dir=os.path.join(self.dump_dir, self.running_day),
                                  chart_connect=1, plot_stock_list=plot_stock_list, generate_date=self.running_day)
            logging.getLogger().info("plot html finished for %s, %s" %(concept, self.running_day))
        print "Finished for %s" %self.running_day
Exemple #20
0
def study_plot(tmp_array,dirs, name_tail = u'', end_date_interval = 0, start_date_interval = 0):

    ## 日线dir
    daydir = dirs
    minsdir = "%s/mins"%dirs
    bothdir = "%s/both"%dirs

    if os.path.exists(minsdir):
        pass
    else:
        os.mkdir(minsdir)

    if os.path.exists(bothdir):
        pass
    else:
        os.mkdir(bothdir)

    [ddate,dtime,code,direction,price]=tmp_array
    end_date = common.format_date(ddate,"%Y-%m-%d")
    start_date = common.get_lastN_date(end_date, start_date_interval)
    day_end_date = common.get_lastN_date(end_date, end_date_interval)
    code = "0"*(6-len(str(int(code))))+str(int(code))

    # 日线数据
    sql = "SELECT TICKER_SYMBOL, SEC_SHORT_NAME, TRADE_DATE, PRE_CLOSE_PRICE, OPEN_PRICE, HIGHEST_PRICE, LOWEST_PRICE, CLOSE_PRICE, \
    DEAL_AMOUNT from vmkt_equd where TRADE_DATE >= '%s' and TRADE_DATE <='%s' and TICKER_SYMBOL = '%s'"%(start_date,day_end_date,code)
    sub = common.get_mysqlData_sqlquery(sql)
    sub = regulate_data(sub)

    idxcode = "000001"
    idxsql = "SELECT TICKER_SYMBOL, SEC_SHORT_NAME, TRADE_DATE, PRE_CLOSE_INDEX, OPEN_INDEX, HIGHEST_INDEX, LOWEST_INDEX, CLOSE_INDEX, \
    TURNOVER_VOL from vmkt_idxd where TRADE_DATE >= '%s' and TRADE_DATE <='%s' and TICKER_SYMBOL = '%s'"%(start_date,day_end_date,idxcode)
    idx = common.get_mysqlData_sqlquery(idxsql)
    idx.columns=sub.columns

    add_mean(sub)
    add_mean(idx)

    tableTime = common.format_date(ddate,"%Y%m")
    endDate = common.format_date(ddate,"%Y%m%d")
    endDate = int(endDate)
    stockid = int(code)

    # table = "equity_pricefenbi%s"%tableTime
    table = "MarketDataTDB.equity_pricemin%s"%tableTime
    dtsql = "SELECT * from %s where ticker = %s and datadate = %s"%(table,stockid,endDate)
    dtv = common.get_mydb_sqlquery(dtsql)
    if len(dtv) == 0:
        table = "MarketDataL1.equity_pricemin%s"%tableTime
        dtsql = "SELECT * from %s where ticker = %s and datadate = %s"%(table,stockid,endDate)
        dtv = common.get_mydb_sqlquery(dtsql)

    table = "MarketDataTDB.equity_pricemin%s"%tableTime
    zssql = 'SELECT * from %s where datadate = %s and ticker = 1 and shortnm = "上证指数"'%(table,endDate)
    sh = common.get_mydb_sqlquery(zssql)
    if len(sh) == 0:
        table = "MarketDataL1.equity_pricemin%s"%tableTime
        zssql = 'SELECT * from %s where datadate = %s and ticker = 1 and shortnm = "上证指数"'%(table,endDate)
        sh = common.get_mydb_sqlquery(zssql)

    # ##临时增加,需要保存数据
    # tmp_dir = "D:\Money\lilton_code\Market_Mode\study_fresh_fail_Module\data"
    # dtv.to_csv(os.path.join(tmp_dir,"%s_%s.csv"%(ddate,code)),encoding='utf8')

    [name,tmp_id]=common.QueryStockMap(id=code)
    ##日线,daydir
    fig1 = plt.figure(figsize=[12,8])

    ##日线图
    point = 10
    # plt.title("%s"%code)
    plt.title(u"%s_%s_%s_d.png"%(ddate, code, name_tail))
    ax1 = fig1.add_subplot(211)
    plot_candlestick(sub, ax1, point=10, direction=direction, mount_flag=1, mark_date=end_date)

    ax2 = fig1.add_subplot(212)
    plot_candlestick(idx, ax2, point=10, mount_flag=1, mark_date=end_date)

    # plt.savefig(os.path.join(daydir,"%s_%s_%s.pdf"%(ddate,direction,code)),dpi=300)
    plt.savefig(os.path.join(daydir, "%s_%s_%s_%s_m.png"%(ddate, code, name, name_tail)),dpi=300)
    plt.close()

    ##分时图,分钟线,在dir/mins
    fig2 = plt.figure(figsize=(12,8))
    ax3 = fig2.add_subplot(211)


    plt.title("%s"%code)
    plot_dealDetail(dtv,ax3,time=dtime,direction=direction,mount_flag=1)

    ax4 = fig2.add_subplot(212)
    plot_dealDetail(sh,ax4,time=dtime,direction=direction,mount_flag=1)

    # plt.savefig(os.path.join(minsdir,"%s_%s_%s_%s.pdf"%(ddate,direction,code,name)),dpi=300)
    plt.savefig(os.path.join(minsdir,"%s_%s_%s_%s.png"%(ddate, code, name, name_tail)),dpi=300)
    plt.close()
        self.mongodb.concepts.dragon_pool.update({"date": tdate},
                                                 save_dict,
                                                 upsert=True)

        # 将up, down, flat存放到mongo中的pattern, trend表中
        for code_str in catch_dict.keys():
            tmp_list = catch_dict[code_str]
            for ticker in tmp_list:
                self.mongodb.pattern.trend.update(
                    {
                        "date": tdate,
                        "ticker": ticker
                    }, {
                        "date": tdate,
                        "ticker": ticker,
                        "trend": code_str
                    },
                    upsert=True)


# 将昨天以及之前记录的龙头、排除等信息更新到存储中,今天生成新的文件就会包含昨天的笔记
if __name__ == '__main__':
    x = DRAGON_POOL()
    # 将上一日的copy到今日
    today = datetime.datetime.today().strftime("%Y%m%d")
    lastday = common.get_lastN_date(today, 1)
    x.copy_pool_dragon(lastday, today)
    x.fresh_dir()
    print "dragon pool update finished!"
Exemple #22
0
def reControlCx(start_day = dt.datetime.today().strftime("%Y%m%d"), end_day = dt.datetime.today().strftime("%Y%m%d"),  force = 0):
    start_day = common.get_lastN_date(start_day, 10)
    start_day = common.format_date(start_day, "%Y%m%d")
    print "Will run reControlCx, start_day = %s, end_day = %s"%(start_day, end_day)
    try:
        mongodb = pymongo.MongoClient("localhost")
        # 统计新股的开始日期 start_day
        # 统计结束日期 end_day

        results = mongodb.stock.ZDT_by_date.find({"date":{"$gte":start_day, "$lte":end_day}})
        # 强势从0开始
        if force == 1:
            previous_back_list = [] # 记录的昨日持续涨停的、回封新股, 不包括今天的回封, 每天开盘前,该字段的值就确定了
            previous_direct_ten_list = [] # 记录的昨日直接涨停的新股,未曾开板过, 每天开盘前,该字段的值就确定了
            flag = 0

            directTen = {}    # 当天,各个一字新股的累计涨停个数,收盘之后才能确定
            backTen_acc = {}      # 当天,各个回封股票的累计涨幅,收盘之后才能确定
            dummyDirectTen = {}
            # dummyDirectTen = {"000839":15,}  考虑回封在内的连板涨停数,用不同颜色标注
            # directTen = {"000839":14,}  不考虑回封,直接一字涨停的连板数
            # backTen_acc = {"000839": 21.4%, }
            # directOpen = {"601989":3.45, }
            # backOpen = {"601989":3.45, }
            # highDirectOpen = {"601989":3.45}
            # highBackOpen = {"601989":3.45}

            # return directTen, dummyDirectTen, backTen_acc, directOpen, highDirectOpen, backOpen, highBackOpen
            last_zt_stocks = "" #昨日的涨停股票
            last_new_stocks = "" # 昨日新上市的股票
        else:
            print start_day
            last_start = common.get_lastN_date(start_day, 1)
            last_start = common.format_date(last_start, "%Y%m%d")
            last_mongo = mongodb.stock.ZDT_by_date.find({"date": last_start})
            day = last_start
            directTen = {}    # 当天,各个一字新股的累计涨停个数,收盘之后才能确定
            backTen_acc = {}      # 当天,各个回封股票的累计涨幅,收盘之后才能确定
            dummyDirectTen = {}
            flag = 1
            if last_mongo.count() == 1:
                mongo_record = last_mongo[0]
                if 'previous_direct_ten_list' in mongo_record.keys():
                    previous_direct_ten_list = mongo_record['previous_direct_ten_list']

                if 'directTen' in mongo_record.keys():
                    directTen = mongo_record['directTen']

                if 'dummyDirectTen' in mongo_record.keys():
                    dummyDirectTen = mongo_record['dummyDirectTen']

                if 'backTen_acc' in mongo_record.keys():
                    backTen_acc = mongo_record['backTen_acc']

                if "freshStocks" in mongo_record.keys():
                    last_zt_stocks = mongo_record['freshStocks']
                else:
                    last_zt_stocks = ""

                if "Add_newStocks" in mongo_record.keys():
                    last_new_stocks = "_".join(mongo_record['Add_newStocks'].keys())
                else:
                    last_new_stocks = ""

        # 更新每天的昨日回封股票list、昨日一字涨停股票list、今日的一字涨停股票和涨停数(多了数目,也多了今天新加的股票)、
        # 今日的回封股票及涨停数(多了数值,以及今天回封的股票)
        for result in results:
            if flag == 0:   # 说明是初始化的第一天
                if "freshStocks" in result:
                    previous_direct_ten_list = result['freshStocks'].split("_")     # 赋值为当天的一字涨停新股(包括了当天的新上市股,也包括了回封的新股,所有的都是当天涨停的)
                flag = 1
            else:
                # 今日的“昨日直接涨停新股” = 昨日的“昨日直接涨停新股”中涨停的 + 昨日新增的股票, 还应该减去中间有开板过的
                previous_direct_ten_list = [x for x in previous_direct_ten_list if x in last_zt_stocks.split("_")]
                previous_direct_ten_list, new_back_ten_list = group_ten_list(previous_direct_ten_list, day)

                previous_direct_ten_list.extend(last_new_stocks.split("_"))
                previous_direct_ten_list = list(set(previous_direct_ten_list))
                # 昨日涨停的新股 = 前日一字新股中昨日直接涨停的 + 昨日新上市的 + 回封的
                previous_back_list = [x for x in last_zt_stocks.split("_") if x not in previous_direct_ten_list]

            if "freshStocks" in result.keys():
                last_zt_stocks = result['freshStocks']
            else:
                last_zt_stocks = ""

            if "Add_newStocks" in result:
                last_new_stocks = "_".join(result['Add_newStocks'].keys())
            else:
                last_new_stocks = ""

            day = result['date']
            # 更新今日收盘后,一字涨停的股票涨停数
            if day == '20170426':
                print 'debug'
                pass
            directTen, dummyDirectTen, backTen_acc, directOpen, highDirectOpen, backOpen, highBackOpen = continues_count(day, directTen, dummyDirectTen, backTen_acc, last_zt_stocks, last_new_stocks)
            print day
            print "will update"
            print "directTen:", directTen
            mongodb.stock.ZDT_by_date.update({"date":day},
                                             {"$set":
                                                  {"previous_direct_ten_list":previous_direct_ten_list,
                                                   "previous_back_list":previous_back_list,
                                                   "directTen":directTen,
                                                   "dummyDirectTen":dummyDirectTen,
                                                   "backTen_acc":backTen_acc,
                                                   "directOpen":directOpen,
                                                   "highDirectOpen":highDirectOpen,
                                                   "backOpen":backOpen,
                                                   "highBackOpen":highBackOpen}},
                                             True)
        return True
    except:
        return False
Exemple #23
0
def study_plot(tmp_array,dirs):

    ## 日线dir
    daydir = dirs
    minsdir = "%s/mins"%dirs
    bothdir = "%s/both"%dirs

    if os.path.exists(minsdir):
        pass
    else:
        os.mkdir(minsdir)

    if os.path.exists(bothdir):
        pass
    else:
        os.mkdir(bothdir)

    [ddate,dtime,code,direction,price]=tmp_array
    end_date = common.format_date(ddate,"%Y-%m-%d")
    start_date = common.get_lastN_date(end_date,120)
    code = "0"*(6-len(str(int(code))))+str(int(code))

    sql = "SELECT TICKER_SYMBOL, SEC_SHORT_NAME, TRADE_DATE, PRE_CLOSE_PRICE, OPEN_PRICE, HIGHEST_PRICE, LOWEST_PRICE, CLOSE_PRICE, \
    DEAL_AMOUNT from vmkt_equd where TRADE_DATE >= '%s' and TRADE_DATE <='%s' and TICKER_SYMBOL = '%s'"%(start_date,end_date,code)
    sub = common.get_mysqlData_sqlquery(sql)

    idxcode = "000001"
    idxsql = "SELECT TICKER_SYMBOL, SEC_SHORT_NAME, TRADE_DATE, PRE_CLOSE_INDEX, OPEN_INDEX, HIGHEST_INDEX, LOWEST_INDEX, CLOSE_INDEX, \
    TURNOVER_VOL from vmkt_idxd where TRADE_DATE >= '%s' and TRADE_DATE <='%s' and TICKER_SYMBOL = '%s'"%(start_date,end_date,idxcode)
    idx = common.get_mysqlData_sqlquery(idxsql)
    idx.columns=sub.columns

    add_mean(sub)
    add_mean(idx)

    tableTime = common.format_date(ddate,"%Y%m")
    endDate = common.format_date(ddate,"%Y%m%d")
    endDate = int(endDate)
    stockid = int(code)

    # table = "equity_pricefenbi%s"%tableTime
    table = "MarketDataTDB.equity_pricemin%s"%tableTime
    dtsql = "SELECT * from %s where ticker = %s and datadate = %s"%(table,stockid,endDate)
    dtv = common.get_mydb_sqlquery(dtsql)
    if len(dtv) == 0:
        table = "MarketDataL1.equity_pricemin%s"%tableTime
        dtsql = "SELECT * from %s where ticker = %s and datadate = %s"%(table,stockid,endDate)
        dtv = common.get_mydb_sqlquery(dtsql)

    table = "MarketDataTDB.equity_pricemin%s"%tableTime
    zssql = 'SELECT * from %s where datadate = %s and ticker = 1 and shortnm = "上证指数"'%(table,endDate)
    sh = common.get_mydb_sqlquery(zssql)
    if len(sh) == 0:
        table = "MarketDataL1.equity_pricemin%s"%tableTime
        zssql = 'SELECT * from %s where datadate = %s and ticker = 1 and shortnm = "上证指数"'%(table,endDate)
        sh = common.get_mydb_sqlquery(zssql)

    ##临时增加,需要保存数据
    tmp_dir = "D:\Money\lilton_code\Market_Mode\study_fresh_fail_Module\data"
    dtv.to_csv(os.path.join(tmp_dir,"%s_%s.csv"%(ddate,code)),encoding='utf8')


    ##日线,daydir
    fig1 = plt.figure(figsize=[12,8])

    ##日线图
    point = 10
    # plt.title("%s"%code)
    ax1 = fig1.add_subplot(211)
    plot_candlestick(sub,ax1,point =10,direction = direction,mount_flag = 1)

    ax2 = fig1.add_subplot(212)
    plot_candlestick(idx,ax2,point =10,mount_flag = 1)

    # plt.savefig(os.path.join(daydir,"%s_%s_%s.pdf"%(ddate,direction,code)),dpi=300)
    plt.savefig(os.path.join(daydir,"%s_%s_%s.png"%(ddate,direction,code)),dpi=300)
    plt.close()

    ##分时图,分钟线,在dir/mins
    fig2 = plt.figure(figsize=(12,8))
    ax3 = fig2.add_subplot(211)

    [name,tmp_id]=common.QueryStockMap(id=code)
    plt.title("%s"%code)
    plot_dealDetail(dtv,ax3,time=dtime,direction=direction,mount_flag=1)

    ax4 = fig2.add_subplot(212)
    plot_dealDetail(sh,ax4,time=dtime,direction=direction,mount_flag=1)

    # plt.savefig(os.path.join(minsdir,"%s_%s_%s_%s.pdf"%(ddate,direction,code,name)),dpi=300)
    plt.savefig(os.path.join(minsdir,"%s_%s_%s_%s.png"%(ddate,direction,code,name)),dpi=300)
    plt.close()