路过的大兄弟好,我是阿尔法电波脑。昨天我已经把要获取的股票代码,以及上市退市日期的数据整理到本地了。今天我将根据这份列表,批量获取股票数据,建立自己的本地股票数据库。那正式开始吧!
功能:根据股票列表批量获取A股所有股票数据
先整理下思路:1、遍历股票列表获取代码。2、判断上一次更新节点。3、使用tushare接口获取股票数据。
好,那么在执行第一步之前,我对之前用于更新股票list的代码进行封装,感兴趣的观众可以看看我写的自学量化投资之旅 - 建立股票数据库 (上)
接下来就第一步遍历股票列表,获取股票数据。
def update_stock_list():
'''
更新股票列表
'''
# 寻找ts_stock: 找后缀为_tss文件 -> 截取文件日期 -> 判断日期决定是否更新列表
# 获取文件所在文件夹
files = os.listdir(r'G:\PycharmProjects\DeltaTrader\data\finance')
for f in files:
file_date = re.search('(^\d{4}-\d{2}-\d{2})_tss', f) # 获取文件指定修改日期
# 判断捕获到时间
if file_date:
date_str = file_date.group(1)
date = datetime.datetime.strptime(date_str, '%Y-%m-%d') # 转换为时间类型
# 获取对应时间的星期数 和 一年中的第几周 已经当前对应的日期
weekday = date.weekday()
week_count = date.isocalendar()[1]
today = datetime.datetime.today()
print(weekday,week_count,today)
# 更新日期是否不是今天,则进行更新:不是同一周 or 不是同一星期且更新日期不是星期五
if ((weekday != today.weekday()) & (weekday != 4)) or (weekday != week_count):
# 获取股票列表并保存和修改更新日期
data = get_stock_list()
data.to_csv(r'G:\PycharmProjects\DeltaTrader\data\finance\{}'.format(f), index=False)
os.rename(r'G:\PycharmProjects\DeltaTrader\data\finance\{}'.format(f),
r'G:\PycharmProjects\DeltaTrader\data\finance\{}_tss.csv'.format(datetime.date.today()))
# 结束循环
break
# 找不到文件则直接获取股票列表
else:
data = get_stock_list(('l', 'D'))
data.to_csv(r'G:\PycharmProjects\DeltaTrader\data\finance\{}_tss.csv'.format(datetime.date.today()), index=False)
这里会有一个问题,由于每天都要更新股票数据,为了避免获取和处理大量不必要的数据,所以要定义一个函数获取数据的日期,和对原有数据的追加。
思路:1、获取股票列表。2、读取存放更新日期的txt文件,不存在就生成新的文件。3、如果配置文件不存在就初始化股票数据库,存在根据更新日期将股票数据库更新至最新日期。
Tips:用到python文件对象处理、pickle模块对数据进行序列化
def update_single_stock():
# 获取本地股票列表
update_stock_list()
stock_list = pd.read_csv(
r'G:\PycharmProjects\DeltaTrader\data\finance\{}_tss.csv'.format(datetime.date.today()),
index_col=0, usecols=['ts_code'])
try:
# 读取配置文件
with open(r'G:\PycharmProjects\DeltaTrader\data\data_tushare\更新日期.txt', 'rb') as file:
# 获取更新记录
data = file.read()
record = pickle.loads(data)
date = record['更新日期']
# 如果配置文件不存在初始化股票数据
except Exception as e:
print(e)
# 生成配置文件
file = open(r'G:\PycharmProjects\DeltaTrader\data\data_tushare\更新日期.txt', 'wb+')
date = {'更新日期': str(datetime.date.today())}
record = pickle.dumps(date)
file.write(record)
file.close()
for code in stock_list.index:
df = ts.pro_bar(ts_code=code, asset='E', start_date='20050101')
df.to_csv(r'G:\PycharmProjects\DeltaTrader\data\data_tushare\{}.csv'.format(code), index=False)
print('完成股票数据更新')
# 判断是否不是最新日期
end_date = datetime.datetime.strptime(date, '%Y-%m-%d')
if not(end_date.date() == datetime.datetime.today().date()):
# 更新至最新日期
start_date = end_date + datetime.timedelta(1)
start_date = str(start_date.date())
for code in stock_list.index:
df = ts.pro_bar(ts_code=code, asset='E', start_date=start_date)
df.to_csv(r'G:\PycharmProjects\DeltaTrader\data\data_tushare\{}.csv'.format(code), index=False, header=False)
# 记录更新日期
with open(r'G:\PycharmProjects\DeltaTrader\data\data_tushare\更新日期.txt', 'wb') as file:
date = {'更新日期': start_date}
record = pickle.dumps(date)
file.write(record)
print('完成股票数据更新')
终于完成了! 看下效果
没毛病,不过更新速度有点慢,看了下一分钟才调取六七十次,远远低于tushare每分钟500次的限制……,emmm将就用吧!有时间的话再做优化,现在的重心要放在策略的研究上。
那么股票数据库到这里就算结束了,接下来的篇章将开始策略方面的内容。