不请自来,哥来帮你,希望有用。
直接上实测结果图。。
以下是代码,供参考。
# -*- 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()