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)
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
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!"
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, ""))
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!"
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
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)
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
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
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)
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
# 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!"
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
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!"
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
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()