路过的大兄弟好,我是阿尔法电波脑,现在是宅家学习量化投资的73天。
最近这一个月有点松懈了哈,这个月开始想改变一下之前闭门造车式的学习,用通俗易懂的话在B站、CSDN上分享自己的所学所思所想,并用采用边做边记录的形式。那么话不多说直接进入正题。
实现功能:用tushare(一个免费开源的股票数据接口),在本地建立股票数据库。
一、问题:避免重复调取数据
首先股票数据调取过程为:1、通过接口获取数据。2、保存股票数据。
所以我的思路是创建或更新文件时,记录下文件位置和修改时间,以供下次更新数据时做为判断条件,下面来一步一步实现。
获取股票列表
首先先定义获取股票列表的函数
def get_stock_list(list_status:tuple=('L')):'''获取股票列表:param list_status: 上市状态:默认'L'上市、D退市、P暂停上市:return: 返回股票列表'''pro = ts.pro_api('xxx')# 列表容器list = []for s in list_status:data = pro.stock_basic(exchange='', list_status=s, fields='ts_code,name,area,industry,list_date')list.append(data)return pd.concat(list)
然后获取股票列表的更新日期进行判断决定是否更新,如果没找到文件则初始化股票列表。这里我是将修改日期直接命名在了文件名上
Tips:运用datatime模块、r模块、os模块
if __name__ == '__main__':# 寻找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, today.weekday())# 更新日期是否不是今天,则进行更新:不是同一周 or 不是同一星期且更新日期不是星期五if ((weekday != today.weekday()) & (weekday != 4)) or (week_count != datetime.datetime.now().isocalendar()[1]):# 获取股票列表并保存和修改更新日期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()))else:print('股票list已是最新')# 结束循环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)
到这里我们就得到了更新股票数据所需的,股票代码。
在下一个篇章我会继续介绍如何批量获取股票数据。