python 股票数据_用Python如何获取所有股票的历史数据并保存到Excel文件?

不请自来,哥来帮你,希望有用。

直接上实测结果图。。

以下是代码,供参考。

# -*- coding: utf-8 -*-

"""Created on Sat Feb 10 18:44:25 2018@author: Sheng"""

#导入两个模块

import tushare as ts

import pandas as pd

# 首先通过ts.get_stock_basics()命令获得股票代码的一些基本数据 ,然后通过to_excel()命令保存。

# 以下是本人保存的路径

source_date=r'D:\\Users\\Sheng\\Desktop\\Financetranscript\\stocklist.xlsx'

# 我们需要提取股票代码,用于后面的for循环,首先读取之前下载好的文件,将第一列的股票代码进行字符串转化。

df=pd.read_excel(source_date,converters={'code':lambda x:str(x)})

# 将提取出来的股票代码列表化赋值与 stockcode 这个变量。

stockcode=list(map(str,df['code']))

# 开始进行循环下载。。

for i in stockcode:

print('开始下载{}股票数据.....'.format(i))

#设定每个文件的文件名和存储地址。

file_address=r'D:\\Users\\Sheng\\Desktop\\Financetranscript\\bigdata\\{}.xlsx'.format(i)

#提取单个股票的历史数据。

stock_data=ts.get_hist_data(i)

#导出到之前设定的好的文件地址。

stock_data.to_excel(file_address)

#由于导出的每个股票的历史数据中并没有包含股票代码,所以我把股票代码加入到Excel中,

#在日期的后一列加入股票代码,方便以后所有数据整合后可以进行股票筛选。

#如果不需要,可以删除下面三行代码。

dw_data=pd.read_excel(file_address)

dw_data.insert(loc=1,column='code',value=i)

dw_data.to_excel(file_address)

# 打印出下载进程,方便观察。。。

print('{}/{} has been downloaded,{}股票数据下载完毕'

.format(stockcode.index(i)+1,len(stockcode),i))

print('-----------------------------------------------------')

一共3500个股票,慢慢下吧。。。睡了!晚安

-------------------------------------------------------------------------------------------------------{分割线}

更新下代码,运用了多线程,下载速度提高N倍,原来1个多小时的活现在只要5分钟。简单粗暴, 以下是代码。文件保存地址换一下就可以用了。

import pandas as pd

import tushare as ts

import os

from datetime import datetime

from datetime import timedelta

from multiprocessing.dummy import Pool as ThreadPool

import time

class stock_data:

def __init__(self):

self.file_path_basic = r'D:\PycharmProjects\Trade\Final_Project_A_Stock\Stock_data\basics.h5'

self.file_dir_daily = r'D:\PycharmProjects\Trade\Final_Project_A_Stock\Stock_data\Daily'

self.current_date_key_path = datetime.today().strftime('%d_%m_%Y')

self.latest_basic_key_path = '/Basics_Data/Stock_Basics_{}'.format(self.current_date_key_path)

self.whole_files_list_daily = os.listdir(self.file_dir_daily)

self.start_date = '2014-01-01' # 选择开始时间

def update_stock_basic(self): # 更新股票基本面数据

hdf = pd.HDFStore(self.file_path_basic)

if self.latest_basic_key_path in hdf.keys():

print("基本面数据已经更新到最新至{}".format(self.current_date_key_path))

else:

print("开始更新股票基本面至{}".format(self.current_date_key_path))

df = ts.get_stock_basics()

hdf.put(self.latest_basic_key_path, df, format='t', data_columns=True, append=False)

print("股票基本面更新完毕最新至{}".format(self.current_date_key_path))

latest_stock_basics = hdf.get(hdf.keys()[-1])

hdf.close()

return latest_stock_basics

def update_daily_data(self, code):

try:

df = ts.get_k_data(code, self.start_date, ktype='d', autype='qfq')

df.set_index('date', inplace=True)

df.to_csv(self.file_dir_daily + '\\' + '{}.csv'.format(code), mode='wt')

process = round((stock_code.index(code)/len(stock_code))*100, 2)

print('{}%'.format(process))

except:

print('没有数据')

st = stock_data()

stock_basics = st.update_stock_basic()

stock_basics = stock_basics[~stock_basics['name'].str.contains('ST')] # 把ST股票去掉

stock_code = list(map(str, stock_basics.index))

def daily_update():

start1 = time.time()

pool = ThreadPool(400)

try:

pool.map(st.update_daily_data, stock_code)

except:

pool.map(st.update_daily_data, stock_code)

pool.close()

pool.join()

end1 = time.time()

diff2 = end1 - start1

print(diff2) #计算花费时间

if __name__ == '__main__':

daily_update()

你可能感兴趣的:(python,股票数据)