def top10_holders(): n = 0 stock_count = len(stock_list(coll_stock_cache)) for code in stock_list(coll_stock_cache): try: print('开始读取code:', code) df, data = ts.top10_holders(code=code, gdtype='1') data['code'] = code coll.insert(json.loads(data.to_json(orient='records'))) print('保存code:', code) coll_stock_cache.delete_one({'code': code}) print('从缓存中删除code:', code) n += 1 sleep_time = n / 100 print('当前进度{}:{}/{}'.format(code, n, stock_count)) print('▂▃▄▅▆▇█▉▉█▇▆▅▄▃▂暂停区') if sleep_time.is_integer(): print('休息三分钟') time.sleep(180) except: try: # coll.deleteMany({'code': code}) update_new_cache(coll_stock_cache, coll_new_cache, code) except: coll_stock_cache.delete_one({'code': code}) finally: print('重新开始top10_holders') restar(top10_holders()) print('开始转换时间') holders_time_convert(coll) print('任务完成')
def update_top10_holders(): n = 0 stock_count = len(stock_list(coll_stock_cache)) for code in stock_list(coll_stock_cache): try: print('开始读取code:', code) # 新股等,列表不存在,返回233 if date_holders(code) == 233: query = { 'code': code, } field = { 'code': 1, '_id': 1, # mogodb中连_id字段在内都相同的完全一样的字段不能插入 } coll_new_cache.insert(coll_stock_cache.find(query, field)) print('可能为新股,不存在该代码,读取下一个') # 不用更新的情况,返回[] elif not date_holders(code): print('未到更新时间,请等待') # 报错为数据还未出来的股票 else: for i in date_holders(code): for k, v in i.items(): year = k quarter = int(v) df, data = ts.top10_holders(code=code, year=year, quarter=quarter, gdtype='1') data['code'] = code coll.insert(json.loads(data.to_json(orient='records'))) print('保存{}:{}年第{}季度:'.format(code, year, quarter)) coll_stock_cache.delete_one({'code': code}) print('从缓存中删除code:', code) n += 1 sleep_time = n / 100 print('当前进度{}:{}/{}'.format(code, n, stock_count)) print('▂▃▄▅▆▇█▉▉█▇▆▅▄▃▂暂停区') if sleep_time.is_integer(): print('休息三分钟') time.sleep(180) except: try: update_new_cache(coll_stock_cache, coll_new_cache, code) except: # 出现new_cache中有重复code coll_stock_cache.delete_one({'code': code}) finally: print('重新开始update_top10_holders') restar(update_top10_holders()) print('开始转换时间') holders_time_convert(coll) print('任务完成')
def top10_holders_worker(engine, codes, year, quarter): pid = os.getpid() tsl.log("pid %i start with %i codes..." % (pid, len(codes))) df = pd.DataFrame() temp = [] for code in codes: try: newdf = ts.top10_holders(code, year, quarter)[1] if newdf is not None: newdf['code'] = code df = df.append(newdf, ignore_index=True) except BaseException, e: if 'timed out' in str(e) or 'urlopen error' in str(e): temp.append(code) else: print e tsl.log("pid %i error for %s" % (pid, code))
def refreshTop10Holders(): logger.info("refreshTop10Holders...") mongoService.drop_collection('top10Holders') mongoService.drop_collection('stockHoldersChanges') res = mongoService.find('stocksBasics', {}) count = 1 for row in res: try: logger.info('count %d' % count) logger.info('code is %s' % row['code']) df = ts.top10_holders(row['code'], 2018, 3) df[0]['code'] = row['code'] df[1]['code'] = row['code'] logger.info('Top10 Holders of %s' % (row['code'])) insertAndPrintResult('stockHoldersChanges', df[0]) insertAndPrintResult('top10Holders', df[1]) count += 1 except Exception: logger.error(traceback.format_exc())
def Get_Top10_holders(self): df = ts.top10_holders('600848') # print df # print type(df) obj_series_tuple = pd.Series(df, index=list('abcdefgsll')) print obj_series_tuple
def generate_stock_line(stock_id, Type, start_date, end_date, interval): start_data = start_date.replace("/", "-").replace( "\n", "") #convert to tushare readable date end_data = end_date.replace("/", "-").replace("\n", "") current_time = time.strftime("%Y/%m/%d") if Type == "分笔": if start_date != current_time: array = ts.get_tick_data(stock_id, date=start_data) #分笔 if array is None: return array = array.sort_values("time") date = array["time"].tolist() amount = array["amount"].tolist() atype = array["type"].tolist() price = array["price"].tolist() flag = ["bar" for i in date] for idx, val in enumerate(atype): #if卖盘,交易变成负数 if val == "卖盘": amount[idx] = -amount[idx] if val == "中性盘": #if中性盘,则忽略. Might have a problem with this part?? amount[idx] = 0 returnarray = zip(date, amount, flag, price) return returnarray else: array = ts.get_today_ticks(stock_id) #Tushare里今日分笔和历史分笔需要分别对待 if array is None: return array = array.sort_values("time") date = array["time"].tolist() amount = array["amount"].tolist() atype = array["type"].tolist() flag = ["bar" for i in date] for idx, val in enumerate(atype): if val == "卖盘": amount[idx] = -amount[idx] if val == "中性盘": amount[idx] = 0 returnarray = zip(date, amount, flag) return returnarray if Type == "季度饼图": datestr = start_date.split("/") thisyear = datestr[0] df2 = ts.top10_holders(code=stock_id, gdtype="1") test = df2[1]["quarter"].tolist() df_ready = df2[1] idxlist = [] for idx, val in enumerate(test): a = val.split("-") if a[0] == thisyear: # print a[0],idx idxlist.append(idx) thing = df_ready.loc[idxlist] thing = thing.sort_values(["quarter", "name"]) # print a[0],id name = thing["name"].tolist() value = thing["hold"].tolist() quarter = thing["quarter"].tolist() namearray = [name[i:i + 10] for i in xrange(0, len(name), 10)] valuearray = [value[j:j + 10] for j in xrange(0, len(value), 10)] quarterarray = [quarter[k:k + 10] for k in xrange(0, len(quarter), 10)] flag = ["pie" for i in namearray] num = [len(value) for k in namearray] returnarray = zip(namearray, valuearray, quarterarray, flag, num) return returnarray if interval != "qfq" and interval != "hfq": if interval == "1min" or interval == "5min" or interval == "15min" or interval == "30min" or interval == "60min": df = ts.get_tick_data(stock_id, date=start_data) df.sort_values("time") a = start_data + " " + df["time"] df["time"] = a df["time"] = pd.to_datetime(a) df = df.set_index("time") price_df = df["price"].resample(interval).ohlc() price_df = price_df.dropna() vols = df["volume"].resample(interval).sum( ) #relevant data processing algorithm taken from Jimmy, Creator of Tushare vols = vols.dropna() vol_df = pd.DataFrame(vols, columns=["volume"]) amounts = df["amount"].resample(interval).sum() amounts = amounts.dropna() amount_df = pd.DataFrame(amounts, columns=["amount"]) newdf = price_df.merge(vol_df, left_index=True, right_index=True).merge(amount_df, left_index=True, right_index=True) if Type != "Kline": Type1 = firstletter(Type) target = newdf[Type1].tolist() date = newdf.index.format() returnarray = zip(date, target) return returnarray else: Date = newdf.index.format() Open = newdf["open"].tolist() Close = newdf["close"].tolist() High = newdf["high"].tolist() Low = newdf["low"].tolist() Candlestick = zip(*[Date, Open, Close, Low, High]) return Candlestick #正常历史k线 if Type != "Kline": array = ts.get_k_data(stock_id, start=start_data, end=end_data, ktype=interval) if array is None: return Type1 = firstletter(Type) target = array[Type1].tolist() date = array["date"].tolist() returnarray = zip(date, target) return returnarray else: array = ts.get_k_data(stock_id, start=start_data, end=end_data, ktype=interval) if array is None: return Date = array["date"].tolist() Open = array["open"].tolist() Close = array["close"].tolist() High = array["high"].tolist() Low = array["low"].tolist() Candlestick = zip(*[Date, Open, Close, Low, High]) return Candlestick else: if Type != "Kline": # 复权 array = ts.get_h_data(stock_id, start=start_data, end=end_data, autype=interval) if array is None: return Type1 = firstletter(Type) array = array.sort_index() target = array[Type1].tolist() date = array.index.format() returnarray = zip(date, target) return returnarray else: array = ts.get_h_data(stock_id, start=start_data, end=end_data, autype=15) if array is None: return array = array.sort_index() Date = array.index.format() Open = array["open"].tolist() Close = array["close"].tolist() High = array["high"].tolist() Low = array["low"].tolist() # list_array = [Date, Open, Close, Low, High] Candlestick = zip(*[Date, Open, Close, Low, High]) return Candlestick
def Top10Holder(codenumber, startdate='2014-10-10'): """ Top10 holde 是将top10 股东用Pie 图进行可视化,其中包含一年股东变化的河流图. Parameters ---------- codenumber: stock 代码 startdate='2014-10-10': 起始时间 Returns ------- 输出为 当前文件夹下 html :top10.html """ if len(codenumber) != 6: #检查 code 长度 不符合6位全部错误 return False elif len(codenumber) == 6: datestr = startdate.split("-") thisyear = datestr[0] df2 = ts.top10_holders(code=codenumber, gdtype="1") # 下载数据 test = df2[1]["quarter"].tolist() #获取季度列表 df_ready = df2[1] idxlist = [] for idx, val in enumerate(test): a = val.split("-") if a[0] == thisyear: # print a[0],idx idxlist.append(idx) elif a[0] > thisyear: idxlist.append(idx) thing = df_ready.loc[idxlist] thing = pd.DataFrame(thing) thing = thing.sort_values(["quarter", "name"]) #排序所有流通股股东 quarterlist = thing.quarter.value_counts() quarterlist = quarterlist.index.sort_values() timeline = Timeline( height=600, width=800, timeline_left=20, timeline_right=100, is_auto_play=False, timeline_bottom=0, timeline_symbol='diamond', ) year_index = thing.quarter.apply( lambda x: x[0:4]) # year list ('20xx') yearlist = year_index.value_counts() yearlist = yearlist.index.sort_values() #print(quarterlist,year) for quarters in list(quarterlist): # 将每个季度画成PIE 加入TIMELINE df = thing[thing["quarter"] == quarters] df.h_pro = df.h_pro.apply(lambda x: float(x)) df.hold = df.hold.apply(lambda x: float(x)) sum_pro = round(df.h_pro.sum(), 2) sum_hold = round(np.mean(df.hold / df.h_pro) * sum_pro, 0) s = pd.Series({ 'name': '其他', 'h_pro': 100 - sum_pro, 'hold': sum_hold }) df = df.append(s, ignore_index=True) #df=df.sort_values(["name"]) pie = Pie('%s' % quarters + "-" + "top10holder", title_pos='outside') TopPie = pie.add( '', df.name, df.hold, radius=[20, 45], center=[45, 50], is_legend_show=True, is_label_show=True, # is_visualmap=True, is_more_utils=True, is_toolbox_show=True, legend_pos='left', legend_orient='vertical', legend_top=25, legend_text_size=12, label_text_size=10, label_text_color="#100", tooltip_text_color="#F0F", #is_label_emphasis=False,#是否显示高亮 label_formatter="{b}:\n {c}万股\n{d}%") #gird= Grid() #gird.add(pie,grid_bottom="20%") #gird.add(tab,grid_bottom="60%") #pietimeline.add(pie, quarters,) timeline.add( pie, quarters, ) #page = pyecharts.Page() #page.add(pie) #page.add(_treemap) #timeline.add(pie,quarters,) #timeline.add(_treemap,quarters,) #pietimeline.top('40%') trmtimeline = Timeline( height=1200, width=800, timeline_left=20, timeline_right=100, is_auto_play=False, timeline_bottom=0, timeline_symbol='diamond', ) #for y in list(yearlist): datas_index = [] for i, _year in enumerate(year_index): #获取datas_index if _year in list(yearlist)[-1:]: datas_index.append(i) else: pass print(thing.loc[datas_index, :]) collect_datas = thing.iloc[datas_index, :3] collect_datas.hold = collect_datas.hold.apply(lambda x: float(x)) print(collect_datas) name = collect_datas['name'] collect_datas.drop(labels=['name'], axis=1, inplace=True) collect_datas.insert(2, 'name', name) print(collect_datas.get_values()) tr = pyecharts.ThemeRiver( "TOP 10 hold 河流图 ", height=800, width=800, ) tr.add(name.get_values(), collect_datas.get_values(), is_label_show=False) #trmtimeline.add(tr,"%s"%y,) page = pyecharts.Page() # page.add(trmtimeline) page.add(timeline) page.add(tr) ''' them_dates=[] for i in thing.index: print (i) collect_datas=thing[thing.index==i].iloc[:, 0:3] name=collect_datas['name'] collect_datas.drop(labels=['name'], axis=1,inplace = True) collect_datas.insert(2, 'name', name) print (collect_datas.get_values()) ''' print('time line done') return page
def graphpage(labels,mode_combo,startdate,enddate,optInterval,width1, height1): #optInterval='D/W/M' labels startdate = startdate.replace("/","-")#convert to tushare readable date enddate = enddate.replace("/","-") page = Page() for label in labels: # generate numbers of graphs according to numbers of queries in treewidget label1 = re.split("-", label) overlap = Overlap() if label1[2]!="分笔" and label1[2]!="季度饼图": #"K线" "复权" "历史分钟" if mode_combo == "复权": #if optInterval == "qfq" or optInterval == "hfq":#复权 array = ts.get_h_data(label1[1], start=startdate, end=enddate, autype="qfq") array = array.sort_index() time = array.index.format() # 日期正是index elif mode_combo == "K线": #elif optInterval.isalnum() :#历史K线 array = ts.get_k_data(label1[1], start=startdate, end=enddate, ktype=optInterval) time = array['date'].tolist() # array.date elif mode_combo == "历史分钟": array_bfr = ts.get_tick_data(label1[1], date=startdate) array_bfr.sort_values("time") a = startdate + " " + array_bfr["time"] array_bfr["time"] = a array_bfr["time"] = pd.to_datetime(a) array_bfr = array_bfr.set_index("time") if label1[2] != "Volume" and label1[2] != "Amount": price_df = array_bfr["price"].resample(optInterval).ohlc() # resample重新取样,选出ohlc=open/high/low,提取除价格之外另外4列.close,tushare是ohcl price_df = price_df.dropna() array = price_df time = price_df.index.format() elif label1[2] == "Volume": vols = array_bfr["volume"].resample(optInterval).sum() #resample重新取样,累加间隔内数值 relevant data processing algorithm taken from Jimmy, Creator of Tushare vols = vols.dropna() vol_df = pd.DataFrame(vols, columns=["volume"]) array = vol_df time = vol_df.index.format() else: amounts = array_bfr["amount"].resample(optInterval).sum() amounts = amounts.dropna() amount_df = pd.DataFrame(amounts, columns=["amount"]) array = amount_df time = amount_df.index.format() #绘图方法 if label1[2] == 'Kline': re_array = array[['open', 'close', 'high', 'low']] data_li = list(row.tolist() for index, row in re_array.iterrows()) # data_list = list(re_array.as_matrix()) close = array['close'].tolist() kline = Kline(label1[0] + "-" + optInterval, width=width1*10/11, height = (height1*10/11) / len(labels)) kline.add(label1[0], time, data_li, is_datazoom_show=True, datazoom_type="slider", yaxis_interval=1) overlap.add(kline) if len(close) > 10: ma10 = calculateMa(close, 10) line1 = Line(title_color="#C0C0C0") line1.add(label1[0] + "-" + "MA10", time, ma10) overlap.add(line1) if len(close) > 20: ma20 = calculateMa(close, 20) line2 = Line(title_color="#C0C0C0") line2.add(label1[0] + "-" + "MA20", time, ma20) overlap.add(line2) if len(close) > 30: ma30 = calculateMa(close, 30) line3 = Line(title_color="#C0C0C0") line3.add(label1[0] + "-" + "MA30", time, ma30) overlap.add(line3) page.add(overlap) else:#When label1[2]==open/close/volume if label1[2] == 'Open': list_aft = array['open'].tolist() elif label1[2] == 'Close': list_aft = close elif label1[2] == 'High': list_aft = array['high'].tolist() elif label1[2] == 'Low': list_aft = array['low'].tolist() elif label1[2] == 'Volume':#volume list_aft = array['volume'].tolist() else:#amount list_aft = array['amount'].tolist() line = Line(label1[0] + "-" + label1[2], width=width1 * 10 / 11, height=(height1 * 10 / 11) / len(labels)) line.add(label1[0] + "-" + label1[2], time, list_aft, is_datazoom_show=True, yaxis_max="dataMax", yaxis_min="dataMin", datazoom_type="slider") overlap.add(line) page.add(overlap) elif label1[2]=="分笔": array = ts.get_tick_data(label1[1], date=startdate) array = array.sort_values("time") date = array["time"].tolist() amount = array["amount"].tolist() atype = array["type"].tolist() price = array["price"].tolist() flag = ["bar" for i in date] for idx, val in enumerate(atype): if val == "卖盘": amount[idx] = -amount[idx] if val == "中性盘": amount[idx] = 0 returnarray = list(zip(date, amount, flag, price)) form = [e[1] for e in returnarray] time = [d[0] for d in returnarray] bar = Bar(label1[0] + "-" + label1[2], width=width1 * 10 / 11, height=(height1 * 10 / 11) / len(labels)) bar.add(label1[0] + "-" + label1[2], time, form, is_datazoom_show=True, datazoom_type="slider", yaxis_min="dataMin", yaxis_max="dataMax") overlap.add(bar) line = Line(label1[0] + "price", width=width1 * 10 / 11, height=(height1 * 10 / 11) / len(labels)) price = [e[3] for e in returnarray] line.add(label1[0] + "price", time, price, yaxis_min="dataMin", yaxis_max="dataMax", is_datazoom_show=True, datazoom_type="slider", yaxis_type="value") overlap.add(line, yaxis_index=1, is_add_yaxis=True) page.add(overlap) elif label1[2]=="季度饼图": datestr = startdate.split("-") thisyear = datestr[0] df2 = ts.top10_holders(code=label1[1], gdtype="1") test = df2[1]["quarter"].tolist() df_ready = df2[1] idxlist = [] for idx, val in enumerate(test): a = val.split("-") if a[0] == thisyear: # print a[0],idx idxlist.append(idx) thing = df_ready.loc[idxlist] thing = thing.sort_values(["quarter", "name"]) # print a[0],id name = thing["name"].tolist() value = thing["hold"].tolist() quarter = thing["quarter"].tolist() namearray = [name[i:i + 10] for i in range(0, len(name), 10)] valuearray = [value[j:j + 10] for j in range(0, len(value), 10)] quarterarray = [quarter[k:k + 10] for k in range(0, len(quarter), 10)] flag = ["pie" for i in namearray] num = [len(value) for k in namearray] returnarray = list(zip(namearray, valuearray, quarterarray, flag, num)) timeline = Timeline(is_auto_play=False, timeline_bottom=0) # zip(namearray,valuearray,quarter,flag,num) namearray = [c[0] for c in returnarray] valuearray = [d[1] for d in returnarray] quarter = [e[2] for e in returnarray] num = returnarray[0][4] for x in range(0, int(num / 10)): list1 = valuearray[x] names = namearray[x] quarters = quarter[x][0] for idx, val in enumerate(list1): list1[idx] = float(val) pie = Pie(label1[0] + "-" + "前十股东", width=width1 * 10 / 11, height=(height1 * 10 / 11)) pie.add(label1[0] + "-" + "前十股东", names, list1, radius=[30, 55], is_legend_show=False, is_label_show=True, label_formatter="{b}: {c}\n{d}%") timeline.add(pie, quarters) # namearray = [y for y in namearray[x]] timeline.render() page.render()
def FindLowStock(): shangHaiStockIds = utility.GetShangHaiStockIdStrArray() np.random.shuffle(shangHaiStockIds) mongoClient = MongoClient('127.0.0.1:27017') ShangHaiStockDB = mongoClient["ShangHaiStock"] dailyDataCollection = ShangHaiStockDB["DailyData"] # pdTopList = ts.top_list('2016-06-12') # print(pdTopList[ pdTopList["code"] == shangHaiStockIds[100] ].cout) for id in shangHaiStockIds: dupDate = [] dateArrOrg = [] valueCloseArrOrg = [] valueLowArrOrg = [] valueOpenArrOrg = [] valueHighArrOrg = [] valueExceptionDate = [] valueMeanLowArrOrg= [] volumeArrOrg = [] preClosePrice = None preOpenPrice = None cursor = dailyDataCollection.find({"StockId":id, "Date_":{"$gte":checkStartDate, "$lte":checkEndDate}}).sort([("Date_", pymongo.ASCENDING)]) for curItem in cursor: try: date = curItem["Date_"] if date in dupDate: continue dupDate.append(date) adjClose = float(curItem["Adj Close"]) openPrice = float(curItem["Open"]) low = float(curItem["Low"]) high = float(curItem["High"]) volumenVal = float(curItem["Volume"]) except: continue dateArrOrg.append(date) valueCloseArrOrg.append(adjClose) valueOpenArrOrg.append(openPrice) valueHighArrOrg.append(high) volumeArrOrg.append(volumenVal) valueLowArrOrg.append(low) if len(valueCloseArrOrg) < 200: continue dateArrOrg = np.array(dateArrOrg) valueCloseArrOrg = np.array(valueCloseArrOrg) volumeArrOrg = np.array(volumeArrOrg) checkIndexes = np.where(dateArrOrg < checkRealEndDate)[0] meanVal = np.mean(valueCloseArrOrg[checkIndexes]) stdVal = np.std(valueCloseArrOrg[checkIndexes]) meanVolumeVal = np.mean(volumeArrOrg[checkIndexes]) stdVolumeVal = np.std(valueCloseArrOrg[checkIndexes]) recentVolumeMean = np.mean(volumeArrOrg[checkIndexes][-20:]) recentMeanVal1 = np.mean(valueCloseArrOrg[checkIndexes][-20:]) recentMeanVal2 = np.mean(valueCloseArrOrg[checkIndexes][-40:-20]) print(meanVal - 0.5*stdVal) if valueCloseArrOrg[checkIndexes][-1] < meanVal - stdVal and recentMeanVal1 < recentMeanVal2 and recentVolumeMean > meanVolumeVal + 1*stdVolumeVal: _, data2 = ts.top10_holders(code=id, year=2017, quarter=1, gdtype='1') # topBrokers = ts.broker_tops() # print(topBrokers) searchArr = ["中央汇金", "香港", "社保", "全国", "养老保险"] # ,"BERKSHIRE" strHolders = str(data2) print(strHolders) bHave = False for item in searchArr: if strHolders.find(item)>0: print(strHolders) bHave = True break if not bHave: print("no no no no no") print(id) fig, ax = plt.subplots() ax.plot(dateArrOrg, valueCloseArrOrg) ax.vlines([checkRealEndDate], np.min(valueCloseArrOrg), np.max(valueCloseArrOrg), color="red") plt.show()
def generateline(stocknumber, Type, startdate, enddate, interval): startdata = startdate.encode("ascii").replace("/", "-").replace( "\n", "") #convert to tushare readable date enddata = enddate.encode("ascii").replace("/", "-").replace("\n", "") #print startdata #print enddata current_time = time.strftime("%Y/%m/%d") if Type == "分笔".decode("utf-8"): if startdate != current_time: array = ts.get_tick_data(stocknumber, date=startdata) #分笔 if array is None: return array = array.sort_values("time") date = array["time"].tolist() amount = array["amount"].tolist() atype = array["type"].tolist() price = array["price"].tolist() flag = ["bar" for i in date] for idx, val in enumerate(atype): #if卖盘,交易变成负数 if val == "卖盘": amount[idx] = -amount[idx] if val == "中性盘": #if中性盘,则忽略. Might have a problem with this part?? amount[idx] = 0 returnarray = zip(date, amount, flag, price) return returnarray else: array = ts.get_today_ticks(stocknumber) #Tushare里今日分笔和历史分笔需要分别对待 if array is None: return array = array.sort_values("time") date = array["time"].tolist() amount = array["amount"].tolist() atype = array["type"].tolist() flag = ["bar" for i in date] for idx, val in enumerate(atype): if val == "卖盘".decode("utf-8"): amount[idx] = -amount[idx] if val == "中性盘".decode("utf-8"): amount[idx] = 0 returnarray = zip(date, amount, flag) return returnarray if Type == "季度饼图".decode("utf-8"): datestr = startdate.split("/") thisyear = datestr[0] df2 = ts.top10_holders(code=stocknumber, gdtype="1") test = df2[1]["quarter"].tolist() df_ready = df2[1] idxlist = [] for idx, val in enumerate(test): a = val.split("-") if a[0] == thisyear: # print a[0],idx idxlist.append(idx) thing = df_ready.loc[idxlist] thing = thing.sort_values(["quarter", "name"]) # print a[0],id name = thing["name"].tolist() value = thing["hold"].tolist() quarter = thing["quarter"].tolist() namearray = [name[i:i + 10] for i in xrange(0, len(name), 10)] valuearray = [value[j:j + 10] for j in xrange(0, len(value), 10)] quarterarray = [quarter[k:k + 10] for k in xrange(0, len(quarter), 10)] flag = ["pie" for i in namearray] num = [len(value) for k in namearray] returnarray = zip(namearray, valuearray, quarterarray, flag, num) return returnarray if interval != "qfq" and interval != "hfq": if interval == "1min" or interval == "5min" or interval == "15min" or interval == "30min" or interval == "60min": df = ts.get_tick_data(stocknumber, date=startdata) df.sort_values("time") a = startdata + " " + df["time"] df["time"] = a df["time"] = pd.to_datetime(a) df = df.set_index("time") price_df = df["price"].resample(interval).ohlc() price_df = price_df.dropna() vols = df["volume"].resample(interval).sum( ) #relevant data processing algorithm taken from Jimmy, Creator of Tushare vols = vols.dropna() vol_df = pd.DataFrame(vols, columns=["volume"]) amounts = df["amount"].resample(interval).sum() amounts = amounts.dropna() amount_df = pd.DataFrame(amounts, columns=["amount"]) newdf = price_df.merge(vol_df, left_index=True, right_index=True).merge(amount_df, left_index=True, right_index=True) if Type != "Kline": Type1 = firstletter(Type).encode("ascii") target = newdf[Type1].tolist() date = newdf.index.format() returnarray = zip(date, target) return returnarray else: Date = newdf.index.format() Open = newdf["open"].tolist() Close = newdf["close"].tolist() High = newdf["high"].tolist() Low = newdf["low"].tolist() Candlestick = zip(*[Date, Open, Close, Low, High]) return Candlestick #正常历史k线 if Type == "差价图".decode("utf-8"): global array300 if array300 is None: array300 = ts.get_k_data("sh", start=startdata, end=enddata, ktype=interval) array = ts.get_k_data(stocknumber, start=startdata, end=enddata, ktype=interval, autype='qfq') if array is None or array300 is None: return None target = [] benchmark_list = [] try: close_list = array["close"].tolist() date = array["date"].tolist() date300 = array300["date"].tolist() close300 = array300["close"].tolist() if len(close_list) is 0: return None data_price_300_map = dict() benchmark300 = 100 / (close300[0]) benchmark = 100 / (close_list[0]) for index, day in zip(range(0, len(date300)), date300): data_price_300_map[day] = close300[index] for index, close in zip(range(1, len(close_list)), close_list): price300 = data_price_300_map[date[index]] * benchmark300 target.append(round(close * benchmark - price300, 3)) benchmark_list.append(0) returnarray = zip(date, target, benchmark_list) return returnarray except Exception as e: print e return None elif Type == "价格指数".decode("utf-8"): global array300 if array300 is None: array300 = ts.get_k_data("sh", start=startdata, end=enddata, ktype=interval) array = ts.get_k_data(stocknumber, start=startdata, end=enddata, ktype=interval, autype='qfq') if array is None or array300 is None: return None price_list = [] price300_list = [] try: close_list = array["close"].tolist() date = array["date"].tolist() close300_list = array300["close"].tolist() if len(close_list) is 0: return None benchmark300 = 100 / (close300_list[0]) benchmark = 100 / (close_list[0]) for close in close_list: price_list.append(close * benchmark) for close300 in close300_list: price300_list.append(close300 * benchmark300) returnarray = zip(date, price_list, price300_list) return returnarray except Exception as e: print e return None elif Type != "Kline": array = ts.get_k_data(stocknumber, start=startdata, end=enddata, ktype=interval) if array is None: return Type1 = firstletter(Type).encode("ascii") target = array[Type1].tolist() date = array["date"].tolist() returnarray = zip(date, target) return returnarray else: array = ts.get_k_data(stocknumber, start=startdata, end=enddata, ktype=interval) if array is None: return Date = array["date"].tolist() Open = array["open"].tolist() Close = array["close"].tolist() High = array["high"].tolist() Low = array["low"].tolist() Candlestick = zip(*[Date, Open, Close, Low, High]) return Candlestick else: if Type != "Kline": # 复权 array = ts.get_h_data(stocknumber, start=startdata, end=enddata, autype=interval) if array is None: return Type1 = firstletter(Type).encode("ascii") array = array.sort_index() target = array[Type1].tolist() date = array.index.format() returnarray = zip(date, target) return returnarray else: array = ts.get_h_data(stocknumber, start=startdata, end=enddata, autype=interval) if array is None: return array = array.sort_index() Date = array.index.format() Open = array["open"].tolist() Close = array["close"].tolist() High = array["high"].tolist() Low = array["low"].tolist() Candlestick = zip(*[Date, Open, Close, Low, High]) return Candlestick
def graphpage(labels, mode_combo, startdate, enddate, optInterval, width1, height1): #optInterval='D/W/M' labels startdate = startdate.replace("/", "-") #convert to tushare readable date enddate = enddate.replace("/", "-") page = Page() for label in labels: # generate numbers of graphs according to numbers of queries in treewidget label1 = re.split("-", label) overlap = Overlap() if label1[2] != "分笔" and label1[2] != "季度饼图": #"K线" "复权" "历史分钟" if mode_combo == "复权": #if optInterval == "qfq" or optInterval == "hfq":#复权 array = ts.get_h_data(label1[1], start=startdate, end=enddate, autype="qfq") array = array.sort_index() time = array.index.format() # 日期正是index elif mode_combo == "K线": #elif optInterval.isalnum() :#历史K线 array = ts.get_k_data(label1[1], start=startdate, end=enddate, ktype=optInterval) time = array['date'].tolist() # array.date elif mode_combo == "历史分钟": array_bfr = ts.get_tick_data(label1[1], date=startdate) array_bfr.sort_values("time") a = startdate + " " + array_bfr["time"] array_bfr["time"] = a array_bfr["time"] = pd.to_datetime(a) array_bfr = array_bfr.set_index("time") if label1[2] != "Volume" and label1[2] != "Amount": price_df = array_bfr["price"].resample(optInterval).ohlc( ) # resample重新取样,选出ohlc=open/high/low,提取除价格之外另外4列.close,tushare是ohcl price_df = price_df.dropna() array = price_df time = price_df.index.format() elif label1[2] == "Volume": vols = array_bfr["volume"].resample(optInterval).sum( ) #resample重新取样,累加间隔内数值 relevant data processing algorithm taken from Jimmy, Creator of Tushare vols = vols.dropna() vol_df = pd.DataFrame(vols, columns=["volume"]) array = vol_df time = vol_df.index.format() else: amounts = array_bfr["amount"].resample(optInterval).sum() amounts = amounts.dropna() amount_df = pd.DataFrame(amounts, columns=["amount"]) array = amount_df time = amount_df.index.format() #绘图方法 if label1[2] == 'Kline': re_array = array[['open', 'close', 'high', 'low']] data_li = list(row.tolist() for index, row in re_array.iterrows() ) # data_list = list(re_array.as_matrix()) close = array['close'].tolist() kline = Kline(label1[0] + "-" + optInterval, width=width1 * 10 / 11, height=(height1 * 10 / 11) / len(labels)) kline.add(label1[0], time, data_li, is_datazoom_show=True, datazoom_type="slider", yaxis_interval=1) overlap.add(kline) if len(close) > 10: ma10 = calculateMa(close, 10) line1 = Line(title_color="#C0C0C0") line1.add(label1[0] + "-" + "MA10", time, ma10) overlap.add(line1) if len(close) > 20: ma20 = calculateMa(close, 20) line2 = Line(title_color="#C0C0C0") line2.add(label1[0] + "-" + "MA20", time, ma20) overlap.add(line2) if len(close) > 30: ma30 = calculateMa(close, 30) line3 = Line(title_color="#C0C0C0") line3.add(label1[0] + "-" + "MA30", time, ma30) overlap.add(line3) page.add(overlap) else: #When label1[2]==open/close/volume if label1[2] == 'Open': list_aft = array['open'].tolist() elif label1[2] == 'Close': list_aft = array['close'].tolist() elif label1[2] == 'High': list_aft = array['high'].tolist() elif label1[2] == 'Low': list_aft = array['low'].tolist() elif label1[2] == 'Volume': #volume list_aft = array['volume'].tolist() else: #amount list_aft = array['amount'].tolist() line = Line(label1[0] + "-" + label1[2], width=width1 * 10 / 11, height=(height1 * 10 / 11) / len(labels)) line.add(label1[0] + "-" + label1[2], time, list_aft, is_datazoom_show=True, yaxis_max="dataMax", yaxis_min="dataMin", datazoom_type="slider") overlap.add(line) page.add(overlap) elif label1[2] == "分笔": array = ts.get_tick_data(label1[1], date=startdate) array = array.sort_values("time") date = array["time"].tolist() amount = array["amount"].tolist() atype = array["type"].tolist() price = array["price"].tolist() flag = ["bar" for i in date] for idx, val in enumerate(atype): if val == "卖盘": amount[idx] = -amount[idx] if val == "中性盘": amount[idx] = 0 returnarray = list(zip(date, amount, flag, price)) form = [e[1] for e in returnarray] time = [d[0] for d in returnarray] bar = Bar(label1[0] + "-" + label1[2], width=width1 * 10 / 11, height=(height1 * 10 / 11) / len(labels)) bar.add(label1[0] + "-" + label1[2], time, form, is_datazoom_show=True, datazoom_type="slider", yaxis_min="dataMin", yaxis_max="dataMax") overlap.add(bar) line = Line(label1[0] + "price", width=width1 * 10 / 11, height=(height1 * 10 / 11) / len(labels)) price = [e[3] for e in returnarray] line.add(label1[0] + "price", time, price, yaxis_min="dataMin", yaxis_max="dataMax", is_datazoom_show=True, datazoom_type="slider", yaxis_type="value") overlap.add(line, yaxis_index=1, is_add_yaxis=True) page.add(overlap) elif label1[2] == "季度饼图": datestr = startdate.split("-") thisyear = datestr[0] df2 = ts.top10_holders(code=label1[1], gdtype="1") test = df2[1]["quarter"].tolist() df_ready = df2[1] idxlist = [] for idx, val in enumerate(test): a = val.split("-") if a[0] == thisyear: # print a[0],idx idxlist.append(idx) thing = df_ready.loc[idxlist] thing = thing.sort_values(["quarter", "name"]) # print a[0],id name = thing["name"].tolist() value = thing["hold"].tolist() quarter = thing["quarter"].tolist() namearray = [name[i:i + 10] for i in range(0, len(name), 10)] valuearray = [value[j:j + 10] for j in range(0, len(value), 10)] quarterarray = [ quarter[k:k + 10] for k in range(0, len(quarter), 10) ] flag = ["pie" for i in namearray] num = [len(value) for k in namearray] returnarray = list( zip(namearray, valuearray, quarterarray, flag, num)) timeline = Timeline(is_auto_play=False, timeline_bottom=0 ) # zip(namearray,valuearray,quarter,flag,num) namearray = [c[0] for c in returnarray] valuearray = [d[1] for d in returnarray] quarter = [e[2] for e in returnarray] num = returnarray[0][4] for x in range(0, int(num / 10)): list1 = valuearray[x] names = namearray[x] quarters = quarter[x][0] for idx, val in enumerate(list1): list1[idx] = float(val) pie = Pie(label1[0] + "-" + "前十股东", width=width1 * 10 / 11, height=(height1 * 10 / 11)) pie.add(label1[0] + "-" + "前十股东", names, list1, radius=[30, 55], is_legend_show=False, is_label_show=True, label_formatter="{b}: {c}\n{d}%") timeline.add(pie, quarters) # namearray = [y for y in namearray[x]] timeline.render() page.render()
import tushare as ts import pandas as pd from IPython.display import HTML StockCode = '300036' #历年前十大股东持股情况 #df1为季度统计摘要,data1为前十大持股明细统计 df1, data1 = ts.top10_holders(code=StockCode, gdtype='1') #gdtype等于1时表示流通股,默认为0 df1 = df1.sort_values('quarter', ascending=True) qts = list(df1['quarter']) data = list(df1['props']) lgdstr = """ var axisData = """ + str(qts) + """; var data = """ + str(data) + """; var links = data.map(function (item, i) { return { source: i, target: i + 1 }; }); links.pop(); option = { title: { text: '【超图软件】前十大流通股东持股占比' }, tooltip: {
def generateline(stocknumber,Type,startdate,enddate,interval): startdata = startdate.encode("ascii").replace("/","-").replace("\n","") #convert to tushare readable date enddata = enddate.encode("ascii").replace("/","-").replace("\n","") #print startdata #print enddata current_time = time.strftime("%Y/%m/%d") if Type == "分笔".decode("utf-8"): if startdate!=current_time: array = ts.get_tick_data(stocknumber, date = startdata)#分笔 if array is None: return array = array.sort_values("time") date = array["time"].tolist() amount = array["amount"].tolist() atype = array["type"].tolist() price = array["price"].tolist() flag = ["bar" for i in date] for idx,val in enumerate(atype):#if卖盘,交易变成负数 if val == "卖盘": amount[idx] = -amount[idx] if val == "中性盘":#if中性盘,则忽略. Might have a problem with this part?? amount[idx] = 0 returnarray = zip(date,amount,flag,price) return returnarray else: array = ts.get_today_ticks(stocknumber)#Tushare里今日分笔和历史分笔需要分别对待 if array is None: return array = array.sort_values("time") date = array["time"].tolist() amount = array["amount"].tolist() atype = array["type"].tolist() flag = ["bar" for i in date] for idx, val in enumerate(atype): if val == "卖盘".decode("utf-8"): amount[idx] = -amount[idx] if val == "中性盘".decode("utf-8"): amount[idx] = 0 returnarray = zip(date, amount, flag) return returnarray if Type=="季度饼图".decode("utf-8"): datestr = startdate.split("/") thisyear = datestr[0] df2 = ts.top10_holders(code=stocknumber, gdtype="1") test = df2[1]["quarter"].tolist() df_ready = df2[1] idxlist = [] for idx, val in enumerate(test): a = val.split("-") if a[0] == thisyear: # print a[0],idx idxlist.append(idx) thing = df_ready.loc[idxlist] thing = thing.sort_values(["quarter", "name"]) # print a[0],id name = thing["name"].tolist() value = thing["hold"].tolist() quarter = thing["quarter"].tolist() namearray = [name[i:i + 10] for i in xrange(0, len(name), 10)] valuearray = [value[j:j + 10] for j in xrange(0, len(value), 10)] quarterarray = [quarter[k:k + 10] for k in xrange(0, len(quarter), 10)] flag = ["pie" for i in namearray] num = [len(value) for k in namearray] returnarray = zip(namearray,valuearray,quarterarray,flag,num) return returnarray if interval!="qfq" and interval!="hfq": if interval=="1min" or interval=="5min" or interval=="15min" or interval=="30min" or interval=="60min": df = ts.get_tick_data(stocknumber, date=startdata) df.sort_values("time") a = startdata + " " + df["time"] df["time"] = a df["time"] = pd.to_datetime(a) df = df.set_index("time") price_df = df["price"].resample(interval).ohlc() price_df = price_df.dropna() vols = df["volume"].resample(interval).sum() #relevant data processing algorithm taken from Jimmy, Creator of Tushare vols = vols.dropna() vol_df = pd.DataFrame(vols, columns=["volume"]) amounts = df["amount"].resample(interval).sum() amounts = amounts.dropna() amount_df = pd.DataFrame(amounts, columns=["amount"]) newdf = price_df.merge(vol_df, left_index=True, right_index=True).merge(amount_df, left_index=True, right_index=True) if Type != "Kline": Type1 = firstletter(Type).encode("ascii") target = newdf[Type1].tolist() date = newdf.index.format() returnarray = zip(date, target) return returnarray else: Date = newdf.index.format() Open = newdf["open"].tolist() Close = newdf["close"].tolist() High = newdf["high"].tolist() Low = newdf["low"].tolist() Candlestick = zip(*[Date, Open, Close, Low, High]) return Candlestick #正常历史k线 if Type!="Kline": array = ts.get_k_data(stocknumber, start=startdata, end=enddata, ktype=interval) if array is None: return Type1 = firstletter(Type).encode("ascii") target = array[Type1].tolist() date = array["date"].tolist() returnarray = zip(date,target) return returnarray else: array = ts.get_k_data(stocknumber, start=startdata, end=enddata, ktype=interval) if array is None: return Date = array["date"].tolist() Open = array["open"].tolist() Close = array["close"].tolist() High = array["high"].tolist() Low = array["low"].tolist() Candlestick = zip(*[Date,Open,Close,Low,High]) return Candlestick else: if Type!="Kline": # 复权 array = ts.get_h_data(stocknumber, start = startdata, end = enddata, autype= interval) if array is None: return Type1 = firstletter(Type).encode("ascii") array = array.sort_index() target = array[Type1].tolist() date = array.index.format() returnarray = zip(date, target) return returnarray else : array = ts.get_h_data(stocknumber, start=startdata, end=enddata, autype=interval) if array is None: return array = array.sort_index() Date = array.index.format() Open = array["open"].tolist() Close = array["close"].tolist() High = array["high"].tolist() Low = array["low"].tolist() Candlestick = zip(*[Date, Open, Close, Low, High]) return Candlestick