├── 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 | 
4 | [](https://pypi.python.org/pypi/tushare/0.1.5)
5 |
6 | TuShare是实现对股票/期货等金融数据从**数据采集**、**清洗加工** 到 **数据存储**过程的工具,满足金融量化分析师和学习数据分析的人在数据获取方面的需求,它的特点是数据覆盖范围广,接口调用简单,响应快速。
7 |
8 | 
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 = ''%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 = ''%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 = ''%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 = ''%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 = ''%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 = ''%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 = ''%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 = ''%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 = ''%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 = ''%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 |
--------------------------------------------------------------------------------