# -*- 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