# -*- coding: utf-8 -*- """ Created on Sat Apr 7 03:15:00 2018 @author: Administrator """ import pandas as pd import numpy as np import tushare as ts import time import threading class sina_real_data: def __init__(self): print('sina_real_data 类') self.sina={} # 获取股票实时数据 def sina_(self,code): df=pd.DataFrame() N=len(code) max_num=891 M=int(N/max_num)+1 for i in range(M): t=time.time() N1=i*max_num N2=(i+1)*max_num-1 if i==M: dataT=ts.get_realtime_quotes(code[N1:]) else: dataT=ts.get_realtime_quotes(code[N1:N2+1]) if len(df)==0: df=dataT else: df=pd.concat([df,dataT],ignore_index=True) t=round(time.time()-t,3) #print('---i='+str(i)+';N1='+str(N1)+';N2='+str(N2)+';耗时:'+str(t)) return df def sina_hand(self,code): pass df=self.sina_(code) df['price']=df['price'].apply(float) df['volume']=df['volume'].apply(float) date=df['date'].values[-1]+' '+df['time'].values[-1] # 为了测试 t=time.localtime(time.time()) date=time.strftime("%Y-%m-%d %H:%M:%S",t) date=pd.to_datetime(date) price=list(np.round( df['price'].values,2)) volume=np.round( df['volume'].values,0) if 'volume_np' not in self.sina: self.sina['volume_np']=volume if t.tm_hour==9 and t.tm_min==30: pass else: volume=np.zeros(len(volume)) else: volumeL=volume volume=volume-self.sina['volume_np'] self.sina['volume_np']=volumeL volume=list(volume) price=price+[date] volume=volume+[date] if 'price' not in self.sina: self.sina['price']=[price] self.sina['volume']=[volume] else: self.sina['price'].append(price) self.sina['volume'].append(volume) if len(self.sina['price'])>200: self.sina['price']=self.sina['price'][-150:] self.sina['volume']=self.sina['volume'][-150:] self.sina_1_min() def sina_1_min(self): if len(self.sina['price'])<60: return price=self.sina['price'] dfA=pd.DataFrame(price) dfA.set_index(dfA.columns[-1], inplace=True) volume=self.sina['volume'] dfB=pd.DataFrame(volume) dfB.set_index(dfB.columns[-1], inplace=True) periodS = '1min' kdata={} kdata['open'] = dfA.resample(periodS).first() kdata['high'] = dfA.resample(periodS).max() kdata['low'] = dfA.resample(periodS).min() kdata['close'] = dfA.resample(periodS).last() kdata['volume'] = dfB.resample(periodS).sum() self.sina['kdata']=kdata # 定时器启动收集数据 def sina_run(self,code): while True: time.sleep(3) t=time.localtime(time.time()) ts=time.strftime("%Y-%m-%d %H:%M:%S",t) # print(ts+' 定时器运行') try: self.sina_hand(code) pass except: pass def sina_run_start(self,code): # 启动策略线程 tt = threading.Thread(target=self.sina_run, args=(code,)) tt.start() if __name__=='__main__': self=sina_real_data() stocklist=pd.read_hdf('Z:/data/stock_data_py/list/stocklist.h5') stocklist['codenum']=stocklist['code'].apply(lambda x:x[7:9].lower()+x[:6]) code=list(stocklist['codenum'].values) tickdata = self.sina_(code) self.sina_run_start(code) t=time.time() df=self.sina_(code) t=round(time.time()-t,3) print('耗时:'+str(t)) df['bid']=df['bid'].apply(float) df['ask']=df['ask'].apply(float) a=df[ ( df['bid']<0.001) & ( df['ask']<0.001) ] data=self.sina