用Python抓取大智慧除权数据
继续做的数据分析,由于新浪获取的是未复权数据,所以在分析的时候出了些小问题,结果变得扑所迷离。于是又用了几天Tushare的获取复权数据功能,本来是写了个循环,每天自动获取,可是几乎每次下载都卡死了,这真是坑爹的网络。翻了翻Tushare的这段代码,Tushare的这个数据倒也是新浪的,但是是从网页上扒下来的,过程好像获取了两个地址的数据,貌似一个复权因子一个后复权数据,没细看了。反正我也不认为这是合理的获取方式,理想的当然是JSON或者XML之类的格式最好了。百度了一圈,没有发现哪里有免费的前复权数据,更找不到除权数据,心想找到除权数据也好啊,自己来复权。这过程中,得到了几个新浪地址,好像和复权有关,但是也没琢磨出怎么用。在这里先把地址贴下来,有时间再研究。
http://vip.stock.finance.sina.com.cn/api/json.php/BasicStockSrv.getStockFuQuanData?symbol=sz000001&type=hfq
和惯例一样,symbol指得是股票代码,而type按拼音来说应该是后复权,但我输入qfq之后得到并非前复权。
http://biz.finance.sina.com.cn/stock/flash_hq/kline_data.php?symbol=sz000001&begin_date=20100101&end_date=20161206
同上,只是有开始和结束时间。
新浪没办法了,看到很多网友都是从大智慧获取,毕竟资料还多,于是下载安装了个大智慧365。装好后在安装目录下有个Download文件夹,而除权数据就在PWR文件夹里,FIN文件夹里放的是财务数据,而ABK里则是大智慧的板块数据。
这里之所以写个日志是因为,365里的数据结构并非网络上写的四字节方式,四字节转赠股,四字节红利,四字节的配股,四字节配股价。我所看到的是120字节分段的形式,任一只股票先120字节的4-12字节为代码,接来下的120字节里前四个字节为除权日期,接着4-20字节为空,剩下的就是除权数据了,而这个数据并非分段的数值形式,而是一句话,比如10股送5股之类的,就是说得到这句话后还要进行分割。一只票除权了多少次就有多少个这样的120字节了,整理之后把代码贴上:
path = '/home/jeff/Share/DZH/Download/PWR/'
name = ['full_sh.PWR','full_sz.PWR']
data = []
for i in name:
exFile = open(path+i,'rb')
exFile.seek(8)
while True:
exContent = exFile.read(120)
if not exContent:
break
if exContent[:4] == b'\xff\xff\xff\xff':
code = exContent[4:12].decode('gbk')
elif len(exContent) > 0:
date= struct.unpack("I", exContent[:4])[0]
date= time.localtime(date)
exlist = exContent[20:].decode('gbk').split('\x00')[0][2:].split()
present = 0
bonus = 0
rationed = 0
price = 0
for i in exlist:
if '送' in i:
present += float(re.findall(r"\d+\.?\d*",i)[0])
if '增' in i:
present += float(re.findall(r"\d+\.?\d*",i)[0])
if '派' in i:
bonus += float(re.findall(r"\d+\.?\d*",i)[0])
if '价' in i:
price += float(re.findall(r"\d+\.?\d*",i)[0])
if '配' in i:
rationed += float(re.findall(r"\d+\.?\d*",i)[0]) - price
data.append({'code':code[2:],'date':date,'present':present,'bonus':bonus,'price':price,'rationed':rationed})
return data
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。