疯人院里的快乐时光

疯,不为常规所度测……

用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

点赞