自学量化投资之旅 - 建立股票数据库 (下)

路过的大兄弟好,我是阿尔法电波脑。昨天我已经把要获取的股票代码,以及上市退市日期的数据整理到本地了。今天我将根据这份列表,批量获取股票数据,建立自己的本地股票数据库。那正式开始吧!

功能:根据股票列表批量获取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将就用吧!有时间的话再做优化,现在的重心要放在策略的研究上。

那么股票数据库到这里就算结束了,接下来的篇章将开始策略方面的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值