├── PyTuShare ├── .project ├── .pydevproject ├── PyShareSelect │ ├── __init__.py │ ├── admin.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ ├── urls.py │ └── views.py ├── PyTuShare │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── db.sqlite3 └── manage.py ├── README.md └── tushare ├── .gitignore ├── .travis.yml ├── LICENSE ├── MANIFEST ├── README.md ├── docs ├── _static │ ├── cpt.png │ ├── fork.png │ ├── ids.png │ ├── main_pic_min.png │ ├── mongodb_d.png │ ├── mysql_d.png │ ├── wx.jpg │ └── zfb.jpg ├── classifying.rst ├── donate.rst ├── fundamental.rst ├── index.rst ├── macro.rst ├── preface.rst ├── storing.rst └── trading.rst ├── issues ├── from_email.txt └── from_sns.txt ├── requirements.txt ├── setup.py ├── test ├── __init__.py ├── billboard_test.py ├── classifying_test.py ├── fund_test.py ├── macro_test.py ├── news_test.py ├── ref_test.py ├── shibor_test.py ├── storing_test.py └── trading_test.py ├── test_unittest.py ├── tushare ├── __init__.py ├── data │ └── __init__.py ├── datayes │ ├── __init__.py │ ├── basics.py │ ├── common.py │ ├── trading.py │ └── vars.py ├── futures │ ├── README.md │ ├── ctp │ │ ├── __init__.py │ │ ├── futures │ │ │ ├── ApiStruct.py │ │ │ ├── __init__.py │ │ │ ├── thostmduserapi.dll │ │ │ └── thosttraderapi.dll │ │ └── talib │ │ │ └── __init__.py │ └── futuresDemo.py ├── stock │ ├── __init__.py │ ├── billboard.py │ ├── classifying.py │ ├── cons.py │ ├── fundamental.py │ ├── macro.py │ ├── macro_vars.py │ ├── news_vars.py │ ├── newsevent.py │ ├── ref_vars.py │ ├── reference.py │ ├── shibor.py │ └── trading.py └── util │ ├── __init__.py │ ├── dateu.py │ ├── netbase.py │ └── store.py └── whats_new.md /PyTuShare/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | PyTuShare 4 | 5 | 6 | 7 | 8 | 9 | org.python.pydev.PyDevBuilder 10 | 11 | 12 | 13 | 14 | 15 | org.python.pydev.pythonNature 16 | org.python.pydev.django.djangoNature 17 | 18 | 19 | -------------------------------------------------------------------------------- /PyTuShare/.pydevproject: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | DJANGO_MANAGE_LOCATION 5 | manage.py 6 | 7 | 8 | /${PROJECT_DIR_NAME} 9 | 10 | Default 11 | python 2.7 12 | 13 | -------------------------------------------------------------------------------- /PyTuShare/PyShareSelect/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/PyTuShare/PyShareSelect/__init__.py -------------------------------------------------------------------------------- /PyTuShare/PyShareSelect/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /PyTuShare/PyShareSelect/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/PyTuShare/PyShareSelect/migrations/__init__.py -------------------------------------------------------------------------------- /PyTuShare/PyShareSelect/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /PyTuShare/PyShareSelect/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /PyTuShare/PyShareSelect/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls import include, url,patterns 2 | 3 | from PyShareSelect.views import hello 4 | 5 | urlpatterns = patterns('', 6 | url(r'^$', hello), 7 | ) 8 | 9 | 10 | -------------------------------------------------------------------------------- /PyTuShare/PyShareSelect/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | 5 | from django.http import HttpResponse 6 | 7 | def hello(request): 8 | return HttpResponse("Hello world") 9 | -------------------------------------------------------------------------------- /PyTuShare/PyTuShare/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/PyTuShare/PyTuShare/__init__.py -------------------------------------------------------------------------------- /PyTuShare/PyTuShare/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for PyTuShare project. 3 | 4 | Generated by 'django-admin startproject' using Django 1.8.3. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.8/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/1.8/ref/settings/ 11 | """ 12 | 13 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 14 | import os 15 | 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = '^*fo+cvov1(z=^anc8tswu^5nuf&l=d2z*=jtve6z0pc*pvts!' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [] 29 | 30 | 31 | # Application definition 32 | 33 | INSTALLED_APPS = ( 34 | 'django.contrib.admin', 35 | 'django.contrib.auth', 36 | 'django.contrib.contenttypes', 37 | 'django.contrib.sessions', 38 | 'django.contrib.messages', 39 | 'django.contrib.staticfiles', 40 | 'PyShareSelect', 41 | ) 42 | 43 | MIDDLEWARE_CLASSES = ( 44 | 'django.contrib.sessions.middleware.SessionMiddleware', 45 | 'django.middleware.common.CommonMiddleware', 46 | 'django.middleware.csrf.CsrfViewMiddleware', 47 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 48 | 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 49 | 'django.contrib.messages.middleware.MessageMiddleware', 50 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 51 | 'django.middleware.security.SecurityMiddleware', 52 | ) 53 | 54 | ROOT_URLCONF = 'PyTuShare.urls' 55 | 56 | TEMPLATES = [ 57 | { 58 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 59 | 'DIRS': [], 60 | 'APP_DIRS': True, 61 | 'OPTIONS': { 62 | 'context_processors': [ 63 | 'django.template.context_processors.debug', 64 | 'django.template.context_processors.request', 65 | 'django.contrib.auth.context_processors.auth', 66 | 'django.contrib.messages.context_processors.messages', 67 | ], 68 | }, 69 | }, 70 | ] 71 | 72 | WSGI_APPLICATION = 'PyTuShare.wsgi.application' 73 | 74 | 75 | # Database 76 | # https://docs.djangoproject.com/en/1.8/ref/settings/#databases 77 | 78 | # DATABASES = { 79 | # 'default': { 80 | # 'ENGINE': 'django.db.backends.sqlite3', 81 | # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 82 | # } 83 | # } 84 | 85 | DATABASES = { 86 | 'default': { 87 | 'ENGINE': 'django.db.backends.mysql', 88 | 'NAME': 'pythsharedb', 89 | 'USER': 'pytushare', 90 | 'PASSWORD': 'pytushare', 91 | 'HOST': '127.0.0.1', 92 | 'PORT': '3306', 93 | } 94 | } 95 | 96 | 97 | # Internationalization 98 | # https://docs.djangoproject.com/en/1.8/topics/i18n/ 99 | 100 | LANGUAGE_CODE = 'en-us' 101 | 102 | TIME_ZONE = 'UTC' 103 | 104 | USE_I18N = True 105 | 106 | USE_L10N = True 107 | 108 | USE_TZ = True 109 | 110 | 111 | # Static files (CSS, JavaScript, Images) 112 | # https://docs.djangoproject.com/en/1.8/howto/static-files/ 113 | 114 | STATIC_URL = '/static/' 115 | -------------------------------------------------------------------------------- /PyTuShare/PyTuShare/urls.py: -------------------------------------------------------------------------------- 1 | """PyTuShare URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/1.8/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Add an import: from blog import urls as blog_urls 14 | 2. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls)) 15 | """ 16 | from django.conf.urls import include, url 17 | from django.contrib import admin 18 | import PyShareSelect.urls 19 | urlpatterns = [ 20 | url(r'^$',include(PyShareSelect.urls)), 21 | url(r'^admin/', include(admin.site.urls)), 22 | ] 23 | -------------------------------------------------------------------------------- /PyTuShare/PyTuShare/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for PyTuShare project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PyTuShare.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /PyTuShare/db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/PyTuShare/db.sqlite3 -------------------------------------------------------------------------------- /PyTuShare/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PyTuShare.settings") 7 | 8 | from django.core.management import execute_from_command_line 9 | 10 | execute_from_command_line(sys.argv) 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PyTuShare 2 | Python,TuShare,pandans,NumPy,Matplotlib,support Python 2-3.0 3 | 4 | Project: 5 | PyTuShare 2015-07-12 6 | 7 | App: 8 | PyShareSelect 2015-07-12 9 | 10 | Source: 11 | tushare 2015-07-12 12 | -------------------------------------------------------------------------------- /tushare/.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | *.log 3 | *.swp 4 | *.pdb 5 | .project 6 | .pydevproject 7 | .settings 8 | __pycache__/ 9 | *.py[cod] 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | env/ 17 | build/ 18 | develop-eggs/ 19 | dist/ 20 | downloads/ 21 | eggs/ 22 | source/ 23 | baks/ 24 | lib/ 25 | lib64/ 26 | parts/ 27 | sdist/ 28 | var/ 29 | *.egg-info/ 30 | .installed.cfg 31 | *.egg 32 | 33 | # PyInstaller 34 | # Usually these files are written by a python script from a template 35 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 36 | *.manifest 37 | *.spec 38 | 39 | # Installer logs 40 | pip-log.txt 41 | pip-delete-this-directory.txt 42 | 43 | # Unit test / coverage reports 44 | htmlcov/ 45 | .tox/ 46 | .coverage 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | 51 | # Translations 52 | *.mo 53 | *.pot 54 | 55 | # Django stuff: 56 | *.log 57 | 58 | # Sphinx documentation 59 | docs/_build/ 60 | docs/*.md 61 | docs/bin 62 | 63 | # PyBuilder 64 | target/ 65 | -------------------------------------------------------------------------------- /tushare/.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | 3 | python: 4 | - 2.7 5 | 6 | before_install: 7 | - wget http://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh 8 | - chmod +x miniconda.sh 9 | - ./miniconda.sh -b 10 | - export PATH=/home/travis/miniconda/bin:$PATH 11 | - conda update --yes conda 12 | 13 | install: 14 | - conda install --yes python=$TRAVIS_PYTHON_VERSION numpy scipy pandas matplotlib lxml 15 | 16 | before_script: 17 | - python setup.py install 18 | 19 | script: 20 | - python test_unittest.py 21 | 22 | -------------------------------------------------------------------------------- /tushare/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015, 挖地兔 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | * Neither the name of tushare nor the names of its 15 | contributors may be used to endorse or promote products derived from 16 | this software without specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 22 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | 29 | -------------------------------------------------------------------------------- /tushare/MANIFEST: -------------------------------------------------------------------------------- 1 | # file GENERATED by distutils, do NOT edit 2 | setup.py 3 | test\test.py 4 | tushare\__init__.py 5 | tushare\data\__init__.py 6 | tushare\data\all.csv 7 | tushare\stock\__init__.py 8 | tushare\stock\cons.py 9 | tushare\stock\fundamental.py 10 | tushare\stock\trading.py 11 | -------------------------------------------------------------------------------- /tushare/README.md: -------------------------------------------------------------------------------- 1 | TuShare 2 | ---- 3 | ![](https://api.travis-ci.org/waditu/tushare.png?branch=master) 4 | [![](https://pypip.in/v/tushare/badge.png)](https://pypi.python.org/pypi/tushare/0.1.5) 5 | 6 | TuShare是实现对股票/期货等金融数据从**数据采集**、**清洗加工** 到 **数据存储**过程的工具,满足金融量化分析师和学习数据分析的人在数据获取方面的需求,它的特点是数据覆盖范围广,接口调用简单,响应快速。 7 | 8 | ![](http://tushare.waditu.com/_images/main_pic_min.png) 9 | 10 | Dependencies 11 | ========= 12 | python 2.x/3.x 13 | 14 | [pandas](http://pandas.pydata.org/ "pandas") 15 | 16 | 17 | Installation 18 | ==== 19 | 20 | - 方式1:pip install tushare 21 | - 方式2:python setup.py install 22 | - 方式3:访问[https://pypi.python.org/pypi/tushare/](https://pypi.python.org/pypi/tushare/)下载安装 23 | 24 | 25 | Upgrade 26 | ======= 27 | 28 | pip install tushare --upgrade 29 | 30 | Quick Start 31 | ====== 32 | **Example 1.** 获取个股历史交易数据(包括均线数据): 33 | 34 | import tushare as ts 35 | 36 | ts.get_hist_data('600848') #一次性获取全部数据 37 | 38 | 结果显示: 39 | 40 | > 日期 ,开盘价, 最高价, 收盘价, 最低价, 成交量, 价格变动 ,涨跌幅,5日均价,10日均价,20日均价,5日均量,10日均量,20日均量,换手率 41 | 42 | open high close low volume p_change ma5 \ 43 | date 44 | 2012-01-11 6.880 7.380 7.060 6.880 14129.96 2.62 7.060 45 | 2012-01-12 7.050 7.100 6.980 6.900 7895.19 -1.13 7.020 46 | 2012-01-13 6.950 7.000 6.700 6.690 6611.87 -4.01 6.913 47 | 2012-01-16 6.680 6.750 6.510 6.480 2941.63 -2.84 6.813 48 | 2012-01-17 6.660 6.880 6.860 6.460 8642.57 5.38 6.822 49 | 2012-01-18 7.000 7.300 6.890 6.880 13075.40 0.44 6.788 50 | 2012-01-19 6.690 6.950 6.890 6.680 6117.32 0.00 6.770 51 | 2012-01-20 6.870 7.080 7.010 6.870 6813.09 1.74 6.832 52 | 53 | ma10 ma20 v_ma5 v_ma10 v_ma20 turnover 54 | date 55 | 2012-01-11 7.060 7.060 14129.96 14129.96 14129.96 0.48 56 | 2012-01-12 7.020 7.020 11012.58 11012.58 11012.58 0.27 57 | 2012-01-13 6.913 6.913 9545.67 9545.67 9545.67 0.23 58 | 2012-01-16 6.813 6.813 7894.66 7894.66 7894.66 0.10 59 | 2012-01-17 6.822 6.822 8044.24 8044.24 8044.24 0.30 60 | 2012-01-18 6.833 6.833 7833.33 8882.77 8882.77 0.45 61 | 2012-01-19 6.841 6.841 7477.76 8487.71 8487.71 0.21 62 | 2012-01-20 6.863 6.863 7518.00 8278.38 8278.38 0.23 63 | 64 | 设定历史数据的时间: 65 | 66 | ts.get_hist_data('600848',start='2015-01-05',end='2015-01-09') 67 | 68 | open high close low volume p_change ma5 ma10 \ 69 | date 70 | 2015-01-05 11.160 11.390 11.260 10.890 46383.57 1.26 11.156 11.212 71 | 2015-01-06 11.130 11.660 11.610 11.030 59199.93 3.11 11.182 11.155 72 | 2015-01-07 11.580 11.990 11.920 11.480 86681.38 2.67 11.366 11.251 73 | 2015-01-08 11.700 11.920 11.670 11.640 56845.71 -2.10 11.516 11.349 74 | 2015-01-09 11.680 11.710 11.230 11.190 44851.56 -3.77 11.538 11.363 75 | ma20 v_ma5 v_ma10 v_ma20 turnover 76 | date 77 | 2015-01-05 11.198 58648.75 68429.87 97141.81 1.59 78 | 2015-01-06 11.382 54854.38 63401.05 98686.98 2.03 79 | 2015-01-07 11.543 55049.74 61628.07 103010.58 2.97 80 | 2015-01-08 11.647 57268.99 61376.00 105823.50 1.95 81 | 2015-01-09 11.682 58792.43 60665.93 107924.27 1.54 82 | 83 | 84 | **复权历史数据** 85 | 获取历史复权数据,分为前复权和后复权数据,接口提供股票上市以来所有历史数据,默认为前复权。如果不设定开始和结束日期,则返回近一年的复权数据,从性能上考虑,推荐设定开始日期和结束日期,而且最好不要超过一年以上,获取到数据后,请及时在本地存储。 86 | 87 | ts.get_h_data('002337') #前复权 88 | ts.get_h_data('002337',autype='hfq') #后复权 89 | ts.get_h_data('002337',autype=None) #不复权 90 | ts.get_h_data('002337',start='2015-01-01',end='2015-03-16') #两个日期之间的前复权数据 91 | 92 | 93 | **Example 2.** 一次性获取最近一个日交易日所有股票的交易数据(结果显示速度取决于网速) 94 | 95 | 96 | ts.get_today_all() 97 | 98 | 99 | 结果显示: 100 | 101 | > 代码,名称,涨跌幅,现价,开盘价,最高价,最低价,最日收盘价,成交量,换手率 102 | 103 | code name changepercent trade open high low settlement \ 104 | 0 002738 中矿资源 10.023 19.32 19.32 19.32 19.32 17.56 105 | 1 300410 正业科技 10.022 25.03 25.03 25.03 25.03 22.75 106 | 2 002736 国信证券 10.013 16.37 16.37 16.37 16.37 14.88 107 | 3 300412 迦南科技 10.010 31.54 31.54 31.54 31.54 28.67 108 | 4 300411 金盾股份 10.007 29.68 29.68 29.68 29.68 26.98 109 | 5 603636 南威软件 10.006 38.15 38.15 38.15 38.15 34.68 110 | 6 002664 信质电机 10.004 30.68 29.00 30.68 28.30 27.89 111 | 7 300367 东方网力 10.004 86.76 78.00 86.76 77.87 78.87 112 | 8 601299 中国北车 10.000 11.44 11.44 11.44 11.29 10.40 113 | 9 601880 大连港 10.000 5.72 5.34 5.72 5.22 5.20 114 | 10 000856 冀东装备 10.000 8.91 8.18 8.91 8.18 8.10 115 | volume turnoverratio 116 | 0 375100 1.25033 117 | 1 85800 0.57200 118 | 2 1058925 0.08824 119 | 3 69400 0.51791 120 | 4 252220 1.26110 121 | 5 1374630 5.49852 122 | 6 6448748 9.32700 123 | 7 2025030 6.88669 124 | 8 433453523 4.28056 125 | 9 323469835 9.61735 126 | 10 25768152 19.51090 127 | 128 | **Example 3.** 获取历史分笔数据 129 | 130 | import tushare as ts 131 | 132 | df = ts.get_tick_data('600848',date='2014-01-09') 133 | df.head(10) 134 | 135 | 结果显示: 136 | >成交时间、成交价格、价格变动,成交手、成交金额(元),买卖类型 137 | 138 | Out[3]: 139 | time price change volume amount type 140 | 0 15:00:00 6.05 -- 8 4840 卖盘 141 | 1 14:59:55 6.05 -- 50 30250 卖盘 142 | 2 14:59:35 6.05 -- 20 12100 卖盘 143 | 3 14:59:30 6.05 -0.01 165 99825 卖盘 144 | 4 14:59:20 6.06 0.01 4 2424 买盘 145 | 5 14:59:05 6.05 -0.01 2 1210 卖盘 146 | 6 14:58:55 6.06 -- 4 2424 买盘 147 | 7 14:58:45 6.06 -- 2 1212 买盘 148 | 8 14:58:35 6.06 0.01 2 1212 买盘 149 | 9 14:58:25 6.05 -0.01 20 12100 卖盘 150 | 10 14:58:05 6.06 -- 5 3030 买盘 151 | 152 | **Example 4.** 获取实时交易数据(Realtime Quotes Data) 153 | 154 | df = ts.get_realtime_quotes('000581') #Single stock symbol 155 | df[['code','name','price','bid','ask','volume','amount','time']] 156 | 157 | 结果显示: 158 | >名称、开盘价、昨价、现价、最高、最低、买入价、卖出价、成交量、成交金额...more in docs 159 | 160 | 161 | code name price bid ask volume amount time 162 | 0 000581 威孚高科 31.15 31.14 31.15 8183020 253494991.16 11:30:36 163 | 164 | 请求多个股票方法(一次最好不要超过30个): 165 | 166 | ts.get_realtime_quotes(['600848','000980','000981']) #symbols from a list 167 | ts.get_realtime_quotes(df['code'].tail(10)) #from a Series 168 | 169 | 170 | 更多文档 171 | ======== 172 | [http://tushare.org/](http://tushare.org/ "TuShare Docs") 173 | 174 | Change Logs 175 | ------ 176 | 177 | 0.3.4 2015/06/15 178 | ------- 179 | 180 | - 新增‘龙虎榜’模块 181 | 1. 每日龙虎榜列表 182 | 1. 个股上榜统计 183 | 1. 营业部上榜统计 184 | 1. 龙虎榜机构席位追踪 185 | 1. 龙虎榜机构席位成交明细 186 | 187 | - 修改get\_h\_data数据类型为float 188 | - 修改get_index接口遗漏的open列 189 | - 合并GitHub上提交的bug修复 190 | 191 | 192 | 0.2.8 2015/04/28 193 | --------- 194 | 195 | - 新增大盘指数实时行情列表 196 | - 新增大盘指数历史行情数据(全部) 197 | - 新增终止上市公司列表(退市) 198 | - 新增暂停上市公司列表 199 | - 修正融资融券明细无日期的缺陷 200 | - 修正get\_h\_data部分bug 201 | 202 | 0.2.6 203 | ======== 204 | - 新增沪市融资融券列表 205 | - 新增沪市融资融券明细列表 206 | - 新增深市融资融券列表 207 | - 新增深市融资融券明细列表 208 | - 修正复权数据数据源出现null造成异常问题(对大约300个股票有影响) 209 | 210 | 0.2.5 2015/04/16 211 | =========== 212 | - 完成python2.x和python3.x兼容性支持 213 | - 部分算法优化和代码重构 214 | - 新增中证500成份股 215 | - 新增当日分笔交易明细 216 | - 修正分配预案(高送转)bug 217 | 218 | 0.2.3 2015/04/11 219 | =========== 220 | - 新增“新浪股吧”消息和热度 221 | - 新增新股上市数据 222 | - 修正“基本面”模块中数据重复的问题 223 | - 修正历史数据缺少一列column(数据来源问题)的bug 224 | 225 | 0.2.0 2015/03/17 226 | ======= 227 | 228 | - 新增历史复权数据接口 229 | - 新增即时滚动新闻、信息地雷数据 230 | - 新增沪深300指数成股份及动态权重、 231 | - 新增上证50指数成份股 232 | - 修改历史行情数据类型为float 233 | 234 | 0.1.9 2015/02/06 235 | ======== 236 | - 增加分类数据 237 | - 增加数据存储示例 238 | 239 | 0.1.6 2015/01/27 240 | ======== 241 | - 增加了重点指数的历史和实时行情 242 | - 更新docs 243 | 244 | 0.1.5 2015/01/26 245 | ===== 246 | 247 | - 增加基本面数据接口 248 | - 发布一版使用手册,开通[TuShare docs](http://tushare.waditu.com)网站 249 | 250 | 0.1.3 2015/01/13 251 | === 252 | - 增加实时交易数据的获取 253 | - Done for crawling Realtime Quotes data 254 | 255 | 0.1.1 2015/01/11 256 | === 257 | 258 | - 增加tick数据的获取 259 | 260 | 0.1.0 2014/12/01 261 | === 262 | 263 | - 创建第一个版本 264 | - 实现个股历史数据的获取 -------------------------------------------------------------------------------- /tushare/docs/_static/cpt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/docs/_static/cpt.png -------------------------------------------------------------------------------- /tushare/docs/_static/fork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/docs/_static/fork.png -------------------------------------------------------------------------------- /tushare/docs/_static/ids.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/docs/_static/ids.png -------------------------------------------------------------------------------- /tushare/docs/_static/main_pic_min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/docs/_static/main_pic_min.png -------------------------------------------------------------------------------- /tushare/docs/_static/mongodb_d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/docs/_static/mongodb_d.png -------------------------------------------------------------------------------- /tushare/docs/_static/mysql_d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/docs/_static/mysql_d.png -------------------------------------------------------------------------------- /tushare/docs/_static/wx.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/docs/_static/wx.jpg -------------------------------------------------------------------------------- /tushare/docs/_static/zfb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/docs/_static/zfb.jpg -------------------------------------------------------------------------------- /tushare/docs/classifying.rst: -------------------------------------------------------------------------------- 1 | .. contents:: 2 | :depth: 3.0 3 | .. 4 | 5 | .. \_classifying: 6 | 7 | .. currentmodule:: tushare 8 | 9 | .. highlightlang:: python 10 | 11 | 股票分类数据 12 | ============ 13 | 14 | *分类数据*\ 提供股票的分类信息数据,从股票类型的不同角度进行数据分类,在一些统计套利方法的应用中,时常会以股票的分类来做切入,比如对某些行业或概念进行阶段统计来决定近期的交易策略等。TuShare提供的分类数据主要包括以下类别: 15 | 16 | - 行业分类 17 | - 概念分类 18 | - 地域分类 19 | - 中小板分类 20 | - 创业板分类 21 | - 风险警示板分类 22 | - 沪深300成份股及权重 23 | - 上证50成份股 24 | - 中证500成份股 25 | - 终止上市股票列表 26 | - 暂停上市股票列表 27 | 28 | 行业分类 29 | -------- 30 | 31 | 在现实交易中,经常会按行业统计股票的涨跌幅或资金进出,本接口按照sina财经对沪深股票进行的行业分类,返回所有股票所属行业的信息。考虑到是一次性在线获取数据,调用接口时会有一定的延时,请在数据返回后自行将数据进行及时存储。sina财经提供的行业分类信息大致如下图所示: 32 | 33 | .. figure:: _static/ids.png 34 | :alt: 35 | 36 | 返回值说明: 37 | 38 | - **code**\ :股票代码 39 | - **name**\ :股票名称 40 | - **c\_name**\ :行业名称 41 | 42 | 调用方法: 43 | 44 | :: 45 | 46 | import tushare as ts 47 | 48 | ts.get_industry_classified() 49 | 50 | 结果显示: 51 | 52 | :: 53 | 54 | code name c_name 55 | 0 600051 宁波联合 综合行业 56 | 1 600209 罗顿发展 综合行业 57 | 2 600212 江泉实业 综合行业 58 | 3 600256 广汇能源 综合行业 59 | 4 600603 大洲兴业 综合行业 60 | 5 600614 鼎立股份 综合行业 61 | 6 600620 天宸股份 综合行业 62 | 7 600622 嘉宝集团 综合行业 63 | 8 600624 复旦复华 综合行业 64 | 9 600647 同达创业 综合行业 65 | 10 600656 博元投资 综合行业 66 | 67 | 概念分类 68 | -------- 69 | 70 | 返回股票概念的分类数据,现实的二级市场交易中,经常会以"概念"来炒作,在数据分析过程中,可根据概念分类监测资金等信息的变动情况。本接口是一次性在线获取数据,调用接口时会有一定的延时,请在数据返回后自行将数据进行及时存储。sina财经提供的概念分类信息大致如下图所示: 71 | 72 | .. figure:: _static/cpt.png 73 | :alt: 74 | 75 | 返回值说明: 76 | 77 | - **code**\ :股票代码 78 | - **name**\ :股票名称 79 | - **c\_name**\ :概念名称 80 | 81 | 调用方法: 82 | 83 | :: 84 | 85 | import tushare as ts 86 | 87 | ts.get_concept_classified() 88 | 89 | 结果显示: 90 | 91 | :: 92 | 93 | code name c_name 94 | 0 600007 中国国贸 外资背景 95 | 1 600114 东睦股份 外资背景 96 | 2 600132 重庆啤酒 外资背景 97 | 3 600182 S佳通 外资背景 98 | 4 600595 中孚实业 外资背景 99 | 5 600641 万业企业 外资背景 100 | 6 600779 水井坊 外资背景 101 | 7 600801 华新水泥 外资背景 102 | 8 600819 耀皮玻璃 外资背景 103 | 9 000001 平安银行 外资背景 104 | 10 000005 世纪星源 外资背景 105 | 106 | 地域分类 107 | -------- 108 | 109 | 按地域对股票进行分类,即查找出哪些股票属于哪个省份。 110 | 111 | 参数说明: 112 | 113 | - **file\_path**:文件路径,默认为None即由TuShare提供,可以设定自己的股票文件路径。 114 | 115 | 返回值说明: 116 | 117 | - **code**\ :股票代码 118 | - **name**\ :股票名称 119 | - **area**\ :地域名称 120 | 121 | 调用方法: 122 | 123 | :: 124 | 125 | import tushare as ts 126 | 127 | ts.get_area_classified() 128 | 129 | 结果显示: 130 | 131 | :: 132 | 133 | code name area 134 | 0 000668 荣丰控股 上海 135 | 1 002506 *ST超日 上海 136 | 2 600597 光明乳业 上海 137 | 3 603009 北特科技 上海 138 | 4 002636 金安国纪 上海 139 | 5 002346 柘中建设 上海 140 | 6 300171 东富龙 上海 141 | 7 600611 大众交通 上海 142 | 8 600843 上工申贝 上海 143 | 9 600490 鹏欣资源 上海 144 | 10 601866 中海集运 上海 145 | 146 | 中小板分类 147 | ---------- 148 | 149 | 获取中小板股票数据,即查找所有002开头的股票 150 | 151 | 参数说明: 152 | 153 | - **file\_path**:文件路径,默认为None即由TuShare提供,可以设定自己的股票文件路径。 154 | 155 | 返回值说明: 156 | 157 | - **code**\ :股票代码 158 | - **name**\ :股票名称 159 | 160 | 调用方法: 161 | 162 | :: 163 | 164 | import tushare as ts 165 | 166 | ts.get_sme_classified() 167 | 168 | 结果显示: 169 | 170 | :: 171 | 172 | code name 173 | 0 002001 新 和 成 174 | 1 002002 鸿达兴业 175 | 2 002003 伟星股份 176 | 3 002004 华邦颖泰 177 | 4 002005 德豪润达 178 | 5 002006 *ST精功 179 | 6 002007 华兰生物 180 | 7 002008 大族激光 181 | 8 002009 天奇股份 182 | 9 002010 传化股份 183 | 10 002011 盾安环境 184 | 185 | 创业板分类 186 | ---------- 187 | 188 | 获取创业板股票数据,即查找所有300开头的股票 189 | 190 | 参数说明: 191 | 192 | - **file\_path**:文件路径,默认为None即由TuShare提供,可以设定自己的股票文件路径。 193 | 194 | 返回值说明: 195 | 196 | - **code**\ :股票代码 197 | - **name**\ :股票名称 198 | 199 | 调用方法: 200 | 201 | :: 202 | 203 | import tushare as ts 204 | 205 | ts.get_gem_classified() 206 | 207 | 结果显示: 208 | 209 | :: 210 | 211 | code name 212 | 0 300001 特锐德 213 | 1 300002 神州泰岳 214 | 2 300003 乐普医疗 215 | 3 300004 南风股份 216 | 4 300005 探路者 217 | 5 300006 莱美药业 218 | 6 300007 汉威电子 219 | 7 300008 上海佳豪 220 | 8 300009 安科生物 221 | 9 300010 立思辰 222 | 10 300011 鼎汉技术 223 | 224 | 风险警示板分类 225 | -------------- 226 | 227 | 获取风险警示板股票数据,即查找所有st股票 228 | 229 | 参数说明: 230 | 231 | - **file\_path**:文件路径,默认为None即由TuShare提供,可以设定自己的股票文件路径。 232 | 233 | 返回值说明: 234 | 235 | - **code**\ :股票代码 236 | - **name**\ :股票名称 237 | 238 | 调用方法: 239 | 240 | :: 241 | 242 | import tushare as ts 243 | 244 | ts.get_st_classified() 245 | 246 | 结果显示: 247 | 248 | :: 249 | 250 | code name 251 | 0 000033 *ST新都 252 | 1 000403 ST生化 253 | 2 000504 *ST传媒 254 | 3 000520 *ST凤凰 255 | 4 000557 *ST广夏 256 | 5 000594 *ST国恒 257 | 6 000659 *ST中富 258 | 7 000677 *ST海龙 259 | 8 000711 *ST京蓝 260 | 9 000755 *ST三维 261 | 10 000779 *ST派神 262 | 263 | 沪深300成份及权重 264 | ----------------- 265 | 266 | 获取沪深300当前成份股及所占权重 267 | 268 | 返回值说明: 269 | 270 | - **code** :股票代码 271 | - **name** :股票名称 272 | - **date** :日期 273 | - **weight**:权重 274 | 275 | 调用方法: 276 | 277 | :: 278 | 279 | import tushare as ts 280 | 281 | ts.get_hs300s() 282 | 283 | 结果显示: 284 | 285 | :: 286 | 287 | code name date weight 288 | 0 000001 平安银行 2015-03-02 0.93 289 | 1 000002 万科A 2015-03-02 1.43 290 | 2 000009 中国宝安 2015-03-02 0.27 291 | 3 000024 招商地产 2015-03-02 0.30 292 | 4 000027 深圳能源 2015-03-02 0.10 293 | 5 000039 中集集团 2015-03-02 0.20 294 | 6 000060 中金岭南 2015-03-02 0.18 295 | 7 000061 农 产 品 2015-03-02 0.21 296 | 8 000063 中兴通讯 2015-03-02 0.46 297 | 9 000069 华侨城A 2015-03-02 0.33 298 | 10 000100 TCL集团 2015-03-02 0.51 299 | 300 | 上证50成份股 301 | ------------ 302 | 303 | 获取上证50成份股 304 | 305 | 返回值说明: 306 | 307 | - **code**\ :股票代码 308 | - **name**\ :股票名称 309 | 310 | 调用方法: 311 | 312 | :: 313 | 314 | import tushare as ts 315 | 316 | ts.get_sz50s() 317 | 318 | 结果显示: 319 | 320 | :: 321 | 322 | code name 323 | 0 600000 浦发银行 324 | 1 600010 包钢股份 325 | 2 600015 华夏银行 326 | 3 600016 民生银行 327 | 4 600018 上港集团 328 | 5 600028 中国石化 329 | 6 600030 中信证券 330 | 7 600036 招商银行 331 | 8 600048 保利地产 332 | 9 600050 中国联通 333 | 10 600089 特变电工 334 | 335 | 中证500成份股 336 | ------------- 337 | 338 | 获取中证500成份股 339 | 340 | 返回值说明: 341 | 342 | - **code**\ :股票代码 343 | - **name**\ :股票名称 344 | 345 | 调用方法: 346 | 347 | :: 348 | 349 | import tushare as ts 350 | 351 | ts.get_zz500s() 352 | 353 | 结果显示: 354 | 355 | :: 356 | 357 | code name 358 | 0 000006 深振业A 359 | 1 000012 南 玻A 360 | 2 000021 深科技 361 | 3 000028 国药一致 362 | 4 000030 富奥股份 363 | 5 000031 中粮地产 364 | 6 000049 德赛电池 365 | 7 000050 深天马A 366 | 8 000062 深圳华强 367 | 9 000066 长城电脑 368 | 10 000078 海王生物 369 | 370 | 终止上市股票列表 371 | ---------------- 372 | 373 | 获取已经被终止上市的股票列表,数据从上交所获取,目前只有在上海证券交易所交易被终止的股票。 374 | 375 | 返回值说明: 376 | 377 | - **code**\ :股票代码 378 | - **name**\ :股票名称 379 | - **oDate**:上市日期 380 | - **tDate**:终止上市日期 381 | 382 | 调用方法: 383 | 384 | :: 385 | 386 | import tushare as ts 387 | 388 | ts.get_terminated() 389 | 390 | 结果显示: 391 | 392 | :: 393 | 394 | code name oDate tDate 395 | 0 900949 东电B股 1997-09-22 2013-11-07 396 | 1 600253 天方药业 2000-12-27 2013-07-15 397 | 2 600991 广汽长丰 2004-06-14 2012-03-20 398 | 3 600263 路桥建设 2000-07-25 2012-03-01 399 | 4 600102 莱钢股份 1997-08-28 2012-02-28 400 | 5 600631 百联股份 1993-02-26 2011-08-23 401 | 6 600553 太行水泥 2002-08-22 2011-02-18 402 | 7 600003 ST东北高 1999-08-10 2010-02-26 403 | 8 600842 中西药业 1994-03-11 2010-02-12 404 | 9 600607 上实医药 1992-03-27 2010-02-12 405 | 406 | 暂停上市股票列表 407 | ---------------- 408 | 409 | 获取被暂停上市的股票列表,数据从上交所获取,目前只有在上海证券交易所交易被终止的股票。 410 | 411 | 返回值说明: 412 | 413 | - **code**\ :股票代码 414 | - **name**\ :股票名称 415 | - **oDate**:上市日期 416 | - **tDate**:暂停上市日期 417 | 418 | 调用方法: 419 | 420 | :: 421 | 422 | import tushare as ts 423 | 424 | ts.get_terminated() 425 | 426 | 结果显示: 427 | 428 | :: 429 | 430 | code name oDate tDate 431 | 0 601268 *ST二重 2010-02-02 - 432 | -------------------------------------------------------------------------------- /tushare/docs/donate.rst: -------------------------------------------------------------------------------- 1 | .. contents:: 2 | :depth: 3.0 3 | .. 4 | 5 | .. \_donate: 6 | 7 | .. currentmodule:: tushare 8 | 9 | .. highlightlang:: python 10 | 11 | 关于捐助 12 | ======== 13 | 14 | 在捐助的问题上,其实我一直是羞于启齿的。 15 | 16 | 从一开始在@vodkabuaa的“算法交易研究小组”群里就有人提出可以捐助一下TuShare,到后来一些用户在我的微博和QQ私底下交流中也提到这个问题,我都是诚恳的表达了谢意并没发布捐助计划。直到对TuShare进行Python2、Python3兼容性整合的时候,才发现原来工作量也是如此巨大,尤其在翻看以前的代码进行优化的时候,才想起了之前无数个深夜里台灯底下独自研究数据接口和敲写代码的时光(TuShare是业余完成),虽没有“为伊消得人憔悴”,却也放任了很多的宝贵睡眠时间。有时候,我自己也在怀疑到底能不能坚持写下去,还好,有很多用户通过加我的QQ或者微博表达了支持,有些甚至成为了好朋友。接下来,我会继续完善和提升TuShare的功能和性能,在使用教程和后期数据分析的demo方面,我个人已经申请了域名和虚拟主机,但由于服务器在美国,从国内访问速度方面有点差强人意,后期我会在国内申请相关服务,一方面提升访问速度增强用户体验,另外也想对一些特定的数据进行存储,方便大家获取。 17 | 18 | 那么,如果能得到您的支持,我将感激不尽,您的打赏将是对我从精神和物质方面的双重支持,对于您是否打赏,打赏多少,我没有要求也不会强迫,只有默默地等待。如果您伸出了援手,我会记下您的“善举”,有需要我帮忙的请随时找我,无论是编程语言、数据库、Python/pandas还是量化分析方面的问题,我会一一认真帮您解答。 19 | 20 | **打赏方式一(微信)**\ : 21 | 22 | 请通过微信“扫一扫”下面的二维码(或添加我的微信jimmysoa打赏个红包也OK) 23 | 24 | .. figure:: _static/wx.jpg 25 | :alt: 26 | 27 | **打赏方式二(支付宝)**\ : 28 | 请打开支付宝App“扫一扫”下面的二维码(或通过帐号liuzhiming@ymail.com) 29 | 30 | .. figure:: _static/zfb.jpg 31 | :alt: 32 | 33 | 再次表达作者的谢意! 34 | -------------------------------------------------------------------------------- /tushare/docs/fundamental.rst: -------------------------------------------------------------------------------- 1 | .. contents:: 2 | :depth: 3.0 3 | .. 4 | 5 | .. \_fundamental: 6 | 7 | .. currentmodule:: tushare 8 | 9 | .. highlightlang:: python 10 | 11 | 基本面数据 12 | ========== 13 | 14 | *基本面类数据*\ 提供所有股票的基本面情况,包括股本情况、业绩预告和业绩报告等。主要包括以下类别: 15 | 16 | - 沪深股票列表 17 | - 业绩预告 18 | - 业绩报告(主表) 19 | - 盈利能力数据 20 | - 营运能力数据 21 | - 成长能力数据 22 | - 偿债能力数据 23 | - 现金流量数据 24 | 25 | 本模块数据全部来自sina财经,由于财务数据项目比较多,所以拆分成了几个表,使用时可以通过股票代码合并在一起,也可以独立使用。数据在获取时,需要一页一页的抓取,所以需要一点等待时间,最后会合并成一个大表。 26 | 27 | 股票列表 28 | -------- 29 | 30 | 获取沪深上市公司基本情况。属性包括: 31 | 32 | :: 33 | 34 | code,代码 35 | name,名称 36 | industry,所属行业 37 | area,地区 38 | pe,市盈率 39 | outstanding,流通股本 40 | totals,总股本(万) 41 | totalAssets,总资产(万) 42 | liquidAssets,流动资产 43 | fixedAssets,固定资产 44 | reserved,公积金 45 | reservedPerShare,每股公积金 46 | eps,每股收益 47 | bvps,每股净资 48 | pb,市净率 49 | timeToMarket,上市日期 50 | 51 | 由于目前暂时没有找到能便捷获取股本等信息的web接口,现在是以直接读取文件(data/all.csv)的方式实现,所以需要定期更新。或者按以上columns自行从行情软件导出数据。 52 | 53 | :: 54 | 55 | import tushare as ts 56 | 57 | ts.get_stock_basics() 58 | 59 | 结果显示: 60 | 61 | :: 62 | 63 | name industry area pe outstanding totals totalAssets 64 | code 65 | 600606 金丰投资 房产服务 上海 0.00 51832.01 51832.01 744930.44 66 | 002285 世联行 房产服务 深圳 71.04 76352.17 76377.60 411595.28 67 | 000861 海印股份 房产服务 广东 126.20 83775.50 118413.84 730716.56 68 | 000526 银润投资 房产服务 福建 2421.16 9619.50 9619.50 20065.32 69 | 000056 深国商 房产服务 深圳 0.00 14305.55 26508.14 787195.94 70 | 600895 张江高科 园区开发 上海 171.60 154868.95 154868.95 1771040.38 71 | 600736 苏州高新 园区开发 江苏 48.68 105788.15 105788.15 2125485.75 72 | 600663 陆家嘴 园区开发 上海 47.63 135808.41 186768.41 4562074.50 73 | 600658 电子城 园区开发 北京 19.39 58009.73 58009.73 431300.19 74 | 600648 外高桥 园区开发 上海 65.36 81022.34 113534.90 2508100.75 75 | 600639 浦东金桥 园区开发 上海 57.28 65664.88 92882.50 1241577.00 76 | 600604 市北高新 园区开发 上海 692.87 33352.42 56644.92 329289.50 77 | 78 | 如果是使用自己的数据,只要表头与默认文件格式一致,可设定文件路径的方式读入,例如:ts.get\_stock\_basics('c:\\all\_stocks.csv') 79 | 80 | 业绩报告(主表) 81 | ---------------- 82 | 83 | 按年度、季度获取业绩报表数据。数据获取需要一定的时间,网速取决于您的网速,请耐心等待。结果返回的数据属性说明如下: 84 | 85 | :: 86 | 87 | code,代码 88 | name,名称 89 | eps,每股收益 90 | eps_yoy,每股收益同比(%) 91 | bvps,每股净资产 92 | roe,净资产收益率(%) 93 | epcf,每股现金流量(元) 94 | net_profits,净利润(万元) 95 | profits_yoy,净利润同比(%) 96 | distrib,分配方案 97 | report_date,发布日期 98 | 99 | 调用方法: 100 | 101 | :: 102 | 103 | #获取2014年第3季度的业绩报表数据 104 | ts.get_report_data(2014,3) 105 | 106 | 结果返回: 107 | 108 | :: 109 | 110 | code name eps eps_yoy bvps roe epcf net_profits \ 111 | 0 601069 西部黄金 -- -- 0 0 0 4801.01 112 | 1 300419 浩丰科技 1.15 -- 7.25 16.9 -0.67 3534.9 113 | 2 603678 火炬电子 0.84 37.7 0 19.04 0 10450.38 114 | 3 300413 快乐购 0.33 -8.33 0 12.62 0 11035.65 115 | 4 603601 再升科技 0.62 43.75 0 17.73 0 3156.93 116 | 5 300364 中文在线 -- -- 0 0 0 1037.41 117 | 6 300417 南华仪器 0.61 15.09 0 11.03 0 1859.62 118 | 7 603600 永艺股份 0.58 -- 3.31 18.14 0.35 4350.88 119 | 8 002740 爱迪尔 -- -- 0 0 0 6174.52 120 | 9 300418 昆仑万维 1.2 103.39 0 25.74 0 25210.2 121 | 10 002739 万达院线 -- -- 0 0 0 67606.93 122 | 123 | 盈利能力 124 | -------- 125 | 126 | 按年度、季度获取盈利能力数据,结果返回的数据属性说明如下: 127 | 128 | :: 129 | 130 | code,代码 131 | name,名称 132 | roe,净资产收益率(%) 133 | net_profit_ratio,净利率(%) 134 | gross_profit_rate,毛利率(%) 135 | net_profits,净利润(万元) 136 | eps,每股收益 137 | business_income,营业收入(百万元) 138 | bips,每股主营业务收入(元) 139 | 140 | 调用方法: 141 | 142 | :: 143 | 144 | #获取2014年第3季度的盈利能力数据 145 | ts.get_profit_data(2014,3) 146 | 147 | 结果返回: 148 | 149 | :: 150 | 151 | code name roe net_profit_ratio gross_profit_rate net_profits \ 152 | 0 000520 *ST凤凰 9404.26 569.35 12.3743 4360.5897 153 | 1 600550 *ST天威 182.73 9.73 21.5026 292.5635 154 | 2 600816 安信信托 51.47 60.79 81.0632 820.8976 155 | 3 600381 *ST贤成 48.61 2159.06 -0.935 154.6058 156 | 4 000420 吉林化纤 46.24 11.85 6.0526 95.4614 157 | 5 600385 ST金泰 37.74 0.89 2.8962 10.775 158 | 6 000034 深信泰丰 34.43 14.54 11.5839 54.717 159 | 7 002174 游族网络 34.14 44.07 66.4404 254.5113 160 | 8 600382 广东明珠 33.38 960.9 64.1516 827.558 161 | 9 600766 园城黄金 32.77 64.56 86.1971 13.0563 162 | 10 000017 深中华A 32.55 2.09 7.1572 3.3881 163 | 164 | 营运能力 165 | -------- 166 | 167 | 按年度、季度获取营运能力数据,结果返回的数据属性说明如下: 168 | 169 | :: 170 | 171 | code,代码 172 | name,名称 173 | arturnover,应收账款周转率(次) 174 | arturndays,应收账款周转天数(天) 175 | inventory_turnover,存货周转率(次) 176 | inventory_days,存货周转天数(天) 177 | currentasset_turnover,流动资产周转率(次) 178 | currentasset_days,流动资产周转天数(天) 179 | 180 | 调用方法: 181 | 182 | :: 183 | 184 | #获取2014年第3季度的营运能力数据 185 | ts.get_operation_data(2014,3) 186 | 187 | 结果返回: 188 | 189 | :: 190 | 191 | code name arturnover arturndays inventory_turnover inventory_days \ 192 | 0 600605 汇通能源 5.7747 62.3409 102298.4414 0.0035 193 | 1 002649 博彦科技 3 120 37127.2743 0.0097 194 | 2 002707 众信旅游 20.0313 17.9719 7704.973 0.0467 195 | 3 002039 黔源电力 7.8636 45.7806 6360.2514 0.0566 196 | 4 300071 华谊嘉信 1.809 199.005 3002.9073 0.1199 197 | 5 002357 富临运业 53.2925 6.7552 2947.0547 0.1222 198 | 6 002400 省广股份 4.7772 75.358 2592.977 0.1388 199 | 7 000415 渤海租赁 8.1159 44.3574 1608.9875 0.2237 200 | 8 600897 厦门空港 5.11 70.4501 1093.2727 0.3293 201 | 9 002238 天威视讯 15.5591 23.1376 903.7139 0.3984 202 | 10 600270 外运发展 3.8491 93.5284 755.0421 0.4768 203 | 204 | 成长能力 205 | -------- 206 | 207 | 按年度、季度获取成长能力数据,结果返回的数据属性说明如下: 208 | 209 | :: 210 | 211 | code,代码 212 | name,名称 213 | mbrg,主营业务收入增长率(%) 214 | nprg,净利润增长率(%) 215 | nav,净资产增长率 216 | targ,总资产增长率 217 | epsg,每股收益增长率 218 | seg,股东权益增长率 219 | 220 | 调用方法: 221 | 222 | :: 223 | 224 | #获取2014年第3季度的成长能力数据 225 | ts.get_growth_data(2014,3) 226 | 227 | 结果返回: 228 | 229 | :: 230 | 231 | code name mbrg nprg nav targ epsg \ 232 | 0 600566 洪城股份 1479.2517 84495.0729 338.3363 200.8906 16133.3333 233 | 1 600105 永鼎股份 39.5802 24575.3671 8.6028 -34.6496 437.0968 234 | 2 600598 *ST大荒 -40.8583 7030.3488 10.3021 -38.2057 1112.5 235 | 3 600483 福能股份 354.7807 6718.1981 671.6278 1085.3524 2234.0807 236 | 4 000678 襄阳轴承 67.0414 6565.1816 5.0957 22.7679 3400 237 | 5 600822 上海物贸 -27.9066 6005.3197 1.5399 -16.5748 -102.3377 238 | 6 300134 大富科技 52.2005 5397.1468 15.932 26.7249 6200 239 | 7 600730 中国高科 137.1223 4068.2816 67.4825 15.0042 3697.0803 240 | 8 000985 大庆华科 35.0846 3106.1411 7.3651 7.2652 2920 241 | 9 300208 恒顺电气 263.2526 2510.8422 12.2521 3.4033 1421.9048 242 | 10 603077 和邦股份 34.8709 1548.3749 46.0789 60.1127 674.1935 243 | 244 | 偿债能力 245 | -------- 246 | 247 | 按年度、季度获取偿债能力数据,结果返回的数据属性说明如下: 248 | 249 | :: 250 | 251 | code,代码 252 | name,名称 253 | currentratio,流动比率 254 | quickratio,速动比率 255 | cashratio,现金比率 256 | icratio,利息支付倍数 257 | sheqratio,股东权益比率 258 | adratio,股东权益增长率 259 | 260 | 调用方法: 261 | 262 | :: 263 | 264 | #获取2014年第3季度的偿债能力数据 265 | ts.get_debtpaying_data(2014,3) 266 | 267 | 结果返回: 268 | 269 | :: 270 | 271 | code name currentratio quickratio cashratio icratio \ 272 | 0 002739 万达院线 0 0 0 0 273 | 1 000892 星美联合 3529.4671 3529.4671 352946.7104 5392.979 274 | 2 300223 北京君正 132.0156 123.7622 11339.085 105.3182 275 | 3 002348 高乐股份 46.9939 40.4353 1960.449 -543.8806 276 | 4 300333 兆日科技 41.7573 39.2037 3817.8843 -240.84 277 | 5 300042 朗科科技 28.8297 27.1808 2508.1954 -115.0911 278 | 6 300085 银之杰 31.2141 30.1414 1819.2099 63.2537 279 | 7 002279 久其软件 20.0396 19.9498 876.2346 -317.0054 280 | 8 002148 北纬通信 23.0136 22.9742 1083.1275 -294.4272 281 | 9 002322 理工监测 28.9634 27.0216 1693.6619 -112.0428 282 | 10 300288 朗玛信息 34.7063 34.7063 2475.7024 -269.7696 283 | 284 | 现金流量 285 | -------- 286 | 287 | 按年度、季度获取现金流量数据,结果返回的数据属性说明如下: 288 | 289 | :: 290 | 291 | code,代码 292 | name,名称 293 | cf_sales,经营现金净流量对销售收入比率 294 | rateofreturn,资产的经营现金流量回报率 295 | cf_nm,经营现金净流量与净利润的比率 296 | cf_liabilities,经营现金净流量对负债比率 297 | cashflowratio,现金流量比率 298 | 299 | 调用方法: 300 | 301 | :: 302 | 303 | #获取2014年第3季度的现金流量数据 304 | ts.get_cashflow_data(2014,3) 305 | 306 | 结果返回: 307 | 308 | :: 309 | 310 | code name cf_sales rateofreturn cf_nm cf_liabilities \ 311 | 0 600291 西水股份 236.89 0.4004 25.4636 0.5169 312 | 1 600485 信威集团 11.7365 0.1141 474.5382 0.5092 313 | 2 600683 京投银泰 10.4481 0.0816 0 0.0879 314 | 3 000712 锦龙股份 9.8521 0.0338 1.1299 0.0495 315 | 4 600715 松辽汽车 8.7834 0.0647 0 0.0635 316 | 5 300059 东方财富 5.7247 0.4412 30.3246 0.7406 317 | 6 000668 荣丰控股 4.52 0.0221 0 0.0392 318 | 7 600773 西藏城投 2.6402 0.1763 56.2188 0.2015 319 | 8 000068 华控赛格 2.2098 0.1357 0 0.1874 320 | 9 600215 长春经开 1.9857 0.1104 0 0.2359 321 | 10 300156 神雾环保 1.6736 0.0509 13.1981 0.1571 322 | -------------------------------------------------------------------------------- /tushare/docs/index.rst: -------------------------------------------------------------------------------- 1 | .. tushare documentation master file, created by Jimmy Liu 2 | 3 | .. currentmodule:: tushare 4 | 5 | .. highlightlang:: python 6 | 7 | 8 | 前言 9 | ==== 10 | 11 | **TuShare是一个免费、开源的python财经数据接口包。**\ 主要实现对股票等金融数据从\ **数据采集**\ 、\ **清洗加工** 12 | 到 13 | **数据存储**\ 的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据,为他们在数据来源方面极大地减轻工作量,使他们更加专注于策略和模型的研究与实现上。考虑到Python 14 | pandas包在金融量化分析中体现出的优势,TuShare返回的绝大部分的数据格式都是pandas 15 | DataFrame类型,非常便于用pandas/NumPy/Matplotlib进行数据分析和可视化。当然,如果您习惯了用Excel或者关系型数据库做分析,您也可以通过TuShare的数据存储功能,将数据全部保存到本地后进行分析。应一些用户的请求,从0.2.5版本开始,TuShare同时兼容Python 16 | 2.x和Python 17 | 3.x,对部分代码进行了重构,并优化了一些算法,确保数据获取的高效和稳定。 18 | 19 | TuShare从发布到现在,已经帮助很多用户在数据方面降低了工作压力,同时也得到很多用户的反馈,TuShare将一如既往的用免费和开源的形式分享出来,希望对有需求的人带来一些帮助。如果您觉得TuShare好用并有所收获,请通过\ **微博**\ 、微信或者网站\ **博客**\ 的方式分享出去,让更多的人了解和使用它,使它能在大家的使用过程中逐步得到改进和提升。TuShare还在不断的完善和优化,后期将逐步增加港股、期货、外汇和基金方面的数据,所以,您的支持和肯定才是TuShare坚持下去的动力。 20 | 21 | TuShare的数据主要来源于网络,如果在使用过程碰到数据无法获取或发生数据错误的情况,可以通过\ **Email:jimmysoa@sina.cn 22 | QQ:52799046** 23 | 联系我,如果有什么好的建议和意见,也请及时联系我,在此谢过。如果在pandas/NumPy技术上有问题,欢迎加入“pandas数据分析”QQ群:297882961,我会和大家一起为您解决。 24 | 25 | .. figure:: _static/main_pic_min.png 26 | :alt: 27 | 28 | 致谢 29 | ---- 30 | 31 | - 感谢\ `新浪财经 `__\ 、\ `凤凰财经 `__\ 、上交所和深交所提供数据 32 | - 感谢深圳大学经济学院研究生\ **邓志浩**\ 的测试和校对 33 | - 感谢上海纽约大学波动研究所\ `赵志强 `__\ 的审阅 34 | - 感谢在QQ、微博和Email里提出意见和建议的很多个不知道名字的朋友们 35 | - 特别感谢对TuShare进行过捐助的朋友,是你们让我一直保持着更加努力和认真的做事,也让我学会用感恩的心去做好每一件事。 36 | 37 | 使用对象 38 | -------- 39 | 40 | - 量化投资分析师(Quant) 41 | - 对金融市场进行大数据分析的企业和个人 42 | - 开发以证券为基础的金融类产品和解决方案的公司 43 | - 正在学习利用python进行数据分析的人 44 | 45 | 【注:最近有人问到说TuShare不方便看行情,我想说的是,TuShare不是普通炒股者用的软件,而是为那些有兴趣做股票期货数据分析的人提供pandas矩阵数据的工具,至于能不能用来炒股以及效果如何,就看个人的能力了】 46 | 47 | 使用前提 48 | -------- 49 | 50 | - 安装Python 51 | - 安装pandas 52 | 53 | 建议安装Anaconda(http://www.continuum.io/downloads),一次安装包括了Python环境和全部依赖包,减少问题出现的几率。 54 | 55 | 下载安装 56 | -------- 57 | 58 | - 方式1:pip install tushare 59 | - 方式2:访问\ https://pypi.python.org/pypi/tushare/\ 下载安装 60 | 61 | 版本升级 62 | -------- 63 | 64 | - pip install tushare --upgrade 65 | 66 | 查看当前版本的方法: 67 | 68 | :: 69 | 70 | import tushare 71 | 72 | print tushare.__version__ 73 | 74 | 版本信息 75 | -------- 76 | 77 | 0.2.9 2015/05/21 78 | 79 | - 新增上海银行间同业拆放利率模块 80 | - 银行间同业拆放利率(Shibor) 81 | - Shibor银行报价数据 82 | - Shibor均值数据 83 | - 贷款基础利率(LPR) 84 | - 贷款基础利率均值数据 85 | - 基本面模块接口优化 86 | - 历史某一阶段的前复权数据bug修复 87 | 88 | 0.2.8 2015/04/28 89 | 90 | - 新增大盘指数实时行情列表 91 | - 新增大盘指数历史行情数据(全部) 92 | - 新增终止上市公司列表(退市) 93 | - 新增暂停上市公司列表 94 | - 修正融资融券明细无日期的缺陷 95 | - 修正get\_h\_data部分bug 96 | 97 | 0.2.6 2015/04/22 98 | 99 | - 新增沪市融资融券列表 100 | - 新增沪市融资融券明细列表 101 | - 新增深市融资融券列表 102 | - 新增深市融资融券明细列表 103 | - 修正复权数据数据源出现null造成异常问题(对大约300个股票有影响) 104 | 105 | 0.2.5 2015/04/16 106 | 107 | - 完成python2.x和python3.x兼容性支持 108 | - 部分算法优化和代码重构 109 | - 新增中证500成份股 110 | - 新增当日分笔交易明细 111 | - 修正分配预案(高送转)bug 112 | 113 | 0.2.3 2015/04/11 114 | 115 | - 新增“新浪股吧”消息和热度 116 | - 新增新股上市数据 117 | - 修正“基本面”模块中数据重复的问题 118 | - 修正历史数据缺少一列column(数据来源问题)的bug 119 | 120 | 0.2.0 2015/03/17 121 | 122 | - 新增历史复权数据接口 123 | - 新增即时滚动新闻、信息地雷数据 124 | - 新增沪深300指数成股份及动态权重、 125 | - 新增上证50指数成份股 126 | - 修改历史行情数据类型为float 127 | 128 | 0.1.9 2015/02/06 129 | 130 | - 增加分类数据 131 | - 增加数据存储示例 132 | 133 | 0.1.6 2015/01/27 134 | 135 | - 增加了重点指数的历史和实时行情 136 | - 更新docs 137 | 138 | 0.1.5 2015/01/26 139 | 140 | - 增加基本面数据接口 141 | - 发布一版使用手册,开通\ `TuShare 142 | docs `__\ 网站 143 | 144 | 0.1.3 2015/01/13 145 | 146 | - 增加实时交易数据的获取 147 | - Done for crawling Realtime Quotes data 148 | 149 | 0.1.1 2015/01/11 150 | 151 | - 增加tick数据的获取 152 | 153 | 0.1.0 2014/12/01 154 | 155 | - 创建第一个版本 156 | - 实现个股历史数据的获取 157 | 158 | -------------- 159 | 160 | 161 | .. toctree:: 162 | :maxdepth: 2 163 | 164 | index 165 | trading 166 | reference 167 | classifying 168 | fundamental 169 | macro 170 | newsevent 171 | shibor 172 | storing 173 | donate -------------------------------------------------------------------------------- /tushare/docs/macro.rst: -------------------------------------------------------------------------------- 1 | .. contents:: 2 | :depth: 3.0 3 | .. 4 | 5 | .. \_macro: 6 | 7 | .. currentmodule:: tushare 8 | 9 | .. highlightlang:: python 10 | 11 | 宏观经济数据 12 | ============ 13 | 14 | *宏观经济数据*\ 提供国内重要的宏观经济数据,目前只提供比较常用的宏观经济数据,通过简单的接口调用可获取相应的DataFrame格式数据,大项主要包括以下类别: 15 | 16 | - 金融信息数据 17 | - 国民经济数据 18 | - 价格指数数据 19 | - 景气指数数据 20 | - 对外经济贸易数据 21 | 22 | 【注:以下所有数据的结果打印只显示了前10行记录】 23 | 24 | 存款利率 25 | -------- 26 | 27 | 调用方法: 28 | 29 | :: 30 | 31 | import tushare as ts 32 | 33 | ts.get_deposit_rate() 34 | 35 | 返回值说明: 36 | 37 | - date :变动日期 38 | - deposit\_type :存款种类 39 | - rate:利率(%) 40 | 41 | 结果显示: 42 | 43 | :: 44 | 45 | date deposit_type rate 46 | 0 2014-11-22 定活两便(定期) -- 47 | 1 2014-11-22 定期存款整存整取(半年) 2.55 48 | 2 2014-11-22 定期存款整存整取(二年) 3.35 49 | 3 2014-11-22 定期存款整存整取(三个月) 2.35 50 | 4 2014-11-22 定期存款整存整取(三年) 4.00 51 | 5 2014-11-22 定期存款整存整取(五年) 4.75 52 | 6 2014-11-22 定期存款整存整取(一年) 2.75 53 | 7 2014-11-22 活期存款(不定期) 0.35 54 | 8 2014-11-22 零存整取、整存零取、存本取息定期存款(三年) 2.80 55 | 9 2014-11-22 零存整取、整存零取、存本取息定期存款(五年) 3.00 56 | 10 2014-11-22 零存整取、整存零取、存本取息定期存款(一年) 2.60 57 | 58 | 贷款利率 59 | -------- 60 | 61 | 调用方法: 62 | 63 | :: 64 | 65 | import tushare as ts 66 | 67 | ts.get_loan_rate() 68 | 69 | 返回值说明: 70 | 71 | - date :执行日期 72 | - loan\_type :存款种类 73 | - rate:利率(%) 74 | 75 | 结果显示: 76 | 77 | :: 78 | 79 | date loan_type rate 80 | 0 2014-11-22 短期贷款(六个月以内) 5.60 81 | 1 2014-11-22 短期贷款(六个月至一年) 5.60 82 | 2 2014-11-22 中长期贷款(三至五年) 6.00 83 | 3 2014-11-22 中长期贷款(五年以上) 6.15 84 | 4 2014-11-22 中长期贷款(一至三年) 6.00 85 | 5 2014-11-22 贴现(贴现) -- 86 | 6 2014-11-22 优惠贷款(扶贫贴息贷款) -- 87 | 7 2014-11-22 优惠贷款(老少边穷发展经济贷款) -- 88 | 8 2014-11-22 优惠贷款(民政部门福利工厂贷款) -- 89 | 9 2014-11-22 优惠贷款(民族贸易及民族用品生产贷款) -- 90 | 10 2014-11-22 优惠贷款(贫困县办工业贷款) -- 91 | 92 | 存款准备金率 93 | ------------ 94 | 95 | 调用方法: 96 | 97 | :: 98 | 99 | import tushare as ts 100 | 101 | ts.get_rrr() 102 | 103 | 返回值说明: 104 | 105 | - date :变动日期 106 | - before :调整前存款准备金率(%) 107 | - now:调整后存款准备金率(%) 108 | - changed:调整幅度(%) 109 | 110 | 结果显示: 111 | 112 | :: 113 | 114 | date before now changed 115 | 0 2012-05-18 20.50 20.00 -0.50 116 | 1 2012-02-24 21.00 20.50 -0.50 117 | 2 2011-12-05 21.50 21.00 -0.50 118 | 3 2011-06-20 21.00 21.50 0.50 119 | 4 2011-05-18 20.50 21.00 0.50 120 | 5 2011-04-21 20.00 20.50 0.50 121 | 6 2011-03-25 19.50 20.00 0.50 122 | 7 2011-02-24 19.00 19.50 0.50 123 | 8 2011-01-20 18.50 19.00 0.50 124 | 9 2010-12-20 18.00 18.50 0.50 125 | 10 2010-11-29 17.50 18.00 0.50 126 | 127 | 货币供应量 128 | ---------- 129 | 130 | 调用方法: 131 | 132 | :: 133 | 134 | import tushare as ts 135 | 136 | ts.get_money_supply() 137 | 138 | 返回值说明: 139 | 140 | - month :统计时间 141 | - m2 :货币和准货币(广义货币M2)(亿元) 142 | - m2\_yoy:货币和准货币(广义货币M2)同比增长(%) 143 | - m1:货币(狭义货币M1)(亿元) 144 | - m1\_yoy:货币(狭义货币M1)同比增长(%) 145 | - m0:流通中现金(M0)(亿元) 146 | - m0\_yoy:流通中现金(M0)同比增长(%) 147 | - cd:活期存款(亿元) 148 | - cd\_yoy:活期存款同比增长(%) 149 | - qm:准货币(亿元) 150 | - qm\_yoy:准货币同比增长(%) 151 | - ftd:定期存款(亿元) 152 | - ftd\_yoy:定期存款同比增长(%) 153 | - sd:储蓄存款(亿元) 154 | - sd\_yoy:储蓄存款同比增长(%) 155 | - rests:其他存款(亿元) 156 | - rests\_yoy:其他存款同比增长(%) 157 | 158 | 结果显示: 159 | 160 | :: 161 | 162 | month m2 m2_yoy m1 m1_yoy m0 m0_yoy cd \ 163 | 0 2014.12 1228374.81 12.20 348056.41 3.20 60259.53 2.90 287796.88 164 | 1 2014.11 1208605.95 12.30 335114.13 3.20 58438.53 3.50 276675.60 165 | 2 2014.10 1199236.31 12.60 329617.73 3.20 57691.64 3.80 271926.09 166 | 3 2014.9 1202051.41 12.90 327220.21 4.80 58844.99 4.20 268375.22 167 | 4 2014.8 1197499.08 12.80 332023.23 5.70 57997.61 5.60 274025.62 168 | 5 2014.7 1194249.24 13.50 331347.32 6.70 57346.50 5.40 274000.81 169 | 6 2014.6 1209587.20 14.70 341487.45 8.90 56951.05 5.30 284536.39 170 | 7 2014.5 1182300.32 13.40 327835.25 5.70 58051.11 6.70 269788.46 171 | 8 2014.4 1168812.67 13.20 324482.52 5.50 58615.54 5.40 265866.98 172 | 9 2014.3 1160687.38 12.10 327683.74 5.40 58329.30 5.20 269354.44 173 | 10 2014.2 1131760.83 13.30 316625.11 6.90 62320.95 3.30 254304.16 174 | 175 | 货币供应量(年底余额) 176 | -------------------- 177 | 178 | 调用方法: 179 | 180 | :: 181 | 182 | import tushare as ts 183 | 184 | ts.get_money_supply_bal() 185 | 186 | 返回值说明: 187 | 188 | - year :统计年度 189 | - m2 :货币和准货币(亿元) 190 | - m1:货币(亿元) 191 | - m0:流通中现金(亿元) 192 | - cd:活期存款(亿元) 193 | - qm:准货币(亿元) 194 | - ftd:定期存款(亿元) 195 | - sd:储蓄存款(亿元) 196 | - rests:其他存款(亿元) 197 | 198 | 结果显示: 199 | 200 | :: 201 | 202 | year m2 m1 m0 cd qm ftd \ 203 | 0 2013 1106525.00 337291.10 58574.40 278716.60 769233.90 232696.60 204 | 1 2012 974159.50 308673.00 54659.80 254013.20 665486.50 195946.30 205 | 2 2011 851590.90 289847.70 50748.50 239099.20 561743.20 166616.00 206 | 3 2010 725774.10 266621.30 44628.20 221993.20 459152.70 105858.70 207 | 4 2009 606225.00 220001.50 38246.00 181758.50 386219.10 82284.90 208 | 5 2008 475166.60 166217.10 34219.00 131998.20 308949.50 60103.10 209 | 6 2007 403442.20 152560.10 30375.20 122184.90 250882.10 46932.50 210 | 7 2005 298755.70 107278.80 24031.70 83247.10 191476.90 33100.00 211 | 8 2004 254107.00 95969.70 21468.30 74501.40 158137.20 25382.20 212 | 9 2003 221222.80 84118.60 19746.00 64372.60 137104.30 20940.40 213 | 10 2002 185007.00 70881.80 17278.00 53603.80 114125.20 16433.80 214 | 215 | 国内生产总值(年度) 216 | ------------------ 217 | 218 | 调用方法: 219 | 220 | :: 221 | 222 | import tushare as ts 223 | 224 | ts.get_gdp_year() 225 | 226 | 返回值说明: 227 | 228 | - year :统计年度 229 | - gdp :国内生产总值(亿元) 230 | - pc\_gdp :人均国内生产总值(元) 231 | - gnp :国民生产总值(亿元) 232 | - pi :第一产业(亿元) 233 | - si :第二产业(亿元) 234 | - industry :工业(亿元) 235 | - cons\_industry :建筑业(亿元) 236 | - ti :第三产业(亿元) 237 | - trans\_industry :交通运输仓储邮电通信业(亿元) 238 | - lbdy :批发零售贸易及餐饮业(亿元) 239 | 240 | 结果显示: 241 | 242 | :: 243 | 244 | year gdp pc_gdp gnp pi si industry \ 245 | 0 2014 636463.00 NaN NaN 58332.00 271392.00 NaN 246 | 1 2013 588019.00 41907.59 NaN 55322.00 256810.00 210689.42 247 | 2 2012 519470.10 38459.47 NaN 52373.63 235161.99 199670.66 248 | 3 2011 473104.05 35197.79 NaN 47486.21 220412.81 188470.15 249 | 4 2010 401202.00 29992.00 403260.00 40533.60 187581.42 160867.01 250 | 5 2009 340902.80 25608.00 341401.50 35226.00 157638.80 135239.90 251 | 6 2008 314045.40 23708.00 315274.70 33702.00 149003.40 130260.20 252 | 7 2007 265810.30 20169.00 266411.00 28627.00 125831.40 110534.90 253 | 8 2006 216314.43 16499.70 215904.41 24040.00 103719.54 91310.94 254 | 9 2005 184937.37 14185.36 183617.37 22420.00 87598.09 77230.78 255 | 10 2004 159878.34 12335.58 159453.60 21412.73 73904.31 65210.03 256 | 257 | 国内生产总值(季度) 258 | ------------------ 259 | 260 | 调用方法: 261 | 262 | :: 263 | 264 | import tushare as ts 265 | 266 | ts.get_gdp_quarter() 267 | 268 | 返回值说明: 269 | 270 | - quarter :季度 271 | - gdp :国内生产总值(亿元) 272 | - gdp\_yoy :国内生产总值同比增长(%) 273 | - pi :第一产业增加值(亿元) 274 | - pi\_yoy:第一产业增加值同比增长(%) 275 | - si :第二产业增加值(亿元) 276 | - si\_yoy :第二产业增加值同比增长(%) 277 | - ti :第三产业增加值(亿元) 278 | - ti\_yoy :第三产业增加值同比增长(%) 279 | 280 | 结果显示: 281 | 282 | :: 283 | 284 | quarter gdp gdp_yoy pi pi_yoy si si_yoy \ 285 | 0 2014.4 636463.00 7.40 58332.00 4.10 271392.00 7.30 286 | 1 2014.3 419908.00 7.40 37996.00 4.20 185787.00 7.40 287 | 2 2014.2 269044.09 7.42 19812.00 3.90 123871.33 7.41 288 | 3 2014.1 128212.71 7.36 7775.68 3.50 57587.49 7.34 289 | 4 2013.4 568845.21 7.67 56957.00 4.00 249684.42 7.85 290 | 5 2013.3 387100.24 7.68 35669.00 3.40 175117.83 7.85 291 | 6 2013.2 248024.45 7.59 18622.00 3.00 116955.37 7.62 292 | 7 2013.1 118862.08 7.74 7427.00 3.40 54528.34 7.75 293 | 8 2012.4 519470.10 7.65 52373.63 4.55 235161.99 7.92 294 | 9 2012.3 353741.55 7.56 33085.87 4.25 165316.31 7.90 295 | 10 2012.2 228003.09 7.68 17469.87 4.35 110785.17 8.16 296 | 297 | 三大需求对GDP贡献 298 | ----------------- 299 | 300 | 调用方法: 301 | 302 | :: 303 | 304 | import tushare as ts 305 | 306 | ts.get_gdp_for() 307 | 308 | 返回值说明: 309 | 310 | - year :统计年度 311 | - end\_for :最终消费支出贡献率(%) 312 | - for\_rate :最终消费支出拉动(百分点) 313 | - asset\_for :资本形成总额贡献率(%) 314 | - asset\_rate:资本形成总额拉动(百分点) 315 | - goods\_for :货物和服务净出口贡献率(%) 316 | - goods\_rate :货物和服务净出口拉动(百分点) 317 | 318 | 结果显示: 319 | 320 | :: 321 | 322 | year end_for for_rate asset_for asset_rate goods_for goods_rate 323 | 0 2013 50.0 3.9 54.4 4.2 -4.4 -0.3 324 | 1 2012 55.1 4.2 47.0 3.6 -2.1 -0.1 325 | 2 2011 56.5 5.3 47.7 4.4 -4.2 -0.4 326 | 3 2010 43.1 4.5 52.9 5.5 4.0 0.4 327 | 4 2009 49.8 4.6 87.6 8.1 -37.4 -3.5 328 | 5 2008 44.2 4.2 47.0 4.5 8.8 0.9 329 | 6 2007 39.6 5.6 42.4 6.0 18.0 2.6 330 | 7 2006 40.4 5.1 43.6 5.5 16.0 2.1 331 | 8 2005 38.7 4.4 38.5 4.3 22.8 2.6 332 | 9 2004 39.5 4.0 54.5 5.5 6.0 0.6 333 | 10 2003 35.8 3.6 63.2 6.3 1.0 0.1 334 | 335 | 三大产业对GDP拉动 336 | ----------------- 337 | 338 | 调用方法: 339 | 340 | :: 341 | 342 | import tushare as ts 343 | 344 | ts.get_gdp_pull() 345 | 346 | 返回值说明: 347 | 348 | - year :统计年度 349 | - gdp\_yoy :国内生产总值同比增长(%) 350 | - pi :第一产业拉动率(%) 351 | - si :第二产业拉动率(%) 352 | - industry:其中工业拉动(%) 353 | - ti :第三产业拉动率(%) 354 | 355 | 结果显示: 356 | 357 | :: 358 | 359 | year gdp_yoy pi si industry ti 360 | 0 2013 7.7 0.4 3.7 3.1 3.6 361 | 1 2012 7.7 0.4 3.7 3.1 3.5 362 | 2 2011 9.3 0.4 4.8 4.2 4.1 363 | 3 2010 10.4 0.4 5.9 5.1 4.1 364 | 4 2009 9.2 0.4 4.8 3.7 4.0 365 | 5 2008 9.6 0.6 4.7 4.2 4.3 366 | 6 2007 14.2 0.4 7.2 6.2 6.6 367 | 7 2006 12.7 0.6 6.3 5.4 5.7 368 | 8 2005 11.3 0.6 5.8 4.9 4.9 369 | 9 2004 10.1 0.8 5.3 4.8 4.0 370 | 10 2003 10.0 0.3 5.9 5.2 3.8 371 | 372 | 三大产业贡献率 373 | -------------- 374 | 375 | 调用方法: 376 | 377 | :: 378 | 379 | import tushare as ts 380 | 381 | ts.get_gdp_contrib() 382 | 383 | 返回值说明: 384 | 385 | - year :统计年度 386 | - gdp\_yoy :国内生产总值 387 | - pi :第一产业献率(%) 388 | - si :第二产业献率(%) 389 | - industry:其中工业献率(%) 390 | - ti :第三产业献率(%) 391 | 392 | 结果显示: 393 | 394 | :: 395 | 396 | year gdp_yoy pi si industry ti 397 | 0 2013 100 4.88 48.28 39.86 46.84 398 | 1 2012 100 5.72 48.71 40.59 45.56 399 | 2 2011 100 4.61 51.61 44.67 43.77 400 | 3 2010 100 3.85 56.84 48.54 39.32 401 | 4 2009 100 4.48 51.94 40.01 43.58 402 | 5 2008 100 5.73 49.25 43.40 45.02 403 | 6 2007 100 2.99 50.70 44.03 46.31 404 | 7 2006 100 4.80 50.00 42.40 45.20 405 | 8 2005 100 5.60 51.10 43.40 43.30 406 | 9 2004 100 7.90 52.20 47.70 39.90 407 | 10 2003 100 3.40 58.50 51.90 38.10 408 | 409 | 居民消费价格指数 410 | ---------------- 411 | 412 | 调用方法: 413 | 414 | :: 415 | 416 | import tushare as ts 417 | 418 | ts.get_cpi() 419 | 420 | 返回值说明: 421 | 422 | - month :统计月份 423 | - cpi :价格指数 424 | 425 | 结果显示: 426 | 427 | :: 428 | 429 | month cpi 430 | 0 2014.12 101.51 431 | 1 2014.11 101.44 432 | 2 2014.10 101.60 433 | 3 2014.9 101.63 434 | 4 2014.8 101.99 435 | 5 2014.7 102.29 436 | 6 2014.6 102.34 437 | 7 2014.5 102.48 438 | 8 2014.4 101.80 439 | 9 2014.3 102.38 440 | 10 2014.2 101.95 441 | 442 | 工业品出厂价格指数 443 | ------------------ 444 | 445 | 调用方法: 446 | 447 | :: 448 | 449 | import tushare as ts 450 | 451 | ts.get_ppi() 452 | 453 | 返回值说明: 454 | 455 | - month :统计月份 456 | - ppiip :工业品出厂价格指数 457 | - ppi :生产资料价格指数 458 | - qm:采掘工业价格指数 459 | - rmi:原材料工业价格指数 460 | - pi:加工工业价格指数 461 | - cg:生活资料价格指数 462 | - food:食品类价格指数 463 | - clothing:衣着类价格指数 464 | - roeu:一般日用品价格指数 465 | - dcg:耐用消费品价格指数 466 | 467 | 结果显示: 468 | 469 | :: 470 | 471 | month ppiip ppi qm rmi pi cg food clothing \ 472 | 0 2014.12 96.68 95.71 86.80 93.64 97.49 99.84 99.71 100.57 473 | 1 2014.11 97.31 96.51 89.35 95.31 97.75 99.87 99.85 100.50 474 | 2 2014.10 97.76 97.05 91.13 96.32 97.95 100.04 100.17 100.51 475 | 3 2014.9 98.20 97.61 93.32 97.28 98.17 100.11 100.35 100.65 476 | 4 2014.8 98.80 98.35 95.56 98.52 98.55 100.24 100.62 100.67 477 | 5 2014.6 98.89 98.47 96.00 98.54 98.69 100.23 100.69 100.79 478 | 6 2014.5 NaN 98.05 NaN 97.96 98.38 100.17 100.41 100.82 479 | 7 2014.4 98.00 97.39 93.94 96.94 97.93 99.94 100.08 100.73 480 | 8 2014.3 97.70 97.05 93.34 96.19 97.79 99.79 99.78 100.83 481 | 9 2014.2 97.98 97.46 94.67 96.78 98.03 99.67 99.70 100.77 482 | 10 2014.1 98.36 97.95 95.95 97.52 98.34 99.65 NaN 100.72 483 | -------------------------------------------------------------------------------- /tushare/docs/preface.rst: -------------------------------------------------------------------------------- 1 | .. contents:: 2 | :depth: 3.0 3 | .. 4 | 5 | .. \_preface: 6 | 7 | .. currentmodule:: tushare 8 | 9 | .. highlightlang:: python 10 | 11 | 前言 12 | ==== 13 | 14 | **TuShare是一个免费、开源的python财经数据接口包。**\ 主要实现对股票等金融数据从\ **数据采集**\ 、\ **清洗加工** 15 | 到 16 | **数据存储**\ 的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据,为他们在数据来源方面极大地减轻了工作量,使他们更加专注于策略和模型的研究与实现上。考虑到Python 17 | pandas包在金融量化分析中体现出的优势,TuShare返回的绝大部分的数据格式都是pandas 18 | DataFrame类型,非常便于用pandas/NumPy/Matplotlib进行数据分析和可视化。当然,如果您习惯了用Excel或者关系型数据库做分析,您也可以通过TuShare的数据存储功能,将数据全部保存到本地后进行分析。应一些用户的请求,从0.2.5版本开始,TuShare同时兼容Python 19 | 2.x和Python 20 | 3.x,对部分代码进行了重构,并优化了一些算法,确保数据获取的高效和稳定。 21 | 22 | TuShare从发布到现在,已经帮助很多用户在数据方面降低了工作压力,同时也得到很多用户的反馈,TuShare将一如既往的用免费和开源的形式分享出来,希望对有需求的人带来一些帮助。如果您觉得TuShare好用并有所收获,请通过\ **微博**\ 、微信或者网站\ **博客**\ 的方式分享出去,让更多的人了解和使用它,使它能在大家的使用过程中逐步得到改进和提升。TuShare还在不断的完善和优化,后期将逐步增加港股、期货、外汇和基金方面的数据,所以,您的支持和肯定才是TuShare坚持下去的动力。 23 | 24 | TuShare的数据主要来源于网络,如果在使用过程碰到数据无法获取或发生数据错误的情况,可以通过\ **Email:jimmysoa@sina.cn 25 | QQ:52799046** 26 | 联系我,如果有什么好的建议和意见,也请及时联系我,在此谢过。如果在pandas/NumPy技术上有问题,欢迎加入“pandas数据分析”QQ群:297882961,我会和大家一起帮忙为您解决。 27 | 28 | .. figure:: _static/main_pic_min.png 29 | :alt: 30 | 31 | 致谢 32 | ---- 33 | 34 | - 感谢\ `新浪财经 `__\ 、\ `凤凰财经 `__\ 、上交所和深交所提供数据 35 | - 感谢深圳大学经济学院研究生\ **邓志浩**\ 的测试和校对 36 | - 感谢上海纽约大学波动研究所\ `赵志强 `__\ 的审阅 37 | - 感谢在QQ、微博和Email里提出意见和建议的很多个不知道名字的朋友们 38 | - 特别感谢对TuShare进行过捐助的朋友,是你们让我一直保持着更加努力和认真的做事,也让我学会用感恩的心去做好每一件事。 39 | 40 | 使用对象 41 | -------- 42 | 43 | - 量化投资分析师(Quant) 44 | - 对金融市场进行大数据分析的企业和个人 45 | - 开发以证券为基础的金融类产品和解决方案的公司 46 | - 正在学习利用python进行数据分析的人 47 | 48 | 【注:最近有人问到说TuShare不方便看行情,我想说的是,TuShare不是普通炒股者用的软件,而是为那些有兴趣做股票期货数据分析的人提供pandas矩阵数据的工具,至于能不能用来炒股以及效果如何,就看个人的能力了】 49 | 50 | 使用前提 51 | -------- 52 | 53 | - 安装Python 54 | - 安装pandas 55 | 56 | 建议安装Anaconda(http://www.continuum.io/downloads),一次安装包括了Python环境和全部依赖包,减少问题出现的几率。 57 | 58 | 下载安装 59 | -------- 60 | 61 | - 方式1:pip install tushare 62 | - 方式2:访问\ https://pypi.python.org/pypi/tushare/\ 下载安装 63 | 64 | 版本升级 65 | -------- 66 | 67 | - pip install tushare --upgrade 68 | 69 | 查看当前版本的方法: 70 | 71 | :: 72 | 73 | import tushare 74 | 75 | print tushare.__version__ 76 | 77 | 版本信息 78 | -------- 79 | 80 | 0.2.8 2015/04/28 81 | 82 | - 新增大盘指数实时行情列表 83 | - 新增大盘指数历史行情数据(全部) 84 | - 新增终止上市公司列表(退市) 85 | - 新增暂停上市公司列表 86 | - 修正融资融券明细无日期的缺陷 87 | - 修正get\_h\_data部分bug 88 | 89 | 0.2.6 2015/04/22 90 | 91 | - 新增沪市融资融券列表 92 | - 新增沪市融资融券明细列表 93 | - 新增深市融资融券列表 94 | - 新增深市融资融券明细列表 95 | - 修正复权数据数据源出现null造成异常问题(对大约300个股票有影响) 96 | 97 | 0.2.5 2015/04/16 98 | 99 | - 完成python2.x和python3.x兼容性支持 100 | - 部分算法优化和代码重构 101 | - 新增中证500成份股 102 | - 新增当日分笔交易明细 103 | - 修正分配预案(高送转)bug 104 | 105 | 0.2.3 2015/04/11 106 | 107 | - 新增“新浪股吧”消息和热度 108 | - 新增新股上市数据 109 | - 修正“基本面”模块中数据重复的问题 110 | - 修正历史数据缺少一列column(数据来源问题)的bug 111 | 112 | 0.2.0 2015/03/17 113 | 114 | - 新增历史复权数据接口 115 | - 新增即时滚动新闻、信息地雷数据 116 | - 新增沪深300指数成股份及动态权重、 117 | - 新增上证50指数成份股 118 | - 修改历史行情数据类型为float 119 | 120 | 0.1.9 2015/02/06 121 | 122 | - 增加分类数据 123 | - 增加数据存储示例 124 | 125 | 0.1.6 2015/01/27 126 | 127 | - 增加了重点指数的历史和实时行情 128 | - 更新docs 129 | 130 | 0.1.5 2015/01/26 131 | 132 | - 增加基本面数据接口 133 | - 发布一版使用手册,开通\ `TuShare 134 | docs `__\ 网站 135 | 136 | 0.1.3 2015/01/13 137 | 138 | - 增加实时交易数据的获取 139 | - Done for crawling Realtime Quotes data 140 | 141 | 0.1.1 2015/01/11 142 | 143 | - 增加tick数据的获取 144 | 145 | 0.1.0 2014/12/01 146 | 147 | - 创建第一个版本 148 | - 实现个股历史数据的获取 149 | 150 | -------------- 151 | -------------------------------------------------------------------------------- /tushare/docs/storing.rst: -------------------------------------------------------------------------------- 1 | .. contents:: 2 | :depth: 3.0 3 | .. 4 | 5 | .. \_storing: 6 | 7 | .. currentmodule:: tushare 8 | 9 | .. highlightlang:: python 10 | 11 | 数据存储 12 | ======== 13 | 14 | *数据存储*\ 模块主要是引导用户将数据保存在本地磁盘或数据库服务器上,便于后期的量化分析和回测使用,在以文件格式保存在电脑磁盘的方式上,调用的是pandas本身自带的方法,此处会罗列常用的参数和说明,另外,也会通过实例,展示操作的方法。在存入DataBase方面,也提供了简单的处理方式,本文将给出简单的python代码。 15 | 16 | - 保存为csv格式 17 | - 保存为Excel格式 18 | - 保存为HDF5文件格式 19 | - 保存为JSON格式 20 | - 存入MySQL等关系型数据库 21 | - 存入NoSQL数据库 22 | 23 | CSV文件 24 | ------- 25 | 26 | pandas的DataFrame和Series对象提供了直接保存csv文件格式的方法,通过参数设定,轻松将数据内容保存在本地磁盘。 27 | 28 | 常用参数说明: 29 | 30 | - **path\_or\_buf**: csv文件存放路径或者StringIO对象 31 | - **sep** : 文件内容分隔符,默认为,逗号 32 | - **na\_rep**: 在遇到NaN值时保存为某字符,默认为''空字符 33 | - **float\_format**: float类型的格式 34 | - **columns**: 需要保存的列,默认为None 35 | - **header**: 是否保存columns名,默认为True 36 | - **index**: 是否保存index,默认为True 37 | - **mode** : 创建新文件还是追加到现有文件,默认为新建 38 | - **encoding**: 文件编码格式 39 | - **date\_format**: 日期格式 40 | 41 | 注:在设定path时,如果目录不存在,程序会提示IOError,请先确保目录已经存在于磁盘中。 42 | 43 | 调用方法: 44 | 45 | :: 46 | 47 | import tushare as ts 48 | 49 | df = ts.get_hist_data('000875') 50 | #直接保存 51 | df.to_csv('c:/day/000875.csv') 52 | 53 | #选择保存 54 | df.to_csv('c:/day/000875.csv',columns=['open','high','low','close']) 55 | 56 | 追加数据的方式: 57 | 58 | 某些时候,可能需要将一些同类数据保存在一个大文件中,这时候就需要将数据追加在同一个文件里,简单举例如下: 59 | 60 | :: 61 | 62 | import tushare as ts 63 | import os 64 | 65 | filename = 'c:/day/bigfile.csv' 66 | for code in ['000875', '600848', '000981']: 67 | df = ts.get_hist_data(code) 68 | if os.path.exists(filename): 69 | df.to_csv(filename, mode='a', header=None) 70 | else: 71 | df.to_csv(filename) 72 | 73 | 【注:如果是不考虑header,直接df.to\_csv(filename, 74 | mode='a')即可,否则,每次循环都会把columns名称也append进去】 75 | 76 | Excel文件 77 | --------- 78 | 79 | pandas将数据保存为MicroSoft Excel文件格式。 80 | 81 | 常用参数说明: 82 | 83 | - **excel\_writer**: 文件路径或者ExcelWriter对象 84 | - **sheet\_name**:sheet名称,默认为Sheet1 85 | - **sep** : 文件内容分隔符,默认为,逗号 86 | - **na\_rep**: 在遇到NaN值时保存为某字符,默认为''空字符 87 | - **float\_format**: float类型的格式 88 | - **columns**: 需要保存的列,默认为None 89 | - **header**: 是否保存columns名,默认为True 90 | - **index**: 是否保存index,默认为True 91 | - **mode** : 创建新文件还是追加到现有文件,默认为新建 92 | - **encoding**: 文件编码格式 93 | - **startrow**: 在数据的头部留出startrow行空行 94 | - **startcol** :在数据的左边留出startcol列空列 95 | 96 | 调用方法: 97 | 98 | :: 99 | 100 | import tushare as ts 101 | 102 | df = ts.get_hist_data('000875') 103 | #直接保存 104 | df.to_excel('c:/day/000875.xlsx') 105 | 106 | #设定数据位置(从第3行,第6列开始插入数据) 107 | df.to_excel('c:/day/000875.xlsx', startrow=2,startcol=5) 108 | 109 | HDF5文件 110 | -------- 111 | 112 | pandas利用PyTables包将数据保存为HDF5格式的文件。需要确认的是,运行时PyTables包的版本需要 113 | >=3.0.0。 114 | 115 | 常用参数说明: 116 | 117 | - **path\_or\_buf**: 文件路径或者HDFStore对象 118 | - **key**:HDF5中的group标识 119 | - **mode** : 包括 {‘a’追加, ‘w’写入, ‘r’只读, 120 | ‘r+’等同于a但文件必须已经存在}, 默认是 ‘a’ 121 | - **format**:‘fixed(f)\|table(t)’,默认‘fixed’,f适合快速读写,不能追加数据 122 | t适合从文件中查找和选择数据 123 | - **append**: 适用于table(t)模式追加数据,默认Flase 124 | - **complevel**: 压缩级别1-9, 默认0 125 | - **complib**: 压缩类型{‘zlib’, ‘bzip2’, ‘lzo’, ‘blosc’, None}默认None 126 | 127 | 调用方法: 128 | 129 | :: 130 | 131 | import tushare as ts 132 | 133 | df = ts.get_hist_data('000875') 134 | df.to_hdf('c:/day/hdf.h5','000875') 135 | 136 | 方法2: 137 | 138 | :: 139 | 140 | import tushare as ts 141 | 142 | df = ts.get_hist_data('000875') 143 | store = HDFStore('c:/day/store.h5') 144 | store['000875'] = df 145 | store.close() 146 | 147 | JSON文件 148 | -------- 149 | 150 | pandas生成Json格式的文件或字符串。 151 | 152 | 常用参数说明: 153 | 154 | - **path\_or\_buf**: json文件存放路径 155 | - **orient**:json格式顺序,包括columns,records,index,split,values,默认为columns 156 | - **force\_ascii**: 将字符转ASCII,默认为True 157 | 158 | 调用方法: 159 | 160 | :: 161 | 162 | import tushare as ts 163 | 164 | df = ts.get_hist_data('000875') 165 | df.to_json('c:/day/000875.json',orient='records') 166 | 167 | #或者直接使用 168 | print df.to_json(orient='records') 169 | 170 | MySQL数据库 171 | ----------- 172 | 173 | pandas提供了将数据便捷存入关系型数据库的方法,在新版的pandas中,主要是已sqlalchemy方式与数据建立连接,支持MySQL、Postgresql、Oracle、MS 174 | SQLServer、SQLite等主流数据库。本例以MySQL数据库为代表,展示将获取到的股票数据存入数据库的方法,其他类型数据库请参考sqlalchemy官网文档的create\_engine部分。 175 | 176 | 常用参数说明: 177 | 178 | - **name**:表名,pandas会自动创建表结构 179 | - **con**\ :数据库连接,最好是用sqlalchemy创建engine的方式来替代con 180 | - **flavor**:数据库类型 {‘sqlite’, ‘mysql’}, 181 | 默认‘sqlite’,如果是engine此项可忽略 182 | - **schema**:指定数据库的schema,默认即可 183 | - **if\_exists**:如果表名已存在的处理方式 {‘fail’, ‘replace’, 184 | ‘append’},默认‘fail’ 185 | - **index**:将pandas的Index作为一列存入数据库,默认是True 186 | - **index\_label**:Index的列名 187 | - **chunksize**:分批存入数据库,默认是None,即一次性全部写人数据库 188 | - **dtype**:设定columns在数据库里的数据类型,默认是None 189 | 190 | 调用方法: 191 | 192 | :: 193 | 194 | from sqlalchemy import create_engine 195 | import tushare as ts 196 | 197 | df = ts.get_tick_data('600848', date='2014-12-22') 198 | engine = create_engine('mysql://user:passwd@127.0.0.1/db_name?charset=utf8') 199 | 200 | #存入数据库 201 | df.to_sql('tick_data',engine) 202 | 203 | #追加数据到现有表 204 | #df.to_sql('tick_data',engine,if_exists='append') 205 | 206 | .. figure:: _static/mysql_d.png 207 | :alt: 208 | 209 | MongoDB 210 | ------- 211 | 212 | pandas目前没有提供直接存入MongoDB的方法,不过依然很简单,而且方式很多,用户可根据自身的业务特点选择存储的结构方式。 213 | 214 | 使用方法: 215 | 216 | :: 217 | 218 | import pymongo 219 | import json 220 | 221 | conn = pymongo.Connection('127.0.0.1', port=27017) 222 | df = ts.get_tick_data('600848',date='2014-12-22') 223 | 224 | conn.db.tickdata.insert(json.loads(df.to_json(orient='records'))) 225 | 226 | .. figure:: _static/mongodb_d.png 227 | :alt: 228 | -------------------------------------------------------------------------------- /tushare/docs/trading.rst: -------------------------------------------------------------------------------- 1 | .. contents:: 2 | :depth: 3.0 3 | .. 4 | 5 | .. \_trading: 6 | 7 | .. currentmodule:: tushare 8 | 9 | .. highlightlang:: python 10 | 11 | 交易数据 12 | ======== 13 | 14 | *交易类数据*\ 提供股票的交易行情数据,通过简单的接口调用可获取相应的DataFrame格式数据,主要包括以下类别: 15 | 16 | - 历史行情数据 17 | - 复权历史数据 18 | - 实时行情数据 19 | - 历史分笔数据 20 | - 实时报价数据 21 | - 当日历史分笔 22 | - 大盘指数列表 23 | 24 | 历史行情 25 | -------- 26 | 27 | 获取个股历史交易数据(包括均线数据),可以通过参数设置获取日k线、周k线、月k线,以及5分钟、15分钟、30分钟和60分钟k线数据。本接口只能获取近3年的日线数据,适合搭配均线数据进行选股和分析,如果需要全部历史数据,请调用下一个接口get\_h\_data()。 28 | 29 | 参数说明: 30 | 31 | - **code**\ :股票代码,即6位数字代码,或者指数代码(sh=上证指数 32 | sz=深圳成指 hs300=沪深300指数 sz50=上证50 zxb=中小板 cyb=创业板) 33 | - **start**\ :开始日期,格式YYYY-MM-DD 34 | - **end**\ :结束日期,格式YYYY-MM-DD 35 | - **ktype**\ :数据类型,D=日k线 W=周 M=月 5=5分钟 15=15分钟 30=30分钟 36 | 60=60分钟,默认为D 37 | - **retry\_count**\ :当网络异常后重试次数,默认为3 38 | - **pause**:重试时停顿秒数,默认为0 39 | 40 | 返回值说明: 41 | 42 | - **date**\ :日期 43 | - **open**\ :开盘价 44 | - **high**\ :最高价 45 | - **close**\ :收盘价 46 | - **low**\ :最低价 47 | - **volume**\ :成交量 48 | - **price\_change**\ :价格变动 49 | - **p\_change**\ :涨跌幅 50 | - **ma5**\ :5日均价 51 | - **ma10**\ :10日均价 52 | - **ma20**:20日均价 53 | - **v\_ma5**:5日均量 54 | - **v\_ma10**:10日均量 55 | - **v\_ma20**:20日均量 56 | - **turnover**:换手率[注:指数无此项] 57 | 58 | 调用方法: 59 | 60 | :: 61 | 62 | import tushare as ts 63 | 64 | ts.get_hist_data('600848') #一次性获取全部日k线数据 65 | 66 | 结果显示: 67 | 68 | :: 69 | 70 | open high close low volume p_change ma5 \ 71 | date 72 | 2012-01-11 6.880 7.380 7.060 6.880 14129.96 2.62 7.060 73 | 2012-01-12 7.050 7.100 6.980 6.900 7895.19 -1.13 7.020 74 | 2012-01-13 6.950 7.000 6.700 6.690 6611.87 -4.01 6.913 75 | 2012-01-16 6.680 6.750 6.510 6.480 2941.63 -2.84 6.813 76 | 2012-01-17 6.660 6.880 6.860 6.460 8642.57 5.38 6.822 77 | 2012-01-18 7.000 7.300 6.890 6.880 13075.40 0.44 6.788 78 | 2012-01-19 6.690 6.950 6.890 6.680 6117.32 0.00 6.770 79 | 2012-01-20 6.870 7.080 7.010 6.870 6813.09 1.74 6.832 80 | 81 | ma10 ma20 v_ma5 v_ma10 v_ma20 turnover 82 | date 83 | 2012-01-11 7.060 7.060 14129.96 14129.96 14129.96 0.48 84 | 2012-01-12 7.020 7.020 11012.58 11012.58 11012.58 0.27 85 | 2012-01-13 6.913 6.913 9545.67 9545.67 9545.67 0.23 86 | 2012-01-16 6.813 6.813 7894.66 7894.66 7894.66 0.10 87 | 2012-01-17 6.822 6.822 8044.24 8044.24 8044.24 0.30 88 | 2012-01-18 6.833 6.833 7833.33 8882.77 8882.77 0.45 89 | 2012-01-19 6.841 6.841 7477.76 8487.71 8487.71 0.21 90 | 2012-01-20 6.863 6.863 7518.00 8278.38 8278.38 0.23 91 | 92 | 设定历史数据的时间: 93 | 94 | :: 95 | 96 | ts.get_hist_data('600848',start='2015-01-05',end='2015-01-09') 97 | 98 | open high close low volume p_change ma5 ma10 \ 99 | date 100 | 2015-01-05 11.160 11.390 11.260 10.890 46383.57 1.26 11.156 11.212 101 | 2015-01-06 11.130 11.660 11.610 11.030 59199.93 3.11 11.182 11.155 102 | 2015-01-07 11.580 11.990 11.920 11.480 86681.38 2.67 11.366 11.251 103 | 2015-01-08 11.700 11.920 11.670 11.640 56845.71 -2.10 11.516 11.349 104 | 2015-01-09 11.680 11.710 11.230 11.190 44851.56 -3.77 11.538 11.363 105 | ma20 v_ma5 v_ma10 v_ma20 turnover 106 | date 107 | 2015-01-05 11.198 58648.75 68429.87 97141.81 1.59 108 | 2015-01-06 11.382 54854.38 63401.05 98686.98 2.03 109 | 2015-01-07 11.543 55049.74 61628.07 103010.58 2.97 110 | 2015-01-08 11.647 57268.99 61376.00 105823.50 1.95 111 | 2015-01-09 11.682 58792.43 60665.93 107924.27 1.54 112 | 113 | 其他: 114 | 115 | :: 116 | 117 | ts.get_hist_data('600848',ktype='W') #获取周k线数据 118 | ts.get_hist_data('600848',ktype='M') #获取月k线数据 119 | ts.get_hist_data('600848',ktype='5') #获取5分钟k线数据 120 | ts.get_hist_data('600848',ktype='15') #获取15分钟k线数据 121 | ts.get_hist_data('600848',ktype='30') #获取30分钟k线数据 122 | ts.get_hist_data('600848',ktype='60') #获取60分钟k线数据 123 | ts.get_hist_data('sh')#获取上证指数k线数据,其它参数与个股一致,下同 124 | ts.get_hist_data('sz')#获取深圳成指k线数据 125 | ts.get_hist_data('hs300')#获取沪深300指数k线数据 126 | ts.get_hist_data('sz50')#获取上证50指数k线数据 127 | ts.get_hist_data('zxb')#获取中小板指数k线数据 128 | ts.get_hist_data('cyb')#获取创业板指数k线数据 129 | 130 | 复权数据 131 | -------- 132 | 133 | 获取历史复权数据,分为前复权和后复权数据,接口提供股票上市以来所有历史数据,默认为前复权。如果不设定开始和结束日期,则返回近一年的复权数据,从性能上考虑,推荐设定开始日期和结束日期,而且最好不要超过三年以上,获取全部历史数据,请分年段分步获取,取到数据后,请及时在本地存储。获取个股首个上市日期,请参考以下方法: 134 | 135 | :: 136 | 137 | df = ts.get_stock_basics() 138 | date = df.ix['600848']['timeToMarket'] #上市日期YYYYMMDD 139 | 140 | 本接口还提供大盘指数的全部历史数据,调用时,请务必设定index参数为True,由于大盘指数不存在复权的问题,故可以忽略autype参数。 141 | 142 | :: 143 | 144 | ts.get_h_data('002337') #前复权 145 | ts.get_h_data('002337',autype='hfq') #后复权 146 | ts.get_h_data('002337',autype=None) #不复权 147 | ts.get_h_data('002337',start='2015-01-01',end='2015-03-16') #两个日期之间的前复权数据 148 | 149 | ts.get_h_data('399106', index=True) #深圳综合指数 150 | 151 | 参数说明: 152 | 153 | - **code**:string,股票代码 e.g. 600848 154 | - **start**:string,开始日期 format:YYYY-MM-DD 为空时取当前日期 155 | - **end**:string,结束日期 format:YYYY-MM-DD 为空时取去年今日 156 | - **autype**:string,复权类型,qfq-前复权 hfq-后复权 157 | None-不复权,默认为qfq 158 | - **index**:Boolean,是否是大盘指数,默认为False 159 | - **retry\_count** : int, 默认3,如遇网络等问题重复执行的次数 160 | - **pause** : int, 默认 161 | 0,重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 162 | 163 | 返回值说明: 164 | 165 | - **date** : 交易日期 (index) 166 | - **open** : 开盘价 167 | - **high** : 最高价 168 | - **close** : 收盘价 169 | - **low** : 最低价 170 | - **volume** : 成交量 171 | - **amount** : 成交金额 172 | 173 | 结果: 174 | 175 | :: 176 | 177 | open high close low volume amount 178 | date 179 | 2015-03-16 13.27 13.45 13.39 13.00 81212976 1073862784 180 | 2015-03-13 13.04 13.38 13.37 13.00 40548836 532739744 181 | 2015-03-12 13.29 13.95 13.28 12.96 71505720 962979904 182 | 2015-03-11 13.35 13.48 13.15 13.00 59110248 780300736 183 | 2015-03-10 13.16 13.67 13.59 12.72 105753088 1393819776 184 | 2015-03-09 13.77 14.73 14.13 13.70 139091552 1994454656 185 | 2015-03-06 12.17 13.39 13.39 12.17 89486704 1167752960 186 | 2015-03-05 12.79 12.80 12.17 12.08 26040832 966927360 187 | 2015-03-04 13.96 13.96 13.30 12.58 26636174 1060270720 188 | 2015-03-03 12.17 13.10 13.10 12.05 19290366 733336768 189 | 190 | 实时行情 191 | -------- 192 | 193 | 一次性获取当前交易所有股票的行情数据(如果是节假日,即为上一交易日,结果显示速度取决于网速) 194 | 195 | :: 196 | 197 | import tushare as ts 198 | 199 | ts.get_today_all() 200 | 201 | 返回值说明: 202 | 203 | - **code**\ :代码 204 | - **name**:名称 205 | - **changepercent**:涨跌幅 206 | - **trade**:现价 207 | - **open**:开盘价 208 | - **high**:最高价 209 | - **low**:最低价 210 | - **settlement**:昨日收盘价 211 | - **volume**:成交量 212 | - **turnoverratio**:换手率 213 | 214 | 结果显示: 215 | 216 | :: 217 | 218 | code name changepercent trade open high low settlement \ 219 | 0 002738 中矿资源 10.023 19.32 19.32 19.32 19.32 17.56 220 | 1 300410 正业科技 10.022 25.03 25.03 25.03 25.03 22.75 221 | 2 002736 国信证券 10.013 16.37 16.37 16.37 16.37 14.88 222 | 3 300412 迦南科技 10.010 31.54 31.54 31.54 31.54 28.67 223 | 4 300411 金盾股份 10.007 29.68 29.68 29.68 29.68 26.98 224 | 5 603636 南威软件 10.006 38.15 38.15 38.15 38.15 34.68 225 | 6 002664 信质电机 10.004 30.68 29.00 30.68 28.30 27.89 226 | 7 300367 东方网力 10.004 86.76 78.00 86.76 77.87 78.87 227 | 8 601299 中国北车 10.000 11.44 11.44 11.44 11.29 10.40 228 | 9 601880 大连港 10.000 5.72 5.34 5.72 5.22 5.20 229 | 230 | volume turnoverratio 231 | 0 375100 1.25033 232 | 1 85800 0.57200 233 | 2 1058925 0.08824 234 | 3 69400 0.51791 235 | 4 252220 1.26110 236 | 5 1374630 5.49852 237 | 6 6448748 9.32700 238 | 7 2025030 6.88669 239 | 8 433453523 4.28056 240 | 9 323469835 9.61735 241 | 242 | 历史分笔 243 | -------- 244 | 245 | 获取个股以往交易历史的分笔数据明细,通过分析分笔数据,可以大致判断资金的进出情况。在使用过程中,对于获取股票某一阶段的历史分笔数据,需要通过参入交易日参数并append到一个DataFrame或者直接append到本地同一个文件里。历史分笔接口只能获取当前交易日之前的数据,当日分笔历史数据请调用get\_today\_ticks()接口或者在当日18点后通过本接口获取。 246 | 247 | 参数说明: 248 | 249 | - **code**\ :股票代码,即6位数字代码 250 | - **date**\ :开始日期,格式YYYY-MM-DD 251 | - **retry\_count** : int, 默认3,如遇网络等问题重复执行的次数 252 | - **pause** : int, 默认 253 | 0,重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 254 | 255 | 调用方法: 256 | 257 | :: 258 | 259 | import tushare as ts 260 | 261 | df = ts.get_tick_data('600848',date='2014-01-09') 262 | df.head(10) 263 | 264 | 返回值说明: 265 | 266 | - **time**\ :时间 267 | - **price**\ :成交价格 268 | - **change**\ :价格变动 269 | - **volume**\ :成交手 270 | - **amount**\ :成交金额(元) 271 | - **type**\ :买卖类型【买盘、卖盘、中性盘】 272 | 273 | 结果显示: 274 | 275 | :: 276 | 277 | time price change volume amount type 278 | 0 15:00:00 6.05 -- 8 4840 卖盘 279 | 1 14:59:55 6.05 -- 50 30250 卖盘 280 | 2 14:59:35 6.05 -- 20 12100 卖盘 281 | 3 14:59:30 6.05 -0.01 165 99825 卖盘 282 | 4 14:59:20 6.06 0.01 4 2424 买盘 283 | 5 14:59:05 6.05 -0.01 2 1210 卖盘 284 | 6 14:58:55 6.06 -- 4 2424 买盘 285 | 7 14:58:45 6.06 -- 2 1212 买盘 286 | 8 14:58:35 6.06 0.01 2 1212 买盘 287 | 9 14:58:25 6.05 -0.01 20 12100 卖盘 288 | 289 | 实时分笔 290 | -------- 291 | 292 | 获取实时分笔数据,可以实时取得股票当前报价和成交信息,其中一种场景是,写一个python定时程序来调用本接口(可两三秒执行一次,性能与行情软件基本一致),然后通过DataFrame的矩阵计算实现交易监控,可实时监测交易量和价格的变化。 293 | 294 | 参数说明: 295 | 296 | - **symbols**\ :6位数字股票代码,或者指数代码(sh=上证指数 sz=深圳成指 297 | hs300=沪深300指数 sz50=上证50 zxb=中小板 cyb=创业板) 298 | 可输入的类型:str、list、set或者pandas的Series对象 299 | 300 | 调用方法: 301 | 302 | :: 303 | 304 | import tushare as ts 305 | 306 | df = ts.get_realtime_quotes('000581') #Single stock symbol 307 | df[['code','name','price','bid','ask','volume','amount','time']] 308 | 309 | 结果显示: 310 | 311 | :: 312 | 313 | code name price bid ask volume amount time 314 | 0 000581 威孚高科 31.15 31.14 31.15 8183020 253494991.16 11:30:36 315 | 316 | 返回值说明: 317 | 318 | :: 319 | 320 | 0:name,股票名字 321 | 1:open,今日开盘价 322 | 2:pre_close,昨日收盘价 323 | 3:price,当前价格 324 | 4:high,今日最高价 325 | 5:low,今日最低价 326 | 6:bid,竞买价,即“买一”报价 327 | 7:ask,竞卖价,即“卖一”报价 328 | 8:volumn,成交量 maybe you need do volumn/100 329 | 9:amount,成交金额(元 CNY) 330 | 10:b1_v,委买一(笔数 bid volume) 331 | 11:b1_p,委买一(价格 bid price) 332 | 12:b2_v,“买二” 333 | 13:b2_p,“买二” 334 | 14:b3_v,“买三” 335 | 15:b3_p,“买三” 336 | 16:b4_v,“买四” 337 | 17:b4_p,“买四” 338 | 18:b5_v,“买五” 339 | 19:b5_p,“买五” 340 | 20:a1_v,委卖一(笔数 ask volume) 341 | 21:a1_p,委卖一(价格 ask price) 342 | ... 343 | 30:date,日期; 344 | 31:time,时间; 345 | 346 | 347 | 请求多个股票方法(一次最好不要超过30个): 348 | 349 | :: 350 | 351 | #symbols from a list 352 | ts.get_realtime_quotes(['600848','000980','000981']) 353 | #from a Series 354 | ts.get_realtime_quotes(df['code'].tail(10)) #一次获取10个股票的实时分笔数据 355 | 356 | 获取实时指数: 357 | 358 | :: 359 | 360 | #上证指数 361 | ts.get_realtime_quotes('sh') 362 | #上证指数 深圳成指 沪深300指数 上证50 中小板 创业板 363 | ts.get_realtime_quotes(['sh','sz','hs300','sz50','zxb','cyb']) 364 | #或者混搭 365 | ts.get_realtime_quotes(['sh','600848']) 366 | 367 | 当日历史分笔 368 | ------------ 369 | 370 | 获取当前交易日(交易进行中使用)已经产生的分笔明细数据。 371 | 372 | 参数说明: 373 | 374 | - **code**\ :股票代码,即6位数字代码 375 | - **retry\_count** : int, 默认3,如遇网络等问题重复执行的次数 376 | - **pause** : int, 默认 377 | 0,重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 378 | 379 | 调用方法: 380 | 381 | :: 382 | 383 | import tushare as ts 384 | 385 | df = ts.get_today_ticks('601333') 386 | df.head(10) 387 | 388 | 返回值说明: 389 | 390 | - **time**\ :时间 391 | - **price**\ :当前价格 392 | - **pchange**:涨跌幅 393 | - **change**\ :价格变动 394 | - **volume**\ :成交手 395 | - **amount**\ :成交金额(元) 396 | - **type**\ :买卖类型【买盘、卖盘、中性盘】 397 | 398 | 结果显示: 399 | 400 | :: 401 | 402 | time price pchange change volume amount type 403 | 0 11:30:07 5.77 -0.52 0.00 634 366372 买盘 404 | 1 11:29:57 5.77 -0.52 0.00 216 124632 买盘 405 | 2 11:29:52 5.77 -0.52 0.00 306 176562 买盘 406 | 3 11:29:42 5.77 -0.52 0.01 159 91766 买盘 407 | 4 11:29:37 5.76 -0.69 0.00 546 314496 卖盘 408 | 5 11:29:32 5.76 -0.69 -0.01 954 549504 卖盘 409 | 6 11:29:22 5.77 -0.52 0.00 374 215798 买盘 410 | 7 11:29:17 5.77 -0.52 0.00 762 439674 买盘 411 | 8 11:29:12 5.77 -0.52 0.00 164 95182 买盘 412 | 9 11:29:07 5.77 -0.52 0.00 303 174854 买盘 413 | 414 | 大盘指数行情列表 415 | ---------------- 416 | 417 | 获取大盘指数实时行情列表,以表格的形式展示大盘指数实时行情。 418 | 419 | 调用方法: 420 | 421 | :: 422 | 423 | import tushare as ts 424 | 425 | df = ts.get_index() 426 | 427 | 返回值说明: 428 | 429 | - **code**:指数代码 430 | - **name**:指数名称 431 | - **change**:涨跌幅 432 | - **open**:开盘点位 433 | - **preclose**:昨日收盘点位 434 | - **close**:收盘点位 435 | - **high**:最高点位 436 | - **low**:最低点位 437 | - **volume**:成交量(手) 438 | - **amount**:成交金额(亿元) 439 | 440 | 结果显示: 441 | 442 | :: 443 | 444 | code name change preclose close high low \ 445 | 0 000001 上证指数 -1.13 4527.396 4476.215 4572.391 4432.904 446 | 1 000002 A股指数 -1.13 4744.093 4690.628 4791.534 4645.190 447 | 2 000003 B股指数 -2.15 403.694 395.018 405.795 392.173 448 | 3 000008 综合指数 0.79 3724.496 3753.906 3848.575 3695.817 449 | 4 000009 上证380 -2.79 7689.128 7474.305 7695.329 7398.911 450 | 5 000010 上证180 -1.13 10741.180 10619.610 10863.080 10529.900 451 | 6 000011 基金指数 -1.02 7033.291 6961.659 7058.856 6918.273 452 | 7 000012 国债指数 0.01 148.626 148.641 148.656 148.510 453 | 8 000016 上证50 -0.79 3308.454 3282.330 3370.025 3255.769 454 | 9 000017 新综指 -1.13 3826.013 3782.936 3864.307 3746.284 455 | 10 000300 沪深300 -1.37 4807.592 4741.861 4839.078 4703.567 456 | 11 399001 深证成指 -0.69 14809.424 14707.245 14979.810 14580.422 457 | 12 399002 深成指R -0.69 17193.832 17075.202 17391.652 16927.959 458 | 13 399003 成份B指 -1.93 9027.079 8853.081 9013.194 8826.048 459 | 14 399004 深证100R -1.79 5994.881 5887.414 6036.322 5832.431 460 | 15 399005 中小板指 -3.34 8935.338 8637.195 8953.813 8551.202 461 | 16 399006 创业板指 -2.17 2747.497 2687.974 2779.200 2650.425 462 | 17 399100 新 指 数 -2.77 10091.194 9811.256 10111.664 9718.085 463 | 18 399101 中小板综 -3.31 12792.057 12368.868 12800.453 12253.744 464 | 19 399106 深证综指 -2.76 2271.275 2208.561 2275.344 2187.897 465 | 20 399107 深证A指 -2.77 2375.176 2309.466 2379.507 2287.784 466 | 21 399108 深证B指 -1.77 1398.244 1373.512 1397.996 1367.343 467 | 22 399333 中小板R -3.34 9640.766 9319.085 9660.699 9226.304 468 | 23 399606 创业板R -2.16 2828.251 2767.127 2861.040 2728.472 469 | 470 | 471 | volume amount 472 | 0 767676416 10611.72 473 | 1 766188823 10599.65 474 | 2 1487592 12.07 475 | 3 263748855 3440.01 476 | 4 182628996 2531.04 477 | 5 464275133 6437.40 478 | 6 66280981 428.46 479 | 7 263420 2.74 480 | 8 266042859 3735.74 481 | 9 766077611 10596.65 482 | 10 608638545 8603.50 483 | 11 51106975785 6405.28 484 | 12 6357969430 1017.68 485 | 13 51206484 4.32 486 | 14 10418315890 1779.58 487 | 15 3071396395 830.54 488 | 16 1441659735 551.73 489 | 17 32943457787 6091.34 490 | 18 10450911278 2291.43 491 | 19 33395285515 6137.71 492 | 20 33274363870 6128.94 493 | 21 120921645 8.77 494 | 22 3071396395 830.54 495 | 23 1441659735 551.73 496 | -------------------------------------------------------------------------------- /tushare/issues/from_email.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/issues/from_email.txt -------------------------------------------------------------------------------- /tushare/issues/from_sns.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/issues/from_sns.txt -------------------------------------------------------------------------------- /tushare/requirements.txt: -------------------------------------------------------------------------------- 1 | scipy == 0.14.0 2 | matplotlib == 1.4.0 3 | cvxopt == 1.1.3 4 | 5 | -------------------------------------------------------------------------------- /tushare/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | import codecs 3 | import os 4 | import tushare 5 | 6 | def read(fname): 7 | return codecs.open(os.path.join(os.path.dirname(__file__), fname)).read() 8 | 9 | long_desc = """ 10 | TuShare 11 | =============== 12 | 13 | .. image:: https://api.travis-ci.org/waditu/tushare.png?branch=master 14 | :target: https://travis-ci.org/waditu/tushare 15 | 16 | .. image:: https://badge.fury.io/py/tushare.png 17 | :target: http://badge.fury.io/py/tushare 18 | 19 | * easy to use as most of the data returned are pandas DataFrame objects 20 | * can be easily saved as csv, excel or json files 21 | * can be inserted into MySQL or Mongodb 22 | 23 | Target Users 24 | -------------- 25 | 26 | * financial market analyst of China 27 | * learners of financial data analysis with pandas/NumPy 28 | * people who are interested in China financial data 29 | 30 | Installation 31 | -------------- 32 | 33 | pip install tushare 34 | 35 | Upgrade 36 | --------------- 37 | 38 | pip install tushare --upgrade 39 | 40 | Quick Start 41 | -------------- 42 | 43 | :: 44 | 45 | import tushare as ts 46 | 47 | ts.get_hist_data('600848') 48 | 49 | return:: 50 | 51 | open high close low volume p_change ma5 \ 52 | 53 | date 54 | 2012-01-11 6.880 7.380 7.060 6.880 14129.96 2.62 7.060 55 | 2012-01-12 7.050 7.100 6.980 6.900 7895.19 -1.13 7.020 56 | 2012-01-13 6.950 7.000 6.700 6.690 6611.87 -4.01 6.913 57 | 2012-01-16 6.680 6.750 6.510 6.480 2941.63 -2.84 6.813 58 | 2012-01-17 6.660 6.880 6.860 6.460 8642.57 5.38 6.822 59 | 2012-01-18 7.000 7.300 6.890 6.880 13075.40 0.44 6.788 60 | 2012-01-19 6.690 6.950 6.890 6.680 6117.32 0.00 6.770 61 | 2012-01-20 6.870 7.080 7.010 6.870 6813.09 1.74 6.832 62 | 63 | """ 64 | 65 | 66 | setup( 67 | name='tushare', 68 | version=tushare.__version__, 69 | description='A utility for crawling historical and Real-time Quotes data of China stocks', 70 | # long_description=read("READM.rst"), 71 | long_description = long_desc, 72 | author='Jimmy Liu', 73 | author_email='jimmysoa@sina.cn', 74 | license='BSD', 75 | url='http://tushare.org', 76 | keywords='china stock data', 77 | classifiers=['Development Status :: 4 - Beta', 78 | 'Programming Language :: Python :: 2.6', 79 | 'Programming Language :: Python :: 2.7', 80 | 'Programming Language :: Python :: 3.2', 81 | 'Programming Language :: Python :: 3.3', 82 | 'Programming Language :: Python :: 3.4', 83 | 'License :: OSI Approved :: BSD License'], 84 | packages=['tushare','tushare.stock','tushare.data','tushare.util'], 85 | package_data={'': ['*.csv']}, 86 | ) -------------------------------------------------------------------------------- /tushare/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/test/__init__.py -------------------------------------------------------------------------------- /tushare/test/billboard_test.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | ''' 3 | Created on 2015/3/14 4 | @author: Jimmy Liu 5 | ''' 6 | import unittest 7 | import tushare.stock.billboard as fd 8 | 9 | class Test(unittest.TestCase): 10 | 11 | def set_data(self): 12 | self.date = '2015-06-12' 13 | self.days = 5 14 | 15 | def test_top_list(self): 16 | self.set_data() 17 | print(fd.top_list(self.date)) 18 | 19 | def test_cap_tops(self): 20 | self.set_data() 21 | print(fd.cap_tops(self.days)) 22 | 23 | def test_broker_tops(self): 24 | self.set_data() 25 | print(fd.broker_tops(self.days)) 26 | 27 | def test_inst_tops(self): 28 | self.set_data() 29 | print(fd.inst_tops(self.days)) 30 | 31 | def test_inst_detail(self): 32 | print(fd.inst_detail()) 33 | 34 | if __name__ == "__main__": 35 | unittest.main() -------------------------------------------------------------------------------- /tushare/test/classifying_test.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | ''' 3 | Created on 2015/3/14 4 | @author: Jimmy Liu 5 | ''' 6 | import unittest 7 | import tushare.stock.classifying as fd 8 | 9 | class Test(unittest.TestCase): 10 | 11 | def set_data(self): 12 | self.code = '600848' 13 | self.start = '2015-01-03' 14 | self.end = '2015-04-07' 15 | self.year = 2014 16 | self.quarter = 4 17 | 18 | def test_get_industry_classified(self): 19 | print(fd.get_industry_classified()) 20 | 21 | def test_get_concept_classified(self): 22 | print(fd.get_concept_classified()) 23 | 24 | def test_get_area_classified(self): 25 | print(fd.get_area_classified()) 26 | 27 | def test_get_gem_classified(self): 28 | print(fd.get_gem_classified()) 29 | 30 | def test_get_sme_classified(self): 31 | print(fd.get_sme_classified()) 32 | 33 | def test_get_st_classified(self): 34 | print(fd.get_st_classified()) 35 | 36 | def test_get_hs300s(self): 37 | print(fd.get_hs300s()) 38 | 39 | def test_get_sz50s(self): 40 | print(fd.get_sz50s()) 41 | 42 | def test_get_zz500s(self): 43 | print(fd.get_zz500s()) 44 | 45 | if __name__ == "__main__": 46 | unittest.main() 47 | 48 | # suite = unittest.TestSuite() 49 | # suite.addTest(Test('test_get_gem_classified')) 50 | # unittest.TextTestRunner(verbosity=2).run(suite) 51 | -------------------------------------------------------------------------------- /tushare/test/fund_test.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | import unittest 4 | import tushare.stock.fundamental as fd 5 | 6 | class Test(unittest.TestCase): 7 | 8 | def set_data(self): 9 | self.code = '600848' 10 | self.start = '2015-01-03' 11 | self.end = '2015-04-07' 12 | self.year = 2014 13 | self.quarter = 4 14 | 15 | def test_get_stock_basics(self): 16 | print(fd.get_stock_basics()) 17 | 18 | def test_get_report_data(self): 19 | self.set_data() 20 | print(fd.get_report_data(self.year, self.quarter)) 21 | 22 | def test_get_profit_data(self): 23 | self.set_data() 24 | print(fd.get_profit_data(self.year, self.quarter)) 25 | 26 | def test_get_operation_data(self): 27 | self.set_data() 28 | print(fd.get_operation_data(self.year, self.quarter)) 29 | 30 | def test_get_growth_data(self): 31 | self.set_data() 32 | print(fd.get_growth_data(self.year, self.quarter)) 33 | 34 | def test_get_debtpaying_data(self): 35 | self.set_data() 36 | print(fd.get_debtpaying_data(self.year, self.quarter)) 37 | 38 | def test_get_cashflow_data(self): 39 | self.set_data() 40 | print(fd.get_cashflow_data(self.year, self.quarter)) 41 | 42 | if __name__ == '__main__': 43 | unittest.main() -------------------------------------------------------------------------------- /tushare/test/macro_test.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | ''' 3 | Created on 2015/3/14 4 | @author: Jimmy Liu 5 | ''' 6 | import unittest 7 | import tushare.stock.macro as fd 8 | 9 | class Test(unittest.TestCase): 10 | 11 | def test_get_gdp_year(self): 12 | print(fd.get_gdp_year()) 13 | 14 | def test_get_gdp_quarter(self): 15 | print(fd.get_gdp_quarter()) 16 | 17 | def test_get_gdp_for(self): 18 | print(fd.get_gdp_for()) 19 | 20 | def test_get_gdp_pull(self): 21 | print(fd.get_gdp_pull()) 22 | 23 | def test_get_gdp_contrib(self): 24 | print(fd.get_gdp_contrib()) 25 | 26 | def test_get_cpi(self): 27 | print(fd.get_cpi()) 28 | 29 | def test_get_ppi(self): 30 | print(fd.get_ppi()) 31 | 32 | def test_get_deposit_rate(self): 33 | print(fd.get_deposit_rate()) 34 | 35 | def test_get_loan_rate(self): 36 | print(fd.get_loan_rate()) 37 | 38 | def test_get_rrr(self): 39 | print(fd.get_rrr()) 40 | 41 | def test_get_money_supply(self): 42 | print(fd.get_money_supply()) 43 | 44 | def test_get_money_supply_bal(self): 45 | print(fd.get_money_supply_bal()) 46 | 47 | 48 | if __name__ == "__main__": 49 | #import sys;sys.argv = ['', 'Test.testName'] 50 | unittest.main() -------------------------------------------------------------------------------- /tushare/test/news_test.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | ''' 3 | Created on 2015/3/14 4 | @author: Jimmy Liu 5 | ''' 6 | import unittest 7 | import tushare.stock.newsevent as fd 8 | 9 | class Test(unittest.TestCase): 10 | 11 | def set_data(self): 12 | self.code = '600848' 13 | self.start = '2015-01-03' 14 | self.end = '2015-04-07' 15 | self.year = 2014 16 | self.quarter = 4 17 | self.top = 60 18 | self.show_content = True 19 | 20 | 21 | def test_get_latest_news(self): 22 | self.set_data() 23 | print(fd.get_latest_news(self.top, self.show_content)) 24 | 25 | def test_get_notices(self): 26 | self.set_data() 27 | df = fd.get_notices(self.code) 28 | print(fd.notice_content(df.ix[0]['url'])) 29 | 30 | def test_guba_sina(self): 31 | self.set_data() 32 | print(fd.guba_sina(self.show_content)) 33 | 34 | if __name__ == "__main__": 35 | unittest.main() -------------------------------------------------------------------------------- /tushare/test/ref_test.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | ''' 3 | Created on 2015/3/14 4 | @author: Jimmy Liu 5 | ''' 6 | import unittest 7 | from tushare.stock import reference as fd 8 | 9 | class Test(unittest.TestCase): 10 | 11 | def set_data(self): 12 | self.code = '600848' 13 | self.start = '2015-01-03' 14 | self.end = '2015-04-07' 15 | self.year = 2014 16 | self.quarter = 4 17 | self.top = 60 18 | self.show_content = True 19 | 20 | def test_profit_data(self): 21 | self.set_data() 22 | print(fd.profit_data(top=self.top)) 23 | 24 | def test_forecast_data(self): 25 | self.set_data() 26 | print(fd.forecast_data(self.year, self.quarter)) 27 | 28 | def test_xsg_data(self): 29 | print(fd.xsg_data()) 30 | 31 | def test_fund_holdings(self): 32 | self.set_data() 33 | print(fd.fund_holdings(self.year, self.quarter)) 34 | 35 | def test_new_stocksa(self): 36 | print(fd.new_stocks()) 37 | 38 | 39 | def test_sh_margin_details(self): 40 | self.set_data() 41 | print(fd.sh_margin_details(self.start, self.end, self.code)) 42 | 43 | def test_sh_margins(self): 44 | self.set_data() 45 | print(fd.sh_margins(self.start, self.end)) 46 | 47 | def test_sz_margins(self): 48 | self.set_data() 49 | print(fd.sz_margins(self.start, self.end)) 50 | 51 | def test_sz_margin_details(self): 52 | self.set_data() 53 | print(fd.sz_margin_details(self.end)) 54 | 55 | 56 | if __name__ == "__main__": 57 | unittest.main() -------------------------------------------------------------------------------- /tushare/test/shibor_test.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | import unittest 4 | import tushare.stock.shibor as fd 5 | 6 | class Test(unittest.TestCase): 7 | 8 | def set_data(self): 9 | self.year = 2014 10 | # self.year = None 11 | 12 | def test_shibor_data(self): 13 | self.set_data() 14 | fd.shibor_data(self.year) 15 | 16 | def test_shibor_quote_data(self): 17 | self.set_data() 18 | fd.shibor_quote_data(self.year) 19 | 20 | def test_shibor_ma_data(self): 21 | self.set_data() 22 | fd.shibor_ma_data(self.year) 23 | 24 | def test_lpr_data(self): 25 | self.set_data() 26 | fd.lpr_data(self.year) 27 | 28 | def test_lpr_ma_data(self): 29 | self.set_data() 30 | fd.lpr_ma_data(self.year) 31 | 32 | if __name__ == '__main__': 33 | unittest.main() -------------------------------------------------------------------------------- /tushare/test/storing_test.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | import os 4 | from sqlalchemy import create_engine 5 | from pandas.io.pytables import HDFStore 6 | import tushare as ts 7 | 8 | def csv(): 9 | df = ts.get_hist_data('000875') 10 | df.to_csv('c:/day/000875.csv',columns=['open','high','low','close']) 11 | 12 | def xls(): 13 | df = ts.get_hist_data('000875') 14 | #直接保存 15 | df.to_excel('c:/day/000875.xlsx', startrow=2,startcol=5) 16 | 17 | def hdf(): 18 | df = ts.get_hist_data('000875') 19 | # df.to_hdf('c:/day/store.h5','table') 20 | 21 | store = HDFStore('c:/day/store.h5') 22 | store['000875'] = df 23 | store.close() 24 | 25 | def json(): 26 | df = ts.get_hist_data('000875') 27 | df.to_json('c:/day/000875.json',orient='records') 28 | 29 | #或者直接使用 30 | print(df.to_json(orient='records')) 31 | 32 | def appends(): 33 | filename = 'c:/day/bigfile.csv' 34 | for code in ['000875', '600848', '000981']: 35 | df = ts.get_hist_data(code) 36 | if os.path.exists(filename): 37 | df.to_csv(filename, mode='a', header=None) 38 | else: 39 | df.to_csv(filename) 40 | 41 | def db(): 42 | df = ts.get_tick_data('600848',date='2014-12-22') 43 | engine = create_engine('mysql://root:jimmy1@127.0.0.1/mystock?charset=utf8') 44 | # db = MySQLdb.connect(host='127.0.0.1',user='root',passwd='jimmy1',db="mystock",charset="utf8") 45 | # df.to_sql('TICK_DATA',con=db,flavor='mysql') 46 | # db.close() 47 | df.to_sql('tick_data',engine,if_exists='append') 48 | 49 | def nosql(): 50 | import pymongo 51 | import json 52 | conn = pymongo.Connection('127.0.0.1', port=27017) 53 | df = ts.get_tick_data('600848',date='2014-12-22') 54 | print(df.to_json(orient='records')) 55 | 56 | conn.db.tickdata.insert(json.loads(df.to_json(orient='records'))) 57 | 58 | # print conn.db.tickdata.find() 59 | 60 | if __name__ == '__main__': 61 | nosql() -------------------------------------------------------------------------------- /tushare/test/trading_test.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | ''' 3 | Created on 2015/3/14 4 | @author: Jimmy Liu 5 | ''' 6 | import unittest 7 | import tushare.stock.trading as fd 8 | 9 | class Test(unittest.TestCase): 10 | 11 | def set_data(self): 12 | self.code = '600848' 13 | self.start = '2015-01-03' 14 | self.end = '2015-04-07' 15 | self.year = 2014 16 | self.quarter = 4 17 | 18 | def test_get_hist_data(self): 19 | self.set_data() 20 | print(fd.get_hist_data(self.code, self.start)) 21 | 22 | def test_get_tick_data(self): 23 | self.set_data() 24 | print(fd.get_tick_data(self.code, self.end)) 25 | 26 | def test_get_today_all(self): 27 | print(fd.get_today_all()) 28 | 29 | def test_get_realtime_quotesa(self): 30 | self.set_data() 31 | print(fd.get_realtime_quotes(self.code)) 32 | 33 | def test_get_h_data(self): 34 | self.set_data() 35 | print(fd.get_h_data(self.code, self.start, self.end)) 36 | 37 | def test_get_today_ticks(self): 38 | self.set_data() 39 | print(fd.get_today_ticks(self.code)) 40 | 41 | if __name__ == "__main__": 42 | #import sys;sys.argv = ['', 'Test.testName'] 43 | unittest.main() -------------------------------------------------------------------------------- /tushare/test_unittest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | UnitTest for API 3 | @author: Jimmy 4 | ''' 5 | import unittest 6 | import tushare.stock.trading as td 7 | 8 | class TestTrading(unittest.TestCase): 9 | 10 | def set_data(self): 11 | self.code = '600848' 12 | self.start = '2014-11-03' 13 | self.end = '2014-11-07' 14 | 15 | def test_tickData(self): 16 | self.set_data() 17 | td.get_tick_data(self.code, date=self.start) 18 | 19 | def test_histData(self): 20 | self.set_data() 21 | td.get_hist_data(self.code, start=self.start, end=self.end) 22 | 23 | if __name__ == "__main__": 24 | #import sys;sys.argv = ['', 'Test.testName'] 25 | unittest.main() -------------------------------------------------------------------------------- /tushare/tushare/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = '0.3.4' 2 | __author__ = 'Jimmy Liu' 3 | 4 | """ 5 | for trading data 6 | """ 7 | from tushare.stock.trading import (get_hist_data, get_tick_data, 8 | get_today_all, get_realtime_quotes, 9 | get_h_data, get_today_ticks, 10 | get_index) 11 | 12 | """ 13 | for trading data 14 | """ 15 | from tushare.stock.fundamental import (get_stock_basics, get_report_data, 16 | get_profit_data, 17 | get_operation_data, get_growth_data, 18 | get_debtpaying_data, get_cashflow_data) 19 | 20 | """ 21 | for macro data 22 | """ 23 | from tushare.stock.macro import (get_gdp_year, get_gdp_quarter, 24 | get_gdp_for, get_gdp_pull, 25 | get_gdp_contrib, get_cpi, 26 | get_ppi, get_deposit_rate, 27 | get_loan_rate, get_rrr, 28 | get_money_supply, get_money_supply_bal) 29 | 30 | """ 31 | for classifying data 32 | """ 33 | from tushare.stock.classifying import (get_industry_classified, get_concept_classified, 34 | get_area_classified, get_gem_classified, 35 | get_sme_classified, get_st_classified, 36 | get_hs300s, get_sz50s, get_zz500s, 37 | get_terminated, get_suspended) 38 | 39 | """ 40 | for macro data 41 | """ 42 | from tushare.stock.newsevent import (get_latest_news, latest_content, 43 | get_notices, notice_content, 44 | guba_sina) 45 | 46 | """ 47 | for reference 48 | """ 49 | from tushare.stock.reference import (profit_data, forecast_data, 50 | xsg_data, fund_holdings, 51 | new_stocks, sh_margins, 52 | sh_margin_details, 53 | sz_margins, sz_margin_details) 54 | 55 | """ 56 | for shibor 57 | """ 58 | from tushare.stock.shibor import (shibor_data, shibor_quote_data, 59 | shibor_ma_data, lpr_data, 60 | lpr_ma_data) 61 | 62 | """ 63 | for LHB 64 | """ 65 | from tushare.stock.billboard import (top_list, cap_tops, broker_tops, 66 | inst_tops, inst_detail) -------------------------------------------------------------------------------- /tushare/tushare/data/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = "0.0.1" -------------------------------------------------------------------------------- /tushare/tushare/datayes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/tushare/datayes/__init__.py -------------------------------------------------------------------------------- /tushare/tushare/datayes/basics.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | """ 4 | Created on 2015年7月4日 5 | @author: JimmyLiu 6 | @QQ:52799046 7 | """ 8 | from tushare.datayes import vars as vs 9 | import pandas as pd 10 | from pandas.compat import StringIO 11 | 12 | class Basics(): 13 | 14 | def __init__(self , client): 15 | self.client = client 16 | 17 | 18 | def dy_master_secID(self, ticker='000001', partyID='', 19 | cnSpell='', assetClass='', field=''): 20 | """ 21 | 证券编码及基本上市信息 22 | getSecID 23 | 输入一个或多个证券交易代码,获取证券ID,证券在数据结构中的一个唯一识别的编码; 24 | 同时可以获取输入证券的基本上市信息,如交易市场,上市状态,交易币种,ISIN编码等。 25 | """ 26 | code, result = self.client.getData(vs.SEC_ID%(ticker, partyID, 27 | cnSpell, assetClass, field)) 28 | return _ret_data(code, result) 29 | 30 | 31 | def dy_master_tradeCal(self, exchangeCD='XSHG,XSHE', beginDate='', 32 | endDate='', field=''): 33 | """ 34 | 交易所交易日历 35 | getTradeCal 36 | 输入交易所,选取日期范围,可查询获取日历日期当天是否开市信息 37 | """ 38 | code, result = self.client.getData(vs.TRADE_DATE%(exchangeCD, beginDate, 39 | endDate, field)) 40 | return _ret_data(code, result) 41 | 42 | 43 | def dy_master_equInfo(self, ticker='wx', pagesize='10', 44 | pagenum='1', field=''): 45 | """ 46 | 沪深股票键盘精灵 47 | getEquInfo 48 | 根据拼音或股票代码,匹配股票代码、名称。包含正在上市的全部沪深股票。 49 | """ 50 | code, result = self.client.getData(vs.EQU_INFO%(ticker, pagesize, 51 | pagenum, field)) 52 | return _ret_data(code, result) 53 | 54 | 55 | def dy_master_region(self, field=''): 56 | """ 57 | 获取中国地域分类,以行政划分为标准。 58 | getSecTypeRegion 59 | """ 60 | code, result = self.client.getData(vs.REGION%(field)) 61 | return _ret_data(code, result) 62 | 63 | 64 | def dy_master_regionRel(self, ticker='', typeID='', 65 | secID='', field=''): 66 | """ 67 | 获取沪深股票地域分类,以注册地所在行政区域为标准。 68 | getSecTypeRegionRel 69 | """ 70 | code, result = self.client.getData(vs.REGION_REL%(ticker, typeID, 71 | secID, field)) 72 | return _ret_data(code, result) 73 | 74 | 75 | def dy_master_secType(self, field=''): 76 | """ 77 | 证券分类列表 78 | 一级分类包含有沪深股票、港股、基金、债券、期货、期权等,每个分类又细分有不同类型; 79 | 可一次获取全部分类。 80 | getSecType 81 | """ 82 | code, result = self.client.getData(vs.SEC_TYPE%(field)) 83 | return _ret_data(code, result) 84 | 85 | 86 | def dy_master_secTypeRel(self, ticker='', typeID='101001004001001', 87 | secID='', field=''): 88 | """ 89 | 录证券每个分类的成分,证券分类可通过在getSecType获取。 90 | getSecTypeRel 91 | """ 92 | code, result = self.client.getData(vs.SEC_TYPE_REL%(ticker, typeID, 93 | secID, field)) 94 | return _ret_data(code, result) 95 | 96 | 97 | def _ret_data(code, result): 98 | if code==200: 99 | result = result.decode('utf-8') if vs.PY3 else result 100 | df = pd.read_csv(StringIO(result)) 101 | return df 102 | else: 103 | print(result) 104 | return None 105 | 106 | -------------------------------------------------------------------------------- /tushare/tushare/datayes/common.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | """ 4 | Created on 2015年7月4日 5 | @author: JimmyLiu 6 | @QQ:52799046 7 | """ 8 | 9 | try: 10 | from httplib import HTTPSConnection 11 | except ImportError: 12 | from http.client import HTTPSConnection 13 | import urllib 14 | 15 | HTTP_OK = 200 16 | HTTP_AUTHORIZATION_ERROR = 401 17 | 18 | class Client: 19 | domain = 'api.wmcloud.com' 20 | port = 443 21 | token = '' 22 | httpClient = None 23 | def __init__(self , token): 24 | self.token = token 25 | self.httpClient = HTTPSConnection(self.domain, self.port) 26 | 27 | def __del__( self ): 28 | if self.httpClient is not None: 29 | self.httpClient.close() 30 | 31 | def encodepath(self, path): 32 | start=0 33 | n=len(path) 34 | re='' 35 | i=path.find('=', start) 36 | while i!=-1 : 37 | re+=path[start:i+1] 38 | start=i+1 39 | i=path.find('&', start) 40 | if(i>=0): 41 | for j in range(start, i): 42 | if(path[j]>'~'): 43 | re+=urllib.quote(path[j]) 44 | else: 45 | re+=path[j] 46 | re+='&' 47 | start=i+1 48 | else: 49 | for j in range(start, n): 50 | if(path[j]>'~'): 51 | re+=urllib.quote(path[j]) 52 | else: 53 | re+=path[j] 54 | start=n 55 | i=path.find('=', start) 56 | return re 57 | 58 | 59 | def init(self, token): 60 | self.token=token 61 | 62 | 63 | def getData(self, path): 64 | result = None 65 | path='/data/v1'+path 66 | path=self.encodepath(path) 67 | try: 68 | self.httpClient.request('GET', path, headers = {"Authorization": "Bearer " + self.token}) 69 | response = self.httpClient.getresponse() 70 | if response.status == HTTP_OK: 71 | result = response.read() 72 | else: 73 | result = response.read() 74 | if(path.find('.csv?')!=-1): 75 | result=result.decode('GBK').encode('utf-8') 76 | return response.status, result 77 | except Exception as e: 78 | raise e 79 | return -1, result 80 | -------------------------------------------------------------------------------- /tushare/tushare/datayes/trading.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | """ 4 | Created on 2015年7月4日 5 | @author: JimmyLiu 6 | @QQ:52799046 7 | """ 8 | from tushare.datayes import vars as vs 9 | import pandas as pd 10 | from pandas.compat import StringIO 11 | 12 | class Trading(): 13 | 14 | def __init__(self, client): 15 | self.client = client 16 | 17 | def dy_market_tickRT(self, securityID='000001.XSHG,000001.XSHE', field=vs.TICK_RT_DEFAULT_COLS): 18 | """ 19 | 获取最新市场信息快照 20 | 获取一只或多只证券最新Level1股票信息。 21 | 输入一只或多只证券代码,如000001.XSHG (上证指数) 或000001.XSHE(平安银行), 22 | 还有所选字段, 得到证券的最新交易快照。 23 | 证券可以是股票,指数, 部分债券或 基金。 24 | getTickRTSnapshot 25 | """ 26 | code, result = self.client.getData(vs.TICK_RT%(securityID, field)) 27 | return _ret_data(code, result) 28 | 29 | 30 | def dy_market_tickRtIndex(self, securityID='', field=''): 31 | """ 32 | 获取指数成份股的最新市场信息快照 33 | 获取一个指数的成份股的最新Level1股票信息。 34 | 输入一个指数的证券代码,如000001.XSHG (上证指数) 或000300.XSHG(沪深300), 35 | 还有所选字段, 得到指数成份股的最新交易快照。 36 | getTickRTSnapshotIndex 37 | """ 38 | code, result = self.client.getData(vs.TICK_RT_INDEX%(securityID, field)) 39 | return _ret_data(code, result) 40 | 41 | 42 | def dy_market_industry_rt(self, securityID='', field=''): 43 | """ 44 | 获取行业(证监会行业标准)资金流向 45 | 内容包括小单成交金额、中单成交金额、大单成交金额、超大单成交金额、本次成交单总金额等。 46 | getIndustryTickRTSnapshot 47 | """ 48 | code, result = self.client.getData(vs.INDUSTRY_TICK_RT%(securityID, field)) 49 | return _ret_data(code, result) 50 | 51 | 52 | def dy_market_future_rt(self, instrumentID='', field=''): 53 | """ 54 | 获取一只或多只期货的最新市场信息快照 55 | getFutureTickRTSnapshot 56 | """ 57 | code, result = self.client.getData(vs.FUTURE_TICK_RT%(instrumentID, field)) 58 | return _ret_data(code, result) 59 | 60 | 61 | def dy_market_equ_rtrank(self, exchangeCD='', pagesize='', 62 | pagenum='', desc='', field=''): 63 | """ 64 | 获取沪深股票涨跌幅排行 65 | getEquRTRank 66 | """ 67 | code, result = self.client.getData(vs.EQU_RT_RANK%(exchangeCD, pagesize, 68 | pagenum, desc, field)) 69 | return _ret_data(code, result) 70 | 71 | 72 | def dy_market_option_rt(self, optionId='', field=''): 73 | """ 74 | 获取期权最新市场信息快照 75 | getOptionTickRTSnapshot 76 | """ 77 | code, result = self.client.getData(vs.OPTION_RT%(optionId, field)) 78 | return _ret_data(code, result) 79 | 80 | 81 | def dy_market_sectips(self, tipsTypeCD='H', field=''): 82 | """ 83 | 上海证券交易所、深圳证券交易所今日停复牌股票列表。数据更新频率:日。 84 | getSecTips 85 | """ 86 | code, result = self.client.getData(vs.SEC_TIPS%(tipsTypeCD, field)) 87 | return _ret_data(code, result) 88 | 89 | 90 | def dy_market_tickrt_intraday(self, securityID='000001.XSHE', startTime='', 91 | endTime='', field=''): 92 | """ 93 | 获取一只股票,指数,债券,基金在当日内时间段Level1信息 94 | 对应:getTickRTIntraDay 95 | """ 96 | code, result = self.client.getData(vs.TICK_RT_INTRADAY%(securityID, startTime, 97 | endTime, field)) 98 | return _ret_data(code, result) 99 | 100 | 101 | def dy_market_bar_rt(self, securityID='000001.XSHE', startTime='', 102 | endTime='', unit='1', field=''): 103 | """ 104 | 获取一只证券当日的分钟线信息。 105 | 输入一只证券代码,如000001.XSHE(平安银行), 得到此证券的当日的分钟线。 106 | 证券目前是股票,指数,基金和部分债券。 107 | 分钟线的有效数据上午从09:30 到11:30,下午从13:01到15:00 108 | 对应:getBarRTIntraDay 109 | """ 110 | code, result = self.client.getData(vs.TICK_RT_INTRADAY%(securityID, startTime, 111 | endTime, field)) 112 | return _ret_data(code, result) 113 | 114 | def _ret_data(code, result): 115 | if code==200: 116 | result = result.decode('utf-8') if vs.PY3 else result 117 | df = pd.read_csv(StringIO(result)) 118 | return df 119 | else: 120 | print(result) 121 | return None 122 | 123 | -------------------------------------------------------------------------------- /tushare/tushare/datayes/vars.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | """ 4 | Created on 2015年7月4日 5 | @author: JimmyLiu 6 | @QQ:52799046 7 | """ 8 | import sys 9 | PY3 = (sys.version_info[0] >= 3) 10 | 11 | _MASTER_HEAD = '/api/master/' 12 | _MARKET_HEAD = '/api/market/' 13 | TRADE_DATE = _MASTER_HEAD + 'getTradeCal.csv?exchangeCD=%s&beginDate=%s&endDate=%s&field=%s' 14 | SEC_ID = _MASTER_HEAD + 'getSecID.csv?ticker=%s&partyID=%s&cnSpell=%s&assetClass=%s&field=%s' 15 | EQU_INFO = _MASTER_HEAD + 'getEquInfo.csv?ticker=%s&pagesize=%s&pagenum=%s&field=%s' 16 | REGION = _MASTER_HEAD + 'getSecTypeRegion.csv?field=%s' 17 | REGION_REL = _MASTER_HEAD + 'getSecTypeRegionRel.csv?ticker=%s&typeID=%s&secID=%s&field=%s' 18 | SEC_TYPE = _MASTER_HEAD + 'getSecType.csv?field=%s' 19 | SEC_TYPE_REL = _MASTER_HEAD + 'getSecTypeRel.csv?ticker=%s&typeID=%s&secID=%s&field=%s' 20 | 21 | TICK_RT_DEFAULT_COLS = 'shortNM,dataTime,lastPrice,openPrice,highPrice,lowPrice,prevClosePrice' 22 | TICK_RT = _MARKET_HEAD + 'getTickRTSnapshot.csv?securityID=%s&field=%s' 23 | TICK_RT_INDEX = _MARKET_HEAD + 'etTickRTSnapshotIndex.csv?securityID=%s&field=%s' 24 | INDUSTRY_TICK_RT = _MARKET_HEAD + 'getIndustryTickRTSnapshot.csv?securityID=%sfield=%s' 25 | FUTURE_TICK_RT = _MARKET_HEAD + 'getFutureTickRTSnapshot.csv?instrumentID=%s&field=%s' 26 | OPTION_RT = _MARKET_HEAD + 'getOptionTickRTSnapshot.csv?optionId=%s&field=%s' 27 | EQU_RT_RANK = _MARKET_HEAD + 'getEquRTRank.csv?exchangeCD=%s&pagesize=%s&pagenum=%s&desc=%s&field=%s' 28 | SEC_TIPS = _MARKET_HEAD + 'getSecTips.csv?tipsTypeCD=%s&field=%s' 29 | TICK_RT_INTRADAY = _MARKET_HEAD + 'getTickRTIntraDay.csv?securityID=%s&startTime=%s&endTime=%s&field=%s' 30 | BAR_RT = _MARKET_HEAD + 'getBarRTIntraDay.csv?securityID=%s&startTime=%s&endTime=%s&unit=%s&field=%s' -------------------------------------------------------------------------------- /tushare/tushare/futures/README.md: -------------------------------------------------------------------------------- 1 | 期货数据接口 2 | ================== 3 | 1. 实时数据 4 | 1. 历史数据 5 | -------------------------------------------------------------------------------- /tushare/tushare/futures/ctp/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/tushare/futures/ctp/__init__.py -------------------------------------------------------------------------------- /tushare/tushare/futures/ctp/futures/thostmduserapi.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/tushare/futures/ctp/futures/thostmduserapi.dll -------------------------------------------------------------------------------- /tushare/tushare/futures/ctp/futures/thosttraderapi.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/tushare/futures/ctp/futures/thosttraderapi.dll -------------------------------------------------------------------------------- /tushare/tushare/futures/futuresDemo.py: -------------------------------------------------------------------------------- 1 | #-*- coding=utf-8 -*- 2 | "This is the main demo file" 3 | from ctp.futures import ApiStruct, MdApi 4 | import time 5 | import traceback 6 | 7 | class MyMdApi(MdApi): 8 | def __init__(self, instruments, broker_id, 9 | investor_id, passwd, *args,**kwargs): 10 | self.requestid=0 11 | self.instruments = instruments 12 | self.broker_id =broker_id 13 | self.investor_id = investor_id 14 | self.passwd = passwd 15 | 16 | def OnRspError(self, info, RequestId, IsLast): 17 | print " Error" 18 | self.isErrorRspInfo(info) 19 | 20 | def isErrorRspInfo(self, info): 21 | if info.ErrorID !=0: 22 | print "ErrorID=", info.ErrorID, ", ErrorMsg=", info.ErrorMsg 23 | return info.ErrorID !=0 24 | 25 | def OnFrontDisConnected(self, reason): 26 | print "onFrontDisConnected:", reason 27 | 28 | def OnHeartBeatWarning(self, time): 29 | print "onHeartBeatWarning", time 30 | 31 | def OnFrontConnected(self): 32 | print "OnFrontConnected:" 33 | self.user_login(self.broker_id, self.investor_id, self.passwd) 34 | 35 | def user_login(self, broker_id, investor_id, passwd): 36 | req = ApiStruct.ReqUserLogin(BrokerID=broker_id, UserID=investor_id, Password=passwd) 37 | 38 | self.requestid+=1 39 | r=self.ReqUserLogin(req, self.requestid) 40 | 41 | def OnRspUserLogin(self, userlogin, info, rid, is_last): 42 | print "OnRspUserLogin", is_last, info 43 | if is_last and not self.isErrorRspInfo(info): 44 | print "get today's trading day:", repr(self.GetTradingDay()) 45 | self.subscribe_market_data(self.instruments) 46 | 47 | def subscribe_market_data(self, instruments): 48 | self.SubscribeMarketData(instruments) 49 | 50 | #def OnRspSubMarketData(self, spec_instrument, info, requestid, islast): 51 | # print "OnRspSubMarketData" 52 | 53 | #def OnRspUnSubMarketData(self, spec_instrument, info, requestid, islast): 54 | # print "OnRspUnSubMarketData" 55 | 56 | def OnRtnDepthMarketData(self, depth_market_data): 57 | print "OnRtnDepthMarketData" 58 | print depth_market_data.BidPrice1,depth_market_data.BidVolume1,depth_market_data.AskPrice1,depth_market_data.AskVolume1,depth_market_data.LastPrice,depth_market_data.Volume,depth_market_data.UpdateTime,depth_market_data.UpdateMillisec,depth_market_data.InstrumentID 59 | 60 | #inst=[u'al1008', u'al1009', u'al1010', u'al1011', u'al1012', u'al1101', u'al1102', u'al1103', u'al1104', u'al1105', u'al1106', u'al1107', u'au1008', u'au1009', u'au1010', u'au1011', u'au1012', u'au1101', u'au1102', u'au1103', u'au1104', u'au1105', u'au1106', u'au1107', u'cu1008', u'cu1009', u'cu1010', u'cu1011', u'cu1012', u'cu1101', u'cu1102', u'cu1103', u'cu1104', u'cu1105', u'cu1106', u'cu1107', u'fu1009', u'fu1010', u'fu1011', u'fu1012', u'fu1101', u'fu1103', u'fu1104', u'fu1105', u'fu1106', u'fu1107', u'fu1108', u'rb1008', u'rb1009', u'rb1010', u'rb1011', u'rb1012', u'rb1101', u'rb1102', u'rb1103', u'rb1104', u'rb1105', u'rb1106', u'rb1107', u'ru1008', u'ru1009', u'ru1010', u'ru1011', u'ru1101', u'ru1103', u'ru1104', u'ru1105', u'ru1106', u'ru1107', u'wr1008', u'wr1009', u'wr1010', u'wr1011', u'wr1012', u'wr1101', u'wr1102', u'wr1103', u'wr1104', u'wr1105', u'wr1106', u'wr1107', u'zn1008', u'zn1009', u'zn1010', u'zn1011', u'zn1012', u'zn1101', u'zn1102', u'zn1103', u'zn1104', u'zn1105', u'zn1106'] 61 | inst = [u'AU0'] 62 | def main(): 63 | user = MyMdApi(instruments=inst, 64 | broker_id="000", 65 | investor_id="000", 66 | passwd="000") 67 | user.Create("data") 68 | user.RegisterFront("tcp://asp-sim1-front1.financial-trading-platform.com:41213") 69 | user.Init() 70 | 71 | while True: 72 | time.sleep(1) 73 | 74 | if __name__=="__main__": main() 75 | -------------------------------------------------------------------------------- /tushare/tushare/stock/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/tushare/stock/__init__.py -------------------------------------------------------------------------------- /tushare/tushare/stock/billboard.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | """ 4 | 龙虎榜数据 5 | Created on 2015年6月10日 6 | @author: Jimmy Liu 7 | @group : waditu 8 | @contact: jimmysoa@sina.cn 9 | """ 10 | 11 | import pandas as pd 12 | from pandas.compat import StringIO 13 | from tushare.stock import cons as ct 14 | import numpy as np 15 | import time 16 | import re 17 | import lxml.html 18 | from lxml import etree 19 | from tushare.util import dateu as du 20 | from tushare.stock import ref_vars as rv 21 | try: 22 | from urllib.request import urlopen, Request 23 | except ImportError: 24 | from urllib2 import urlopen, Request 25 | 26 | 27 | def top_list(date = None, retry_count=3, pause=0.001): 28 | """ 29 | 获取每日龙虎榜列表 30 | Parameters 31 | -------- 32 | date:string 33 | 明细数据日期 format:YYYY-MM-DD 如果为空,返回最近一个交易日的数据 34 | retry_count : int, 默认 3 35 | 如遇网络等问题重复执行的次数 36 | pause : int, 默认 0 37 | 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 38 | 39 | Return 40 | ------ 41 | DataFrame 42 | code:代码 43 | name :名称 44 | pchange:涨跌幅 45 | amount:龙虎榜成交额(万) 46 | buy:买入额(万) 47 | bratio:占总成交比例 48 | sell:卖出额(万) 49 | sratio :占总成交比例 50 | reason:上榜原因 51 | date :日期 52 | """ 53 | if date is None: 54 | if du.get_hour() < 18: 55 | date = du.last_tddate() 56 | else: 57 | date = du.today() 58 | else: 59 | if(du.is_holiday(date)): 60 | return None 61 | for _ in range(retry_count): 62 | time.sleep(pause) 63 | try: 64 | request = Request(rv.LHB_URL%(ct.P_TYPE['http'], ct.DOMAINS['em'], date)) 65 | text = urlopen(request, timeout=10).read() 66 | text = text.decode('GBK') 67 | html = lxml.html.parse(StringIO(text)) 68 | res = html.xpath("//table[@id=\"dt_1\"]") 69 | if ct.PY3: 70 | sarr = [etree.tostring(node).decode('utf-8') for node in res] 71 | else: 72 | sarr = [etree.tostring(node) for node in res] 73 | sarr = ''.join(sarr) 74 | df = pd.read_html(sarr)[0] 75 | df.columns = [i for i in range(1,12)] 76 | df = df.apply(_f_rows, axis=1) 77 | df = df.fillna(method='ffill') 78 | df = df.drop([1, 4], axis=1) 79 | df.columns = rv.LHB_COLS 80 | df = df.drop_duplicates() 81 | df['code'] = df['code'].astype(int) 82 | df['code'] = df['code'].map(lambda x: str(x).zfill(6)) 83 | df['date'] = date 84 | except: 85 | pass 86 | else: 87 | return df 88 | raise IOError(ct.NETWORK_URL_ERROR_MSG) 89 | 90 | 91 | def cap_tops(days= 5, retry_count= 3, pause= 0.001): 92 | """ 93 | 获取个股上榜统计数据 94 | Parameters 95 | -------- 96 | days:int 97 | 天数,统计n天以来上榜次数,默认为5天,其余是10、30、60 98 | retry_count : int, 默认 3 99 | 如遇网络等问题重复执行的次数 100 | pause : int, 默认 0 101 | 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 102 | Return 103 | ------ 104 | DataFrame 105 | code:代码 106 | name:名称 107 | count:上榜次数 108 | bamount:累积购买额(万) 109 | samount:累积卖出额(万) 110 | net:净额(万) 111 | bcount:买入席位数 112 | scount:卖出席位数 113 | """ 114 | 115 | if ct._check_lhb_input(days) is True: 116 | ct._write_head() 117 | df = _cap_tops(days, pageNo=1, retry_count=retry_count, 118 | pause=pause) 119 | df['code'] = df['code'].map(lambda x: str(x).zfill(6)) 120 | if df is not None: 121 | df = df.drop_duplicates('code') 122 | return df 123 | 124 | 125 | def _cap_tops(last=5, pageNo=1, retry_count=3, pause=0.001, dataArr=pd.DataFrame()): 126 | ct._write_console() 127 | for _ in range(retry_count): 128 | time.sleep(pause) 129 | try: 130 | request = Request(rv.LHB_SINA_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], rv.LHB_KINDS[0], 131 | ct.PAGES['fd'], last, pageNo)) 132 | text = urlopen(request, timeout=10).read() 133 | text = text.decode('GBK') 134 | html = lxml.html.parse(StringIO(text)) 135 | res = html.xpath("//table[@id=\"dataTable\"]/tr") 136 | if ct.PY3: 137 | sarr = [etree.tostring(node).decode('utf-8') for node in res] 138 | else: 139 | sarr = [etree.tostring(node) for node in res] 140 | sarr = ''.join(sarr) 141 | sarr = '%s
'%sarr 142 | df = pd.read_html(sarr)[0] 143 | df.columns = rv.LHB_GGTJ_COLS 144 | dataArr = dataArr.append(df, ignore_index=True) 145 | nextPage = html.xpath('//div[@class=\"pages\"]/a[last()]/@onclick') 146 | if len(nextPage)>0: 147 | pageNo = re.findall(r'\d+', nextPage[0])[0] 148 | return _cap_tops(last, pageNo, retry_count, pause, dataArr) 149 | else: 150 | return dataArr 151 | except Exception as e: 152 | print(e) 153 | 154 | 155 | def broker_tops(days= 5, retry_count= 3, pause= 0.001): 156 | """ 157 | 获取营业部上榜统计数据 158 | Parameters 159 | -------- 160 | days:int 161 | 天数,统计n天以来上榜次数,默认为5天,其余是10、30、60 162 | retry_count : int, 默认 3 163 | 如遇网络等问题重复执行的次数 164 | pause : int, 默认 0 165 | 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 166 | Return 167 | --------- 168 | broker:营业部名称 169 | count:上榜次数 170 | bamount:累积购买额(万) 171 | bcount:买入席位数 172 | samount:累积卖出额(万) 173 | scount:卖出席位数 174 | top3:买入前三股票 175 | """ 176 | if ct._check_lhb_input(days) is True: 177 | ct._write_head() 178 | df = _broker_tops(days, pageNo=1, retry_count=retry_count, 179 | pause=pause) 180 | return df 181 | 182 | 183 | def _broker_tops(last=5, pageNo=1, retry_count=3, pause=0.001, dataArr=pd.DataFrame()): 184 | ct._write_console() 185 | for _ in range(retry_count): 186 | time.sleep(pause) 187 | try: 188 | request = Request(rv.LHB_SINA_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], rv.LHB_KINDS[1], 189 | ct.PAGES['fd'], last, pageNo)) 190 | text = urlopen(request, timeout=10).read() 191 | text = text.decode('GBK') 192 | html = lxml.html.parse(StringIO(text)) 193 | res = html.xpath("//table[@id=\"dataTable\"]/tr") 194 | if ct.PY3: 195 | sarr = [etree.tostring(node).decode('utf-8') for node in res] 196 | else: 197 | sarr = [etree.tostring(node) for node in res] 198 | sarr = ''.join(sarr) 199 | sarr = '%s
'%sarr 200 | df = pd.read_html(sarr)[0] 201 | df.columns = rv.LHB_YYTJ_COLS 202 | dataArr = dataArr.append(df, ignore_index=True) 203 | nextPage = html.xpath('//div[@class=\"pages\"]/a[last()]/@onclick') 204 | if len(nextPage)>0: 205 | pageNo = re.findall(r'\d+', nextPage[0])[0] 206 | return _broker_tops(last, pageNo, retry_count, pause, dataArr) 207 | else: 208 | return dataArr 209 | except Exception as e: 210 | print(e) 211 | 212 | 213 | def inst_tops(days= 5, retry_count= 3, pause= 0.001): 214 | """ 215 | 获取机构席位追踪统计数据 216 | Parameters 217 | -------- 218 | days:int 219 | 天数,统计n天以来上榜次数,默认为5天,其余是10、30、60 220 | retry_count : int, 默认 3 221 | 如遇网络等问题重复执行的次数 222 | pause : int, 默认 0 223 | 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 224 | 225 | Return 226 | -------- 227 | code:代码 228 | name:名称 229 | bamount:累积买入额(万) 230 | bcount:买入次数 231 | samount:累积卖出额(万) 232 | scount:卖出次数 233 | net:净额(万) 234 | """ 235 | if ct._check_lhb_input(days) is True: 236 | ct._write_head() 237 | df = _inst_tops(days, pageNo=1, retry_count=retry_count, 238 | pause=pause) 239 | df['code'] = df['code'].map(lambda x: str(x).zfill(6)) 240 | return df 241 | 242 | 243 | def _inst_tops(last=5, pageNo=1, retry_count=3, pause=0.001, dataArr=pd.DataFrame()): 244 | ct._write_console() 245 | for _ in range(retry_count): 246 | time.sleep(pause) 247 | try: 248 | request = Request(rv.LHB_SINA_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], rv.LHB_KINDS[2], 249 | ct.PAGES['fd'], last, pageNo)) 250 | text = urlopen(request, timeout=10).read() 251 | text = text.decode('GBK') 252 | html = lxml.html.parse(StringIO(text)) 253 | res = html.xpath("//table[@id=\"dataTable\"]/tr") 254 | if ct.PY3: 255 | sarr = [etree.tostring(node).decode('utf-8') for node in res] 256 | else: 257 | sarr = [etree.tostring(node) for node in res] 258 | sarr = ''.join(sarr) 259 | sarr = '%s
'%sarr 260 | df = pd.read_html(sarr)[0] 261 | df = df.drop([2,3], axis=1) 262 | df.columns = rv.LHB_JGZZ_COLS 263 | dataArr = dataArr.append(df, ignore_index=True) 264 | nextPage = html.xpath('//div[@class=\"pages\"]/a[last()]/@onclick') 265 | if len(nextPage)>0: 266 | pageNo = re.findall(r'\d+', nextPage[0])[0] 267 | return _inst_tops(last, pageNo, retry_count, pause, dataArr) 268 | else: 269 | return dataArr 270 | except Exception as e: 271 | print(e) 272 | 273 | 274 | def inst_detail(retry_count= 3, pause= 0.001): 275 | """ 276 | 获取最近一个交易日机构席位成交明细统计数据 277 | Parameters 278 | -------- 279 | retry_count : int, 默认 3 280 | 如遇网络等问题重复执行的次数 281 | pause : int, 默认 0 282 | 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 283 | 284 | Return 285 | ---------- 286 | code:股票代码 287 | name:股票名称 288 | date:交易日期 289 | bamount:机构席位买入额(万) 290 | samount:机构席位卖出额(万) 291 | type:类型 292 | """ 293 | ct._write_head() 294 | df = _inst_detail(pageNo=1, retry_count=retry_count, 295 | pause=pause) 296 | if len(df)>0: 297 | df['code'] = df['code'].map(lambda x: str(x).zfill(6)) 298 | return df 299 | 300 | 301 | def _inst_detail(pageNo=1, retry_count=3, pause=0.001, dataArr=pd.DataFrame()): 302 | ct._write_console() 303 | for _ in range(retry_count): 304 | time.sleep(pause) 305 | try: 306 | request = Request(rv.LHB_SINA_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], rv.LHB_KINDS[3], 307 | ct.PAGES['fd'], '', pageNo)) 308 | text = urlopen(request, timeout=10).read() 309 | text = text.decode('GBK') 310 | html = lxml.html.parse(StringIO(text)) 311 | res = html.xpath("//table[@id=\"dataTable\"]/tr") 312 | if ct.PY3: 313 | sarr = [etree.tostring(node).decode('utf-8') for node in res] 314 | else: 315 | sarr = [etree.tostring(node) for node in res] 316 | sarr = ''.join(sarr) 317 | sarr = '%s
'%sarr 318 | df = pd.read_html(sarr)[0] 319 | df.columns = rv.LHB_JGMX_COLS 320 | dataArr = dataArr.append(df, ignore_index=True) 321 | nextPage = html.xpath('//div[@class=\"pages\"]/a[last()]/@onclick') 322 | if len(nextPage)>0: 323 | pageNo = re.findall(r'\d+', nextPage[0])[0] 324 | return _inst_detail(pageNo, retry_count, pause, dataArr) 325 | else: 326 | return dataArr 327 | except Exception as e: 328 | print(e) 329 | 330 | 331 | def _f_rows(x): 332 | if '%' in x[3]: 333 | x[11] = x[6] 334 | for i in range(6, 11): 335 | x[i] = x[i-5] 336 | for i in range(1, 6): 337 | x[i] = np.NaN 338 | return x 339 | 340 | if __name__ == "__main__": 341 | print(top_list('2015-06-17')) 342 | # print(inst_detail()) 343 | -------------------------------------------------------------------------------- /tushare/tushare/stock/classifying.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | """ 4 | 获取股票分类数据接口 5 | Created on 2015/02/01 6 | @author: Jimmy Liu 7 | @group : waditu 8 | @contact: jimmysoa@sina.cn 9 | """ 10 | 11 | import pandas as pd 12 | from tushare.stock import cons as ct 13 | from tushare.stock import ref_vars as rv 14 | import json 15 | import re 16 | from pandas.util.testing import _network_error_classes 17 | import time 18 | import tushare.stock.fundamental as fd 19 | from tushare.util.netbase import Client 20 | try: 21 | from urllib.request import urlopen, Request 22 | except ImportError: 23 | from urllib2 import urlopen, Request 24 | 25 | 26 | def get_industry_classified(): 27 | """ 28 | 获取行业分类数据 29 | Return 30 | -------- 31 | DataFrame 32 | code :股票代码 33 | name :股票名称 34 | c_name :行业名称 35 | """ 36 | df = _get_type_data(ct.SINA_INDUSTRY_INDEX_URL%(ct.P_TYPE['http'], 37 | ct.DOMAINS['vsf'], ct.PAGES['ids'])) 38 | data = [] 39 | ct._write_head() 40 | for row in df.values: 41 | rowDf = _get_detail(row[0]) 42 | rowDf['c_name'] = row[1] 43 | data.append(rowDf) 44 | data = pd.concat(data, ignore_index=True) 45 | return data 46 | 47 | 48 | def get_concept_classified(): 49 | """ 50 | 获取概念分类数据 51 | Return 52 | -------- 53 | DataFrame 54 | code :股票代码 55 | name :股票名称 56 | c_name :概念名称 57 | """ 58 | ct._write_head() 59 | df = _get_type_data(ct.SINA_CONCEPTS_INDEX_URL%(ct.P_TYPE['http'], 60 | ct.DOMAINS['sf'], ct.PAGES['cpt'])) 61 | data = [] 62 | for row in df.values: 63 | rowDf = _get_detail(row[0]) 64 | rowDf['c_name'] = row[1] 65 | data.append(rowDf) 66 | data = pd.concat(data,ignore_index=True) 67 | return data 68 | 69 | 70 | def get_area_classified(): 71 | """ 72 | 获取地域分类数据 73 | Return 74 | -------- 75 | DataFrame 76 | code :股票代码 77 | name :股票名称 78 | area :地域名称 79 | """ 80 | df = fd.get_stock_basics() 81 | df = df[['name', 'area']] 82 | df.reset_index(level=0, inplace=True) 83 | df = df.sort('area').reset_index(drop=True) 84 | return df 85 | 86 | 87 | def get_gem_classified(): 88 | """ 89 | 获取创业板股票 90 | Return 91 | -------- 92 | DataFrame 93 | code :股票代码 94 | name :股票名称 95 | """ 96 | df = fd.get_stock_basics() 97 | df.reset_index(level=0, inplace=True) 98 | df = df[ct.FOR_CLASSIFY_B_COLS] 99 | df = df.ix[df.code.str[0] == '3'] 100 | df = df.sort('code').reset_index(drop=True) 101 | return df 102 | 103 | 104 | def get_sme_classified(): 105 | """ 106 | 获取中小板股票 107 | Return 108 | -------- 109 | DataFrame 110 | code :股票代码 111 | name :股票名称 112 | """ 113 | df = fd.get_stock_basics() 114 | df.reset_index(level=0, inplace=True) 115 | df = df[ct.FOR_CLASSIFY_B_COLS] 116 | df = df.ix[df.code.str[0:3] == '002'] 117 | df = df.sort('code').reset_index(drop=True) 118 | return df 119 | 120 | def get_st_classified(): 121 | """ 122 | 获取风险警示板股票 123 | Return 124 | -------- 125 | DataFrame 126 | code :股票代码 127 | name :股票名称 128 | """ 129 | df = fd.get_stock_basics() 130 | df.reset_index(level=0, inplace=True) 131 | df = df[ct.FOR_CLASSIFY_B_COLS] 132 | df = df.ix[df.name.str.contains('ST')] 133 | df = df.sort('code').reset_index(drop=True) 134 | return df 135 | 136 | 137 | def _get_detail(tag, retry_count=3, pause=0.001): 138 | for _ in range(retry_count): 139 | time.sleep(pause) 140 | try: 141 | ct._write_console() 142 | request = Request(ct.SINA_DATA_DETAIL_URL%(ct.P_TYPE['http'], 143 | ct.DOMAINS['vsf'], ct.PAGES['jv'], 144 | tag)) 145 | text = urlopen(request, timeout=10).read() 146 | text = text.decode('gbk') 147 | except _network_error_classes: 148 | pass 149 | else: 150 | reg = re.compile(r'\,(.*?)\:') 151 | text = reg.sub(r',"\1":', text) 152 | text = text.replace('"{symbol', '{"symbol') 153 | text = text.replace('{symbol', '{"symbol"') 154 | jstr = json.dumps(text) 155 | js = json.loads(jstr) 156 | df = pd.DataFrame(pd.read_json(js, dtype={'code':object}), columns=ct.THE_FIELDS) 157 | df = df[ct.FOR_CLASSIFY_B_COLS] 158 | return df 159 | raise IOError(ct.NETWORK_URL_ERROR_MSG) 160 | 161 | 162 | def _get_type_data(url): 163 | try: 164 | request = Request(url) 165 | data_str = urlopen(request, timeout=10).read() 166 | data_str = data_str.decode('GBK') 167 | data_str = data_str.split('=')[1] 168 | data_json = json.loads(data_str) 169 | df = pd.DataFrame([[row.split(',')[0], row.split(',')[1]] for row in data_json.values()], 170 | columns=['tag', 'name']) 171 | return df 172 | except Exception as er: 173 | print(str(er)) 174 | 175 | 176 | def get_hs300s(): 177 | """ 178 | 获取沪深300当前成份股及所占权重 179 | Return 180 | -------- 181 | DataFrame 182 | code :股票代码 183 | name :股票名称 184 | date :日期 185 | weight:权重 186 | """ 187 | try: 188 | df = pd.read_excel(ct.HS300_CLASSIFY_URL%(ct.P_TYPE['http'], ct.DOMAINS['idx'], 189 | ct.INDEX_C_COMM, ct.PAGES['hs300b']), parse_cols=[0,1]) 190 | df.columns = ct.FOR_CLASSIFY_B_COLS 191 | df['code'] = df['code'].map(lambda x :str(x).zfill(6)) 192 | wt = pd.read_excel(ct.HS300_CLASSIFY_URL%(ct.P_TYPE['http'], ct.DOMAINS['idx'], 193 | ct.INDEX_C_COMM, ct.PAGES['hs300w']), parse_cols=[0,3,6]) 194 | wt.columns = ct.FOR_CLASSIFY_W_COLS 195 | wt['code'] = wt['code'].map(lambda x :str(x).zfill(6)) 196 | return pd.merge(df,wt) 197 | except Exception as er: 198 | print(str(er)) 199 | 200 | 201 | def get_sz50s(): 202 | """ 203 | 获取上证50成份股 204 | Return 205 | -------- 206 | DataFrame 207 | code :股票代码 208 | name :股票名称 209 | """ 210 | try: 211 | df = pd.read_excel(ct.HS300_CLASSIFY_URL%(ct.P_TYPE['http'], ct.DOMAINS['idx'], 212 | ct.INDEX_C_COMM, ct.PAGES['sz50b']), parse_cols=[0,1]) 213 | df.columns = ct.FOR_CLASSIFY_B_COLS 214 | df['code'] = df['code'].map(lambda x :str(x).zfill(6)) 215 | return df 216 | except Exception as er: 217 | print(str(er)) 218 | 219 | 220 | def get_zz500s(): 221 | """ 222 | 获取中证500成份股 223 | Return 224 | -------- 225 | DataFrame 226 | code :股票代码 227 | name :股票名称 228 | """ 229 | try: 230 | df = pd.read_excel(ct.HS300_CLASSIFY_URL%(ct.P_TYPE['http'], ct.DOMAINS['idx'], 231 | ct.INDEX_C_COMM, ct.PAGES['zz500b']), parse_cols=[0,1]) 232 | df.columns = ct.FOR_CLASSIFY_B_COLS 233 | df['code'] = df['code'].map(lambda x :str(x).zfill(6)) 234 | return df 235 | except Exception as er: 236 | print(str(er)) 237 | 238 | 239 | def get_terminated(): 240 | """ 241 | 获取终止上市股票列表 242 | Return 243 | -------- 244 | DataFrame 245 | code :股票代码 246 | name :股票名称 247 | oDate:上市日期 248 | tDate:终止上市日期 249 | """ 250 | try: 251 | 252 | ref = ct.SSEQ_CQ_REF_URL%(ct.P_TYPE['http'], ct.DOMAINS['sse']) 253 | clt = Client(rv.TERMINATED_URL%(ct.P_TYPE['http'], ct.DOMAINS['sseq'], 254 | ct.PAGES['ssecq'], _random(5), 255 | _random()), ref=ref, cookie=rv.MAR_SH_COOKIESTR) 256 | lines = clt.gvalue() 257 | lines = lines.decode('utf-8') if ct.PY3 else lines 258 | lines = lines[19:-1] 259 | lines = json.loads(lines) 260 | df = pd.DataFrame(lines['result'], columns=rv.TERMINATED_T_COLS) 261 | df.columns = rv.TERMINATED_COLS 262 | return df 263 | except Exception as er: 264 | print(str(er)) 265 | 266 | 267 | def get_suspended(): 268 | """ 269 | 获取暂停上市股票列表 270 | Return 271 | -------- 272 | DataFrame 273 | code :股票代码 274 | name :股票名称 275 | oDate:上市日期 276 | tDate:终止上市日期 277 | """ 278 | try: 279 | 280 | ref = ct.SSEQ_CQ_REF_URL%(ct.P_TYPE['http'], ct.DOMAINS['sse']) 281 | clt = Client(rv.SUSPENDED_URL%(ct.P_TYPE['http'], ct.DOMAINS['sseq'], 282 | ct.PAGES['ssecq'], _random(5), 283 | _random()), ref=ref, cookie=rv.MAR_SH_COOKIESTR) 284 | lines = clt.gvalue() 285 | lines = lines.decode('utf-8') if ct.PY3 else lines 286 | lines = lines[19:-1] 287 | lines = json.loads(lines) 288 | df = pd.DataFrame(lines['result'], columns=rv.TERMINATED_T_COLS) 289 | df.columns = rv.TERMINATED_COLS 290 | return df 291 | except Exception as er: 292 | print(str(er)) 293 | 294 | 295 | def _random(n=13): 296 | from random import randint 297 | start = 10**(n-1) 298 | end = (10**n)-1 299 | return str(randint(start, end)) 300 | 301 | -------------------------------------------------------------------------------- /tushare/tushare/stock/cons.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | """ 3 | Created on 2014/07/31 4 | @author: Jimmy Liu 5 | @group : waditu 6 | @contact: jimmysoa@sina.cn 7 | """ 8 | 9 | VERSION = '0.3.4' 10 | K_LABELS = ['D', 'W', 'M'] 11 | K_MIN_LABELS = ['5', '15', '30', '60'] 12 | K_TYPE = {'D': 'akdaily', 'W': 'akweekly', 'M': 'akmonthly'} 13 | INDEX_LABELS = ['sh', 'sz', 'hs300', 'sz50', 'cyb', 'zxb'] 14 | INDEX_LIST = {'sh': 'sh000001', 'sz': 'sz399001', 'hs300': 'sz399300', 15 | 'sz50': 'sh000016', 'zxb': 'sz399005', 'cyb': 'sz399006'} 16 | P_TYPE = {'http': 'http://', 'ftp': 'ftp://'} 17 | PAGE_NUM = [38, 60, 80, 100] 18 | FORMAT = lambda x: '%.2f' % x 19 | DOMAINS = {'sina': 'sina.com.cn', 'sinahq': 'sinajs.cn', 20 | 'ifeng': 'ifeng.com', 'sf': 'finance.sina.com.cn', 21 | 'vsf': 'vip.stock.finance.sina.com.cn', 22 | 'idx': 'www.csindex.com.cn', '163': 'money.163.com', 23 | 'em': 'eastmoney.com', 'sseq': 'query.sse.com.cn', 24 | 'sse': 'www.sse.com.cn', 'szse': 'www.szse.cn', 25 | 'oss': 'tudata.oss-cn-beijing.aliyuncs.com', 26 | 'shibor': 'www.shibor.org'} 27 | PAGES = {'fd': 'index.phtml', 'dl': 'downxls.php', 'jv': 'json_v2.php', 28 | 'cpt': 'newFLJK.php', 'ids': 'newSinaHy.php', 'lnews':'rollnews_ch_out_interface.php', 29 | 'ntinfo':'vCB_BulletinGather.php', 'hs300b':'000300cons.xls', 30 | 'hs300w':'000300closeweight.xls','sz50b':'000016cons.xls', 31 | 'dp':'all_fpya.php', '163dp':'fpyg.html', 32 | 'emxsg':'JS.aspx', '163fh':'jjcgph.php', 33 | 'newstock':'vRPD_NewStockIssue.php', 'zz500b':'000905cons.xls', 34 | 't_ticks':'vMS_tradedetail.php', 'dw': 'downLoad.html', 35 | 'qmd':'queryMargin.do', 'szsefc':'FrontController.szse', 36 | 'ssecq':'commonQuery.do'} 37 | TICK_COLUMNS = ['time', 'price', 'change', 'volume', 'amount', 'type'] 38 | TODAY_TICK_COLUMNS = ['time', 'price', 'pchange', 'change', 'volume', 'amount', 'type'] 39 | DAY_TRADING_COLUMNS = ['code', 'symbol', 'name', 'changepercent', 40 | 'trade', 'open', 'high', 'low', 'settlement', 'volume', 'turnoverratio'] 41 | REPORT_COLS = ['code', 'name', 'eps', 'eps_yoy', 'bvps', 'roe', 42 | 'epcf', 'net_profits', 'profits_yoy', 'distrib', 'report_date'] 43 | FORECAST_COLS = ['code', 'name', 'type', 'report_date', 'pre_eps', 'range'] 44 | PROFIT_COLS = ['code', 'name', 'roe', 'net_profit_ratio', 45 | 'gross_profit_rate', 'net_profits', 'eps', 'business_income', 'bips'] 46 | OPERATION_COLS = ['code', 'name', 'arturnover', 'arturndays', 'inventory_turnover', 47 | 'inventory_days', 'currentasset_turnover', 'currentasset_days'] 48 | GROWTH_COLS = ['code', 'name', 'mbrg', 'nprg', 'nav', 'targ', 'epsg', 'seg'] 49 | DEBTPAYING_COLS = ['code', 'name', 'currentratio', 50 | 'quickratio', 'cashratio', 'icratio', 'sheqratio', 'adratio'] 51 | CASHFLOW_COLS = ['code', 'name', 'cf_sales', 'rateofreturn', 52 | 'cf_nm', 'cf_liabilities', 'cashflowratio'] 53 | DAY_PRICE_COLUMNS = ['date', 'open', 'high', 'close', 'low', 'volume', 'price_change', 'p_change', 54 | 'ma5', 'ma10', 'ma20', 'v_ma5', 'v_ma10', 'v_ma20', 'turnover'] 55 | INX_DAY_PRICE_COLUMNS = ['date', 'open', 'high', 'close', 'low', 'volume', 'price_change', 'p_change', 56 | 'ma5', 'ma10', 'ma20', 'v_ma5', 'v_ma10', 'v_ma20'] 57 | LIVE_DATA_COLS = ['name', 'open', 'pre_close', 'price', 'high', 'low', 'bid', 'ask', 'volume', 'amount', 58 | 'b1_v', 'b1_p', 'b2_v', 'b2_p', 'b3_v', 'b3_p', 'b4_v', 'b4_p', 'b5_v', 'b5_p', 59 | 'a1_v', 'a1_p', 'a2_v', 'a2_p', 'a3_v', 'a3_p', 'a4_v', 'a4_p', 'a5_v', 'a5_p', 'date', 'time', 's'] 60 | FOR_CLASSIFY_B_COLS = ['code','name'] 61 | FOR_CLASSIFY_W_COLS = ['date','code','weight'] 62 | THE_FIELDS = ['code','symbol','name','changepercent','trade','open','high','low','settlement','volume','turnoverratio'] 63 | TICK_PRICE_URL = '%smarket.%s/%s?date=%s&symbol=%s' 64 | TODAY_TICKS_PAGE_URL = '%s%s/quotes_service/api/%s/CN_Transactions.getAllPageTime?date=%s&symbol=%s' 65 | TODAY_TICKS_URL = '%s%s/quotes_service/view/%s?symbol=%s&date=%s&page=%s' 66 | DAY_PRICE_URL = '%sapi.finance.%s/%s/?code=%s&type=last' 67 | LIVE_DATA_URL = '%shq.%s/rn=%s&list=%s' 68 | DAY_PRICE_MIN_URL = '%sapi.finance.%s/akmin?scode=%s&type=%s' 69 | SINA_DAY_PRICE_URL = '%s%s/quotes_service/api/%s/Market_Center.getHQNodeData?num=80&sort=changepercent&asc=0&node=hs_a&symbol=&_s_r_a=page&page=%s' 70 | REPORT_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/mainindex/%s?s_i=&s_a=&s_c=&reportdate=%s&quarter=%s&p=%s&num=%s' 71 | FORECAST_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/performance/%s?s_i=&s_a=&s_c=&s_type=&reportdate=%s&quarter=%s&p=%s&num=%s' 72 | PROFIT_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/profit/%s?s_i=&s_a=&s_c=&reportdate=%s&quarter=%s&p=%s&num=%s' 73 | OPERATION_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/operation/%s?s_i=&s_a=&s_c=&reportdate=%s&quarter=%s&p=%s&num=%s' 74 | GROWTH_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/grow/%s?s_i=&s_a=&s_c=&reportdate=%s&quarter=%s&p=%s&num=%s' 75 | DEBTPAYING_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/debtpaying/%s?s_i=&s_a=&s_c=&reportdate=%s&quarter=%s&p=%s&num=%s' 76 | CASHFLOW_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/cashflow/%s?s_i=&s_a=&s_c=&reportdate=%s&quarter=%s&p=%s&num=%s' 77 | SHIBOR_TYPE ={'Shibor': 'Shibor数据', 'Quote': '报价数据', 'Tendency': 'Shibor均值数据', 78 | 'LPR': 'LPR数据', 'LPR_Tendency': 'LPR均值数据'} 79 | SHIBOR_DATA_URL = '%s%s/shibor/web/html/%s?nameNew=Historical_%s_Data_%s.xls&downLoadPath=data&nameOld=%s%s.xls&shiborSrc=http://www.shibor.org/shibor/' 80 | ALL_STOCK_BASICS_FILE = '%s%s/all.csv'%(P_TYPE['http'], DOMAINS['oss']) 81 | SINA_CONCEPTS_INDEX_URL = '%smoney.%s/q/view/%s?param=class' 82 | SINA_INDUSTRY_INDEX_URL = '%s%s/q/view/%s' 83 | SINA_DATA_DETAIL_URL = '%s%s/quotes_service/api/%s/Market_Center.getHQNodeData?page=1&num=400&sort=symbol&asc=1&node=%s&symbol=&_s_r_a=page' 84 | INDEX_C_COMM = 'sseportal/ps/zhs/hqjt/csi' 85 | HS300_CLASSIFY_URL = '%s%s/%s/%s' 86 | HIST_FQ_URL = '%s%s/corp/go.php/vMS_FuQuanMarketHistory/stockid/%s.phtml?year=%s&jidu=%s' 87 | HIST_INDEX_URL = '%s%s/corp/go.php/vMS_MarketHistory/stockid/%s/type/S.phtml?year=%s&jidu=%s' 88 | HIST_FQ_FACTOR_URL = '%s%s/api/json.php/BasicStockSrv.getStockFuQuanData?symbol=%s&type=hfq' 89 | INDEX_HQ_URL = '''%shq.%s/rn=xppzh&list=sh000001,sh000002,sh000003,sh000008,sh000009,sh000010,sh000011,sh000012,sh000016,sh000017,sh000300,sz399001,sz399002,sz399003,sz399004,sz399005,sz399006,sz399100,sz399101,sz399106,sz399107,sz399108,sz399333,sz399606''' 90 | SSEQ_CQ_REF_URL = '%s%s/assortment/stock/list/name' 91 | ALL_STK_URL = '%s%s/all.csv' 92 | SHIBOR_COLS = ['date', 'ON', '1W', '2W', '1M', '3M', '6M', '9M', '1Y'] 93 | QUOTE_COLS = ['date', 'bank', 'ON_B', 'ON_A', '1W_B', '1W_A', '2W_B', '2W_A', '1M_B', '1M_A', 94 | '3M_B', '3M_A', '6M_B', '6M_A', '9M_B', '9M_A', '1Y_B', '1Y_A'] 95 | SHIBOR_MA_COLS = ['date', 'ON_5', 'ON_10', 'ON_20', '1W_5', '1W_10', '1W_20','2W_5', '2W_10', '2W_20', 96 | '1M_5', '1M_10', '1M_20', '3M_5', '3M_10', '3M_20', '6M_5', '6M_10', '6M_20', 97 | '9M_5', '9M_10', '9M_20','1Y_5', '1Y_10', '1Y_20'] 98 | LPR_COLS = ['date', '1Y'] 99 | LPR_MA_COLS = ['date', '1Y_5', '1Y_10', '1Y_20'] 100 | INDEX_HEADER = 'code,name,open,preclose,close,high,low,0,0,volume,amount,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,d,c,3\n' 101 | INDEX_COLS = ['code', 'name', 'change', 'open', 'preclose', 'close', 'high', 'low', 'volume', 'amount'] 102 | HIST_FQ_COLS = ['date', 'open', 'high', 'close', 'low', 'volume', 'amount', 'factor'] 103 | HIST_FQ_FACTOR_COLS = ['code','value'] 104 | DATA_GETTING_TIPS = '[Getting data:]' 105 | DATA_GETTING_FLAG = '#' 106 | DATA_ROWS_TIPS = '%s rows data found.Please wait for a moment.' 107 | DATA_INPUT_ERROR_MSG = 'date input error.' 108 | NETWORK_URL_ERROR_MSG = '获取失败,请检查网络和URL' 109 | DATE_CHK_MSG = '年度输入错误:请输入1989年以后的年份数字,格式:YYYY' 110 | DATE_CHK_Q_MSG = '季度输入错误:请输入1、2、3或4数字' 111 | TOP_PARAS_MSG = 'top有误,请输入整数或all.' 112 | LHB_MSG = '周期输入有误,请输入数字5、10、30或60' 113 | 114 | import sys 115 | PY3 = (sys.version_info[0] >= 3) 116 | def _write_head(): 117 | sys.stdout.write(DATA_GETTING_TIPS) 118 | sys.stdout.flush() 119 | 120 | def _write_console(): 121 | sys.stdout.write(DATA_GETTING_FLAG) 122 | sys.stdout.flush() 123 | 124 | def _write_tips(tip): 125 | sys.stdout.write(DATA_ROWS_TIPS%tip) 126 | sys.stdout.flush() 127 | 128 | def _write_msg(msg): 129 | sys.stdout.write(msg) 130 | sys.stdout.flush() 131 | 132 | def _check_input(year, quarter): 133 | if type(year) is str or year < 1989 : 134 | raise TypeError(DATE_CHK_MSG) 135 | elif quarter is None or type(quarter) is str or quarter not in [1, 2, 3, 4]: 136 | raise TypeError(DATE_CHK_Q_MSG) 137 | else: 138 | return True 139 | 140 | def _check_lhb_input(last): 141 | if last not in [5, 10, 30, 60]: 142 | raise TypeError(LHB_MSG) 143 | else: 144 | return True -------------------------------------------------------------------------------- /tushare/tushare/stock/fundamental.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | """ 3 | 基本面数据接口 4 | Created on 2015/01/18 5 | @author: Jimmy Liu 6 | @group : waditu 7 | @contact: jimmysoa@sina.cn 8 | """ 9 | import pandas as pd 10 | from tushare.stock import cons as ct 11 | import lxml.html 12 | from lxml import etree 13 | import re 14 | from pandas.compat import StringIO 15 | try: 16 | from urllib.request import urlopen, Request 17 | except ImportError: 18 | from urllib2 import urlopen, Request 19 | 20 | def get_stock_basics(): 21 | """ 22 | 获取沪深上市公司基本情况 23 | Return 24 | -------- 25 | DataFrame 26 | code,代码 27 | name,名称 28 | industry,细分行业 29 | area,地区 30 | pe,市盈率 31 | outstanding,流通股本 32 | totals,总股本(万) 33 | totalAssets,总资产(万) 34 | liquidAssets,流动资产 35 | fixedAssets,固定资产 36 | reserved,公积金 37 | reservedPerShare,每股公积金 38 | eps,每股收益 39 | bvps,每股净资 40 | pb,市净率 41 | timeToMarket,上市日期 42 | """ 43 | request = Request(ct.ALL_STOCK_BASICS_FILE) 44 | text = urlopen(request, timeout=10).read() 45 | text = text.decode('GBK') 46 | df = pd.read_csv(StringIO(text), dtype={'code':'object'}) 47 | df = df.set_index('code') 48 | return df 49 | 50 | 51 | def get_report_data(year, quarter): 52 | """ 53 | 获取业绩报表数据 54 | Parameters 55 | -------- 56 | year:int 年度 e.g:2014 57 | quarter:int 季度 :1、2、3、4,只能输入这4个季度 58 | 说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度 59 | 60 | Return 61 | -------- 62 | DataFrame 63 | code,代码 64 | name,名称 65 | eps,每股收益 66 | eps_yoy,每股收益同比(%) 67 | bvps,每股净资产 68 | roe,净资产收益率(%) 69 | epcf,每股现金流量(元) 70 | net_profits,净利润(万元) 71 | profits_yoy,净利润同比(%) 72 | distrib,分配方案 73 | report_date,发布日期 74 | """ 75 | if ct._check_input(year,quarter) is True: 76 | ct._write_head() 77 | df = _get_report_data(year, quarter, 1, pd.DataFrame()) 78 | if df is not None: 79 | df = df.drop_duplicates('code') 80 | df['code'] = df['code'].map(lambda x:str(x).zfill(6)) 81 | return df 82 | 83 | 84 | def _get_report_data(year, quarter, pageNo, dataArr): 85 | ct._write_console() 86 | try: 87 | request = Request(ct.REPORT_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], ct.PAGES['fd'], 88 | year, quarter, pageNo, ct.PAGE_NUM[1])) 89 | text = urlopen(request, timeout=10).read() 90 | text = text.decode('GBK') 91 | html = lxml.html.parse(StringIO(text)) 92 | res = html.xpath("//table[@class=\"list_table\"]/tr") 93 | if ct.PY3: 94 | sarr = [etree.tostring(node).decode('utf-8') for node in res] 95 | else: 96 | sarr = [etree.tostring(node) for node in res] 97 | sarr = ''.join(sarr) 98 | sarr = '%s
'%sarr 99 | df = pd.read_html(sarr)[0] 100 | df = df.drop(11, axis=1) 101 | df.columns = ct.REPORT_COLS 102 | dataArr = dataArr.append(df, ignore_index=True) 103 | nextPage = html.xpath('//div[@class=\"pages\"]/a[last()]/@onclick') 104 | if len(nextPage)>0: 105 | pageNo = re.findall(r'\d+', nextPage[0])[0] 106 | return _get_report_data(year, quarter, pageNo, dataArr) 107 | else: 108 | return dataArr 109 | except Exception as e: 110 | print(e) 111 | 112 | 113 | def get_profit_data(year, quarter): 114 | """ 115 | 获取盈利能力数据 116 | Parameters 117 | -------- 118 | year:int 年度 e.g:2014 119 | quarter:int 季度 :1、2、3、4,只能输入这4个季度 120 | 说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度 121 | 122 | Return 123 | -------- 124 | DataFrame 125 | code,代码 126 | name,名称 127 | roe,净资产收益率(%) 128 | net_profit_ratio,净利率(%) 129 | gross_profit_rate,毛利率(%) 130 | net_profits,净利润(万元) 131 | eps,每股收益 132 | business_income,营业收入(百万元) 133 | bips,每股主营业务收入(元) 134 | """ 135 | if ct._check_input(year, quarter) is True: 136 | ct._write_head() 137 | data = _get_profit_data(year, quarter, 1, pd.DataFrame()) 138 | if data is not None: 139 | data = data.drop_duplicates('code') 140 | data['code'] = data['code'].map(lambda x:str(x).zfill(6)) 141 | return data 142 | 143 | 144 | def _get_profit_data(year, quarter, pageNo, dataArr): 145 | ct._write_console() 146 | try: 147 | request = Request(ct.PROFIT_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], 148 | ct.PAGES['fd'], year, 149 | quarter, pageNo, ct.PAGE_NUM[1])) 150 | text = urlopen(request, timeout=10).read() 151 | text = text.decode('GBK') 152 | html = lxml.html.parse(StringIO(text)) 153 | res = html.xpath("//table[@class=\"list_table\"]/tr") 154 | if ct.PY3: 155 | sarr = [etree.tostring(node).decode('utf-8') for node in res] 156 | else: 157 | sarr = [etree.tostring(node) for node in res] 158 | sarr = ''.join(sarr) 159 | sarr = '%s
'%sarr 160 | df = pd.read_html(sarr)[0] 161 | df.columns=ct.PROFIT_COLS 162 | dataArr = dataArr.append(df, ignore_index=True) 163 | nextPage = html.xpath('//div[@class=\"pages\"]/a[last()]/@onclick') 164 | if len(nextPage)>0: 165 | pageNo = re.findall(r'\d+', nextPage[0])[0] 166 | return _get_profit_data(year, quarter, pageNo, dataArr) 167 | else: 168 | return dataArr 169 | except: 170 | pass 171 | 172 | 173 | def get_operation_data(year, quarter): 174 | """ 175 | 获取营运能力数据 176 | Parameters 177 | -------- 178 | year:int 年度 e.g:2014 179 | quarter:int 季度 :1、2、3、4,只能输入这4个季度 180 | 说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度 181 | 182 | Return 183 | -------- 184 | DataFrame 185 | code,代码 186 | name,名称 187 | arturnover,应收账款周转率(次) 188 | arturndays,应收账款周转天数(天) 189 | inventory_turnover,存货周转率(次) 190 | inventory_days,存货周转天数(天) 191 | currentasset_turnover,流动资产周转率(次) 192 | currentasset_days,流动资产周转天数(天) 193 | """ 194 | if ct._check_input(year, quarter) is True: 195 | ct._write_head() 196 | data = _get_operation_data(year, quarter, 1, pd.DataFrame()) 197 | if data is not None: 198 | data = data.drop_duplicates('code') 199 | data['code'] = data['code'].map(lambda x:str(x).zfill(6)) 200 | return data 201 | 202 | 203 | def _get_operation_data(year, quarter, pageNo, dataArr): 204 | ct._write_console() 205 | try: 206 | request = Request(ct.OPERATION_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], 207 | ct.PAGES['fd'], year, 208 | quarter, pageNo, ct.PAGE_NUM[1])) 209 | text = urlopen(request, timeout=10).read() 210 | text = text.decode('GBK') 211 | html = lxml.html.parse(StringIO(text)) 212 | res = html.xpath("//table[@class=\"list_table\"]/tr") 213 | if ct.PY3: 214 | sarr = [etree.tostring(node).decode('utf-8') for node in res] 215 | else: 216 | sarr = [etree.tostring(node) for node in res] 217 | sarr = ''.join(sarr) 218 | sarr = '%s
'%sarr 219 | df = pd.read_html(sarr)[0] 220 | df.columns=ct.OPERATION_COLS 221 | dataArr = dataArr.append(df, ignore_index=True) 222 | nextPage = html.xpath('//div[@class=\"pages\"]/a[last()]/@onclick') 223 | if len(nextPage)>0: 224 | pageNo = re.findall(r'\d+', nextPage[0])[0] 225 | return _get_operation_data(year, quarter, pageNo, dataArr) 226 | else: 227 | return dataArr 228 | except Exception as e: 229 | print(e) 230 | 231 | 232 | def get_growth_data(year, quarter): 233 | """ 234 | 获取成长能力数据 235 | Parameters 236 | -------- 237 | year:int 年度 e.g:2014 238 | quarter:int 季度 :1、2、3、4,只能输入这4个季度 239 | 说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度 240 | 241 | Return 242 | -------- 243 | DataFrame 244 | code,代码 245 | name,名称 246 | mbrg,主营业务收入增长率(%) 247 | nprg,净利润增长率(%) 248 | nav,净资产增长率 249 | targ,总资产增长率 250 | epsg,每股收益增长率 251 | seg,股东权益增长率 252 | """ 253 | if ct._check_input(year, quarter) is True: 254 | ct._write_head() 255 | data = _get_growth_data(year, quarter, 1, pd.DataFrame()) 256 | if data is not None: 257 | data = data.drop_duplicates('code') 258 | data['code'] = data['code'].map(lambda x:str(x).zfill(6)) 259 | return data 260 | 261 | 262 | def _get_growth_data(year, quarter, pageNo, dataArr): 263 | ct._write_console() 264 | try: 265 | request = Request(ct.GROWTH_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], 266 | ct.PAGES['fd'], year, 267 | quarter, pageNo, ct.PAGE_NUM[1])) 268 | text = urlopen(request, timeout=10).read() 269 | text = text.decode('GBK') 270 | html = lxml.html.parse(StringIO(text)) 271 | res = html.xpath("//table[@class=\"list_table\"]/tr") 272 | if ct.PY3: 273 | sarr = [etree.tostring(node).decode('utf-8') for node in res] 274 | else: 275 | sarr = [etree.tostring(node) for node in res] 276 | sarr = ''.join(sarr) 277 | sarr = '%s
'%sarr 278 | df = pd.read_html(sarr)[0] 279 | df.columns=ct.GROWTH_COLS 280 | dataArr = dataArr.append(df, ignore_index=True) 281 | nextPage = html.xpath('//div[@class=\"pages\"]/a[last()]/@onclick') 282 | if len(nextPage)>0: 283 | pageNo = re.findall(r'\d+', nextPage[0])[0] 284 | return _get_growth_data(year, quarter, pageNo, dataArr) 285 | else: 286 | return dataArr 287 | except Exception as e: 288 | print(e) 289 | 290 | 291 | def get_debtpaying_data(year, quarter): 292 | """ 293 | 获取偿债能力数据 294 | Parameters 295 | -------- 296 | year:int 年度 e.g:2014 297 | quarter:int 季度 :1、2、3、4,只能输入这4个季度 298 | 说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度 299 | 300 | Return 301 | -------- 302 | DataFrame 303 | code,代码 304 | name,名称 305 | currentratio,流动比率 306 | quickratio,速动比率 307 | cashratio,现金比率 308 | icratio,利息支付倍数 309 | sheqratio,股东权益比率 310 | adratio,股东权益增长率 311 | """ 312 | if ct._check_input(year, quarter) is True: 313 | ct._write_head() 314 | df = _get_debtpaying_data(year, quarter, 1, pd.DataFrame()) 315 | if df is not None: 316 | df = df.drop_duplicates('code') 317 | df['code'] = df['code'].map(lambda x:str(x).zfill(6)) 318 | return df 319 | 320 | 321 | def _get_debtpaying_data(year, quarter, pageNo, dataArr): 322 | ct._write_console() 323 | try: 324 | request = Request(ct.DEBTPAYING_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], 325 | ct.PAGES['fd'], year, 326 | quarter, pageNo, ct.PAGE_NUM[1])) 327 | text = urlopen(request, timeout=10).read() 328 | text = text.decode('GBK') 329 | html = lxml.html.parse(StringIO(text)) 330 | res = html.xpath("//table[@class=\"list_table\"]/tr") 331 | if ct.PY3: 332 | sarr = [etree.tostring(node).decode('utf-8') for node in res] 333 | else: 334 | sarr = [etree.tostring(node) for node in res] 335 | sarr = ''.join(sarr) 336 | sarr = '%s
'%sarr 337 | df = pd.read_html(sarr)[0] 338 | df.columns = ct.DEBTPAYING_COLS 339 | dataArr = dataArr.append(df, ignore_index=True) 340 | nextPage = html.xpath('//div[@class=\"pages\"]/a[last()]/@onclick') 341 | if len(nextPage)>0: 342 | pageNo = re.findall(r'\d+', nextPage[0])[0] 343 | return _get_debtpaying_data(year, quarter, pageNo, dataArr) 344 | else: 345 | return dataArr 346 | except Exception as e: 347 | print(e) 348 | 349 | 350 | def get_cashflow_data(year, quarter): 351 | """ 352 | 获取现金流量数据 353 | Parameters 354 | -------- 355 | year:int 年度 e.g:2014 356 | quarter:int 季度 :1、2、3、4,只能输入这4个季度 357 | 说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度 358 | 359 | Return 360 | -------- 361 | DataFrame 362 | code,代码 363 | name,名称 364 | cf_sales,经营现金净流量对销售收入比率 365 | rateofreturn,资产的经营现金流量回报率 366 | cf_nm,经营现金净流量与净利润的比率 367 | cf_liabilities,经营现金净流量对负债比率 368 | cashflowratio,现金流量比率 369 | """ 370 | if ct._check_input(year, quarter) is True: 371 | ct._write_head() 372 | df = _get_cashflow_data(year, quarter, 1, pd.DataFrame()) 373 | if df is not None: 374 | df = df.drop_duplicates('code') 375 | df['code'] = df['code'].map(lambda x:str(x).zfill(6)) 376 | return df 377 | 378 | 379 | def _get_cashflow_data(year, quarter, pageNo, dataArr): 380 | ct._write_console() 381 | try: 382 | request = Request(ct.CASHFLOW_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], 383 | ct.PAGES['fd'], year, 384 | quarter, pageNo, ct.PAGE_NUM[1])) 385 | text = urlopen(request, timeout=10).read() 386 | text = text.decode('GBK') 387 | html = lxml.html.parse(StringIO(text)) 388 | res = html.xpath("//table[@class=\"list_table\"]/tr") 389 | if ct.PY3: 390 | sarr = [etree.tostring(node).decode('utf-8') for node in res] 391 | else: 392 | sarr = [etree.tostring(node) for node in res] 393 | sarr = ''.join(sarr) 394 | sarr = '%s
'%sarr 395 | df = pd.read_html(sarr)[0] 396 | df.columns = ct.CASHFLOW_COLS 397 | dataArr = dataArr.append(df, ignore_index=True) 398 | nextPage = html.xpath('//div[@class=\"pages\"]/a[last()]/@onclick') 399 | if len(nextPage)>0: 400 | pageNo = re.findall(r'\d+', nextPage[0])[0] 401 | return _get_cashflow_data(year, quarter, pageNo, dataArr) 402 | else: 403 | return dataArr 404 | except Exception as e: 405 | print(e) 406 | 407 | 408 | def _data_path(): 409 | import os 410 | import inspect 411 | caller_file = inspect.stack()[1][1] 412 | pardir = os.path.abspath(os.path.join(os.path.dirname(caller_file), os.path.pardir)) 413 | return os.path.abspath(os.path.join(pardir, os.path.pardir)) 414 | 415 | -------------------------------------------------------------------------------- /tushare/tushare/stock/macro.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | """ 4 | 宏观经济数据接口 5 | Created on 2015/01/24 6 | @author: Jimmy Liu 7 | @group : waditu 8 | @contact: jimmysoa@sina.cn 9 | """ 10 | 11 | import pandas as pd 12 | import numpy as np 13 | import re 14 | import json 15 | from tushare.stock import macro_vars as vs 16 | from tushare.stock import cons as ct 17 | try: 18 | from urllib.request import urlopen, Request 19 | except ImportError: 20 | from urllib2 import urlopen, Request 21 | 22 | 23 | def get_gdp_year(): 24 | """ 25 | 获取年度国内生产总值数据 26 | Return 27 | -------- 28 | DataFrame 29 | year :统计年度 30 | gdp :国内生产总值(亿元) 31 | pc_gdp :人均国内生产总值(元) 32 | gnp :国民生产总值(亿元) 33 | pi :第一产业(亿元) 34 | si :第二产业(亿元) 35 | industry :工业(亿元) 36 | cons_industry :建筑业(亿元) 37 | ti :第三产业(亿元) 38 | trans_industry :交通运输仓储邮电通信业(亿元) 39 | lbdy :批发零售贸易及餐饮业(亿元) 40 | """ 41 | rdint = vs.random() 42 | request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'], 43 | rdint, vs.MACRO_TYPE[0], 0, 70, 44 | rdint)) 45 | text = urlopen(request, timeout=10).read() 46 | text = text.decode('gbk') if ct.PY3 else text 47 | regSym = re.compile(r'\,count:(.*?)\}') 48 | datastr = regSym.findall(text) 49 | datastr = datastr[0] 50 | datastr = datastr.split('data:')[1] 51 | datastr = datastr.replace('"', '').replace('null', '0') 52 | js = json.loads(datastr) 53 | df = pd.DataFrame(js, columns=vs.GDP_YEAR_COLS) 54 | df[df==0] = np.NaN 55 | return df 56 | 57 | 58 | def get_gdp_quarter(): 59 | """ 60 | 获取季度国内生产总值数据 61 | Return 62 | -------- 63 | DataFrame 64 | quarter :季度 65 | gdp :国内生产总值(亿元) 66 | gdp_yoy :国内生产总值同比增长(%) 67 | pi :第一产业增加值(亿元) 68 | pi_yoy:第一产业增加值同比增长(%) 69 | si :第二产业增加值(亿元) 70 | si_yoy :第二产业增加值同比增长(%) 71 | ti :第三产业增加值(亿元) 72 | ti_yoy :第三产业增加值同比增长(%) 73 | """ 74 | rdint = vs.random() 75 | request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'], 76 | rdint, vs.MACRO_TYPE[0], 1, 250, 77 | rdint)) 78 | text = urlopen(request,timeout=10).read() 79 | text = text.decode('gbk') if ct.PY3 else text 80 | regSym = re.compile(r'\,count:(.*?)\}') 81 | datastr = regSym.findall(text) 82 | datastr = datastr[0] 83 | datastr = datastr.split('data:')[1] 84 | datastr = datastr.replace('"', '').replace('null', '0') 85 | js = json.loads(datastr) 86 | df = pd.DataFrame(js, columns=vs.GDP_QUARTER_COLS) 87 | df['quarter'] = df['quarter'].astype(object) 88 | df[df==0] = np.NaN 89 | return df 90 | 91 | 92 | def get_gdp_for(): 93 | """ 94 | 获取三大需求对GDP贡献数据 95 | Return 96 | -------- 97 | DataFrame 98 | year :统计年度 99 | end_for :最终消费支出贡献率(%) 100 | for_rate :最终消费支出拉动(百分点) 101 | asset_for :资本形成总额贡献率(%) 102 | asset_rate:资本形成总额拉动(百分点) 103 | goods_for :货物和服务净出口贡献率(%) 104 | goods_rate :货物和服务净出口拉动(百分点) 105 | """ 106 | rdint = vs.random() 107 | request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'], 108 | rdint, vs.MACRO_TYPE[0], 4, 80, rdint)) 109 | text = urlopen(request,timeout=10).read() 110 | text = text.decode('gbk') if ct.PY3 else text 111 | regSym = re.compile(r'\,count:(.*?)\}') 112 | datastr = regSym.findall(text) 113 | datastr = datastr[0] 114 | datastr = datastr.split('data:')[1] 115 | datastr = datastr.replace('"','').replace('null','0') 116 | js = json.loads(datastr) 117 | df = pd.DataFrame(js,columns=vs.GDP_FOR_COLS) 118 | df[df==0] = np.NaN 119 | return df 120 | 121 | 122 | def get_gdp_pull(): 123 | """ 124 | 获取三大产业对GDP拉动数据 125 | Return 126 | -------- 127 | DataFrame 128 | year :统计年度 129 | gdp_yoy :国内生产总值同比增长(%) 130 | pi :第一产业拉动率(%) 131 | si :第二产业拉动率(%) 132 | industry:其中工业拉动(%) 133 | ti :第三产业拉动率(%) 134 | """ 135 | rdint = vs.random() 136 | request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'], 137 | rdint, vs.MACRO_TYPE[0], 5, 60, rdint)) 138 | text = urlopen(request,timeout=10).read() 139 | text = text.decode('gbk') if ct.PY3 else text 140 | regSym = re.compile(r'\,count:(.*?)\}') 141 | datastr = regSym.findall(text) 142 | datastr = datastr[0] 143 | datastr = datastr.split('data:')[1] 144 | datastr = datastr.replace('"', '').replace('null', '0') 145 | js = json.loads(datastr) 146 | df = pd.DataFrame(js, columns=vs.GDP_PULL_COLS) 147 | df[df==0] = np.NaN 148 | return df 149 | 150 | 151 | def get_gdp_contrib(): 152 | """ 153 | 获取三大产业贡献率数据 154 | Return 155 | -------- 156 | DataFrame 157 | year :统计年度 158 | gdp_yoy :国内生产总值 159 | pi :第一产业献率(%) 160 | si :第二产业献率(%) 161 | industry:其中工业献率(%) 162 | ti :第三产业献率(%) 163 | """ 164 | rdint = vs.random() 165 | request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'], rdint, 166 | vs.MACRO_TYPE[0], 6, 60, rdint)) 167 | text = urlopen(request, timeout=10).read() 168 | text = text.decode('gbk') if ct.PY3 else text 169 | regSym = re.compile(r'\,count:(.*?)\}') 170 | datastr = regSym.findall(text) 171 | datastr = datastr[0] 172 | datastr = datastr.split('data:')[1] 173 | datastr = datastr.replace('"', '').replace('null', '0') 174 | js = json.loads(datastr) 175 | df = pd.DataFrame(js, columns=vs.GDP_CONTRIB_COLS) 176 | df[df==0] = np.NaN 177 | return df 178 | 179 | def get_cpi(): 180 | """ 181 | 获取居民消费价格指数数据 182 | Return 183 | -------- 184 | DataFrame 185 | month :统计月份 186 | cpi :价格指数 187 | """ 188 | rdint = vs.random() 189 | request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'], 190 | rdint, vs.MACRO_TYPE[1], 0, 600, 191 | rdint)) 192 | text = urlopen(request,timeout=10).read() 193 | text = text.decode('gbk') if ct.PY3 else text 194 | regSym = re.compile(r'\,count:(.*?)\}') 195 | datastr = regSym.findall(text) 196 | datastr = datastr[0] 197 | datastr = datastr.split('data:')[1] 198 | js = json.loads(datastr) 199 | df = pd.DataFrame(js, columns=vs.CPI_COLS) 200 | df['cpi'] = df['cpi'].astype(float) 201 | return df 202 | 203 | 204 | def get_ppi(): 205 | """ 206 | 获取工业品出厂价格指数数据 207 | Return 208 | -------- 209 | DataFrame 210 | month :统计月份 211 | ppiip :工业品出厂价格指数 212 | ppi :生产资料价格指数 213 | qm:采掘工业价格指数 214 | rmi:原材料工业价格指数 215 | pi:加工工业价格指数 216 | cg:生活资料价格指数 217 | food:食品类价格指数 218 | clothing:衣着类价格指数 219 | roeu:一般日用品价格指数 220 | dcg:耐用消费品价格指数 221 | """ 222 | rdint = vs.random() 223 | request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'], 224 | rdint, vs.MACRO_TYPE[1], 3, 600, 225 | rdint)) 226 | text = urlopen(request, timeout=10).read() 227 | text = text.decode('gbk') if ct.PY3 else text 228 | regSym = re.compile(r'\,count:(.*?)\}') 229 | datastr = regSym.findall(text) 230 | datastr = datastr[0] 231 | datastr = datastr.split('data:')[1] 232 | js = json.loads(datastr) 233 | df = pd.DataFrame(js, columns=vs.PPI_COLS) 234 | for i in df.columns: 235 | df[i] = df[i].apply(lambda x:np.where(x is None, np.NaN, x)) 236 | if i != 'month': 237 | df[i] = df[i].astype(float) 238 | return df 239 | 240 | 241 | def get_deposit_rate(): 242 | """ 243 | 获取存款利率数据 244 | Return 245 | -------- 246 | DataFrame 247 | date :变动日期 248 | deposit_type :存款种类 249 | rate:利率(%) 250 | """ 251 | rdint = vs.random() 252 | request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'], 253 | rdint, vs.MACRO_TYPE[2], 2, 600, 254 | rdint)) 255 | text = urlopen(request, timeout=10).read() 256 | text = text.decode('gbk') 257 | regSym = re.compile(r'\,count:(.*?)\}') 258 | datastr = regSym.findall(text) 259 | datastr = datastr[0] 260 | datastr = datastr.split('data:')[1] 261 | js = json.loads(datastr) 262 | df = pd.DataFrame(js, columns=vs.DEPOSIT_COLS) 263 | for i in df.columns: 264 | df[i] = df[i].apply(lambda x:np.where(x is None, '--', x)) 265 | return df 266 | 267 | 268 | def get_loan_rate(): 269 | """ 270 | 获取贷款利率数据 271 | Return 272 | -------- 273 | DataFrame 274 | date :执行日期 275 | loan_type :存款种类 276 | rate:利率(%) 277 | """ 278 | rdint = vs.random() 279 | request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'], 280 | rdint, vs.MACRO_TYPE[2], 3, 800, 281 | rdint)) 282 | text = urlopen(request, timeout=10).read() 283 | text = text.decode('gbk') 284 | regSym = re.compile(r'\,count:(.*?)\}') 285 | datastr = regSym.findall(text) 286 | datastr = datastr[0] 287 | datastr = datastr.split('data:')[1] 288 | js = json.loads(datastr) 289 | df = pd.DataFrame(js, columns=vs.LOAN_COLS) 290 | for i in df.columns: 291 | df[i] = df[i].apply(lambda x:np.where(x is None, '--', x)) 292 | return df 293 | 294 | 295 | def get_rrr(): 296 | """ 297 | 获取存款准备金率数据 298 | Return 299 | -------- 300 | DataFrame 301 | date :变动日期 302 | before :调整前存款准备金率(%) 303 | now:调整后存款准备金率(%) 304 | changed:调整幅度(%) 305 | """ 306 | rdint = vs.random() 307 | request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'], 308 | rdint, vs.MACRO_TYPE[2], 4, 100, 309 | rdint)) 310 | text = urlopen(request, timeout=10).read() 311 | text = text.decode('gbk') 312 | regSym = re.compile(r'\,count:(.*?)\}') 313 | datastr = regSym.findall(text) 314 | datastr = datastr[0] 315 | datastr = datastr.split('data:')[1] 316 | js = json.loads(datastr) 317 | df = pd.DataFrame(js, columns=vs.RRR_COLS) 318 | for i in df.columns: 319 | df[i] = df[i].apply(lambda x:np.where(x is None, '--', x)) 320 | return df 321 | 322 | 323 | def get_money_supply(): 324 | """ 325 | 获取货币供应量数据 326 | Return 327 | -------- 328 | DataFrame 329 | month :统计时间 330 | m2 :货币和准货币(广义货币M2)(亿元) 331 | m2_yoy:货币和准货币(广义货币M2)同比增长(%) 332 | m1:货币(狭义货币M1)(亿元) 333 | m1_yoy:货币(狭义货币M1)同比增长(%) 334 | m0:流通中现金(M0)(亿元) 335 | m0_yoy:流通中现金(M0)同比增长(%) 336 | cd:活期存款(亿元) 337 | cd_yoy:活期存款同比增长(%) 338 | qm:准货币(亿元) 339 | qm_yoy:准货币同比增长(%) 340 | ftd:定期存款(亿元) 341 | ftd_yoy:定期存款同比增长(%) 342 | sd:储蓄存款(亿元) 343 | sd_yoy:储蓄存款同比增长(%) 344 | rests:其他存款(亿元) 345 | rests_yoy:其他存款同比增长(%) 346 | """ 347 | rdint = vs.random() 348 | request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'], 349 | rdint, vs.MACRO_TYPE[2], 1, 600, 350 | rdint)) 351 | text = urlopen(request, timeout=10).read() 352 | text = text.decode('gbk') 353 | regSym = re.compile(r'\,count:(.*?)\}') 354 | datastr = regSym.findall(text) 355 | datastr = datastr[0] 356 | datastr = datastr.split('data:')[1] 357 | js = json.loads(datastr) 358 | df = pd.DataFrame(js, columns=vs.MONEY_SUPPLY_COLS) 359 | for i in df.columns: 360 | df[i] = df[i].apply(lambda x:np.where(x is None, '--', x)) 361 | return df 362 | 363 | 364 | def get_money_supply_bal(): 365 | """ 366 | 获取货币供应量(年底余额)数据 367 | Return 368 | -------- 369 | DataFrame 370 | year :统计年度 371 | m2 :货币和准货币(亿元) 372 | m1:货币(亿元) 373 | m0:流通中现金(亿元) 374 | cd:活期存款(亿元) 375 | qm:准货币(亿元) 376 | ftd:定期存款(亿元) 377 | sd:储蓄存款(亿元) 378 | rests:其他存款(亿元) 379 | """ 380 | rdint = vs.random() 381 | request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'], 382 | rdint, vs.MACRO_TYPE[2], 0, 200, 383 | rdint)) 384 | text = urlopen(request,timeout=10).read() 385 | text = text.decode('gbk') 386 | regSym = re.compile(r'\,count:(.*?)\}') 387 | datastr = regSym.findall(text) 388 | datastr = datastr[0] 389 | datastr = datastr.split('data:')[1] 390 | js = json.loads(datastr) 391 | df = pd.DataFrame(js, columns=vs.MONEY_SUPPLY_BLA_COLS) 392 | for i in df.columns: 393 | df[i] = df[i].apply(lambda x:np.where(x is None, '--', x)) 394 | return df 395 | -------------------------------------------------------------------------------- /tushare/tushare/stock/macro_vars.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | P_TYPE = {'http':'http://','ftp':'ftp://'} 4 | DOMAINS = {'sina':'sina.com.cn','sinahq':'sinajs.cn','ifeng':'ifeng.com'} 5 | MACRO_TYPE = ['nation','price','fininfo'] 6 | MACRO_URL = '%smoney.finance.%s/mac/api/jsonp.php/SINAREMOTECALLCALLBACK%s/MacPage_Service.get_pagedata?cate=%s&event=%s&from=0&num=%s&condition=&_=%s' 7 | GDP_YEAR_COLS = ['year','gdp','pc_gdp','gnp','pi','si','industry','cons_industry','ti','trans_industry','lbdy'] 8 | GDP_QUARTER_COLS = ['quarter','gdp','gdp_yoy','pi','pi_yoy','si','si_yoy','ti','ti_yoy'] 9 | GDP_FOR_COLS = ['year','end_for','for_rate','asset_for','asset_rate','goods_for','goods_rate'] 10 | GDP_PULL_COLS = ['year','gdp_yoy','pi','si','industry','ti'] 11 | GDP_CONTRIB_COLS = ['year','gdp_yoy','pi','si','industry','ti'] 12 | CPI_COLS = ['month','cpi'] 13 | PPI_COLS = ['month','ppiip','ppi','qm','rmi','pi','cg','food','clothing','roeu','dcg'] 14 | DEPOSIT_COLS = ['date','deposit_type','rate'] 15 | LOAN_COLS = ['date','loan_type','rate'] 16 | RRR_COLS = ['date','before','now','changed'] 17 | MONEY_SUPPLY_COLS = ['month','m2','m2_yoy','m1','m1_yoy','m0','m0_yoy','cd','cd_yoy','qm','qm_yoy','ftd','ftd_yoy','sd','sd_yoy','rests','rests_yoy'] 18 | MONEY_SUPPLY_BLA_COLS = ['year','m2','m1','m0','cd','qm','ftd','sd','rests'] 19 | 20 | def random(n=13): 21 | from random import randint 22 | start = 10**(n-1) 23 | end = (10**n)-1 24 | return str(randint(start, end)) -------------------------------------------------------------------------------- /tushare/tushare/stock/news_vars.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | LATEST_URL = '%sroll.news.%s/interface/%s?col=43&spec=&type=&ch=03&k=&offset_page=0&offset_num=0&num=%s&asc=&page=1&r=0.%s' 4 | LATEST_COLS = ['classify','title','time','url'] 5 | LATEST_COLS_C = ['classify','title','time','url','content'] 6 | NOTICE_INFO_URL = '%s%s/corp/view/%s?stock_str=%s' 7 | NOTICE_INFO_CLS = ['title', 'type', 'date', 'url'] 8 | GUBA_SINA_URL = '%sguba.%s' 9 | GUBA_SINA_COLS = ['title', 'content', 'ptime', 'rcounts'] 10 | -------------------------------------------------------------------------------- /tushare/tushare/stock/newsevent.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | """ 4 | 新闻事件数据接口 5 | Created on 2015/02/07 6 | @author: Jimmy Liu 7 | @group : waditu 8 | @contact: jimmysoa@sina.cn 9 | """ 10 | 11 | from tushare.stock import cons as ct 12 | from tushare.stock import news_vars as nv 13 | import pandas as pd 14 | from datetime import datetime 15 | import lxml.html 16 | from lxml import etree 17 | import re 18 | import json 19 | try: 20 | from urllib.request import urlopen, Request 21 | except ImportError: 22 | from urllib2 import urlopen, Request 23 | 24 | 25 | 26 | def get_latest_news(top=None, show_content=False): 27 | """ 28 | 获取即时财经新闻 29 | 30 | Parameters 31 | -------- 32 | top:数值,显示最新消息的条数,默认为80条 33 | show_content:是否显示新闻内容,默认False 34 | 35 | Return 36 | -------- 37 | DataFrame 38 | classify :新闻类别 39 | title :新闻标题 40 | time :发布时间 41 | url :新闻链接 42 | content:新闻内容(在show_content为True的情况下出现) 43 | """ 44 | top = ct.PAGE_NUM[2] if top is None else top 45 | try: 46 | request = Request(nv.LATEST_URL % (ct.P_TYPE['http'], ct.DOMAINS['sina'], 47 | ct.PAGES['lnews'], top, 48 | _random())) 49 | data_str = urlopen(request, timeout=10).read() 50 | data_str = data_str.decode('GBK') 51 | data_str = data_str.split('=')[1][:-1] 52 | data_str = eval(data_str, type('Dummy', (dict,), 53 | dict(__getitem__ = lambda s, n:n))()) 54 | data_str = json.dumps(data_str) 55 | data_str = json.loads(data_str) 56 | data_str = data_str['list'] 57 | data = [] 58 | for r in data_str: 59 | rt = datetime.fromtimestamp(r['time']) 60 | rtstr = datetime.strftime(rt, "%m-%d %H:%M") 61 | arow = [r['channel']['title'], r['title'], rtstr, r['url']] 62 | if show_content: 63 | arow.append(latest_content(r['url'])) 64 | data.append(arow) 65 | df = pd.DataFrame(data, columns=nv.LATEST_COLS_C if show_content else nv.LATEST_COLS) 66 | return df 67 | except Exception as er: 68 | print(str(er)) 69 | 70 | 71 | def latest_content(url): 72 | ''' 73 | 获取即时财经新闻内容 74 | Parameter 75 | -------- 76 | url:新闻链接 77 | 78 | Return 79 | -------- 80 | string:返回新闻的文字内容 81 | ''' 82 | try: 83 | html = lxml.html.parse(url) 84 | res = html.xpath('//div[@id=\"artibody\"]/p') 85 | if ct.PY3: 86 | sarr = [etree.tostring(node).decode('utf-8') for node in res] 87 | else: 88 | sarr = [etree.tostring(node) for node in res] 89 | sarr = ''.join(sarr).replace(' ', '')#.replace('\n\n', '\n'). 90 | html_content = lxml.html.fromstring(sarr) 91 | content = html_content.text_content() 92 | return content 93 | except Exception as er: 94 | print(str(er)) 95 | 96 | 97 | def get_notices(code=None, date=None): 98 | ''' 99 | 个股信息地雷 100 | Parameters 101 | -------- 102 | code:股票代码 103 | date:信息公布日期 104 | 105 | Return 106 | -------- 107 | DataFrame,属性列表: 108 | title:信息标题 109 | type:信息类型 110 | date:公告日期 111 | url:信息内容URL 112 | ''' 113 | if code is None: 114 | return None 115 | symbol = 'sh' + code if code[:1] == '6' else 'sz' + code 116 | url = nv.NOTICE_INFO_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], 117 | ct.PAGES['ntinfo'], symbol) 118 | url = url if date is None else '%s&gg_date=%s'%(url, date) 119 | html = lxml.html.parse(url) 120 | res = html.xpath('//table[@class=\"body_table\"]/tbody/tr') 121 | data = [] 122 | for td in res: 123 | title = td.xpath('th/a/text()')[0] 124 | type = td.xpath('td[1]/text()')[0] 125 | date = td.xpath('td[2]/text()')[0] 126 | url = '%s%s%s'%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], td.xpath('th/a/@href')[0]) 127 | data.append([title, type, date, url]) 128 | df = pd.DataFrame(data, columns=nv.NOTICE_INFO_CLS) 129 | return df 130 | 131 | 132 | def notice_content(url): 133 | ''' 134 | 获取信息地雷内容 135 | Parameter 136 | -------- 137 | url:内容链接 138 | 139 | Return 140 | -------- 141 | string:信息内容 142 | ''' 143 | try: 144 | html = lxml.html.parse(url) 145 | res = html.xpath('//div[@id=\"content\"]/pre/text()')[0] 146 | return res.strip() 147 | except Exception as er: 148 | print(str(er)) 149 | 150 | 151 | def guba_sina(show_content=False): 152 | """ 153 | 获取sina财经股吧首页的重点消息 154 | Parameter 155 | -------- 156 | show_content:是否显示内容,默认False 157 | 158 | Return 159 | -------- 160 | DataFrame 161 | title, 消息标题 162 | content, 消息内容(show_content=True的情况下) 163 | ptime, 发布时间 164 | rcounts,阅读次数 165 | """ 166 | 167 | from pandas.io.common import urlopen 168 | try: 169 | with urlopen(nv.GUBA_SINA_URL%(ct.P_TYPE['http'], 170 | ct.DOMAINS['sina'])) as resp: 171 | lines = resp.read() 172 | html = lxml.html.document_fromstring(lines) 173 | res = html.xpath('//ul[@class=\"list_05\"]/li') 174 | heads = html.xpath('//div[@class=\"tit_04\"]') 175 | data = [] 176 | for head in heads[:1]: 177 | title = head.xpath('a/text()')[0] 178 | url = head.xpath('a/@href')[0] 179 | ds = [title] 180 | ds.extend(_guba_content(url)) 181 | data.append(ds) 182 | for row in res: 183 | title = row.xpath('a[2]/text()')[0] 184 | url = row.xpath('a[2]/@href')[0] 185 | ds = [title] 186 | ds.extend(_guba_content(url)) 187 | data.append(ds) 188 | df = pd.DataFrame(data, columns=nv.GUBA_SINA_COLS) 189 | df['rcounts'] = df['rcounts'].astype(float) 190 | return df if show_content is True else df.drop('content', axis=1) 191 | except Exception as er: 192 | print(str(er)) 193 | 194 | 195 | def _guba_content(url): 196 | try: 197 | html = lxml.html.parse(url) 198 | res = html.xpath('//div[@class=\"ilt_p\"]/p') 199 | if ct.PY3: 200 | sarr = [etree.tostring(node).decode('utf-8') for node in res] 201 | else: 202 | sarr = [etree.tostring(node) for node in res] 203 | sarr = ''.join(sarr).replace(' ', '')#.replace('\n\n', '\n'). 204 | html_content = lxml.html.fromstring(sarr) 205 | content = html_content.text_content() 206 | ptime = html.xpath('//div[@class=\"fl_left iltp_time\"]/span/text()')[0] 207 | rcounts = html.xpath('//div[@class=\"fl_right iltp_span\"]/span[2]/text()')[0] 208 | reg = re.compile(r'\((.*?)\)') 209 | rcounts = reg.findall(rcounts)[0] 210 | return [content, ptime, rcounts] 211 | except Exception: 212 | return ['', '', '0'] 213 | 214 | 215 | def _random(n=16): 216 | from random import randint 217 | start = 10 ** (n - 1) 218 | end = (10 ** n) - 1 219 | return str(randint(start, end)) 220 | 221 | -------------------------------------------------------------------------------- /tushare/tushare/stock/ref_vars.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | DP_URL = '%sapp.finance.%s/data/stock/%s?day=&page=%s' 4 | DP_163_URL = '%squotes.%s/data/caibao/%s?reportdate=%s&sort=declaredate&order=desc&page=%s' 5 | FUND_HOLDS_URL = '%squotes.%s/hs/marketdata/service/%s?host=/hs/marketdata/service/%s&page=%s&query=start:%s;end:%s&order=desc&count=60&type=query&req=%s' 6 | XSG_URL = '%sdatainterface.%s/EM_DataCenter/%s?type=FD&sty=BST&st=3&sr=true&fd=%s&stat=%s' 7 | LHB_URL = '%sdata.%s/stock/lhb/%s.html' 8 | LHB_SINA_URL = '%s%s/q/go.php/vLHBData/kind/%s/%s?last=%s&p=%s' 9 | LHB_COLS = ['code', 'name', 'pchange', 'amount', 'buy', 'bratio', 'sell', 'sratio', 'reason'] 10 | NEW_STOCKS_URL = '%s%s/corp/view/%s?page=%s&cngem=0&orderBy=NetDate&orderType=desc' 11 | MAR_SH_HZ_URL = '%s%s/marketdata/tradedata/%s?jsonCallBack=jsonpCallback%s&isPagination=true&tabType=&pageHelp.pageSize=100&beginDate=%s&endDate=%s%s&_=%s' 12 | MAR_SH_HZ_REF_URL = '%s%s/market/dealingdata/overview/margin/' 13 | MAR_SH_MX_URL = '%s%s/marketdata/tradedata/%s?jsonCallBack=jsonpCallback%s&isPagination=true&tabType=mxtype&detailsDate=%s&pageHelp.pageSize=100&stockCode=%s&beginDate=%s&endDate=%s%s&_=%s' 14 | MAR_SZ_HZ_URL = '%s%s/szseWeb/%s?ACTIONID=8&CATALOGID=1837_xxpl&txtDate=%s&tab2PAGENUM=1&ENCODE=1&TABKEY=tab1' 15 | MAR_SZ_MX_URL = '%s%s/szseWeb/%s?ACTIONID=8&CATALOGID=1837_xxpl&txtDate=%s&tab2PAGENUM=1&ENCODE=1&TABKEY=tab2' 16 | MAR_SH_HZ_TAIL_URL = '&pageHelp.pageNo=%s&pageHelp.beginPage=%s&pageHelp.endPage=%s' 17 | TERMINATED_URL = '%s%s/%s?jsonCallBack=jsonpCallback%s&isPagination=true&sqlId=COMMON_SSE_ZQPZ_GPLB_MCJS_ZZSSGGJBXX_L&pageHelp.pageSize=50&_=%s' 18 | SUSPENDED_URL = '%s%s/%s?jsonCallBack=jsonpCallback%s&isPagination=true&sqlId=COMMON_SSE_ZQPZ_GPLB_MCJS_ZTSSGS_L&pageHelp.pageSize=50&_=%s' 19 | TERMINATED_T_COLS = ['COMPANY_CODE', 'COMPANY_ABBR', 'LISTING_DATE', 'CHANGE_DATE'] 20 | LHB_KINDS = ['ggtj', 'yytj', 'jgzz', 'jgmx'] 21 | LHB_GGTJ_COLS = ['code', 'name', 'count', 'bamount', 'samount', 'net', 'bcount', 'scount'] 22 | LHB_YYTJ_COLS = ['broker', 'count', 'bamount', 'bcount', 'samount', 'scount', 'top3'] 23 | LHB_JGZZ_COLS = ['code', 'name', 'bamount', 'bcount', 'samount', 'scount', 'net'] 24 | LHB_JGMX_COLS = ['code', 'name', 'date', 'bamount', 'samount', 'type'] 25 | TERMINATED_COLS = ['code', 'name', 'oDate', 'tDate'] 26 | DP_COLS = ['report_date', 'quarter', 'code', 'name', 'plan'] 27 | DP_163_COLS = ['code', 'name', 'year', 'plan', 'report_date'] 28 | XSG_COLS = ['code', 'name', 'date', 'count', 'ratio'] 29 | QUARTS_DIC = {'1':('%s-12-31', '%s-03-31'), '2':('%s-03-31', '%s-06-30'), 30 | '3':('%s-06-30', '%s-09-30'), '4':('%s-9-30', '%s-12-31')} 31 | FUND_HOLDS_COLS = ['count', 'clast', 'date', 'ratio', 'amount', 'nums','nlast', 'name', 'code'] 32 | NEW_STOCKS_COLS = ['code', 'name', 'ipo_date', 'issue_date', 'amount', 'markets', 'price', 'pe', 33 | 'limit', 'funds', 'ballot'] 34 | MAR_SH_COOKIESTR = '_gscu_1808689395=27850607moztu036' 35 | MAR_SH_HZ_COLS = ['opDate', 'rzye', 'rzmre', 'rqyl', 'rqylje', 'rqmcl', 'rzrqjyzl'] 36 | MAR_SH_MX_COLS = ['opDate', 'stockCode', 'securityAbbr', 'rzye', 'rzmre', 'rzche', 'rqyl', 'rqmcl', 'rqchl'] 37 | MAR_SZ_HZ_COLS = ['rzmre', 'rzye', 'rqmcl', 'rqyl', 'rqye', 'rzrqye'] 38 | MAR_SZ_MX_COLS = ['stockCode', 'securityAbbr', 'rzmre', 'rzye', 'rqmcl', 'rqyl', 'rqye', 'rzrqye'] 39 | MAR_SZ_HZ_MSG = 'please do not input more than a year,you can obtaining the data year by year.' 40 | MAR_SZ_HZ_MSG2 = 'start and end date all need input.' 41 | -------------------------------------------------------------------------------- /tushare/tushare/stock/shibor.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | """ 3 | 上海银行间同业拆放利率(Shibor)数据接口 4 | Created on 2014/07/31 5 | @author: Jimmy Liu 6 | @group : waditu 7 | @contact: jimmysoa@sina.cn 8 | """ 9 | import pandas as pd 10 | import numpy as np 11 | from tushare.stock import cons as ct 12 | from tushare.util import dateu as du 13 | 14 | def shibor_data(year=None): 15 | """ 16 | 获取上海银行间同业拆放利率(Shibor) 17 | Parameters 18 | ------ 19 | year:年份(int) 20 | 21 | Return 22 | ------ 23 | date:日期 24 | ON:隔夜拆放利率 25 | 1W:1周拆放利率 26 | 2W:2周拆放利率 27 | 1M:1个月拆放利率 28 | 3M:3个月拆放利率 29 | 6M:6个月拆放利率 30 | 9M:9个月拆放利率 31 | 1Y:1年拆放利率 32 | """ 33 | year = du.get_year() if year is None else year 34 | lab = ct.SHIBOR_TYPE['Shibor'] 35 | lab = lab.encode('utf-8') if ct.PY3 else lab 36 | try: 37 | df = pd.read_excel(ct.SHIBOR_DATA_URL%(ct.P_TYPE['http'], ct.DOMAINS['shibor'], 38 | ct.PAGES['dw'], 'Shibor', 39 | year, lab, 40 | year)) 41 | df.columns = ct.SHIBOR_COLS 42 | df['date'] = df['date'].map(lambda x: x.date()) 43 | df['date'] = df['date'].astype(np.datetime64) 44 | return df 45 | except: 46 | return None 47 | 48 | def shibor_quote_data(year=None): 49 | """ 50 | 获取Shibor银行报价数据 51 | Parameters 52 | ------ 53 | year:年份(int) 54 | 55 | Return 56 | ------ 57 | date:日期 58 | bank:报价银行名称 59 | ON:隔夜拆放利率 60 | ON_B:隔夜拆放买入价 61 | ON_A:隔夜拆放卖出价 62 | 1W_B:1周买入 63 | 1W_A:1周卖出 64 | 2W_B:买入 65 | 2W_A:卖出 66 | 1M_B:买入 67 | 1M_A:卖出 68 | 3M_B:买入 69 | 3M_A:卖出 70 | 6M_B:买入 71 | 6M_A:卖出 72 | 9M_B:买入 73 | 9M_A:卖出 74 | 1Y_B:买入 75 | 1Y_A:卖出 76 | """ 77 | year = du.get_year() if year is None else year 78 | lab = ct.SHIBOR_TYPE['Quote'] 79 | lab = lab.encode('utf-8') if ct.PY3 else lab 80 | try: 81 | df = pd.read_excel(ct.SHIBOR_DATA_URL%(ct.P_TYPE['http'], ct.DOMAINS['shibor'], 82 | ct.PAGES['dw'], 'Quote', 83 | year, lab, 84 | year), skiprows=[0]) 85 | df.columns = ct.QUOTE_COLS 86 | df['date'] = df['date'].map(lambda x: x.date()) 87 | df['date'] = df['date'].astype(np.datetime64) 88 | return df 89 | except: 90 | return None 91 | 92 | def shibor_ma_data(year=None): 93 | """ 94 | 获取Shibor均值数据 95 | Parameters 96 | ------ 97 | year:年份(int) 98 | 99 | Return 100 | ------ 101 | date:日期 102 | 其它分别为各周期5、10、20均价 103 | """ 104 | year = du.get_year() if year is None else year 105 | lab = ct.SHIBOR_TYPE['Tendency'] 106 | lab = lab.encode('utf-8') if ct.PY3 else lab 107 | try: 108 | df = pd.read_excel(ct.SHIBOR_DATA_URL%(ct.P_TYPE['http'], ct.DOMAINS['shibor'], 109 | ct.PAGES['dw'], 'Shibor_Tendency', 110 | year, lab, 111 | year), skiprows=[0]) 112 | df.columns = ct.SHIBOR_MA_COLS 113 | df['date'] = df['date'].map(lambda x: x.date()) 114 | df['date'] = df['date'].astype(np.datetime64) 115 | return df 116 | except: 117 | return None 118 | 119 | 120 | def lpr_data(year=None): 121 | """ 122 | 获取贷款基础利率(LPR) 123 | Parameters 124 | ------ 125 | year:年份(int) 126 | 127 | Return 128 | ------ 129 | date:日期 130 | 1Y:1年贷款基础利率 131 | """ 132 | year = du.get_year() if year is None else year 133 | lab = ct.SHIBOR_TYPE['LPR'] 134 | lab = lab.encode('utf-8') if ct.PY3 else lab 135 | try: 136 | df = pd.read_excel(ct.SHIBOR_DATA_URL%(ct.P_TYPE['http'], ct.DOMAINS['shibor'], 137 | ct.PAGES['dw'], 'LPR', 138 | year, lab, 139 | year)) 140 | df.columns = ct.LPR_COLS 141 | df['date'] = df['date'].map(lambda x: x.date()) 142 | df['date'] = df['date'].astype(np.datetime64) 143 | return df 144 | except: 145 | return None 146 | 147 | 148 | def lpr_ma_data(year=None): 149 | """ 150 | 获取贷款基础利率均值数据 151 | Parameters 152 | ------ 153 | year:年份(int) 154 | 155 | Return 156 | ------ 157 | date:日期 158 | 1Y_5:5日均值 159 | 1Y_10:10日均值 160 | 1Y_20:20日均值 161 | """ 162 | year = du.get_year() if year is None else year 163 | lab = ct.SHIBOR_TYPE['LPR_Tendency'] 164 | lab = lab.encode('utf-8') if ct.PY3 else lab 165 | try: 166 | df = pd.read_excel(ct.SHIBOR_DATA_URL%(ct.P_TYPE['http'], ct.DOMAINS['shibor'], 167 | ct.PAGES['dw'], 'LPR_Tendency', 168 | year, lab, 169 | year), skiprows=[0]) 170 | df.columns = ct.LPR_MA_COLS 171 | df['date'] = df['date'].map(lambda x: x.date()) 172 | df['date'] = df['date'].astype(np.datetime64) 173 | return df 174 | except: 175 | return None 176 | -------------------------------------------------------------------------------- /tushare/tushare/util/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andyzsf/PyTuShare/b9ba35807fc1648f0f9cc6b1258b5785d223050c/tushare/tushare/util/__init__.py -------------------------------------------------------------------------------- /tushare/tushare/util/dateu.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | import datetime 4 | import pandas as pd 5 | 6 | 7 | def year_qua(date): 8 | mon = date[5:7] 9 | mon = int(mon) 10 | return[date[0:4], _quar(mon)] 11 | 12 | 13 | def _quar(mon): 14 | if mon in [1, 2, 3]: 15 | return '1' 16 | elif mon in [4, 5, 6]: 17 | return '2' 18 | elif mon in [7, 8, 9]: 19 | return '3' 20 | elif mon in [10, 11, 12]: 21 | return '4' 22 | else: 23 | return None 24 | 25 | 26 | def today(): 27 | day = datetime.datetime.today().date() 28 | return str(day) 29 | 30 | 31 | def get_year(): 32 | year = datetime.datetime.today().year 33 | return year 34 | 35 | def get_month(): 36 | month = datetime.datetime.today().month 37 | return month 38 | 39 | def get_hour(): 40 | return datetime.datetime.today().hour 41 | 42 | 43 | def today_last_year(): 44 | lasty = datetime.datetime.today().date() + datetime.timedelta(-365) 45 | return str(lasty) 46 | 47 | 48 | def day_last_week(days=-7): 49 | lasty = datetime.datetime.today().date() + datetime.timedelta(days) 50 | return str(lasty) 51 | 52 | 53 | def diff_day(start=None, end=None): 54 | d1 = datetime.datetime.strptime(end, '%Y-%m-%d') 55 | d2 = datetime.datetime.strptime(start, '%Y-%m-%d') 56 | delta = d1 - d2 57 | return delta.days 58 | 59 | 60 | def get_quarts(start, end): 61 | idx = pd.period_range('Q'.join(year_qua(start)), 'Q'.join(year_qua(end)), 62 | freq='Q-JAN') 63 | return [str(d).split('Q') for d in idx][::-1] 64 | 65 | 66 | holiday = ['2015-01-01', '2015-01-02', '2015-02-18', '2015-02-19', '2015-02-20', '2015-02-23', '2015-02-24', '2015-04-06', 67 | '2015-05-01', '2015-06-22', '2015-09-03', '2015-09-04', '2015-10-01', '2015-10-02', '2015-10-05', '2015-10-06', '2015-10-07'] 68 | 69 | 70 | def is_holiday(date): 71 | if isinstance(date, str): 72 | date = datetime.datetime.strptime(date, '%Y-%m-%d') 73 | today=int(date.strftime("%w")) 74 | if today > 0 and today < 6 and date not in holiday: 75 | return False 76 | else: 77 | return True 78 | 79 | 80 | def last_tddate(): 81 | today = datetime.datetime.today().date() 82 | today=int(today.strftime("%w")) 83 | if today == 0: 84 | return day_last_week(-2) 85 | else: 86 | return day_last_week(-1) 87 | 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /tushare/tushare/util/netbase.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | try: 4 | from urllib.request import urlopen, Request 5 | except ImportError: 6 | from urllib2 import urlopen, Request 7 | 8 | 9 | class Client(object): 10 | def __init__(self, url=None, ref=None, cookie=None): 11 | self._ref = ref 12 | self._cookie = cookie 13 | self._url = url 14 | self._setOpener() 15 | 16 | def _setOpener(self): 17 | request = Request(self._url) 18 | request.add_header("Accept-Language", "en-US,en;q=0.5") 19 | request.add_header("Connection", "keep-alive") 20 | request.add_header('Referer', self._ref) 21 | if self._cookie is not None: 22 | request.add_header("Cookie", self._cookie) 23 | request.add_header("User-Agent", 'Mozilla/5.0 (Windows NT 6.1; rv:37.0) Gecko/20100101 Firefox/37.0') 24 | self._request = request 25 | 26 | def gvalue(self): 27 | values = urlopen(self._request, timeout = 10).read() 28 | return values 29 | -------------------------------------------------------------------------------- /tushare/tushare/util/store.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | """ 3 | Created on 2015/02/04 4 | @author: Jimmy Liu 5 | @group : waditu 6 | @contact: jimmysoa@sina.cn 7 | """ 8 | import pandas as pd 9 | import tushare as ts 10 | from pandas import compat 11 | import os 12 | 13 | 14 | class Store(object): 15 | 16 | def __init__(self, data=None, name=None, path=None): 17 | if isinstance(data, pd.DataFrame): 18 | self.data = data 19 | else: 20 | raise RuntimeError('data type is incorrect') 21 | self.name = name 22 | self.path = path 23 | 24 | def save_as(self, name, path, to='csv'): 25 | if name is None: 26 | name = self.name 27 | if path is None: 28 | path = self.path 29 | file_path = '%s%s%s.%s' 30 | if isinstance(name, compat.string_types) and name is not '': 31 | if (path is None) or (path == ''): 32 | file_path = '.'.join([name, to]) 33 | else: 34 | try: 35 | if os.path.exists(path) is False: 36 | os.mkdir(path) 37 | file_path = file_path%(path, '/', name, to) 38 | except: 39 | pass 40 | 41 | else: 42 | print('input error') 43 | 44 | -------------------------------------------------------------------------------- /tushare/whats_new.md: -------------------------------------------------------------------------------- 1 | 0.3.4 2 | ------- 3 | 4 | - 新增‘龙虎榜’模块 5 | 1. 每日龙虎榜列表 6 | 1. 个股上榜统计 7 | 1. 营业部上榜统计 8 | 1. 龙虎榜机构席位追踪 9 | 1. 龙虎榜机构席位成交明细 10 | 11 | 12 | - 修改get\_h\_data数据类型为float 13 | - 修改get_index接口遗漏的open列 14 | - 合并GitHub上提交的bug修复 15 | 16 | 17 | 0.3.1 18 | ------- 19 | 20 | - 修复get\_h\_data的bug 21 | - 修改get\_stock\_basics数据获取方式 22 | 23 | 24 | 0.2.9 25 | --------- 26 | 27 | - 新增上海银行间同业拆放利率模块 28 | 1. 银行间同业拆放利率(Shibor) 29 | 1. Shibor银行报价数据 30 | 1. Shibor均值数据 31 | 1. 贷款基础利率(LPR) 32 | 1. 贷款基础利率均值数据 33 | - 基本面模块接口优化 34 | - 历史某一阶段的前复权数据bug修复 35 | 36 | 0.2.8 37 | --------- 38 | 39 | 1. 新增大盘指数实时行情列表 40 | 1. 新增大盘指数历史行情数据(全部) 41 | 1. 新增终止上市公司列表(退市) 42 | 1. 新增暂停上市公司列表 43 | 1. 修正融资融券明细无日期的缺陷 44 | 1. 修正get\_h\_data部分bug 45 | 46 | 47 | 0.2.6 48 | ----------- 49 | 1. 新增沪市融资融券列表 50 | 1. 新增沪市融资融券明细列表 51 | 1. 新增深市融资融券列表 52 | 1. 新增深市融资融券明细列表 53 | 1. 修正复权数据数据源出现null造成异常问题(对大约300个股票有影响) 54 | 55 | 56 | 0.2.5 57 | ----------- 58 | 1. 完成python2.x和python3.x兼容性支持 59 | 1. 部分算法优化和代码重构 60 | 1. 新增中证500成份股 61 | 1. 新增当日分笔交易明细 62 | 1. 修正分配预案(高送转)bug 63 | 64 | 65 | 66 | 0.2.3 67 | ----------- 68 | 1. “新浪股吧”消息和热度 69 | 1. 新股数据 70 | 1. 修正“基本面”模块中数据重复的问题 71 | 1. 修正历史数据缺少一列column(数据来源问题)的bug 72 | 1. 新增期货模块(实验)by @ideaplat 73 | 74 | 75 | 76 | 77 | 0.2.2 78 | -------- 79 | 对前复权数据接口的bug进行了修改(pandas v0.14版本在使用时报错) 80 | 81 | 0.2.1 82 | -------- 83 | 1、增加‘投资参考’数据模块 84 | 85 | - 分配预案 86 | - 业绩预告 87 | - 限售股解禁 88 | - 基金持股 89 | 90 | 91 | 2、将“业绩预告”挪到了‘投资参考’模块中 92 | 93 | 3、对历史复权方法中的代码进行了修改 94 | 95 | 96 | 0.2.0 97 | -------- 98 | 1、新增新闻事件模块 99 | 100 | - 即时财经新闻 101 | - 个股信息地雷 102 | 103 | 2、新增指数成份股和权重分类 104 | 105 | - 沪深300成份股和权重 106 | - 上证50成份股列表 107 | 108 | 109 | 3、修改get\_hist_data()接口 110 | 111 | - 修改数值型数据的dtype为float 112 | 113 | 4、新增历史复权数据接口get\_h_data 114 | 115 | - 前复权(默认) 116 | - 后复权 117 | - 不复权 118 | 119 | --------------------------------------------------------------------------------