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

 

分类:

技术点:

相关文章: