实时获取新浪 / 腾讯 的免费股票行情 / 集思路的分级基金行情

shidenggui, updated 🕥 2022-12-08 17:16:34

easyquotation

Package Travis License

快速获取新浪/腾讯的全市场行情, 网络正常的情况下只需要 200+ms

前言

  • 获取新浪的免费实时行情
  • 获取腾讯财经的免费实时行情
  • 获取集思路的分级基金数据

微信群以及公众号

欢迎大家扫码关注公众号「食灯鬼」,一起交流。进群可通过菜单加我好友,备注量化。

公众号二维码

若二维码因 Github 网络无法打开,请点击公众号二维码直接打开图片。

Author

easyquotation © shidenggui, Released under the MIT License.

Blog @shidenggui · Weibo @食灯鬼 · Twitter @shidenggui

其他作品

requirements

Python 3.6+

pip install -r requirements.txt

安装

python pip install easyquotation

也可以下载源码,然后安装

python python setup.py install

升级

python pip install easyquotation --upgrade

用法

引入:

python import easyquotation

选择行情

python quotation = easyquotation.use('sina') # 新浪 ['sina'] 腾讯 ['tencent', 'qq']

获取所有股票行情

python quotation.market_snapshot(prefix=True) # prefix 参数指定返回的行情字典中的股票代码 key 是否带 sz/sh 前缀

return

python {'sh000159': {'name': '国际实业', # 股票名 'buy': 8.87, # 竞买价 'sell': 8.88, # 竞卖价 'now': 8.88, # 现价 'open': 8.99, # 开盘价 'close': 8.96, # 昨日收盘价 'high': 9.15, # 今日最高价 'low': 8.83, # 今日最低价 'turnover': 22545048, # 交易股数 'volume': 202704887.74, # 交易金额 'ask1': 8.88, # 卖一价 'ask1_volume': 111900, # 卖一量 'ask2': 8.89, 'ask2_volume': 54700, 'bid1': 8.87, # 买一价 'bid1_volume': 21800, # 买一量 ... 'bid2': 8.86, 'bid2_volume': 78400, 'date': '2016-02-19', 'time': '14:30:00', ...}, ...... }

单只股票

quotation.real('162411') # 支持直接指定前缀,如 'sh000001'

多只股票

quotation.stocks(['000001', '162411'])

同时获取指数和行情

quotation.stocks(['sh000001', 'sz000001'], prefix=True)

更新股票代码

easyquotation.update_stock_codes()

选择 jsl(集思路) 行情

quotation = easyquotation.use('jsl') # ['jsl']

设置 cookie (可选)

不设置的话获取相关数据有限制

quotation.set_cookie('从浏览器获取的集思录 Cookie')

获取分级基金信息

``` quotation.funda() # 参数可选择利率、折价率、交易量、有无下折、是否永续来过滤

quotation.fundb() # 参数如上 ```

对应的分级 A 数据

return

{ 150020: {'abrate': '5:5', 'calc_info': None, 'coupon_descr': '+3.0%', 'coupon_descr_s': '+3.0%', 'fund_descr': '每年第一个工作日定折,无下折,A不参与上折,净值<1元无定折', 'funda_amount': 178823, 'funda_amount_increase': '0', 'funda_amount_increase_rt': '0.00%', 'funda_base_est_dis_rt': '2.27%', 'funda_base_est_dis_rt_t1': '2.27%', 'funda_base_est_dis_rt_t2': '-0.34%', 'funda_base_est_dis_rt_tip': '', 'funda_base_fund_id': '163109', 'funda_coupon': '5.75', 'funda_coupon_next': '4.75', 'funda_current_price': '0.783', 'funda_discount_rt': '24.75%', 'funda_id': '150022', 'funda_increase_rt': '0.00%', 'funda_index_id': '399001', 'funda_index_increase_rt': '0.00%', 'funda_index_name': '深证成指', 'funda_left_year': '永续', 'funda_lower_recalc_rt': '1.82%', 'funda_name': '深成指A', 'funda_nav_dt': '2015-09-14', 'funda_profit_rt': '7.74%', 'funda_profit_rt_next': '6.424%', 'funda_value': '1.0405', 'funda_volume': '0.00', 'fundb_upper_recalc_rt': '244.35%', 'fundb_upper_recalc_rt_info': '深成指A不参与上折', 'last_time': '09:18:22', 'left_recalc_year': '0.30411', 'lower_recalc_profit_rt': '-', 'next_recalc_dt': '<span style="font-style:italic">2016-01-04</span>', 'owned': 0, 'status_cd': 'N'}>'}}

分级基金套利接口

quotation.fundarb(jsl_username, jsl_password, avolume=100, bvolume=100, ptype='price')

jsl_username: 集思录用户名 jsl_password: 集思路登录密码 avolume: A成交额,单位百万 bvolume: B成交额,单位百万 ptype: 溢价计算方式,price=现价,buy=买一,sell=卖一

return { "165511":{ 'base_fund_id': '165511', # 母基金代码 'AB_price': '现价A/B : 1.008/1.329', 'a_profit_rt_next': '4.705', 'a_ratio': 4, 'abrate': '4:6', 'apply_fee': '0', 'apply_fee_tip': '0', 'apply_sell': '-0.59', 'asset_ratio': '95%', 'asset_ratio_last': '99%', 'asset_ratio_num': '95.00', 'b_est_val': '1.340', 'b_gangan': '1.502', 'b_ratio': 6, 'base_est_dis_rt': '-0.56%', 'base_est_val': '1.2073', 'base_fund_nm': '信诚500', 'base_lower_recalc_rt': '54.15%', 'base_nav': '1.1970', 'base_nav_dt': '2016-04-13', 'buy1A': '1.007', 'buy1B': '1.329', 'buy1_amountA': '0.201', 'buy1_amountB': '7.123', 'buy_redeem': '-0.51', 'calc_info': None, 'coupon': '0.00%', 'coupon_next': '4.700', 'est_dis_rt': '-0.55%', 'est_time': '2016-04-14 15:10:05', 'fundA_amount': '6667', 'fundA_amount_increase': '-51', 'fundA_amount_increase_rt': '-0.76%', 'fundA_amount_tip': '2016-04-14 A类总份额6667.000万份,份额增长-0.76%', 'fundA_id': '150028', 'fundA_last_dt': '2016-04-14', 'fundA_last_time': '14:57:02', 'fundA_nav': '1.0090', 'fundA_nav_dt': '2016-04-13', 'fundA_nm': '中证500A', 'fundA_stock_volume': '28.2446', 'fundA_stock_volume_tip': 'A类总份额6667.000万份, 成交28万份', 'fundA_turnover_rt': '0.42%', 'fundA_volume': '28.46', 'fundB_amount': 10000.5, 'fundB_amount_increase': '-76', 'fundB_amount_tip': '2016-04-14 B类总份额10000万份,份额增长-0.76%', 'fundB_id': '150029', 'fundB_last_dt': '2016-04-14', 'fundB_last_time': '15:00:27', 'fundB_nav': '1.3220', 'fundB_nav_dt': '2016-04-13', 'fundB_nm': '中证500B', 'fundB_stock_volume': '255.5280', 'fundB_stock_volume_tip': 'B类总份额10000万份, 成交256万份', 'fundB_turnover_rt': '2.56%', 'fundB_volume': '337.24', 'fund_company_nm': '信诚基金', 'funda_name_tip': '下期利率:4.70,修正收益率:4.71%', 'idx_incr_rt': '0.91%', 'increase_rtA': '-0.10%', 'increase_rtB': '1.06%', 'index_id': '399905', 'index_nm': '中证 500', 'is_est_val': 1, 'is_last_nav': 1, 'lower_recalc_rt': '54.15', 'maturity_dt': '-', 'merge_price': '1.2006', 'min_apply_amount': None, 'notes': 'http://www.xcfunds.com/funds_2012/165511/fundinfor.shtml\r\n', 'ownedA': 0, 'ownedM': 1, 'priceA': '1.008', 'priceB': '1.329', 'real_idx_increase_rt': '0.91', 'recalc_to': None, 'redeem_fee': '0.5%', 'redeem_fee_tip': '0.5%', 'sell1A': '1.008', 'sell1B': '1.330', 'sell1_amountA': '7.132', 'sell1_amountB': '16.820', 'status_cd': 'N' } }

指数ETF查询接口

TIP : 尚未包含黄金ETF和货币ETF

集思录ETF源网页

quotation.etfindex(index_id="", min_volume=0, max_discount=None, min_discount=None)

return

{ "510050": { "fund_id": "510050", # 代码 "fund_nm": "50ETF", # 名称 "price": "2.066", # 现价 "increase_rt": "0.34%", # 涨幅 "volume": "71290.96", # 成交额(万元) "index_nm": "上证50", # 指数 "pe": "9.038", # 指数PE "pb": "1.151", # 指数PB "index_increase_rt": "0.45%", # 指数涨幅 "estimate_value": "2.0733", # 估值 "fund_nav": "2.0730", # 净值 "nav_dt": "2016-03-11", # 净值日期 "discount_rt": "-0.34%", # 溢价率 "creation_unit": "90", # 最小申赎单位(万份) "amount": "1315800", # 份额 "unit_total": "271.84", # 规模(亿元) "index_id": "000016", # 指数代码 "last_time": "15:00:00", # 价格最后时间(未确定) "last_est_time": "23:50:02", # 估值最后时间(未确定) } }

分数图

腾讯分时图地址

```python

quotation = easyquotation.use("timekline") data = quotation.real(['603828'], prefix=True)

```

return

{ 'sh603828': { 'date': '170721', #日期 'time_data': { '201707210930': ['0930', '19.42', '61'], # [时间, 当前价, 上一分钟到这一分钟之间的成交数量] '201707210931': ['0931', '19.42','122'], '201707210932': ['0932', '19.43', '123'], '201707210933': ['0933', '19.48', '125'], '201707210934': ['0934', '19.49', '133'], '201707210935': ['0935', '19.48', '161'], ... } }

港股日k线图

腾讯日k线图

```python

import easyquotation quotation = easyquotation.use("daykline") data = quotation.real(['00001','00700']) print(data)

*return* { '00001': [ ['2017-10-09', '352.00', '349.00', '353.00', '348.60', '13455864.00'], # [日期, 今开, 今收, 最高, 最低, 成交量 ] ['2017-10-10', '350.80', '351.20', '352.60', '349.80', '10088970.00'], ] '00700':[

]           
 }

} ```

腾讯港股时时行情

腾讯控股时时行情 ```python

import easyquotation quotation = easyquotation.use("hkquote") data = quotation.real(['00001','00700']) print(data) ```

{ '00001': { 'stock_code': '00001', # 股票代码 'lotSize': '"100', # 每手数量 'name': '长和', # 股票名称 'price': '97.20', # 股票当前价格 'lastPrice': '97.75', # 股票昨天收盘价格 'openPrice': '97.75', # 股票今天开盘价格 'amount': '1641463.0', # 股票成交量 'time': '2017/11/29 15:38:58', # 当前时间 'high': '98.05', # 当天最高价格 'low': '97.15' # 当天最低价格 }, '00700': { 'stock_code': '00700', 'lotSize': '"100', 'name': '腾讯控股', 'price': '413.20', 'lastPrice': '419.20', 'openPrice': '422.20', 'amount': '21351010.0', 'time': '2017/11/29 15:39:01', 'high': '422.80', 'low': '412.40' } }

开发指南

初始化环境

进入项目目录后运行

make init

提交代码时通过所有 hooks 检查即可

Issues

有美股盘前盘后数据吗

opened on 2022-12-11 07:04:00 by youzeliang None

Bump certifi from 2018.4.16 to 2022.12.7

opened on 2022-12-08 17:16:33 by dependabot[bot]

Bumps certifi from 2018.4.16 to 2022.12.7.

Commits


Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) - `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language - `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language - `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language - `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/shidenggui/easyquotation/network/alerts).

大数据AI推荐

opened on 2022-11-10 08:11:10 by ShijunGong

Go to: https://supershortlegend.top/standard

本机上用新浪获取数据可以,但在阿里云的服务器上就获取的是空集

opened on 2022-09-02 04:29:40 by dandancat

如题 用腾讯没问题,但是新浪比腾讯快很多 这个是新浪把阿里云的服务器IP给屏蔽了吗?

希望能支持北交所数据

opened on 2022-08-23 08:20:52 by wzlu

新浪数据是现成的,希望可以支持。

After 2022/6/15, not able to retrieve the price of the stock from sina server

opened on 2022-07-16 09:33:16 by laomagege

After 2022/6/15, not able to retrieve the price of the stock from sina server Failed to establish a new connection: [Errno 11002] getaddrinfo failed')


gaierror Traceback (most recent call last) ~\Anaconda3\lib\site-packages\urllib3\connection.py in _new_conn(self) 168 try: --> 169 conn = connection.create_connection( 170 (self._dns_host, self.port), self.timeout, **extra_kw

~\Anaconda3\lib\site-packages\urllib3\util\connection.py in create_connection(address, timeout, source_address, socket_options) 72 ---> 73 for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): 74 af, socktype, proto, canonname, sa = res

~\Anaconda3\lib\socket.py in getaddrinfo(host, port, family, type, proto, flags) 917 addrlist = [] --> 918 for res in _socket.getaddrinfo(host, port, family, type, proto, flags): 919 af, socktype, proto, canonname, sa = res

gaierror: [Errno 11002] getaddrinfo failed

During handling of the above exception, another exception occurred:

NewConnectionError Traceback (most recent call last) ~\Anaconda3\lib\site-packages\urllib3\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw) 698 # Make the request on the httplib connection object. --> 699 httplib_response = self._make_request( 700 conn,

~\Anaconda3\lib\site-packages\urllib3\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, httplib_request_kw) 393 else: --> 394 conn.request(method, url, httplib_request_kw) 395

~\Anaconda3\lib\site-packages\urllib3\connection.py in request(self, method, url, body, headers) 233 headers["User-Agent"] = _get_default_user_agent() --> 234 super(HTTPConnection, self).request(method, url, body=body, headers=headers) 235

~\Anaconda3\lib\http\client.py in request(self, method, url, body, headers, encode_chunked) 1254 """Send a complete request to the server.""" -> 1255 self._send_request(method, url, body, headers, encode_chunked) 1256

~\Anaconda3\lib\http\client.py in _send_request(self, method, url, body, headers, encode_chunked) 1300 body = _encode(body, 'body') -> 1301 self.endheaders(body, encode_chunked=encode_chunked) 1302

~\Anaconda3\lib\http\client.py in endheaders(self, message_body, encode_chunked) 1249 raise CannotSendHeader() -> 1250 self._send_output(message_body, encode_chunked=encode_chunked) 1251

~\Anaconda3\lib\http\client.py in _send_output(self, message_body, encode_chunked) 1009 del self._buffer[:] -> 1010 self.send(msg) 1011

~\Anaconda3\lib\http\client.py in send(self, data) 949 if self.auto_open: --> 950 self.connect() 951 else:

~\Anaconda3\lib\site-packages\urllib3\connection.py in connect(self) 199 def connect(self): --> 200 conn = self._new_conn() 201 self._prepare_conn(conn)

~\Anaconda3\lib\site-packages\urllib3\connection.py in _new_conn(self) 180 except SocketError as e: --> 181 raise NewConnectionError( 182 self, "Failed to establish a new connection: %s" % e

NewConnectionError: : Failed to establish a new connection: [Errno 11002] getaddrinfo failed

During handling of the above exception, another exception occurred:

MaxRetryError Traceback (most recent call last) ~\Anaconda3\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies) 438 if not chunked: --> 439 resp = conn.urlopen( 440 method=request.method,

~\Anaconda3\lib\site-packages\urllib3\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw) 754 --> 755 retries = retries.increment( 756 method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]

~\Anaconda3\lib\site-packages\urllib3\util\retry.py in increment(self, method, url, response, error, _pool, _stacktrace) 573 if new_retry.is_exhausted(): --> 574 raise MaxRetryError(_pool, url, error or ResponseError(cause)) 575

MaxRetryError: HTTPConnectionPool(host='hq.sinajs.cn', port=80): Max retries exceeded with url: /list=sh600519 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 11002] getaddrinfo failed'))

During handling of the above exception, another exception occurred:

ConnectionError Traceback (most recent call last) in 2 gudaima = "sh600519" #股票代码 3 headers = {'referer': 'http://finance.sina.com.cn'} ----> 4 resp = requests.get('http://hq.sinajs.cn/list=' + gudaima, headers=headers, timeout=6) 5 data = resp.text 6 print(data)

~\Anaconda3\lib\site-packages\requests\api.py in get(url, params, kwargs) 74 75 kwargs.setdefault('allow_redirects', True) ---> 76 return request('get', url, params=params, kwargs) 77 78

~\Anaconda3\lib\site-packages\requests\api.py in request(method, url, kwargs) 59 # cases, and look like a memory leak in others. 60 with sessions.Session() as session: ---> 61 return session.request(method=method, url=url, kwargs) 62 63

~\Anaconda3\lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json) 540 } 541 send_kwargs.update(settings) --> 542 resp = self.send(prep, **send_kwargs) 543 544 return resp

~\Anaconda3\lib\site-packages\requests\sessions.py in send(self, request, kwargs) 653 654 # Send the request --> 655 r = adapter.send(request, kwargs) 656 657 # Total elapsed time of the request (approximately)

~\Anaconda3\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies) 514 raise SSLError(e, request=request) 515 --> 516 raise ConnectionError(e, request=request) 517 518 except ClosedPoolError as e:

ConnectionError: HTTPConnectionPool(host='hq.sinajs.cn', port=80): Max retries exceeded with url: /list=sh600519 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 11002] getaddrinfo failed'))