路过的大兄弟好,我是菜菜的宅家汪,现在是宅家学习量化投资的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__':
# 获取文件所在文件夹
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()
# 更新日期是否不是今天,则进行更新:不是同一周 or 不是同一星期且更新日期不是星期五
if ((weekday != today.weekday()) & (weekday != 4)) or (weekday != today.isocalendar()[1]):
# 获取股票列表并保存和修改更新日期
data = get_stock_list()
data.to_csv(r'G:\PycharmProjects\DeltaTrader\data\finance\{}.csv'.format(f), index=False)
os.rename(r'G:\PycharmProjects\DeltaTrader\data\finance\{}.csv'.format(f),
f'{datetime.date.today()}_tss.csv')
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)
到这里我们就得到了更新股票数据所需的,股票代码和上市退市日期。
在下一个篇章我会继续介绍如何批量获取股票数据。 作者:阿尔法电波脑 https://www.bilibili.com/read/cv12455345/?from=readlist 出处:bilibili