python 获取pv_从网上获取股票数据

最近两天股市涨了一些,有声音叫喊着牛市来了。想着是不是可以把股票信息下载到本地进行分析。

俗话说,数据越多脑子越混乱。这个事情就是做来玩的,不指望能分析出个子丑寅卯来,打发时间来的。

首先在网上找找看哪里可以获取到股票历史数据,以前也找过,弄了机器人交易日收盘以后会发送一下大盘的涨跌幅和交易量。不过这次是想把所有历史数据拿到本地进行分析,所以还是需要再找找。

没玩过 Python ,不打算通过抓取页面的内容的方式获取数据,所以主要是找找看有没有什么接口可以直接访问获取数据,网页大部分都是通过 js 向后台拉取数据的,所以接口应该是有的,多在几个网站的金融/股市频道找找基本都能找到。比如新浪,搜狐,网易都有。

之前机器人的当天大盘信息就是在新浪找的,可以从下面的 URL 获取上一个交易日的股票信息。

http://hq.sinajs.cn/?list=sh000001,sz399001,sz399006

后面 list 参数表明想要获取的股票代码列表,比如上面的就是获取 000001(上证指数),399001(深证指数),399006(创业板指数)上个交易日的信息。

接口返回的是一个 javascript 脚本,形式如下:

var hq_str_sh000001="上证指数,3103.9952,3090.5693,3152.8126,3152.8126,3103.9952,0,0,458793851,535489334735,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-07-03,15:02:13,00,";var hq_str_sz399001="深证成指,12295.620,12269.488,12433.265,12433.685,12232.704,0.000,0.000,51287202197,636052461681.943,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,2020-07-03,15:00:03,00";var hq_str_sz399006="创业板指,2426.302,2424.393,2462.563,2467.497,2407.998,0.000,0.000,12165718337,203856908779.570,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,2020-07-03,15:00:03,00";

想要获取具体数据需要对返回的数据进行分割提取。和在网页上看到的对应交易日的数据对比一下不能分析出各个字段对应的信息。

获取历史数据的找到如下的一个 jsonp 接口:

http://quotes.sina.cn/cn/api/jsonp.php/$cb/KC_MarketDataService.getKLineData?symbol=sz399707

这个接口可以返回历史 日K 数据,这里是可以已经去掉了不必要的参数。只留下关键的 symbol 参数,此参数表示要获取的股票代码。返回的结果形式如下:

$cb ([{"d": "2015-04-16","o": "12793.688","h": "13314.929","l": "12728.004","c": "13190.820","v": "2702795008","pv": null,"pa": null},{"d": "2015-04-17","o": "13334.660","h": "13577.760","l": "13121.672","c": "13294.885","v": "3578836736","pv": null,"pa": null},...])

回调函数传入的参数是一个对象数组,每个数字元素表示了一个交易日的数据。

{"d": "2002-10-09","o": "3.050","h": "3.150","l": "2.860","c": "2.870","v": "1304738321","pv": null,"pa": null}

不难看出 d 表示的是日期(date),o 表示开盘价(open),h 表示最高价(high),l 表示最低价(low),c 表示收盘价(close),v 表示的是成交量(volume,这里是详细的成交的股票数,一般页面上显示的成交量是以“手”为单位,所以用这个数值除以100取整就是页面上看到的成交量),pv 和 pa 暂时不知道含义,而且都是空值,也就不关心了。

数据分析上将接口返回的字符串只截取数组部分,然后进行JSON解析就能得到历史的日K数据。

注意:新浪的接口在获取股票信息的时候,股票代码如果是沪市股票需要在前面加上 “sh”,比如上证指数代码是 000001,在接口中需要使用“sh000001”进行查询,深证指数代码是 399001,在查询时使用的是 “sz399001” 。

后来在知乎看到一位网友说网易有地方可以下载历史数据,就去看了看。发现网易下载的 日K 信息要比上面新浪的数据详细多了。网易的接口地址如下:

http://quotes.money.163.com/service/chddata.html?code=0600050&start=20021009&end=20200704&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP

上面的URL中,code 参数表示的是股票代码(0600050,中国联通),start 表示的是起始日期(20021009,联通上市日期),end表示的是截止日期,fields 参数表示下载的数据中携带哪些信息(上面的是所有支持的参数,比如“TCLOSE”是收盘价,“HIGH”是最高价等)。如果在浏览器中打开上面的网页会下载到一个 “CSV” 格式的文件,包含信息如下图:

8eeafa78a5bc2897f465415027436e78.png

注:股票代码 600050 前面有一个 ' 符号,应该是为了防止打开文档时程序将这一列解析为数值。

如果是使用程序从这个接口获取,只需要对返回的文本数据进行简单解析就能得到所有历史数据。

注意:网易在接口中使用股票代码时也进行了增加了一点变化,注意看上面的 URL 中中国联通的代码是 0600050,前面多了个 0,经过测试,如果是沪市股票需要在前面加上一个 “0”,深市股票需要在代码前面加上一个 “1”。

网易获取股票实时信息的接口地址如下:

http://api.money.126.net/data/feed/0600050,1000776,money.api?callback=cb

返回的格式如下:

cb({  "0600050":{    "code": "0600050", "percent": 0.013972,     "high": 5.12, "askvol3": 3183900, "askvol2": 5670859, "askvol5": 2193500, "askvol4": 6285703, "price": 5.08, "open": 5.02, "bid5": 5.04, "bid4": 5.05,     "bid3": 5.06, "bid2": 5.07, "bid1": 5.08, "low": 5.02, "updown": 0.07, "type": "SH", "symbol": "600050", "status": 0, "ask4": 5.12, "bidvol3": 1955700, "bidvol2": 1795552, "bidvol1": 1245073, "update": "2020/07/03 15:59:58",     "bidvol5": 1787300, "bidvol4": 1892720, "yestclose": 5.01, "askvol1": 4989800, "ask5": 5.13, "volume": 216328028, "ask1": 5.09, "name": "\u4e2d\u56fd\u8054\u901a", "ask3": 5.11, "ask2": 5.1, "arrow": "\u2191", "time": "2020/07/03 15:59:57", "turnover": 1097386952    },  "1000776":{    "code": "1000776", "percent": 0.06701, "high": 16.73,     "askvol3": 88000, "askvol2": 966400, "askvol5": 363801, "askvol4": 36480, "price": 16.56, "open": 15.68, "bid5": 16.51, "bid4": 16.52, "bid3": 16.53, "bid2": 16.54, "bid1": 16.55, "low": 15.4, "updown": 1.04, "type": "SZ", "bidvol1": 137000, "status": 0,     "bidvol3": 53900, "bidvol2": 63300, "symbol": "000776", "update": "2020/07/03 15:59:53", "bidvol5": 93500,     "bidvol4": 34600, "volume": 226574546, "askvol1": 303370, "ask5": 16.6, "ask4": 16.59, "ask1": 16.56, "name": "\u5e7f\u53d1\u8bc1\u5238", "ask3": 16.58, "ask2": 16.57, "arrow": "\u2191", "time": "2020/07/03 15:59:54", "yestclose": 15.52, "turnover": 3630573517.74    } });

此接口是一个jsonp接口,可以一次查询多个股票,各股票代码之间使用半角逗号隔开。

通过上面的接口就可以拿到股票的历史信息和最新信息了。

如果需要拿到所有股票信息,还需要获得一个所有股票代码的列表。如果只关心几只股票的话就手工记录股票代码,后面可以一点点增加。如果是想要全面分析,那就需要市场上全部的股票代码了。

幸运的是在深市的证券交易所的官网上有页面提供了下载上市公司信息功能。

http://www.szse.cn/market/stock/list/index.html

在这个页面上可以下载所有上市公司信息,包含了股票代码等信息,文件格式为“xlsx”,这个不是我们想要的,不过总算是个后备手段。在网站上多番寻找,终于找到一个接口

http://www.szse.cn/api/report/ShowReport/data?SHOWTYPE=JSON&CATALOGID=1110&PAGENO=1

这个接口会返回JSON格式文本,结构稍稍复杂点,包含了一些供 Web 页面使用的额外信息,这里就不全部展示了,只展示下股票列表部分的结构。

95696504f7a1586a11e3850e5184d649.png

可以看到返回的内容中 “data” 部分是一个股票列表,包含了股票基本信息,有所属交易板块(主板,中小板,创业板),股票代码,详情链接,上市日期,总股本,流通股本,行业板块。其中我们关心的就是股票代码和名称了。

这个接口一次只返回20条股票记录,可以通过递增 URL 中的 PAGENO 参数获取更多的股票信息。

通过调整CATALOGID还可以获取 B 股和 A+B股 的股票,不过我们只关心 A 股,就不详细研究这个参数了。

深市股票搞定了,再去沪市交易所官网看看。不幸的是沪市交易所官网并没有提供深市这样的下载的功能。不过还是找到了如下 URL 可以获取股票列表

http://yunhq.sse.com.cn:32041/v1/sh1/list/exchange/equity?callback=cb&select=code%2Cname%2Copen%2Chigh%2Clow%2Clast%2Cprev_close%2Cchg_rate%2Cvolume%2Camount%2Ctradephase%2Cchange%2Camp_rate%2Ccpxxsubtype%2Ccpxxprodusta&order=&begin=25&end=50

上面的 URL 中的 select 参数决定了返回的信息中包含股票那些信息,上面的 URL 中 select 指定的返回信息有 股票代码,股票名称,开盘价,最高价等等。后面的 begin 参数和 end 参数指定了股票列表的起始记录位置和结束位置。

我们只关心股票代码和股票名称,那么可以使用下面这个更简短的 URL,

http://yunhq.sse.com.cn:32041/v1/sh1/list/exchange/equity?callback=cb&select=code%2Cname&begin=0&end=3000

通过 select 参数指定只返回 code(股票代码)和 name(股票名称),将 begin 设置为0,end 设置为 3000 就能返回当前沪市的所有股票(当前沪市 A 股只有不到1500只流通股)。

最后需要说明的是如果通过程序从网站获取到的文本出现乱码,很可能是编码的问题可以试试转为 UTF-8 编码(原始编码一般会在 http 的 Content-Type 头字段中携带的,如果不方便获取网站返回的编码格式,可以尝试指定原始编码方式为 GBK 或者 GB18030 进行转换)。

为什么新浪,网易这些网站都会通过在股票代码上增加额外的字符来区分是沪市股票代码还是深市股票代码呢?

原因是股票代码不唯一,例如沪市的 “000001” 代表上证指数,深市也有一个 “000001” 的代码,代表平安银行。还能说什么呢??‍♂️

好了,现在数据的获取途径基本都解决了。下一步就是准备“爬”数据了。e96e2182d08da7c7487055e246c8efaf.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值