如何用python获取沪深300历年成分股的行情数据

       我们这里所需要的沪深300历年的成分股行情数据不是当下成分股的历年行情数据,而是历年的沪深300成分股的行情数据,如果是前者,那很简单,直接获取一下当下的沪深300的成分股列表,然后分别获取其历史行情数据就行了;但是我们需要的是后者,即不同时期的沪深300的成分股是有变动的,本文的思路是:先依次获取历年每天的成分股列表,然后再根据当天的成分股获取当天的数据,并逐步导入到csv文件中储存,最后汇总。

       这里后者处理的一个难点是日期的处理,即如何让循环指针在日期上遍历,本文对这点的处理是利用python的datetime库中的date模块和timedelta模块,即先确定自己需要的数据的起始日期和终止日期,并分别构造成date对象,两者相减便可以得到一个timedelta对象,里面的days参数便是起始日期和终止日期的相隔的天数,然后再以相隔天数作为循坏次数,让指针作为timedelta对象的days参数构造新的timedelta对象,并让起始日期加上这个timedelta对象作为当次循环的日期,这样便可以达到日期遍历的目的。以下是具体的代码,因为本例是从聚宽平台获取数据,因此相关的sdk和接口是基于聚宽的:

#导入聚宽数据的sdk
import jqdatasdk as jd
jd.auth("account","password")

import pandas as pd
from datetime import date,timedelta

filename='D:\python\data\data.csv' #数据储存路径

#csv文件初始化
date_init=date(2013,1,1)
stocks=jd.get_index_stocks('000300.XSHG', date=date_init)
df_init=jd.get_price(stocks,start_date=date_init, end_date=date_init,fields=['close','avg'],frequency='daily',skip_paused=False).to_frame()
df_init.to_csv(filename)

#遍历历史日期,并逐步导入数据到csv文件
for i in range(2090):
    trade_date=date(2018,1,2)+timedelta(days=i)
    stocks=jd.get_index_stocks('000300.XSHG', date=trade_date)
    df=jd.get_price(stocks,start_date=trade_date, end_date=trade_date,fields=['close','avg'],frequency='daily',skip_paused=False).to_frame()
    df.to_csv(filename,mode='a',header=None)

       本例获取了2013年1月1日到2018年9月21日的近五年多的日频数据,直接利用了DataFrame对象的to_csv方法将数据导入csv文件,由于后面是逐步追加数据,因此在初始化csv文件后,循环中to_csv方法的mode参数设为‘a’,这表示追加数据,不会清空之间的数据,header参数为None,表示省略列名,因为已经进行了初始化。

猜你喜欢

转载自blog.csdn.net/S_o_l_o_n/article/details/82828485