项目练习_利用tushare下载股票行情【多线程】

本文介绍如何使用tushare金融数据接口进行股票行情数据的下载,涵盖多线程处理、数据清洗与存储至数据库的全过程。tushare提供丰富的金融数据资源,包括股票、基金、债券、期货等市场数据,适用于金融分析与研究。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目练习_利用tushare下载股票行情【多线程】

tushare简介

  • tushare是专业的金融数据开源接口,数据齐全(甚至包含宏观数据,石油数据,电影数据等等等),是金融分析的一大神奇,使用也非常方便,有些高级接口需要积分
  • 通过连接注册并填写基本信息,马上获的120积分,已经满足基本使用需求
  • https://tushare.pro/register?reg=243479

代码

# -*- coding:utf-8 -*- 
# tushare下载股票行情



import pandas as pd 
import numpy as np 
import sqlalchemy
from sqlalchemy import create_engine
import threading
import tushare as ts 
import itertools
import threadpool
import datetime




today=datetime.date.today().strftime('%Y%m%d')

class downmarket:
    def __new__(cls,save='csv',tdc=1,start_date=today,end_date=today,codes=None,adj='qfq',method='append'):
        new=super(cls,cls).__new__(cls)
        cls.__init__(new,adj,method)
        return new.action(save,tdc,start_date,end_date,codes)


    def __init__(self,adj,method):
        ts.set_token('1223456')
        self.ts=ts
        self.pro=ts.pro_api()

        self.adj=adj
        self.method=method
        self.ct=itertools.count(1)
        self.errorcode=[]

        self.mk_engine=self.get_engine('stock_market')
        self.da_engine=self.get_engine('stock_data')


    def get_engine(self,db):
        engine=create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/%s?charset=utf8mb4"%db)
        return engine


    def get_basic(self):
        '''
        股票基本信息
        '''
        try:
            basic=pd.read_sql('select * from basic',con=self.da_engine)
        except sqlalchemy.exc.ProgrammingError as e:
            print(e)
            basic=self.pro.stock_basic(list_status='L')
            basic.to_sql('basic',con=self.da_engine,if_exists='replace',index=False)
        return basic


    def get_market(self,ts_code,start_date,end_date):
        '''
        下载数据及格式调整
        '''
        market=self.ts.pro_bar(ts_code=ts_code,pro_api=self.pro,start_date=start_date,end_date=end_date,adj=self.adj)
        market.trade_date=market.trade_date.astype(np.str).astype(np.datetime64)
        market=market.set_index('trade_date')
        market.drop(columns='change',inplace=True)
        market.pct_chg=(market.close/market.pre_close-1)*100
        market.pct_chg=np.around(market.pct_chg,2)
        market.vol=np.around(market.vol,2)
        market.amount=np.around(market.amount,2)
        return market

 
    def save_sql(self,ts_code,start_date,end_date):
        '''
        数据库存储
        '''
        tbname='%s_%s'%(self.adj,ts_code.lower())
        market=self.get_market(ts_code,start_date,end_date)
        try:
            exists_date=pd.read_sql('select trade_date from `%s`'%tbname,con=self.mk_engine).ix[:,0].tolist()
        except sqlalchemy.exc.ProgrammingError as e:
            print(e)
            exists_date=None        
        if exists_date:
            for ind in market.index:
                if ind in exists_date:
                    market.drop(index=ind,inplace=True)
        market=market.reset_index()
        market.to_sql(tbname,con=self.mk_engine,if_exists=self.method,index=False)
        print('num(%s) code(%s) updat_row(%s) is ok...'%(next(self.ct),ts_code,market.shape[0]))


    def save_csv(self,ts_code,start_date,end_date):
        fname='%s_%s.csv'%(self.adj,ts_code)
        market=self.get_market(ts_code,start_date,end_date)
        market.to_csv(fname)
        print('num(%s) code(%s) is ok...'%(next(self.ct),ts_code))
            

    def action(self,save,tdc,start_date,end_date,codes):
        '''
        多线程执行
        '''
        if not codes:
            codes=self.get_basic().ts_code.tolist()
        if save=='sql':
            callable_=self.save_sql
        elif save=='csv':
            callable_=self.save_csv


        tuple_list=[((code,start_date,end_date),None) for code in codes]
        pool=threadpool.ThreadPool(tdc)
        tasks=threadpool.makeRequests(callable_=callable_,args_list=tuple_list)
        for task in tasks:
            pool.putRequest(task)
        pool.wait()

        if len(self.errorcode)==0:
            print('全部成功...')
        else:
            print('部分失败:%s'%self.errorcode)

        return self.errorcode



if __name__=='__main__':
    downmarket(tdc=2,codes=['000001.SZ','000002.SZ'])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值