[セットトップ]Pythonマルチスレッド上証50成分株取引データ取得


1.上証50成分株
上証50指数はサンプルの安定性と動的追跡を結合する原則に基づいて、半年ごとに成分株を調整し、調整時間は上証180指数と一致した.特殊な場合は、サンプルを一時的に調整することもできます.調整する割合は一般的に10%を超えない.サンプル調整設定バッファは、40位までの新しいサンプルが優先され、60位までの古いサンプルが優先されます.詳細はこちらをクリックしてください
2016-02-25リリース
     (600000)        (600010)        (600015)
     (600016)        (600018)        (600028)
     (600030)        (600036)        (600048)
     (600050)        (600104)        (600109)
     (600111)        (600150)        (600518)
     (600519)        (600585)        (600637)
     (600795)        (600837)        (600887)
     (600893)        (600958)        (600999)
     (601006)        (601088)        (601166)
     (601169)        (601186)        (601211)
     (601288)        (601318)        (601328)
     (601336)        (601390)        (601398)
     (601601)        (601628)        (601668)
     (601669)        (601688)        (601766)
     (601800)        (601818)        (601857)
     (601901)        (601985)        (601988)
     (601989)        (601998)   

以上のデータを処理する1つのSH 50に保存する.listファイルでは、ソースコードを参照してください.
600000.SS     
600010.SS     
600015.SS     
600016.SS     
600018.SS     
600028.SS     
600030.SS     
600036.SS     
600048.SS     
600050.SS     

2.ファイルの読み込み
def read_stocks(stock_file):
    print 'read_stocks...'
    ls_stock_name = []
    f = open(stock_file, 'r')
    for line in f.readlines():
        if line.strip():
            ls_stock_name.append(line.strip().split(' ')[0])
    f.close()

    return ls_stock_name

3.Yahooから株式データを取得する
Python Yahoo株価データ取得
def get_yahoo_data(stock):
    start = time.time()
    res = True
    _now = datetime.datetime.now()
    try:
        if stock[0] == '$':
            stock = '^' + stock[1:]
        print 'get %s ...' % stock
        f = open(data_path + '/' + stock + ".csv", 'w')
        params = urllib.urlencode(
            {'a': 1, 'b': 1, 'c': 2004, 'd': _now.day, 'e': _now.month, 'f': _now.year, 's': stock})
        url = "http://ichart.finance.yahoo.com/table.csv?%s" % params
        time.sleep(0.5)
        url_get = urllib2.urlopen(url)

        data = url_get.readline()
        while(len(data) > 0):
            # print data
            f.write(data)
            data = url_get.readline()

        f.close()
        print "Fetch [%s] done, cost : %s." % (stock,  (time.time() - start))

    except urllib2.HTTPError:
        res = False
        miss_stock.append(stock)
        print "Unable to fetch data for stock: {0} at {1}".format(stock, url)
    except urllib2.URLError:
        res = False
        miss_stock.append(stock)
        print "URL Error for stock: {0} at {1}".format(stock, url)
    except SocketError as e:
        res = False
        miss_stock.append(stock)
        print "Socket Error for stock: {0} at {1}".format(stock, url)
    except :
        res = False
        miss_stock.append(stock)
        print "Unknown Error for stock: {0} at {1}".format(stock, url)

    return res

4.マルチスレッドモジュール
def get_yahoo_datas(ls_stock_name):
    print 'get_yahoo_data...'
    if len(ls_stock_name) <= 0:
        return
    print data_path
    print ls_stock_name
    if not (os.access(data_path, os.F_OK)):
        os.makedirs(data_path)

# pool = mythreadpool.ThreadPool(8)
# for stock in ls_stock_name:
# pool.add_job(get_yahoo_data, stock)
# pool.wait()

    pool = threadpool.ThreadPool(10)
    reqs = threadpool.makeRequests(get_yahoo_data, ls_stock_name)
    [pool.putRequest(req) for req in reqs]
    pool.wait()

    print "All done. Got {0} stocks. Could not get {1}".format(len(ls_stock_name) - len(miss_stock), len(miss_stock))
    return

5.ソースコード
http://download.csdn.net/detail/xiyanlgu/9443331
6.参考文献
[1]上証50指数成分株リストhttp://www.sse.com.cn/market/sseindex/indexlist/s/i000016/const_list.shtml