• python分别使用多线程和多进程获取所有股票实时数据


     

    python分别使用多线程和多进程获取所有股票实时数据

     

    前一天简单介绍了python怎样获取历史数据和实时分笔数据,那么如果要获取所有上市公司的实时分笔数据,应该怎么做呢? 
    肯定有人想的是,用一个列表存储所有上市公司的股票代号,然后无限循环获取不就得了吗? 
    现在深市和沪市的股票一共有3400多只,如果你真这样做的话,获取一次所有股票的实时数据需要十几二十秒的时间,甚至更多,而且非常容易因为等待超时而使程序挂掉,如果你的模型对实时数据的质量要求非常高,这肯定是不行的,即使不考虑数据质量,获取数据的脚本经常挂也是不行的。 
    那首先想到的是多线程和多进程。然而因为python全局解释锁的存在,在多线程情况下,即使是在多核cpu的情况下,也只能同时执行一个线程,即使如此,多线程获取一次所有股票实时数据所花的时间,依然比在一个大循环里面运用单线程少得多,这是因为python从网络获取数据存储到本地,是IO密集型任务,python多线程依然能很大程度上提高性能,具体细节在这里不多做介绍。 
    为了充分利用带宽资源,IO资源,在这里使用多线程和多进程两种方式获取股票数据, 
    首先我们需要有一个比较全的所有股票代号文件,我已经替大家准备好了,关注微信公众号【数据之佳】回复“股票”四个字即可得到下载链接,压缩包提供多线程和多进程获取股票实时数据两个案例,其中的stocks文件内存储的是股票代号文件,提供的是截止今日(2017-11-23)的所有上市公司代号。

    这里写图片描述 
    在这里提供多线程的例子,多进程的例子请在【数据之佳】里面查看,同时代码也给大家准备好了,上面回复的“股票”得到的下载链接里面直接就有python源文件,下载以后修改一下路径直接就可以跑了,其中用到的python版本是昨天分享的文章中anaconda自带的python3.5,代码依然使用jupyter编写,操作系统为win10,在linux上只需要稍加改动就可以了执行了。

    import pandas as pd
    import numpy as np
    import tushare as ts
    import os
    import time
    from threading import Thread
    def get_data(stock):
        date=time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time()))
        data=ts.get_realtime_quotes(stock)
        print(data)
        path='F:\stocks'
        data.to_csv(path+'\'+date+'_'+stock,mode='wt')
    time1=time.strftime('%Y-%m-%d-%H-%M-%S')
    print(time1)
    with open('F:stocksstock_codesstocks') as f:
                    try:
                            while True:
                                    line=next(f).strip()
                                    t=Thread(target=get_data,args=(line,))
                                    t.start()
                    except StopIteration:
                        pass
    time2=time.strftime('%Y-%m-%d-%H-%M-%S')
    print(time2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    其中time1是获取一次所有股票的开始时间,time2是结束时间,具体有耗时多上时间,请读者下载元代以后自行测试

    2017-11-23-21-16-23 
    2017-11-23-21-16-33

    这是我注释了prinf(data)一行以后所花的时间,恰好用了10秒,如果你的网络好一些,可能会更快,当然这不是最快的方法,最快的方法可以实现一秒以内获取一次。 
    这里写图片描述 
    数据已经存储在指定目录下,使用多进程的例子请各位自行获取下载链接下载。 
    下面是【数据之佳】的二维码,我会在公众号分享一些量化建模的案例,结果等。 

  • 相关阅读:
    164 Maximum Gap 最大间距
    162 Find Peak Element 寻找峰值
    160 Intersection of Two Linked Lists 相交链表
    155 Min Stack 最小栈
    154 Find Minimum in Rotated Sorted Array II
    153 Find Minimum in Rotated Sorted Array 旋转数组的最小值
    152 Maximum Product Subarray 乘积最大子序列
    151 Reverse Words in a String 翻转字符串里的单词
    bzoj3994: [SDOI2015]约数个数和
    bzoj 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/timssd/p/8231479.html
Copyright © 2020-2023  润新知