您的位置:首页 > 编程语言 > Python开发

[Python]通过网易财经接口获取股票和指数的历史数据

2015-09-14 20:17 781 查看
因为最近需要用到股市的各种指数数据,刚开始想的是从同花顺等交易软件直接导出,结果发现要用滚轮滚到最开始的日期,这过于繁琐了,我对于这种重复性的劳动一向不耐烦,而且这种方法在以后每日更新的时候也很不方便。所以我把视线转向了网上的各种api。网上比较普遍的主要有两种,一种是新浪的api,一种是雅虎的api。新浪的api很方便,速度也很快,不过就网上的资料而言,似乎只能提取当天的数据。雅虎的api功能更齐全,但是连接速度比较慢,有时候一个连接请求都要10多秒甚至20秒(原谅我的渣网速-,-)这对于需要大量股票数据的我来说显然不可接受。后来发现从网易财经可以下载股票和指数的历史数据。通过在chrome的调试工具中观察请求信息,发现网址为

http://quotes.money.163.com/service/chddata.html?code=0000001&start=19901219&end=20150911&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER;VATURNOVER

这里0000001指的是上证指数。注意这串数字要分0和000001两部分看。0代表sh,1代表sz。所以0000001其实是sh000001的意思。同理,0 000300也就是sh000300 沪深300的代码。后面的start和end没什么问题。fields选项中,TCLOSE,HIGH,LOW,TOPEN分别表示当日的收盘,最高,最低,开盘价;LCLOSE表示昨日收盘价。CHG,PCHG,VOTURNOVER,VAT分别表示涨跌额,涨跌幅,成交量,成交金额。如果你在浏览器中直接输入网址的话,会下载一个csv文件。如果直接用urllib.request来打开的话,会得到一长串字符串,里面包含了所有的数据,如下所示。需要自己用str.split(‘\r\n’)来截取

日期,股票代码,名称,收盘价,最高价,最低价,开盘价,前收盘,涨跌额,涨跌幅,成交量,成交金额

2015-09-11,’000001,上证指数,3200.234,3223.762,3163.449,3189.479,3197.893,2.341,0.0732,224557822,2.52769467178e+11

2015-09-10,’000001,上证指数,3197.893,3243.281,3178.904,3190.553,3243.089,-45.196,-1.3936,273261759,2.99581090523e+11

2015-09-09,’000001,上证指数,3243.089,3256.743,3165.696,3182.552,3170.452,72.637,2.2911,375327978,4.12991428267e+11

2015-09-08,’000001,上证指数,3170.452,3174.709,3011.117,3054.444,3080.42,90.032,2.9227,255415465,2.63910382052e+11

2015-09-07,’000001,上证指数,3080.42,3217.579,3066.304,3149.38,3160.167,-79.747,-2.5235,296468114,3.02689722336e+11

有几点需要指出,这里的指数代码前会加个 ’ 比如上面是’000001要把那个 ’ 去掉。还有,有些时候涨跌额和涨跌幅的值是None,简直莫名其妙,只能根据当日收盘价和前一天的收盘价自己补全;还有成交金额有几天的值也是None,这个似乎没法自己补,处理的时候需要特别注意

下面是代码。

import urllib,time,

def get_page(url):  #获取页面数据
req=urllib.request.Request(url,headers={
'Connection': 'Keep-Alive',
'Accept': 'text/html, application/xhtml+xml, */*',
'Accept-Language':'zh-CN,zh;q=0.8',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'
})
opener=urllib.request.urlopen(req)
page=opener.read()
return page

def get_index_history_byNetease(index_temp):
"""
:param index_temp: for example, 'sh000001' 上证指数
:return:
"""
index_type=index_temp[0:2]
index_id=index_temp[2:]
if index_type=='sh':
index_id='0'+index_id
if index_type=="sz":
index_id='1'+index_id
url='http://quotes.money.163.com/service/chddata.html?code=%s&start=19900101&end=%s&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER;VATURNOVER'%(index_id,time.strftime("%Y%m%d"))

page=get_page(url).decode('gb2312') #该段获取原始数据
page=page.split('\r\n')
col_info=page[0].split(',')   #各列的含义
index_data=page[1:]     #真正的数据

#为了与现有的数据库对应,这里我还修改了列名,大家不改也没关系
col_info[col_info.index('日期')]='交易日期'   #该段更改列名称
col_info[col_info.index('股票代码')]='指数代码'
col_info[col_info.index('名称')]='指数名称'
col_info[col_info.index('成交金额')]='成交额'

index_data=[x.replace("'",'') for x in index_data]  #去掉指数编号前的“'”
index_data=[x.split(',') for x in index_data]

index_data=index_data[0:index_data.__len__()-1]   #最后一行为空,需要去掉
pos1=col_info.index('涨跌幅')
pos2=col_info.index('涨跌额')
posclose=col_info.index('收盘价')
index_data[index_data.__len__()-1][pos1]=0      #最下面行涨跌额和涨跌幅为None改为0
index_data[index_data.__len__()-1][pos2]=0
for i in range(0,index_data.__len__()-1):       #这两列中有些值莫名其妙为None 现在补全
if index_data[i][pos2]=='None':
index_data[i][pos2]=float(index_data[i][posclose])-float(index_data[i+1][posclose])
if index_data[i][pos1]=='None':
index_data[i][pos1]=(float(index_data[i][posclose])-float(index_data[i+1][posclose]))/float(index_data[i+1][posclose])

# print(col_info)
return [index_data,col_info]


运行get_index_history_byNetease(‘sh000001’) 就能够得到上证指数所有的历史数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: