[
  {
    "path": ".gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n*.log\n*.swp\n*.pdb\n.project\n.pydevproject\n.settings\n__pycache__/\n*.py[cod]\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nenv/\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\nsource/\nbaks/\nlib/\nlib64/\nparts/\nsdist/\nvar/\ndocs/\n*.egg-info/\n.installed.cfg\n*.egg\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.coverage\n.cache\nnosetests.xml\ncoverage.xml\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\n\n# Sphinx documentation\ndocs/_build/\ndocs/*.md\ndocs/bin\n.idea/\n\n# PyBuilder\ntarget/\n\n#Visual Studio Environment\n*.pyproj\n*.sln\n.vs/\n\n#Vim Environment\ntags\n*~\n\n\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: python\n\npython:\n  # We don't actually use the Travis Python, but this keeps it organized.\n  - \"2.7\"\n  # \"3.3\"\n  - \"3.4\"\n  \ninstall:\n  - sudo apt-get update\n  # We do this conditionally because it saves us some downloading if the\n  # version is the same.\n  - if [[ \"$TRAVIS_PYTHON_VERSION\" == \"2.7\" ]]; then\n      wget https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh;\n    else\n      wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh;\n    fi\n  - bash miniconda.sh -b -p $HOME/miniconda\n  - export PATH=\"$HOME/miniconda/bin:$PATH\"\n  - hash -r\n  - conda config --set always_yes yes --set changeps1 no\n  - conda update -q conda\n  # Useful for debugging any issues with conda\n  - conda info -a\n    \nbefore_script:\n  - conda install --yes python=$TRAVIS_PYTHON_VERSION numpy scipy pandas matplotlib lxml pytesseract\n  - python setup.py install\n  \nscript:\n  - python test_unittest.py\n\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2015, 挖地兔\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of tushare nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n"
  },
  {
    "path": "MANIFEST",
    "content": "# file GENERATED by distutils, do NOT edit\nsetup.py\ntest\\test.py\ntushare\\__init__.py\ntushare\\data\\__init__.py\ntushare\\data\\all.csv\ntushare\\stock\\__init__.py\ntushare\\stock\\cons.py\ntushare\\stock\\fundamental.py\ntushare\\stock\\trading.py\n"
  },
  {
    "path": "README.md",
    "content": "TuShare\r\n\r\n\r\nTushare Pro版已发布，请访问新的官网了解和查询数据接口！ [https://tushare.pro](https://tushare.pro)\r\n\r\nTuShare是实现对股票/期货等金融数据从**数据采集**、**清洗加工** 到 **数据存储**过程的工具，满足金融量化分析师和学习数据分析的人在数据获取方面的需求，它的特点是数据覆盖范围广，接口调用简单,响应快速。\r\n\r\n![](http://tushare.org/_images/main_pic_min.png)\r\n\r\n欢迎关注扫描TuShare的微信公众号“挖地兔”，更多资源和信息与您分享。另外，由于tushare官网在重新设计和开发，最新接口的使用文档都会在挖地兔公众号发布，所以，请扫码关注，谢谢！\r\n\r\n![](http://tushare.org/_images/ts.jpg)\r\n\r\nQQ交流群：\r\n\r\n- 一群（已满）：14934432\r\n- 二群（付费高级用户群，可获得更多支持及参与圈子活动）：658562506\r\n- 三群（免费）：665480579\r\n- 四群 (免费) ：527416821\r\n\r\n\r\n\r\nDependencies\r\n=========\r\npython 2.x/3.x   \r\n\r\n[pandas](http://pandas.pydata.org/ \"pandas\")\r\n\r\n\r\nInstallation\r\n====\r\n\r\n- 方式1：pip install tushare\r\n- 方式2：python setup.py install\r\n- 方式3：访问[https://pypi.python.org/pypi/tushare/](https://pypi.python.org/pypi/tushare/)下载安装\r\n\r\n\r\nUpgrade\r\n=======\r\n\r\n\tpip install tushare --upgrade\r\n\r\nQuick Start\r\n======\r\n**Example 1.** 获取个股历史交易数据（包括均线数据）：\r\n\r\n    import tushare as ts\r\n\r\n\tts.get_hist_data('600848') #一次性获取全部数据\r\n\t另外，参考get_k_data函数\r\n\r\n结果显示：\r\n\r\n> 日期 ，开盘价， 最高价， 收盘价， 最低价， 成交量， 价格变动 ，涨跌幅，5日均价，10日均价，20日均价，5日均量，10日均量，20日均量，换手率\r\n\r\n    \t\t\t open    high   close     low     volume    p_change  ma5 \\\r\n\tdate                                                                     \r\n\t2012-01-11   6.880   7.380   7.060   6.880   14129.96     2.62   7.060   \r\n\t2012-01-12   7.050   7.100   6.980   6.900    7895.19    -1.13   7.020   \r\n\t2012-01-13   6.950   7.000   6.700   6.690    6611.87    -4.01   6.913   \r\n\t2012-01-16   6.680   6.750   6.510   6.480    2941.63    -2.84   6.813   \r\n\t2012-01-17   6.660   6.880   6.860   6.460    8642.57     5.38   6.822   \r\n\t2012-01-18   7.000   7.300   6.890   6.880   13075.40     0.44   6.788   \r\n\t2012-01-19   6.690   6.950   6.890   6.680    6117.32     0.00   6.770   \r\n\t2012-01-20   6.870   7.080   7.010   6.870    6813.09     1.74   6.832 \r\n\r\n\t\t\t\t ma10    ma20      v_ma5     v_ma10     v_ma20     turnover  \r\n\tdate                                                                  \r\n\t2012-01-11   7.060   7.060   14129.96   14129.96   14129.96     0.48  \r\n\t2012-01-12   7.020   7.020   11012.58   11012.58   11012.58     0.27  \r\n\t2012-01-13   6.913   6.913    9545.67    9545.67    9545.67     0.23  \r\n\t2012-01-16   6.813   6.813    7894.66    7894.66    7894.66     0.10  \r\n\t2012-01-17   6.822   6.822    8044.24    8044.24    8044.24     0.30  \r\n\t2012-01-18   6.833   6.833    7833.33    8882.77    8882.77     0.45  \r\n\t2012-01-19   6.841   6.841    7477.76    8487.71    8487.71     0.21  \r\n\t2012-01-20   6.863   6.863    7518.00    8278.38    8278.38     0.23  \r\n\r\n设定历史数据的时间：      \r\n\t\r\n\tts.get_hist_data('600848',start='2015-01-05',end='2015-01-09')\r\n\r\n\t\t\t\topen    high   close     low    volume   p_change     ma5    ma10 \\  \r\n\tdate                                                                            \r\n\t2015-01-05  11.160  11.390  11.260  10.890  46383.57     1.26  11.156  11.212   \r\n\t2015-01-06  11.130  11.660  11.610  11.030  59199.93     3.11  11.182  11.155   \r\n\t2015-01-07  11.580  11.990  11.920  11.480  86681.38     2.67  11.366  11.251   \r\n\t2015-01-08  11.700  11.920  11.670  11.640  56845.71    -2.10  11.516  11.349   \r\n\t2015-01-09  11.680  11.710  11.230  11.190  44851.56    -3.77  11.538  11.363   \r\n\t \t\t\tma20     v_ma5    v_ma10     v_ma20 \t turnover  \r\n\tdate                                                        \r\n\t2015-01-05  11.198  58648.75  68429.87   97141.81     1.59  \r\n\t2015-01-06  11.382  54854.38  63401.05   98686.98     2.03  \r\n\t2015-01-07  11.543  55049.74  61628.07  103010.58     2.97  \r\n\t2015-01-08  11.647  57268.99  61376.00  105823.50     1.95  \r\n\t2015-01-09  11.682  58792.43  60665.93  107924.27     1.54  \r\n\r\n\r\n**复权历史数据**\r\n获取历史复权数据，分为前复权和后复权数据，接口提供股票上市以来所有历史数据，默认为前复权。如果不设定开始和结束日期，则返回近一年的复权数据，从性能上考虑，推荐设定开始日期和结束日期，而且最好不要超过一年以上，获取到数据后，请及时在本地存储。\r\n\r\n\tts.get_h_data('002337') #前复权\r\n\tts.get_h_data('002337',autype='hfq') #后复权\r\n\tts.get_h_data('002337',autype=None) #不复权\r\n\tts.get_h_data('002337',start='2015-01-01',end='2015-03-16') #两个日期之间的前复权数据\r\n\r\n\r\n**Example 2.** 一次性获取最近一个日交易日所有股票的交易数据（结果显示速度取决于网速）\r\n\t\r\n\r\n\tts.get_today_all()\r\n\r\n\r\n结果显示：\r\n\r\n> 代码，名称，涨跌幅，现价，开盘价，最高价，最低价，最日收盘价，成交量，换手率\r\n\r\n\t\t  code    name     changepercent  trade   open   high    low  settlement \\  \r\n\t0     002738  中矿资源         10.023  19.32  19.32  19.32  19.32       17.56   \r\n\t1     300410  正业科技         10.022  25.03  25.03  25.03  25.03       22.75   \r\n\t2     002736  国信证券         10.013  16.37  16.37  16.37  16.37       14.88   \r\n\t3     300412  迦南科技         10.010  31.54  31.54  31.54  31.54       28.67   \r\n\t4     300411  金盾股份         10.007  29.68  29.68  29.68  29.68       26.98   \r\n\t5     603636  南威软件         10.006  38.15  38.15  38.15  38.15       34.68   \r\n\t6     002664  信质电机         10.004  30.68  29.00  30.68  28.30       27.89   \r\n\t7     300367  东方网力         10.004  86.76  78.00  86.76  77.87       78.87   \r\n\t8     601299  中国北车         10.000  11.44  11.44  11.44  11.29       10.40   \r\n\t9     601880   大连港         10.000   5.72   5.34   5.72   5.22        5.20   \r\n\t10    000856  冀东装备         10.000   8.91   8.18   8.91   8.18        8.10  \r\n\t\t\tvolume  \t turnoverratio  \r\n\t0        375100        1.25033  \r\n\t1         85800        0.57200  \r\n\t2       1058925        0.08824  \r\n\t3         69400        0.51791  \r\n\t4        252220        1.26110  \r\n\t5       1374630        5.49852  \r\n\t6       6448748        9.32700  \r\n\t7       2025030        6.88669  \r\n\t8     433453523        4.28056  \r\n\t9     323469835        9.61735  \r\n\t10     25768152       19.51090  \r\n\r\n**Example 3.** 获取历史分笔数据\r\n\r\n    import tushare as ts\r\n\r\n\tdf = ts.get_tick_data('600848',date='2014-01-09')\r\n\tdf.head(10)\r\n\r\n结果显示：\r\n>成交时间、成交价格、价格变动，成交手、成交金额(元)，买卖类型\r\n\r\n    Out[3]: \r\n     \t time  \t\tprice change  volume  amount  type\r\n\t0    15:00:00   6.05     --       8    4840   卖盘\r\n\t1    14:59:55   6.05     --      50   30250   卖盘\r\n\t2    14:59:35   6.05     --      20   12100   卖盘\r\n\t3    14:59:30   6.05  -0.01     165   99825   卖盘\r\n\t4    14:59:20   6.06   0.01       4    2424   买盘\r\n\t5    14:59:05   6.05  -0.01       2    1210   卖盘\r\n\t6    14:58:55   6.06     --       4    2424   买盘\r\n\t7    14:58:45   6.06     --       2    1212   买盘\r\n\t8    14:58:35   6.06   0.01       2    1212   买盘\r\n\t9    14:58:25   6.05  -0.01      20   12100   卖盘\r\n\t10   14:58:05   6.06     --       5    3030   买盘\r\n\r\n**Example 4.** 获取实时交易数据(Realtime Quotes Data)\r\n\r\n    df = ts.get_realtime_quotes('000581') #Single stock symbol\r\n\tdf[['code','name','price','bid','ask','volume','amount','time']]\r\n\r\n结果显示：\r\n>名称、开盘价、昨价、现价、最高、最低、买入价、卖出价、成交量、成交金额...more in docs\r\n\r\n\r\n\t   code    name     price  bid    ask    volume   amount        time\r\n\t0  000581  威孚高科  31.15  31.14  31.15  8183020  253494991.16  11:30:36 \r\n\t  \r\n请求多个股票方法（一次最好不要超过30个）：\r\n    \r\n\tts.get_realtime_quotes(['600848','000980','000981']) #symbols from a list\r\n\tts.get_realtime_quotes(df['code'].tail(10)) #from a Series\r\n\r\n\r\n更多文档\r\n========\r\n\r\n[https://tushare.pro](https://tushare.pro)\r\n\r\n[http://tushare.org/](http://tushare.org/ \"TuShare Docs\")\r\n \r\n\r\nChange Logs\r\n-----------\r\n\r\n1.2.17 2018/11/24\r\n======\r\n\r\n- Pro版增加期货数据\r\n- Pro版增加A股周/月数据\r\n- Pro版增加通用行情pro_bar接口股票/基金/期货/数据货币行情的支持，同时支持股票的复权行情\r\n\r\n1.2.15 2018/10/15\r\n====\r\n\r\n- 增加通用行情pro_bar接口\r\n- 优化set_token功能\r\n\r\n\r\n\r\n1.2.12 2018/08/10\r\n====\r\n\r\n- 发布Pro版第一稿\r\n- 发布Pro网站，[https://tushare.pro](https://tushare.pro)\r\n\r\n1.0.5 2017/11/12\r\n======\r\n\r\n- 新增可转债数据\r\n- 增加长连接关闭函数\r\n- 修复部分bug\r\n\r\n1.0.2 2017/10/29\r\n==========\r\n\r\n- 新增bar接口，支持更稳定的股票、ETF、期货期权、港股、中概股等品种\r\n- 新增tick接口，支持以上品种的成交数据\r\n- 新增沪深港通每日资金流向数据\r\n- 修复了部分bug\r\n\r\n0.9.2 2017/09/13\r\n===========\r\n\r\n- 新增数据货币行情数据接口,同时支持火币、okcoin、中国比特币\r\n- 部分bug修复\r\n\r\n\r\n0.8.8 2017/08/29\r\n===========\r\n\r\n- 新增分红送股数据（包含历史）\r\n- 新增get_day_all接口\r\n- 新增BDI接口\r\n\r\n0.8.0 2017/06/05\r\n===========\r\n\r\n- 新增期货行情数据6个接口，感谢debugo贡献代码\r\n- 修复部分bug\r\n\r\n0.7.6 2017/05/16\r\n=============\r\n- get\\_today\\_all接口数据补齐\r\n- forecast\\_data mac下编码问题修复\r\n\r\n0.7.0 2017/03/12\r\n=============\r\n- get\\_today\\_all接口提速\r\n- 版本累积更新\r\n\r\n\r\n0.6.2 2016/12/03\r\n==========\r\n- 新增十大股东和十大流通股接口 top10_holders\r\n- 新增全球实时指数列表接口 global_realtime\r\n- 修复部分bug\r\n\r\n0.6.1 2016/11/22\r\n===========\r\n- 修正get_k_databug\r\n- 修正实盘交易登录问题\r\n\r\n0.5.6 2016/11/06\r\n=============\r\n- 新增全新行情数据接口get_k_data(请关注tushare公众号“挖地兔”后查看历史文章《全新的免费行情数据接口》)\r\n- 修复程序和文档bug\r\n\r\n\r\n0.5.1 2016/10/16\r\n=============\r\n- 新增实盘交易接口\r\n- 修复bug\r\n\r\n\r\n0.4.9 2016/03/26\r\n=============\r\n- 新增申万行业分类get_industry_classified(standard='sw')\r\n- 新增交易日历trade_cal()\r\n- 修复bug\r\n\r\n0.4.3 2015/12/24\r\n============\r\n- 新增电影票房数据\r\n- 修复部分bug\r\n\r\n0.4.1 2015/11/27\r\n==============\r\n\r\n- 新增sina大单数据\r\n- 修改当日分笔bug\r\n- 深市融资融券数据修复\r\n\r\n0.3.9 2015/10/13\r\n============\r\n\r\n- 新增期权隐含波动率数据\r\n- 修复指数成份及权重接口问题\r\n\r\n0.3.8 2015/09/19\r\n============\r\n\r\n- 沪深300成份股和权重接口问题修复\r\n- 其它bug的修复\r\n\r\n\r\n\r\n0.3.5 2015/07/27\r\n==========\r\n\r\n- 部分代码修正\r\n\r\n\r\n0.3.4 2015/06/15\r\n===========\r\n\r\n- 新增‘龙虎榜’模块\r\n\t1. 每日龙虎榜列表\r\n\t1. 个股上榜统计\r\n\t1. 营业部上榜统计\r\n\t1. 龙虎榜机构席位追踪\r\n\t1. 龙虎榜机构席位成交明细\r\n\r\n- 修改get\\_h\\_data数据类型为float\r\n- 修改get_index接口遗漏的open列\r\n- 合并GitHub上提交的bug修复\r\n\r\n\r\n0.2.8 2015/04/28\r\n============\r\n\r\n- 新增大盘指数实时行情列表\r\n- 新增大盘指数历史行情数据（全部）\r\n- 新增终止上市公司列表（退市）\r\n- 新增暂停上市公司列表\r\n- 修正融资融券明细无日期的缺陷\r\n- 修正get\\_h\\_data部分bug\r\n\r\n0.2.6\r\n========\r\n- 新增沪市融资融券列表\r\n- 新增沪市融资融券明细列表\r\n- 新增深市融资融券列表\r\n- 新增深市融资融券明细列表\r\n- 修正复权数据数据源出现null造成异常问题（对大约300个股票有影响）\r\n\r\n0.2.5 2015/04/16\r\n===========\r\n- 完成python2.x和python3.x兼容性支持\r\n- 部分算法优化和代码重构\r\n- 新增中证500成份股\r\n- 新增当日分笔交易明细\r\n- 修正分配预案（高送转）bug\r\n\r\n0.2.3 2015/04/11\r\n===========\r\n- 新增“新浪股吧”消息和热度\r\n- 新增新股上市数据\r\n- 修正“基本面”模块中数据重复的问题\r\n- 修正历史数据缺少一列column（数据来源问题）的bug\r\n\r\n0.2.0 2015/03/17\r\n=======\r\n\r\n - 新增历史复权数据接口\r\n - 新增即时滚动新闻、信息地雷数据\r\n - 新增沪深300指数成股份及动态权重、\r\n - 新增上证50指数成份股\r\n - 修改历史行情数据类型为float\r\n\r\n0.1.9 2015/02/06\r\n========\r\n- 增加分类数据\r\n- 增加数据存储示例\r\n\r\n0.1.6 2015/01/27\r\n========\r\n- 增加了重点指数的历史和实时行情\r\n- 更新docs\r\n\r\n0.1.5 2015/01/26\r\n=====\r\n\r\n- 增加基本面数据接口\r\n- 发布一版使用手册，开通[TuShare docs](http://tushare.waditu.com)网站\r\n\r\n0.1.3 2015/01/13\r\n===\r\n- 增加实时交易数据的获取\r\n- Done for crawling Realtime Quotes data\r\n\r\n0.1.1 2015/01/11\r\n===\r\n\r\n- 增加tick数据的获取\r\n\r\n0.1.0 2014/12/01\r\n===\r\n\r\n- 创建第一个版本\r\n- 实现个股历史数据的获取\r\n"
  },
  {
    "path": "issues/from_email.txt",
    "content": "2015-2-10\r\n------------\r\nASK:Stupidinsect:ϣӻ\r\nREP:\r\n\r\n2015-2-26\r\n------------\r\nASK:Allisnoneproblem with python keywords\r\nREP:н\r\n\r\n2015-3-1\r\n------------\r\nASK:: get_hist_dataMySQLdate(index)޷\r\nREP:ʱͨdf['date'] = df.indexto_sqlòindex=Falseһ汾ȡindex\r\n\r\n2015-3-23\r\n--------------\r\nchendonghui1987:ȡǰȨݱTypeError: cannot convert the series to <type 'float'>\r\nfrom v0.2.1\r\n\r\n2015-04-05\r\n-------------------\r\n̹:\r\nJimmyTuã\r\nȸлṩôõһ⣬Һܾõ⣬\r\nύһbugع˾걨ݣreport = ts.get_report_data(2014, 1)\r\n⣺\r\n1ȱ˾ƽУ000001\r\n2˾ظ總ˢ\r\nϣлָ\r\n\r\n\r\n2015-04-18\r\n---------------\r\nhuhaook:ĳЩɵĸȨ쳣ʵԴΪnullҪ޸ĳ(418)\r\n\r\n\r\n2015-04-28\r\n----------------\r\nԬͨget_hist_dataȡ600102ʱ600102йƱݷأֱӷNone\n\n2015-06-13\n\nTales Yuantushareprofit_dataȡ2015Ԥʧܡ61423ʱ25"
  },
  {
    "path": "issues/from_sns.txt",
    "content": "2015-02-12\n-----------\nQQȺ297882961kݸȨ۵⡢ݲ\n\n2015-03-01\n-----------\nQQȺ275882700@ kߴ⣬ȷʵǷ˲ƾԴ⣨ɸget_h_data()ӿڣ\n\n2015-03-02\n-----------\nQQȺ275882700@װ˹̹ ϣṩָĳɷݹɺȨ\n\n2015-03-20\nQQȺ297882961:@x ֤100֤800ָk\n\n2015-04-09\n-------------\nQQȺ297882961:@㽭-QT002738Ʊʷݱget_hist_data飬ԭǷ˲ƾĽӿһлʵݡʽжһcolumnsöԵȵcolumsб\n\n2015-04-10\n-------------\n־ȨݵΪobject\n\n2015-04-16\n-------------\n΢@ariestigerget_h_data()ĳɽƴд\n\n\n2015-05-01\n------------------\nQQȺ297882961:@Koffʹget_today_tickӿڵʱUnboundLocalError: local variable 'data' referenced before assignment쳣̺ϵõģ\n\n2015-05-05\nQQ Mr.OKӹ˾ɶĽӿ\n\n\nPHENXI-ڻ\n--------------------\nhttp://vip.stock.finance.sina.com.cn/mkt/#hqIndex\nҳбȽȫгϢ\nhttp://blog.sina.com.cn/s/blog_7ed3ed3d0101gphj.html\nƪгһЩݽṹ\nhttp://quote.hexun.com/futures/newfutures.aspx?market=9&type=all&n=%C8%AB%B2%BF \nhttp://webcffex.hermes.hexun.com/cffex/kline?code=CFFEXIH1606&start=20160206091500&number=-1000&type=5\nPHENXI 2016/2/15 8:57:44\nhttp://webftcn.hermes.hexun.com/ \n\nhttp://webcffex.hermes.hexun.com/cffex/quotelist?code=CFFEXIH1606,CFFEXIF1609,CFFEXIC1603,dceA1611,CFFEXIC1512,&column=code,name,price,priceweight,updownrate,high,low,updown,lastclose,open&callback=getdata1&callback=jQuery111107492109271895186_1455497884413&_=1455497884414\n"
  },
  {
    "path": "requirements.txt",
    "content": "pandas>=0.18.0\nrequests>=2.0.0\nlxml>=3.8.0\nsimplejson>=3.16.0\nbs4>=0.0.1\nbeautfulsoup4>=4.5.1"
  },
  {
    "path": "setup.py",
    "content": "from setuptools import setup, find_packages\r\nimport codecs\r\nimport os\r\n\r\n\r\ndef read(fname):\r\n    return codecs.open(os.path.join(os.path.dirname(__file__), fname)).read()\r\n\r\nlong_desc = \"\"\"\r\nTuShare\r\n===============\r\n\r\n.. image:: https://api.travis-ci.org/waditu/tushare.png?branch=master\r\n    :target: https://travis-ci.org/waditu/tushare\r\n\r\n.. image:: https://badge.fury.io/py/tushare.png\r\n    :target: http://badge.fury.io/py/tushare\r\n\r\n* easy to use as most of the data returned are pandas DataFrame objects\r\n* can be easily saved as csv, excel or json files\r\n* can be inserted into MySQL or Mongodb\r\n\r\nTarget Users\r\n--------------\r\n\r\n* financial market analyst of China\r\n* learners of financial data analysis with pandas/NumPy\r\n* people who are interested in China financial data\r\n\r\nInstallation\r\n--------------\r\n\r\n    pip install tushare\r\n    \r\nUpgrade\r\n---------------\r\n\r\n    pip install tushare --upgrade\r\n    \r\nQuick Start\r\n--------------\r\n\r\n::\r\n\r\n    import tushare as ts\r\n    \r\n    ts.get_hist_data('600848')\r\n    \r\nreturn::\r\n\r\n                open    high   close     low     volume    p_change  ma5 \\\r\n    \r\n    date\r\n    2012-01-11   6.880   7.380   7.060   6.880   14129.96     2.62   7.060\r\n    2012-01-12   7.050   7.100   6.980   6.900    7895.19    -1.13   7.020\r\n    2012-01-13   6.950   7.000   6.700   6.690    6611.87    -4.01   6.913\r\n    2012-01-16   6.680   6.750   6.510   6.480    2941.63    -2.84   6.813\r\n    2012-01-17   6.660   6.880   6.860   6.460    8642.57     5.38   6.822\r\n    2012-01-18   7.000   7.300   6.890   6.880   13075.40     0.44   6.788\r\n    2012-01-19   6.690   6.950   6.890   6.680    6117.32     0.00   6.770\r\n    2012-01-20   6.870   7.080   7.010   6.870    6813.09     1.74   6.832\r\n    \r\n\"\"\"\r\n\r\ndef read_install_requires():\r\n    reqs = [\r\n            'pandas>=0.18.0',\r\n            'requests>=2.0.0',\r\n            'lxml>=3.8.0',\r\n            'simplejson>=3.16.0',\r\n            'msgpack>=0.5.6',\r\n            'pyzmq>=16.0.0'\r\n            ]\r\n    return reqs\r\n\r\n\r\nsetup(\r\n    name='tushare',\r\n    version=read('tushare/VERSION.txt'),\r\n    description='A utility for crawling historical and Real-time Quotes data of China stocks',\r\n#     long_description=read(\"READM.rst\"),\r\n    long_description = long_desc,\r\n    author='Jimmy Liu',\r\n    author_email='jimmysoa@sina.cn',\r\n    license='BSD',\r\n    url='http://tushare.org',\r\n    install_requires=read_install_requires(),\r\n    keywords='Global Financial Data',\r\n    classifiers=['Development Status :: 4 - Beta',\r\n    'Programming Language :: Python :: 2.6',\r\n    'Programming Language :: Python :: 2.7',\r\n    'Programming Language :: Python :: 3.2',\r\n    'Programming Language :: Python :: 3.3',\r\n    'Programming Language :: Python :: 3.4',\r\n    'Programming Language :: Python :: 3.5',\r\n    'License :: OSI Approved :: BSD License'],\r\n    packages=find_packages(),\r\n    include_package_data=True,\r\n    package_data={'': ['*.csv', '*.txt']},\r\n)"
  },
  {
    "path": "test/__init__.py",
    "content": ""
  },
  {
    "path": "test/bar_test.py",
    "content": "# -*- coding:utf-8 -*- \n'''\nCreated on 2017/9/24\n@author: Jimmy Liu\n'''\nimport unittest\nimport tushare.stock.trading as fd\n\nclass Test(unittest.TestCase):\n\n    def set_data(self):\n        self.code = '600848'\n        self.start = ''\n        self.end = ''\n        \n    def test_bar_data(self):\n        self.set_data()\n        print(fd.bar(self.code, self.start, self.end))\n        \n\nif __name__ == \"__main__\":\n    #import sys;sys.argv = ['', 'Test.testName']\n    unittest.main()"
  },
  {
    "path": "test/billboard_test.py",
    "content": "# -*- coding:utf-8 -*- \r\n'''\r\nCreated on 2015/3/14\r\n@author: Jimmy Liu\r\n'''\r\nimport unittest\r\nimport tushare.stock.billboard as fd\r\n\r\nclass Test(unittest.TestCase):\r\n\r\n    def set_data(self):\r\n        self.date = '2015-06-12'\r\n        self.days = 5\r\n    \r\n    def test_top_list(self):\r\n        self.set_data()\r\n        print(fd.top_list(self.date))\r\n              \r\n    def test_cap_tops(self):\r\n        self.set_data()\r\n        print(fd.cap_tops(self.days))\r\n        \r\n    def test_broker_tops(self):\r\n        self.set_data()\r\n        print(fd.broker_tops(self.days))\r\n      \r\n    def test_inst_tops(self):\r\n        self.set_data()\r\n        print(fd.inst_tops(self.days))  \r\n        \r\n    def test_inst_detail(self):\r\n        print(fd.inst_detail())  \r\n        \r\nif __name__ == \"__main__\":\r\n    unittest.main()"
  },
  {
    "path": "test/classifying_test.py",
    "content": "# -*- coding:utf-8 -*- \n'''\nCreated on 2015/3/14\n@author: Jimmy Liu\n'''\nimport unittest\nimport tushare.stock.classifying as fd\n\nclass Test(unittest.TestCase):\n\n    def set_data(self):\n        self.code = '600848'\n        self.start = '2015-01-03'\n        self.end = '2015-04-07'\n        self.year = 2014\n        self.quarter = 4\n        \n    def test_get_industry_classified(self):\n        print(fd.get_industry_classified())\n        \n    def test_get_concept_classified(self):\n        print(fd.get_concept_classified())\n        \n    def test_get_area_classified(self):\n        print(fd.get_area_classified())\n        \n    def test_get_gem_classified(self):\n        print(fd.get_gem_classified())\n        \n    def test_get_sme_classified(self):\n        print(fd.get_sme_classified())\n        \n    def test_get_st_classified(self):\n        print(fd.get_st_classified())\n    \n    def test_get_hs300s(self):\n        print(fd.get_hs300s())   \n        \n    def test_get_sz50s(self):\n        print(fd.get_sz50s()) \n      \n    def test_get_zz500s(self):\n        print(fd.get_zz500s())   \n        \nif __name__ == \"__main__\":\n    unittest.main()\n    \n#     suite = unittest.TestSuite()  \n#     suite.addTest(Test('test_get_gem_classified'))  \n#     unittest.TextTestRunner(verbosity=2).run(suite)\n"
  },
  {
    "path": "test/dateu_test.py",
    "content": "# -*- coding:utf-8 -*-\n\"\"\"\n@author: ZackZK\n\"\"\"\n\nfrom unittest import TestCase\n\nfrom tushare.util import dateu\nfrom tushare.util.dateu import is_holiday\n\n\nclass Test_Is_holiday(TestCase):\n    def test_is_holiday(self):\n        dateu.holiday = ['2016-01-04']  # holiday stub for later test\n        self.assertTrue(is_holiday('2016-01-04'))  # holiday\n        self.assertFalse(is_holiday('2016-01-01'))  # not holiday\n        self.assertTrue(is_holiday('2016-01-09'))  # Saturday\n        self.assertTrue(is_holiday('2016-01-10'))  # Sunday\n\n"
  },
  {
    "path": "test/fund_test.py",
    "content": "# -*- coding:utf-8 -*- \n\nimport unittest\nimport tushare.stock.fundamental as fd\n\nclass Test(unittest.TestCase):\n\n    def set_data(self):\n        self.code = '600848'\n        self.start = '2015-01-03'\n        self.end = '2015-04-07'\n        self.year = 2014\n        self.quarter = 4\n\n    def test_get_stock_basics(self):\n        print(fd.get_stock_basics())\n        \n#     def test_get_report_data(self):\n#         self.set_data()\n#         print(fd.get_report_data(self.year, self.quarter))\n#     \n#     def test_get_profit_data(self):\n#         self.set_data()\n#         print(fd.get_profit_data(self.year, self.quarter))\n#         \n#     def test_get_operation_data(self):\n#         self.set_data()\n#         print(fd.get_operation_data(self.year, self.quarter))\n#         \n#     def test_get_growth_data(self):\n#         self.set_data()\n#         print(fd.get_growth_data(self.year, self.quarter))\n#         \n#     def test_get_debtpaying_data(self):\n#         self.set_data()\n#         print(fd.get_debtpaying_data(self.year, self.quarter))\n#         \n#     def test_get_cashflow_data(self):\n#         self.set_data()\n#         print(fd.get_cashflow_data(self.year, self.quarter))\n\nif __name__ == '__main__':\n    unittest.main()"
  },
  {
    "path": "test/indictor_test.py",
    "content": "# -*- coding:utf-8 -*- \n'''\nCreated on 2018/05/26\n@author: Jackie Liao\n'''\nimport unittest\nimport tushare.stock.indictor as idx\nimport tushare as ts\n\n\nclass Test(unittest.TestCase):\n\n    def test_plot_all(self):\n        data = ts.get_k_data(\"601398\", start=\"2018-01-01\", end=\"2018-05-27\")\n\n        data = data.sort_values(by=[\"date\"], ascending=True)\n\n        idx.plot_all(data, is_show=True, output=None)\n\n\nif __name__ == \"__main__\":\n    # import sys;sys.argv = ['', 'Test.testName']\n    unittest.main()\n"
  },
  {
    "path": "test/macro_test.py",
    "content": "# -*- coding:utf-8 -*- \n'''\nCreated on 2015/3/14\n@author: Jimmy Liu\n'''\nimport unittest\nimport tushare.stock.macro as fd\n\nclass Test(unittest.TestCase):\n\n    def test_get_gdp_year(self):\n        print(fd.get_gdp_year())\n              \n    def test_get_gdp_quarter(self):\n        print(fd.get_gdp_quarter())\n         \n    def test_get_gdp_for(self):\n        print(fd.get_gdp_for())\n     \n    def test_get_gdp_pull(self):\n        print(fd.get_gdp_pull())\n         \n    def test_get_gdp_contrib(self):\n        print(fd.get_gdp_contrib())\n         \n    def test_get_cpi(self):\n        print(fd.get_cpi())\n         \n    def test_get_ppi(self):\n        print(fd.get_ppi())\n         \n    def test_get_deposit_rate(self):\n        print(fd.get_deposit_rate())\n         \n    def test_get_loan_rate(self):\n        print(fd.get_loan_rate())\n         \n    def test_get_rrr(self):\n        print(fd.get_rrr())\n         \n    def test_get_money_supply(self):\n        print(fd.get_money_supply())\n          \n    def test_get_money_supply_bal(self):\n        print(fd.get_money_supply_bal())\n        \n        \nif __name__ == \"__main__\":\n    #import sys;sys.argv = ['', 'Test.testName']\n    unittest.main()"
  },
  {
    "path": "test/nav_test.py",
    "content": "# -*- coding:utf-8 -*-\n'''\nCreated on 2016/5/26\n@author: leo\n'''\nimport unittest\nimport tushare.fund.nav as nav\n\n\nclass Test(unittest.TestCase):\n\n    def set_data(self):\n        self.symbol = '600848'\n        self.start = '2014-11-24'\n        self.end = '2016-02-29'\n        self.disp = 5\n\n    def test_get_nav_open(self):\n        self.set_data()\n        lst = ['all', 'equity', 'mix', 'bond', 'monetary', 'qdii']\n        print('get nav open................\\n')\n        for item in lst:\n            print('=============\\nget %s nav\\n=============' % item)\n            fund_df = nav.get_nav_open(item)\n            print('\\nnums=%d' % len(fund_df))\n            print(fund_df[:self.disp])\n\n    def test_get_nav_close(self):\n        self.set_data()\n        type2 = ['all', 'fbqy', 'fbzq']\n        qy_t3 = ['all', 'ct', 'cx']\n        zq_t3 = ['all', 'wj', 'jj', 'cz']\n\n        print('\\nget nav closed................\\n')\n        fund_df = None\n        for item in type2:\n            if item == 'fbqy':\n                for t3i in qy_t3:\n                    print('\\n=============\\nget %s-%s nav\\n=============' %\n                          (item, t3i))\n                    fund_df = nav.get_nav_close(item, t3i)\n                    print('\\nnums=%d' % len(fund_df))\n                    print(fund_df[:self.disp])\n            elif item == 'fbzq':\n                for t3i in zq_t3:\n                    print('\\n=============\\nget %s-%s nav\\n=============' %\n                          (item, t3i))\n                    fund_df = nav.get_nav_close(item, t3i)\n                    print('\\nnums=%d' % len(fund_df))\n                    print(fund_df[:self.disp])\n            else:\n                print('\\n=============\\nget %s nav\\n=============' % item)\n                fund_df = nav.get_nav_close(item)\n                print('\\nnums=%d' % len(fund_df))\n                print(fund_df[:self.disp])\n\n    def test_get_nav_grading(self):\n        self.set_data()\n        t2 = ['all', 'fjgs', 'fjgg']\n        t3 = {'all': '0', 'wjzq': '13', 'gp': '14',\n              'zs': '15', 'czzq': '16', 'jjzq': '17'}\n\n        print('\\nget nav grading................\\n')\n        fund_df = None\n        for item in t2:\n            if item == 'all':\n                print('\\n=============\\nget %s nav\\n=============' % item)\n                fund_df = nav.get_nav_grading(item)\n                print('\\nnums=%d' % len(fund_df))\n                print(fund_df[:self.disp])\n            else:\n                for t3i in t3.keys():\n                    print('\\n=============\\nget %s-%s nav\\n=============' %\n                          (item, t3i))\n                    fund_df = nav.get_nav_grading(item, t3i)\n                    print('\\nnums=%d' % len(fund_df))\n                    print(fund_df[:self.disp])\n\n    def test_nav_history(self):\n        self.set_data()\n        lst = ['164905', '161005', '380007', '000733', '159920', '164902',\n               '184721', '165519', '164302', '519749', '150275', '150305',\n               '150248']\n        for _, item in enumerate(lst):\n            print('\\n=============\\nget %s nav\\n=============' % item)\n            fund_df = nav.get_nav_history(item, self.start, self.end)\n            if fund_df is not None:\n                print('\\nnums=%d' % len(fund_df))\n                print(fund_df[:self.disp])\n\n    def test_get_fund_info(self):\n        self.set_data()\n        lst = ['164905', '161005', '380007', '000733', '159920', '164902',\n               '184721', '165519', '164302', '519749', '150275', '150305',\n               '150248']\n        for item in lst:\n            print('\\n=============\\nget %s nav\\n=============' % item)\n            fund_df = nav.get_fund_info(item)\n            if fund_df is not None:\n                print('%s fund info' % item)\n                print(fund_df)\n\nif __name__ == '__main__':\n    unittest.main()\n"
  },
  {
    "path": "test/news_test.py",
    "content": "# -*- coding:utf-8 -*- \n'''\nCreated on 2015/3/14\n@author: Jimmy Liu\n'''\nimport unittest\nimport tushare.stock.newsevent as fd\n\nclass Test(unittest.TestCase):\n\n    def set_data(self):\n        self.code = '600848'\n        self.start = '2015-01-03'\n        self.end = '2015-04-07'\n        self.year = 2014\n        self.quarter = 4\n        self.top = 60\n        self.show_content = True\n     \n     \n    def test_get_latest_news(self):\n        self.set_data()\n        print(fd.get_latest_news(self.top, self.show_content)) \n        \n        \n    def test_get_notices(self):\n        self.set_data()\n        df = fd.get_notices(self.code) \n        print(fd.notice_content(df.ix[0]['url'])) \n \n \n    def test_guba_sina(self):\n        self.set_data()\n        print(fd.guba_sina(self.show_content)) \n            \n               \nif __name__ == \"__main__\":\n    unittest.main()"
  },
  {
    "path": "test/ref_test.py",
    "content": "# -*- coding:utf-8 -*- \r\n'''\r\nCreated on 2015/3/14\r\n@author: Jimmy Liu\r\n'''\r\nimport unittest\r\nfrom tushare.stock import reference as fd\r\n\r\nclass Test(unittest.TestCase):\r\n\r\n    def set_data(self):\r\n        self.code = '600848'\r\n        self.start = '2015-01-03'\r\n        self.end = '2015-04-07'\r\n        self.year = 2014\r\n        self.quarter = 4\r\n        self.top = 60\r\n        self.show_content = True\r\n        \r\n    def test_profit_data(self):\r\n        self.set_data()\r\n        print(fd.profit_data(top=self.top)) \r\n        \r\n    def test_forecast_data(self):\r\n        self.set_data()\r\n        print(fd.forecast_data(self.year, self.quarter)) \r\n        \r\n    def test_xsg_data(self):\r\n        print(fd.xsg_data()) \r\n        \r\n    def test_fund_holdings(self):\r\n        self.set_data()\r\n        print(fd.fund_holdings(self.year, self.quarter)) \r\n     \r\n    def test_new_stocksa(self):\r\n        print(fd.new_stocks())  \r\n        \r\n    \r\n    def test_sh_margin_details(self):\r\n        self.set_data()\r\n        print(fd.sh_margin_details(self.start, self.end, self.code)) \r\n               \r\n    def test_sh_margins(self):\r\n        self.set_data()\r\n        print(fd.sh_margins(self.start, self.end)) \r\n      \r\n    def test_sz_margins(self):\r\n        self.set_data()\r\n        print(fd.sz_margins(self.start, self.end))   \r\n        \r\n    def test_sz_margin_details(self):\r\n        self.set_data()\r\n        print(fd.sz_margin_details(self.end))   \r\n        \r\n    \r\nif __name__ == \"__main__\":\r\n    unittest.main()"
  },
  {
    "path": "test/shibor_test.py",
    "content": "# -*- coding:utf-8 -*- \r\n\r\nimport unittest\r\nimport tushare.stock.shibor as fd\r\n\r\nclass Test(unittest.TestCase):\r\n\r\n    def set_data(self):\r\n        self.year = 2014\r\n#         self.year = None\r\n\r\n    def test_shibor_data(self):\r\n        self.set_data()\r\n        fd.shibor_data(self.year)\r\n        \r\n    def test_shibor_quote_data(self):\r\n        self.set_data()\r\n        fd.shibor_quote_data(self.year)\r\n        \r\n    def test_shibor_ma_data(self):\r\n        self.set_data()\r\n        fd.shibor_ma_data(self.year)\r\n        \r\n    def test_lpr_data(self):\r\n        self.set_data()\r\n        fd.lpr_data(self.year)\r\n        \r\n    def test_lpr_ma_data(self):\r\n        self.set_data()\r\n        fd.lpr_ma_data(self.year)\r\n\r\nif __name__ == '__main__':\r\n    unittest.main()"
  },
  {
    "path": "test/storing_test.py",
    "content": "# -*- coding:utf-8 -*- \n\nimport os\nfrom sqlalchemy import create_engine\nfrom pandas.io.pytables import HDFStore\nimport tushare as ts\n\ndef csv():\n    df = ts.get_hist_data('000875')\n    df.to_csv('c:/day/000875.csv',columns=['open','high','low','close'])\n\ndef xls():\n    df = ts.get_hist_data('000875')\n    #直接保存\n    df.to_excel('c:/day/000875.xlsx', startrow=2,startcol=5)\n\ndef hdf():\n    df = ts.get_hist_data('000875')\n#     df.to_hdf('c:/day/store.h5','table')\n    \n    store = HDFStore('c:/day/store.h5')\n    store['000875'] = df\n    store.close()\n\ndef json():\n    df = ts.get_hist_data('000875')\n    df.to_json('c:/day/000875.json',orient='records')\n\n    #或者直接使用\n    print(df.to_json(orient='records'))\n\ndef appends():\n    filename = 'c:/day/bigfile.csv'\n    for code in ['000875', '600848', '000981']:\n        df = ts.get_hist_data(code)\n        if os.path.exists(filename):\n            df.to_csv(filename, mode='a', header=None)\n        else:\n            df.to_csv(filename)  \n\ndef db():\n    df = ts.get_tick_data('600848',date='2014-12-22')\n    engine = create_engine('mysql://root:jimmy1@127.0.0.1/mystock?charset=utf8')\n#     db = MySQLdb.connect(host='127.0.0.1',user='root',passwd='jimmy1',db=\"mystock\",charset=\"utf8\")\n#     df.to_sql('TICK_DATA',con=db,flavor='mysql')\n#     db.close()\n    df.to_sql('tick_data',engine,if_exists='append')\n\ndef nosql():\n    import pymongo\n    import json\n    conn = pymongo.Connection('127.0.0.1', port=27017)\n    df = ts.get_tick_data('600848',date='2014-12-22')\n    print(df.to_json(orient='records'))\n    \n    conn.db.tickdata.insert(json.loads(df.to_json(orient='records')))\n    \n#     print conn.db.tickdata.find()\n    \nif __name__ == '__main__':\n    nosql()"
  },
  {
    "path": "test/trading_test.py",
    "content": "# -*- coding:utf-8 -*- \n'''\nCreated on 2015/3/14\n@author: Jimmy Liu\n'''\nimport unittest\nimport tushare.stock.trading as fd\n\nclass Test(unittest.TestCase):\n\n    def set_data(self):\n        self.code = '600848'\n        self.start = '2015-01-03'\n        self.end = '2015-04-07'\n        self.year = 2014\n        self.quarter = 4\n        \n    def test_get_hist_data(self):\n        self.set_data()\n        print(fd.get_hist_data(self.code, self.start))\n        \n    def test_get_tick_data(self):\n        self.set_data()\n        print(fd.get_tick_data(self.code, self.end))\n    \n    def test_get_today_all(self):\n        print(fd.get_today_all()) \n        \n    def test_get_realtime_quotesa(self):\n        self.set_data()\n        print(fd.get_realtime_quotes(self.code)) \n        \n    def test_get_h_data(self):\n        self.set_data()\n        print(fd.get_h_data(self.code, self.start, self.end))\n        \n    def test_get_today_ticks(self):\n        self.set_data()\n        print(fd.get_today_ticks(self.code))    \n\nif __name__ == \"__main__\":\n    #import sys;sys.argv = ['', 'Test.testName']\n    unittest.main()"
  },
  {
    "path": "test_unittest.py",
    "content": "'''\nUnitTest for API\n@author: Jimmy\n'''\nimport unittest\nimport tushare.stock.trading as td\n\nclass TestTrading(unittest.TestCase):\n\n    def set_data(self):\n        self.code = '600848'\n        self.start = '2014-11-03'\n        self.end = '2014-11-07'\n    \n    def test_tickData(self):\n        self.set_data()\n        td.get_tick_data(self.code, date=self.start)\n    \n#     def test_histData(self):\n#         self.set_data()\n#         td.get_hist_data(self.code, start=self.start, end=self.end)\n        \nif __name__ == \"__main__\":\n    #import sys;sys.argv = ['', 'Test.testName']\n    unittest.main()"
  },
  {
    "path": "tushare/VERSION.txt",
    "content": "1.2.18"
  },
  {
    "path": "tushare/__init__.py",
    "content": "# -*- coding:utf-8 -*- \r\nimport codecs\r\nimport os\r\n\r\n__version__ = codecs.open(os.path.join(os.path.dirname(__file__), 'VERSION.txt')).read()\r\n__author__ = 'Jimmy Liu'\r\n\r\n\"\"\"\r\nfor trading data\r\n\"\"\"\r\nfrom tushare.stock.trading import (get_hist_data, get_tick_data,\r\n                                   get_today_all, get_realtime_quotes,\r\n                                   get_h_data, get_today_ticks,\r\n                                   get_index, get_hists,\r\n                                   get_k_data, get_day_all,\r\n                                   get_sina_dd, bar, tick,\r\n                                   get_markets, quotes,\r\n                                   get_instrument, reset_instrument)\r\n\r\n\"\"\"\r\nfor trading data\r\n\"\"\"\r\nfrom tushare.stock.fundamental import (get_stock_basics, get_report_data,\r\n                                       get_profit_data,\r\n                                       get_operation_data, get_growth_data,\r\n                                       get_debtpaying_data, get_cashflow_data,\r\n                                       get_balance_sheet, get_profit_statement, get_cash_flow)\r\n\r\n\"\"\"\r\nfor macro data\r\n\"\"\"\r\nfrom tushare.stock.macro import (get_gdp_year, get_gdp_quarter,\r\n                                 get_gdp_for, get_gdp_pull,\r\n                                 get_gdp_contrib, get_cpi,\r\n                                 get_ppi, get_deposit_rate,\r\n                                 get_loan_rate, get_rrr,\r\n                                 get_money_supply, get_money_supply_bal,\r\n                                 get_gold_and_foreign_reserves)\r\n\r\n\"\"\"\r\nfor classifying data\r\n\"\"\"\r\nfrom tushare.stock.classifying import (get_industry_classified, get_concept_classified,\r\n                                       get_area_classified, get_gem_classified,\r\n                                       get_sme_classified, get_st_classified,\r\n                                       get_hs300s, get_sz50s, get_zz500s,\r\n                                       get_terminated, get_suspended)\r\n\r\n\"\"\"\r\nfor macro data\r\n\"\"\"\r\nfrom tushare.stock.newsevent import (get_latest_news, latest_content,\r\n                                     get_notices, notice_content,\r\n                                     guba_sina)\r\n\r\n\"\"\"\r\nfor reference\r\nmoneyflow_hsgt:沪深港通资金流向\r\n\"\"\"\r\nfrom tushare.stock.reference import (profit_data, forecast_data,\r\n                                     xsg_data, fund_holdings,\r\n                                     new_stocks, new_cbonds, sh_margins,\r\n                                     sh_margin_details,\r\n                                     sz_margins, sz_margin_details,\r\n                                     top10_holders, profit_divis,\r\n                                     moneyflow_hsgt, margin_detail,\r\n                                     margin_target, margin_offset,\r\n                                     margin_zsl, stock_issuance,\r\n                                     stock_pledged, pledged_detail)\r\n\r\n\"\"\"\r\nfor shibor\r\n\"\"\"\r\nfrom tushare.stock.shibor import (shibor_data, shibor_quote_data,\r\n                                  shibor_ma_data, lpr_data,\r\n                                  lpr_ma_data)\r\n\r\n\r\n\"\"\"\r\nfor tushare pro api\r\n\"\"\"\r\nfrom tushare.pro.data_pro import (pro_api, pro_bar)\r\n\r\n\"\"\"\r\nfor LHB\r\n\"\"\"\r\nfrom tushare.stock.billboard import (top_list, cap_tops, broker_tops,\r\n                                     inst_tops, inst_detail)\r\n\r\n\r\n\"\"\"\r\nfor utils\r\n\"\"\"\r\nfrom tushare.util.dateu import (trade_cal, is_holiday)\r\n\r\n\r\n\r\nfrom tushare.internet.boxoffice import (realtime_boxoffice, day_boxoffice,\r\n                                        day_cinema, month_boxoffice)\r\n\r\nfrom tushare.internet.indexes import (bdi)\r\n\r\n\"\"\"\r\nfor fund data\r\n\"\"\"\r\nfrom tushare.fund.nav import (get_nav_open, get_nav_close, get_nav_grading,\r\n                              get_nav_history, get_fund_info)\r\n\r\n\"\"\"\r\nfor trader API\r\n\"\"\"\r\nfrom tushare.trader.trader import TraderAPI\r\n\r\n\"\"\"\r\nfor futures API\r\n\"\"\"\r\nfrom tushare.futures.intlfutures import (get_intlfuture)\r\n\r\n\r\nfrom tushare.stock.globals import (global_realtime)\r\n\r\n\r\nfrom tushare.util.mailmerge import (MailMerge)\r\n\r\n\r\n\"\"\"\r\nfor futures API\r\n\"\"\"\r\nfrom tushare.futures.domestic import (get_cffex_daily, get_czce_daily,\r\n                                      get_dce_daily, get_future_daily,\r\n                                      get_shfe_daily, get_shfe_vwap)\r\n\r\n\r\nfrom tushare.coins.market import (coins_tick, coins_bar,\r\n                                  coins_snapshot, coins_trade)\r\n\r\nfrom tushare.util.conns import (get_apis, close_apis)\r\n\r\nfrom tushare.util.upass import (get_token, set_token)\r\n"
  },
  {
    "path": "tushare/bond/__init__.py",
    "content": ""
  },
  {
    "path": "tushare/bond/bonds.py",
    "content": "# -*- coding:utf-8 -*- \n\"\"\"\n投资参考数据接口 \nCreated on 2017/10/01\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n\"\"\"\n\n\ndef get_bond_info(code):\n    pass\n\n\n\nif __name__ == '__main__':\n    pass"
  },
  {
    "path": "tushare/coins/__init__.py",
    "content": ""
  },
  {
    "path": "tushare/coins/market.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*- \n\"\"\"\n数字货币行情数据\nCreated on 2017年9月9日\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n\"\"\"\n\nimport pandas as pd\nimport traceback\nimport time\nimport json\ntry:\n    from urllib.request import urlopen, Request\nexcept ImportError:\n    from urllib2 import urlopen, Request\n\n\nURL = {\n       \"hb\": {\n              \"rt\"         : 'http://api.huobi.com/staticmarket/ticker_%s_json.js',\n              \"kline\"      : 'http://api.huobi.com/staticmarket/%s_kline_%s_json.js?length=%s',\n              \"snapshot\"   : 'http://api.huobi.com/staticmarket/depth_%s_%s.js',\n              \"tick\"       : 'http://api.huobi.com/staticmarket/detail_%s_json.js',\n              },\n       \"ok\": {\n              \"rt\"         : 'https://www.okcoin.cn/api/v1/ticker.do?symbol=%s_cny',\n              \"kline\"      : 'https://www.okcoin.cn/api/v1/kline.do?symbol=%s_cny&type=%s&size=%s',\n              \"snapshot\"   : 'https://www.okcoin.cn/api/v1/depth.do?symbol=%s_cny&merge=&size=%s',\n              \"tick\"       : 'https://www.okcoin.cn/api/v1/trades.do?symbol=%s_cny',\n              },\n       'chbtc': {\n                \"rt\"       : 'http://api.chbtc.com/data/v1/ticker?currency=%s_cny',\n                \"kline\"    : 'http://api.chbtc.com/data/v1/kline?currency=%s_cny&type=%s&size=%s',\n                \"snapshot\" : 'http://api.chbtc.com/data/v1/depth?currency=%s_cny&size=%s&merge=',\n                \"tick\"     : 'http://api.chbtc.com/data/v1/trades?currency=%s_cny',\n                }\n       }\n\nKTYPES = {\n          \"D\": {\n                \"hb\"       : '100',\n                'ok'       : '1day',\n                'chbtc'    : '1day',\n                },\n          \"W\": {\n                \"hb\"       : '200',\n                'ok'       : '1week',\n                'chbtc'    : '1week',\n                },\n          \"M\": {\n                \"hb\"       : '300',\n                \"ok\"       : '',\n                \"chbtc\"    : '',\n                },\n          \"1MIN\": {\n                   \"hb\"    : '001',\n                   'ok'    : '1min',\n                   'chbtc' : '1min',\n                   },\n          \"5MIN\": {\n                   \"hb\"    : '005',\n                   'ok'    : '5min',\n                   'chbtc' : '5min',\n                   },\n          \"15MIN\": {\n                   \"hb\"    : '015',\n                   'ok'    : '15min',\n                   'chbtc' : '15min',\n                   },\n          \"30MIN\": {\n                   \"hb\"    : '030',\n                   'ok'    : '30min',\n                   'chbtc' : '30min',\n                   },\n          \"60MIN\": {\n                   \"hb\"    : '060',\n                   'ok'    : '1hour',\n                   'chbtc' : '1hour',\n                   },\n          } \n\n\ndef coins_tick(broker='hb', code='btc'):\n    \"\"\"\n    实时tick行情\n    params:\n    ---------------\n    broker: hb:火币\n            ok:okCoin\n            chbtc:中国比特币\n    code: hb:btc,ltc\n        ----okcoin---\n        btc_cny：比特币    ltc_cny：莱特币    eth_cny :以太坊     etc_cny :以太经典    bcc_cny :比特现金 \n        ----chbtc----\n        btc_cny:BTC/CNY\n        ltc_cny :LTC/CNY\n        eth_cny :以太币/CNY\n        etc_cny :ETC币/CNY\n        bts_cny :BTS币/CNY\n        eos_cny :EOS币/CNY\n        bcc_cny :BCC币/CNY\n        qtum_cny :量子链/CNY\n        hsr_cny :HSR币/CNY\n    return:json\n    ---------------\n    hb:\n    {\n    \"time\":\"1504713534\",\n    \"ticker\":{\n        \"symbol\":\"btccny\",\n        \"open\":26010.90,\n        \"last\":28789.00,\n        \"low\":26000.00,\n        \"high\":28810.00,\n        \"vol\":17426.2198,\n        \"buy\":28750.000000,\n        \"sell\":28789.000000\n        }\n    }\n    ok:\n    {\n    \"date\":\"1504713864\",\n    \"ticker\":{\n        \"buy\":\"28743.0\",\n        \"high\":\"28886.99\",\n        \"last\":\"28743.0\",\n        \"low\":\"26040.0\",\n        \"sell\":\"28745.0\",\n        \"vol\":\"20767.734\"\n        }\n    }\n    chbtc: \n        {\n         u'date': u'1504794151878',\n         u'ticker': {\n             u'sell': u'28859.56', \n             u'buy': u'28822.89', \n             u'last': u'28859.56', \n             u'vol': u'2702.71', \n             u'high': u'29132', \n             u'low': u'27929'\n         }\n        }\n\n        \n    \"\"\"\n    return _get_data(URL[broker]['rt'] % (code))\n            \ndef coins_bar(broker='hb', code='btc', ktype='D', size='2000'):\n    \"\"\"\n            获取各类k线数据\n    params:\n    broker:hb,ok,chbtc\n    code:btc,ltc,eth,etc,bcc\n    ktype:D,W,M,1min,5min,15min,30min,60min\n    size:<2000\n    return DataFrame: 日期时间，开盘价，最高价，最低价，收盘价，成交量\n    \"\"\"\n    try:\n        js = _get_data(URL[broker]['kline'] % (code, KTYPES[ktype.strip().upper()][broker], size))\n        if js is None:\n            return js\n        if broker == 'chbtc':\n            js = js['data']\n        df = pd.DataFrame(js, columns=['DATE', 'OPEN', 'HIGH', 'LOW', 'CLOSE', 'VOL'])\n        if broker == 'hb':\n            if ktype.strip().upper() in ['D', 'W', 'M']:\n                df['DATE'] = df['DATE'].apply(lambda x: x[0:8])\n            else:\n                df['DATE'] = df['DATE'].apply(lambda x: x[0:12])\n        else:\n            df['DATE'] = df['DATE'].apply(lambda x: int2time(x / 1000))\n        if ktype.strip().upper() in ['D', 'W', 'M']:\n            df['DATE'] = df['DATE'].apply(lambda x: str(x)[0:10])\n        df['DATE'] = pd.to_datetime(df['DATE'])\n        return df\n    except Exception:\n        print(traceback.print_exc())\n\n\ndef coins_snapshot(broker='hb', code='btc', size='5'):\n    \"\"\"\n            获取实时快照数据\n    params:\n    broker:hb,ok,chbtc\n    code:btc,ltc,eth,etc,bcc\n    size:<150\n    return Panel: asks,bids\n    \"\"\"\n    try:\n        js = _get_data(URL[broker]['snapshot'] % (code, size))\n        if js is None:\n            return js\n        if broker == 'hb':\n            timestr = js['ts']\n            timestr = int2time(timestr / 1000)\n        if broker == 'ok':\n            timestr = time.strftime(\"%Y-%m-%d %H:%M:%S\", time.localtime()) \n        if broker == 'chbtc':\n            timestr = js['timestamp']\n            timestr = int2time(timestr)\n        asks = pd.DataFrame(js['asks'], columns = ['price', 'vol'])\n        bids = pd.DataFrame(js['bids'], columns = ['price', 'vol'])\n        asks['time'] = timestr\n        bids['time'] = timestr\n        djs = {\"asks\": asks, \"bids\": bids}\n        pf = pd.Panel(djs)\n        return pf\n    except Exception:\n        print(traceback.print_exc())\n\n\ndef coins_trade(broker='hb', code='btc'):\n    \"\"\"\n    获取实时交易数据\n    params:\n    -------------\n    broker: hb,ok,chbtc\n    code:btc,ltc,eth,etc,bcc\n    \n    return:\n    ---------------\n    DataFrame\n    'tid':order id\n    'datetime', date time \n    'price' : trade price\n    'amount' : trade amount\n    'type' : buy or sell\n    \"\"\"\n    js = _get_data(URL[broker]['tick'] % code)\n    if js is None:\n        return js\n    if broker == 'hb':\n        df = pd.DataFrame(js['trades'])\n        df = df[['id', 'ts', 'price', 'amount', 'direction']]\n        df['ts'] = df['ts'].apply(lambda x: int2time(x / 1000))\n    if broker == 'ok':\n        df = pd.DataFrame(js)\n        df = df[['tid', 'date_ms', 'price', 'amount', 'type']]\n        df['date_ms'] = df['date_ms'].apply(lambda x: int2time(x / 1000))\n    if broker == 'chbtc':\n        df = pd.DataFrame(js)\n        df = df[['tid', 'date', 'price', 'amount', 'type']]\n        df['date'] = df['date'].apply(lambda x: int2time(x))\n    df.columns = ['tid', 'datetime', 'price', 'amount', 'type']\n    return df\n\n\ndef _get_data(url):\n    try:\n        request = Request(url)\n        lines = urlopen(request, timeout = 10).read()\n        if len(lines) < 50: #no data\n            return None\n        js = json.loads(lines.decode('GBK'))\n        return js\n    except Exception:\n        print(traceback.print_exc())\n\n\ndef int2time(timestamp):\n    value = time.localtime(timestamp)\n    dt = time.strftime('%Y-%m-%d %H:%M:%S', value)\n    return dt\n\n"
  },
  {
    "path": "tushare/data/__init__.py",
    "content": "__version__ = \"0.0.1\""
  },
  {
    "path": "tushare/fund/__init__.py",
    "content": ""
  },
  {
    "path": "tushare/fund/cons.py",
    "content": "# -*- coding:utf-8 -*-\n\"\"\"\nCreated on 2016/04/03\n@author: Leo\n@group : lazytech\n@contact: lazytech@sina.cn\n\"\"\"\n\nVERSION = '0.0.1'\nP_TYPE = {'http': 'http://', 'ftp': 'ftp://'}\nFORMAT = lambda x: '%.2f' % x\nFORMAT4 = lambda x: '%.4f' % x\nDOMAINS = {'sina': 'sina.com.cn', 'sinahq': 'sinajs.cn',\n           'ifeng': 'ifeng.com', 'sf': 'finance.sina.com.cn',\n           'ssf': 'stock.finance.sina.com.cn',\n           'vsf': 'vip.stock.finance.sina.com.cn',\n           'idx': 'www.csindex.com.cn', '163': 'money.163.com',\n           'em': 'eastmoney.com', 'sseq': 'query.sse.com.cn',\n           'sse': 'www.sse.com.cn', 'szse': 'www.szse.cn',\n           'oss': '218.244.146.57',\n           'shibor': 'www.shibor.org'}\n\nNAV_OPEN_API = {'all': 'getNetValueOpen', 'equity': 'getNetValueOpen',\n                'mix': 'getNetValueOpen', 'bond': 'getNetValueOpen',\n                'monetary': 'getNetValueMoney', 'qdii': 'getNetValueOpen'}\n\nNAV_OPEN_KEY = {'all': '6XxbX6h4CED0ATvW', 'equity': 'Gb3sH5uawH5WCUZ9',\n                'mix': '6XxbX6h4CED0ATvW', 'bond': 'Gb3sH5uawH5WCUZ9',\n                'monetary': 'uGo5qniFnmT5eQjp', 'qdii': 'pTYExKwRmqrSaP0P'}\nNAV_OPEN_T2 = {'all': '0', 'equity': '2', 'mix': '1',\n               'bond': '3', 'monetary': '0', 'qdii': '6'}\nNAV_OPEN_T3 = ''\n\n\nNAV_CLOSE_API = 'getNetValueClose'\nNAV_CLOSE_KEY = ''\nNAV_CLOSE_T2 = {'all': '0', 'fbqy': '4', 'fbzq': '9'}\nNAV_CLOSE_T3 = {'all': '0', 'ct': '10',\n                'cx': '11', 'wj': '3', 'jj': '5', 'cz': '12'}\n\n\nNAV_GRADING_API = 'getNetValueCX'\nNAV_GRADING_KEY = ''\nNAV_GRADING_T2 = {'all': '0', 'fjgs': '7', 'fjgg': '8'}\nNAV_GRADING_T3 = {'all': '0', 'wjzq': '13',\n                  'gp': '14', 'zs': '15', 'czzq': '16', 'jjzq': '17'}\n\n\nNAV_DEFAULT_PAGE = 1\n\n##########################################################################\n# 基金数据列名\n\nNAV_OPEN_COLUMNS = ['symbol', 'sname', 'per_nav', 'total_nav', 'yesterday_nav',\n                    'nav_rate', 'nav_a', 'nav_date', 'fund_manager',\n                    'jjlx', 'jjzfe']\n\nNAV_HIS_JJJZ = ['fbrq', 'jjjz', 'ljjz']\nNAV_HIS_NHSY = ['fbrq', 'nhsyl', 'dwsy']\n\nFUND_INFO_COLS = ['symbol', 'jjqc', 'jjjc', 'clrq', 'ssrq', 'xcr', 'ssdd',\n                  'Type1Name', 'Type2Name', 'Type3Name', 'jjgm', 'jjfe',\n                  'jjltfe', 'jjferq', 'quarter', 'glr', 'tgr']\n\n\nNAV_CLOSE_COLUMNS = ['symbol', 'sname', 'per_nav', 'total_nav', 'nav_rate',\n                     'discount_rate', 'nav_date', 'start_date', 'end_date',\n                     'fund_manager', 'jjlx', 'jjzfe']\n\n\nNAV_GRADING_COLUMNS = ['symbol', 'sname', 'per_nav', 'total_nav', 'nav_rate',\n                       'discount_rate', 'nav_date', 'start_date', 'end_date',\n                       'fund_manager', 'jjlx', 'jjzfe']\n\n\nNAV_COLUMNS = {'open': NAV_OPEN_COLUMNS,\n               'close': NAV_CLOSE_COLUMNS, 'grading': NAV_GRADING_COLUMNS}\n\n##########################################################################\n# 数据源URL\nSINA_NAV_COUNT_URL = '%s%s/fund_center/data/jsonp.php/IO.XSRV2.CallbackList[\\'%s\\']/NetValue_Service.%s?ccode=&type2=%s&type3=%s'\nSINA_NAV_DATA_URL = '%s%s/fund_center/data/jsonp.php/IO.XSRV2.CallbackList[\\'%s\\']/NetValue_Service.%s?page=%s&num=%s&ccode=&type2=%s&type3=%s'\n\nSINA_NAV_HISTROY_COUNT_URL = '%s%s/fundInfo/api/openapi.php/CaihuiFundInfoService.getNav?symbol=%s&datefrom=%s&dateto=%s'\nSINA_NAV_HISTROY_DATA_URL = '%s%s/fundInfo/api/openapi.php/CaihuiFundInfoService.getNav?symbol=%s&datefrom=%s&dateto=%s&num=%s'\n\nSINA_NAV_HISTROY_COUNT_CUR_URL = '%s%s/fundInfo/api/openapi.php/CaihuiFundInfoService.getNavcur?symbol=%s&datefrom=%s&dateto=%s'\nSINA_NAV_HISTROY_DATA_CUR_URL = '%s%s/fundInfo/api/openapi.php/CaihuiFundInfoService.getNavcur?symbol=%s&datefrom=%s&dateto=%s&num=%s'\n\nSINA_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'\n\nSINA_FUND_INFO_URL = '%s%s/fundInfo/api/openapi.php/FundPageInfoService.tabjjgk?symbol=%s&format=json'\n\n##########################################################################\nDATA_GETTING_TIPS = '[Getting data:]'\nDATA_GETTING_FLAG = '#'\nDATA_ROWS_TIPS = '%s rows data found.Please wait for a moment.'\nDATA_INPUT_ERROR_MSG = 'date input error.'\nNETWORK_URL_ERROR_MSG = '获取失败，请检查网络和URL'\nDATE_CHK_MSG = '年度输入错误：请输入1989年以后的年份数字，格式：YYYY'\nDATE_CHK_Q_MSG = '季度输入错误：请输入1、2、3或4数字'\nTOP_PARAS_MSG = 'top有误，请输入整数或all.'\nLHB_MSG = '周期输入有误，请输入数字5、10、30或60'\n\nOFT_MSG = u'开放型基金类型输入有误，请输入all、equity、mix、bond、monetary、qdii'\n\nDICT_NAV_EQUITY = {\n    'fbrq': 'date',\n    'jjjz': 'value',\n    'ljjz': 'total',\n    'change': 'change'\n}\n\nDICT_NAV_MONETARY = {\n    'fbrq': 'date',\n    'nhsyl': 'value',\n    'dwsy': 'total',\n    'change': 'change'\n}\n\nimport sys\nPY3 = (sys.version_info[0] >= 3)\n\n\ndef _write_head():\n    sys.stdout.write(DATA_GETTING_TIPS)\n    sys.stdout.flush()\n\n\ndef _write_console():\n    sys.stdout.write(DATA_GETTING_FLAG)\n    sys.stdout.flush()\n\n\ndef _write_tips(tip):\n    sys.stdout.write(DATA_ROWS_TIPS % tip)\n    sys.stdout.flush()\n\n\ndef _write_msg(msg):\n    sys.stdout.write(msg)\n    sys.stdout.flush()\n\n\ndef _check_nav_oft_input(found_type):\n    if found_type not in NAV_OPEN_KEY.keys():\n        raise TypeError(OFT_MSG)\n    else:\n        return True\n\n\ndef _check_input(year, quarter):\n    if isinstance(year, str) or year < 1989:\n        raise TypeError(DATE_CHK_MSG)\n    elif quarter is None or isinstance(quarter, str) or quarter not in [1, 2, 3, 4]:\n        raise TypeError(DATE_CHK_Q_MSG)\n    else:\n        return True\n"
  },
  {
    "path": "tushare/fund/nav.py",
    "content": "# -*- coding:utf-8 -*-\n\n\"\"\"\n获取基金净值数据接口 \nCreated on 2016/04/03\n@author: leo\n@group : lazytech\n@contact: lazytech@sina.cn\n\"\"\"\n\nfrom __future__ import division\nimport time\nimport json\nimport re\nimport pandas as pd\nimport numpy as np\nfrom tushare.fund import cons as ct\nfrom tushare.util import dateu as du\ntry:\n    from urllib.request import urlopen, Request\nexcept ImportError:\n    from urllib2 import urlopen, Request\n\n\ndef get_nav_open(fund_type='all'):\n    \"\"\"\n        获取开放型基金净值数据\n    Parameters\n    ------\n        type:string\n            开放基金类型:\n                1. all \t\t所有开放基金\n                2. equity\t股票型开放基金\n                3. mix \t\t混合型开放基金\n                4. bond\t\t债券型开放基金\n                5. monetary\t货币型开放基金\n                6. qdii\t\tQDII型开放基金\n     return\n     -------\n        DataFrame\n            开放型基金净值数据(DataFrame):\n                symbol      基金代码\n                sname       基金名称\n                per_nav     单位净值\n                total_nav   累计净值\n                yesterday_nav  前一日净值\n                nav_a       涨跌额\n                nav_rate    增长率(%)\n                nav_date    净值日期\n                fund_manager 基金经理\n                jjlx        基金类型\n                jjzfe       基金总份额\n    \"\"\"\n    if ct._check_nav_oft_input(fund_type) is True:\n        ct._write_head()\n        nums = _get_fund_num(ct.SINA_NAV_COUNT_URL %\n                             (ct.P_TYPE['http'], ct.DOMAINS['vsf'],\n                              ct.NAV_OPEN_KEY[fund_type],\n                              ct.NAV_OPEN_API[fund_type],\n                              ct.NAV_OPEN_T2[fund_type],\n                              ct.NAV_OPEN_T3))\n\n        pages = 2  # 分两次请求数据\n        limit_cnt = int(nums/pages)+1   # 每次取的数量\n        fund_dfs = []\n        for page in range(1, pages+1):\n            fund_dfs = _parse_fund_data(ct.SINA_NAV_DATA_URL %\n                                       (ct.P_TYPE['http'], ct.DOMAINS['vsf'],\n                                        ct.NAV_OPEN_KEY[fund_type],\n                                        ct.NAV_OPEN_API[fund_type],\n                                        page,\n                                        limit_cnt,\n                                        ct.NAV_OPEN_T2[fund_type],\n                                        ct.NAV_OPEN_T3))\n\n        return pd.concat(fund_dfs, ignore_index=True)\n\n\ndef get_nav_close(fund_type='all', sub_type='all'):\n    \"\"\"\n        获取封闭型基金净值数据\n    Parameters\n    ------\n        type:string\n            封闭基金类型:\n                1. all      所有封闭型基金\n                2. fbqy     封闭-权益\n                3. fbzq     封闭债券\n\n        sub_type:string\n            基金子类型:\n\n                1. type=all sub_type无效\n                2. type=fbqy 封闭-权益\n                    *all    全部封闭权益\n                    *ct     传统封基\n                    *cx     创新封基\n\n                3. type=fbzq  封闭债券\n                    *all    全部封闭债券\n                    *wj     稳健债券型\n                    *jj     激进债券型\n                    *cz     纯债债券型\n     return\n     -------\n        DataFrame\n            开放型基金净值数据(DataFrame):\n                symbol      基金代码\n                sname       基金名称\n                per_nav     单位净值\n                total_nav   累计净值\n                nav_rate    增长率(%)\n                discount_rate 折溢价率(%)\n                nav_date    净值日期\n                start_date  成立日期\n                end_date    到期日期\n                fund_manager 基金经理\n                jjlx        基金类型\n                jjzfe       基金总份额\n    \"\"\"\n    ct._write_head()\n    nums = _get_fund_num(ct.SINA_NAV_COUNT_URL %\n                         (ct.P_TYPE['http'], ct.DOMAINS['vsf'],\n                          ct.NAV_CLOSE_KEY, ct.NAV_CLOSE_API,\n                          ct.NAV_CLOSE_T2[fund_type],\n                          ct.NAV_CLOSE_T3[sub_type]))\n\n    fund_df = _parse_fund_data(ct.SINA_NAV_DATA_URL %\n                               (ct.P_TYPE['http'], ct.DOMAINS['vsf'],\n                                ct.NAV_OPEN_KEY, ct.NAV_CLOSE_API, \n                                ct.NAV_DEFAULT_PAGE,\n                                nums,\n                                ct.NAV_CLOSE_T2[fund_type],\n                                ct.NAV_CLOSE_T3[sub_type]),\n                               'close')\n    return fund_df\n\n\ndef get_nav_grading(fund_type='all', sub_type='all'):\n    \"\"\"\n        获取分级子基金净值数据\n    Parameters\n    ------\n        type:string\n            封闭基金类型:\n                1. all      所有分级基金\n                2. fjgs     分级-固收\n                3. fjgg     分级-杠杆\n\n        sub_type:string\n            基金子类型(type=all sub_type无效):\n                *all    全部分级债券\n                *wjzq   稳健债券型\n                *czzq   纯债债券型\n                *jjzq   激进债券型\n                *gp     股票型\n                *zs     指数型\n     return\n     -------\n        DataFrame\n            开放型基金净值数据(DataFrame):\n                symbol      基金代码\n                sname       基金名称\n                per_nav     单位净值\n                total_nav   累计净值\n                nav_rate    增长率(%)\n                discount_rate 折溢价率(%)\n                nav_date    净值日期\n                start_date  成立日期\n                end_date    到期日期\n                fund_manager 基金经理\n                jjlx        基金类型\n                jjzfe       基金总份额\n    \"\"\"\n    ct._write_head()\n    nums = _get_fund_num(ct.SINA_NAV_COUNT_URL %\n                         (ct.P_TYPE['http'], ct.DOMAINS['vsf'],\n                          ct.NAV_GRADING_KEY, ct.NAV_GRADING_API,\n                          ct.NAV_GRADING_T2[fund_type],\n                          ct.NAV_GRADING_T3[sub_type]))\n\n    fund_df = _parse_fund_data(ct.SINA_NAV_DATA_URL %\n                               (ct.P_TYPE['http'], ct.DOMAINS['vsf'],\n                                ct.NAV_GRADING_KEY, ct.NAV_GRADING_API, \n                                ct.NAV_DEFAULT_PAGE,\n                                nums,\n                                ct.NAV_GRADING_T2[fund_type],\n                                ct.NAV_GRADING_T3[sub_type]),\n                               'grading')\n    return fund_df\n\n\ndef get_nav_history(code, start=None, end=None, retry_count=3, pause=0.001, timeout=10):\n    '''\n    获取历史净值数据\n    Parameters\n    ------\n      code:string\n                  基金代码 e.g. 000001\n      start:string\n                  开始日期 format：YYYY-MM-DD 为空时取当前日期\n      end:string\n                  结束日期 format：YYYY-MM-DD 为空时取去年今日\n      retry_count : int, 默认 3\n                 如遇网络等问题重复执行的次数\n      pause : int, 默认 0\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\n      timeout: int 默认 10s\n                请求大量数据时的网络超时\n    return\n    -------\n      DataFrame\n          date 发布日期 (index)\n          value 基金净值(股票/混合/QDII型基金) / 年华收益(货币/债券基金)\n          total 累计净值(股票/混合/QDII型基金) / 万分收益(货币/债券基金)\n          change 净值增长率(股票/混合/QDII型基金)\n    '''\n    start = du.today_last_year() if start is None else start\n    end = du.today() if end is None else end\n\n    # 判断基金类型\n    ismonetary = False  # 是否是债券型和货币型基金\n    df_fund = get_fund_info(code)\n\n    fund_type = df_fund.ix[0]['Type2Name']\n    if (fund_type.find(u'债券型') != -1) or (fund_type.find(u'货币型') != -1):\n        ismonetary = True\n\n    ct._write_head()\n    nums = _get_nav_histroy_num(code, start, end, ismonetary)\n    data = _parse_nav_history_data(\n        code, start, end, nums, ismonetary, retry_count, pause, timeout)\n    return data\n\n\ndef get_fund_info(code):\n    '''\n    获取基金基本信息\n    Parameters\n    ------\n      code:string\n                  基金代码 e.g. 000001\n    return\n    -------\n      DataFrame\n          jjqc      基金全称\n          jjjc      基金简称\n          symbol    基金代码\n          clrq      成立日期\n          ssrq      上市日期\n          xcr       存续期限\n          ssdd      上市地点\n          Type1Name 运作方式\n          Type2Name 基金类型\n          Type3Name 二级分类\n          jjgm      基金规模(亿元)\n          jjfe      基金总份额(亿份)\n          jjltfe    上市流通份额(亿份)\n          jjferq    基金份额日期\n          quarter   上市季度\n          glr       基金管理人\n          tgr       基金托管人\n    '''\n    request = ct.SINA_FUND_INFO_URL % (\n        ct.P_TYPE['http'], ct.DOMAINS['ssf'], code)\n    text = urlopen(request, timeout=10).read()\n    text = text.decode('gbk')\n    org_js = json.loads(text)\n\n    status_code = int(org_js['result']['status']['code'])\n    if status_code != 0:\n        status = str(org_js['result']['status']['msg'])\n        raise ValueError(status)\n    data = org_js['result']['data']\n    fund_df = pd.DataFrame(data, columns=ct.FUND_INFO_COLS, index=[0])\n    fund_df = fund_df.set_index('symbol')\n\n    return fund_df\n\n\ndef _parse_fund_data(url, fund_type='open'):\n\n    ct._write_console()\n\n    try:\n        request = Request(url)\n\n        text = urlopen(request, timeout=10).read()\n        if text == 'null':\n            return None\n        text = text.decode('gbk') if ct.PY3 else text\n        text = text.split('data:')[1].split(',exec_time')[0]\n        reg = re.compile(r'\\,(.*?)\\:')\n        text = reg.sub(r',\"\\1\":', text)\n        text = text.replace('\"{symbol', '{\"symbol')\n        text = text.replace('{symbol', '{\"symbol\"')\n        if ct.PY3:\n            jstr = json.dumps(text)\n        else:\n            jstr = json.dumps(text, encoding='gbk')\n        org_js = json.loads(jstr)\n        fund_df = pd.DataFrame(pd.read_json(org_js, dtype={'symbol': object}),\n                               columns=ct.NAV_COLUMNS[fund_type])\n        fund_df.fillna(0, inplace=True)\n        return fund_df\n    except Exception as er:\n        print(str(er))\n\n\ndef _get_fund_num(url):\n    \"\"\"\n        获取基金数量\n    \"\"\"\n\n    ct._write_console()\n    try:\n        request = Request(url)\n        text = urlopen(request, timeout=10).read()\n        text = text.decode('gbk')\n        if text == 'null':\n            raise ValueError('get fund num error')\n\n        text = text.split('((')[1].split('))')[0]\n        reg = re.compile(r'\\,(.*?)\\:')\n        text = reg.sub(r',\"\\1\":', text)\n        text = text.replace('{total_num', '{\"total_num\"')\n        text = text.replace('null', '0')\n        org_js = json.loads(text)\n        nums = org_js[\"total_num\"]\n        return int(nums)\n    except Exception as er:\n        print(str(er))\n\n\ndef _get_nav_histroy_num(code, start, end, ismonetary=False):\n    \"\"\"\n        获取基金历史净值数量\n\n    --------\n        货币和证券型基金采用的url不同，需要增加基金类型判断\n    \"\"\"\n\n    ct._write_console()\n\n    if ismonetary:\n        request = Request(ct.SINA_NAV_HISTROY_COUNT_CUR_URL %\n                          (ct.P_TYPE['http'], ct.DOMAINS['ssf'],\n                           code, start, end))\n    else:\n        request = Request(ct.SINA_NAV_HISTROY_COUNT_URL %\n                          (ct.P_TYPE['http'], ct.DOMAINS['ssf'],\n                           code, start, end))\n\n    text = urlopen(request, timeout=10).read()\n    text = text.decode('gbk')\n    org_js = json.loads(text)\n    status_code = int(org_js['result']['status']['code'])\n    if status_code != 0:\n        status = str(org_js['result']['status']['msg'])\n        raise ValueError(status)\n    nums = org_js['result']['data']['total_num']\n\n    return int(nums)\n\n\ndef _parse_nav_history_data(code, start, end, nums, ismonetary=False, retry_count=3, pause=0.01, timeout=10):\n    if nums == 0:\n        return None\n\n    for _ in range(retry_count):\n        time.sleep(pause)\n        # try:\n        ct._write_console()\n\n        if ismonetary:\n            request = Request(ct.SINA_NAV_HISTROY_DATA_CUR_URL %\n                              (ct.P_TYPE['http'], ct.DOMAINS['ssf'],\n                               code, start, end, nums))\n        else:\n            request = Request(ct.SINA_NAV_HISTROY_DATA_URL %\n                              (ct.P_TYPE['http'], ct.DOMAINS['ssf'],\n                               code, start, end, nums))\n        text = urlopen(request, timeout=timeout).read()\n        text = text.decode('gbk')\n        org_js = json.loads(text)\n\n        status_code = int(org_js['result']['status']['code'])\n        if status_code != 0:\n            status = str(org_js['result']['status']['msg'])\n            raise ValueError(status)\n\n        data = org_js['result']['data']['data']\n\n        if 'jjjz' in data[0].keys():\n            fund_df = pd.DataFrame(data, columns=ct.NAV_HIS_JJJZ)\n            fund_df['jjjz'] = fund_df['jjjz'].astype(float)\n            fund_df['ljjz'] = fund_df['ljjz'].astype(float)\n            fund_df.rename(columns=ct.DICT_NAV_EQUITY, inplace=True)\n\n        else:\n            fund_df = pd.DataFrame(data, columns=ct.NAV_HIS_NHSY)\n            fund_df['nhsyl'] = fund_df['nhsyl'].astype(float)\n            fund_df['dwsy'] = fund_df['dwsy'].astype(float)\n            fund_df.rename(columns=ct.DICT_NAV_MONETARY, inplace=True)\n\n        #fund_df.fillna(0, inplace=True)\n\n        if fund_df['date'].dtypes == np.object:\n            fund_df['date'] = pd.to_datetime(fund_df['date'])\n        fund_df = fund_df.set_index('date')\n        fund_df = fund_df.sort_index(ascending=False)\n\n        fund_df['pre_value'] = fund_df['value'].shift(-1)\n        fund_df['change'] = (fund_df['value'] / fund_df['pre_value'] - 1) * 100\n        fund_df = fund_df.drop('pre_value', axis=1)\n\n        return fund_df\n\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\n"
  },
  {
    "path": "tushare/futures/__init__.py",
    "content": ""
  },
  {
    "path": "tushare/futures/cons.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*- \n\n'''\nCreated on 2016年10月17日\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n'''\n\nP_TYPE = {'http': 'http://', 'ftp': 'ftp://'}\nDOMAINS = {\n           'EM': 'eastmoney.com'\n           }\nPAGES = {'INTL_FUT': 'index.aspx'}\nINTL_FUTURE_CODE = 'CONX0,GLNZ0,LCPS0,SBCX0,CRCZ0,WHCZ0,SMCZ0,SOCZ0,CTNZ0,HONV0,LALS0,LZNS0,LTNS0,LNKS0,LLDS0,RBTZ0,SBCC0,SMCC0,SOCC0,WHCC0,SGNC0,SFNC0,CTNC0,CRCC0,CCNC0,CFNC0,GLNC0,CONC0,HONC0,RBTC0,OILC0'\nINTL_FUTURE_URL = '%shq2gjqh.%s/EM_Futures2010NumericApplication/%s?type=z&jsName=quote_future&sortType=A&sortRule=1&jsSort=1&ids=%s&_g=0.%s'\nINTL_FUTURES_COL = ['code', 'name', 'price', 'open', 'high', 'low', 'preclose', 'vol', 'pct_count', 'pct_change', 'posi', 'b_amount', 's_amount']\n"
  },
  {
    "path": "tushare/futures/domestic.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*-\n'''\nCreated on 2017年06月04日\n@author: debugo\n@contact: me@debugo.com\n'''\n\nimport json\nimport datetime\nfrom bs4 import BeautifulSoup\nimport pandas as pd\nfrom tushare.futures import domestic_cons as ct\ntry:\n    from urllib.request import urlopen, Request\n    from urllib.parse import urlencode\n    from urllib.error import HTTPError\n    from http.client import IncompleteRead\nexcept ImportError:\n    from urllib import urlencode\n    from urllib2 import urlopen, Request\n    from urllib2 import HTTPError\n    from httplib import IncompleteRead\n\n\ndef get_cffex_daily(date = None):\n    \"\"\"\n        获取中金所日交易数据\n    Parameters\n    ------\n        date: 日期 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天\n    Return\n    -------\n        DataFrame\n            中金所日交易数据(DataFrame):\n                symbol        合约代码\n                date          日期\n                open          开盘价\n                high          最高价\n                low          最低价\n                close         收盘价\n                volume        成交量\n                open_interest   持仓量\n                turnover      成交额\n                settle        结算价\n                pre_settle    前结算价\n                variety       合约类别\n        或 None(给定日期没有交易数据)\n    \"\"\"\n    day = ct.convert_date(date) if date is not None else datetime.date.today()\n    try:\n        html = urlopen(Request(ct.CFFEX_DAILY_URL % (day.strftime('%Y%m'), \n                                                     day.strftime('%d'), day.strftime('%Y%m%d')), \n                               headers=ct.SIM_HAEDERS)).read().decode('gbk', 'ignore')\n    except HTTPError as reason:\n        if reason.code != 404:\n            print(ct.CFFEX_DAILY_URL % (day.strftime('%Y%m'), day.strftime('%d'), \n                                        day.strftime('%Y%m%d')), reason)\n        return\n\n    if html.find(u'网页错误') >= 0:\n        return\n    html = [i.replace(' ','').split(',') for i in html.split('\\n')[:-2] if i[0][0] != u'小' ]\n    \n    if html[0][0]!=u'合约代码':\n        return\n    \n    dict_data = list()\n    day_const = day.strftime('%Y%m%d')\n    for row in html[1:]:\n        m = ct.FUTURE_SYMBOL_PATTERN.match(row[0])\n        if not m:\n            continue\n        row_dict = {'date': day_const, 'symbol': row[0], 'variety': m.group(1)}\n        \n        for i,field in enumerate(ct.CFFEX_COLUMNS):\n            if row[i+1] == u\"\":\n                row_dict[field] = 0.0\n            elif field in ['volume', 'open_interest', 'oi_chg']:\n                row_dict[field] = int(row[i+1])        \n            else:\n                row_dict[field] = float(row[i+1])\n        row_dict['pre_settle'] = row_dict['close'] - row_dict['change1']\n        dict_data.append(row_dict)\n        \n    return pd.DataFrame(dict_data)[ct.OUTPUT_COLUMNS]\n\n\ndef get_czce_daily(date=None, type=\"future\"):\n    \"\"\"\n        获取郑商所日交易数据\n    Parameters\n    ------\n        date: 日期 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天\n        type: 数据类型, 为'future'期货 或 'option'期权二者之一\n    Return\n    -------\n        DataFrame\n            郑商所每日期货交易数据:\n                symbol        合约代码\n                date          日期\n                open          开盘价\n                high          最高价\n                low           最低价\n                close         收盘价\n                volume        成交量\n                open_interest 持仓量\n                turnover      成交额\n                settle        结算价\n                pre_settle    前结算价\n                variety       合约类别\n        或 \n        DataFrame\n           郑商所每日期权交易数据\n                symbol        合约代码\n                date          日期\n                open          开盘价\n                high          最高价\n                low           最低价\n                close         收盘价\n                pre_settle      前结算价\n                settle         结算价\n                delta          对冲值  \n                volume         成交量\n                open_interest     持仓量\n                oi_change       持仓变化\n                turnover        成交额\n                implied_volatility 隐含波动率\n                exercise_volume   行权量\n                variety        合约类别\n        None(类型错误或给定日期没有交易数据)\n    \"\"\"\n    if type == 'future':\n        url = ct.CZCE_DAILY_URL\n        listed_columns = ct.CZCE_COLUMNS\n        output_columns = ct.OUTPUT_COLUMNS\n    elif type == 'option':\n        url = ct.CZCE_OPTION_URL\n        listed_columns = ct.CZCE_OPTION_COLUMNS\n        output_columns = ct.OPTION_OUTPUT_COLUMNS\n    else:\n        print('invalid type :' + type + ',type should be one of \"future\" or \"option\"')\n        return\n    \n    day = ct.convert_date(date) if date is not None else datetime.date.today()\n\n    try:\n        html = urlopen(Request(url % (day.strftime('%Y'),\n                                                    day.strftime('%Y%m%d')),\n                               headers=ct.SIM_HAEDERS)).read().decode('gbk', 'ignore')\n    except HTTPError as reason:\n        if reason.code != 404:\n            print(ct.CZCE_DAILY_URL % (day.strftime('%Y'),\n                                       day.strftime('%Y%m%d')), reason)            \n        return\n    if html.find(u'您的访问出错了') >= 0 or html.find(u'无期权每日行情交易记录') >= 0:\n        return\n    html = [i.replace(' ','').split('|') for i in html.split('\\n')[:-4] if i[0][0] != u'小']\n    if html[1][0] not in [u'品种月份', u'品种代码']:\n            return\n        \n    dict_data = list()\n    day_const = int(day.strftime('%Y%m%d'))\n    for row in html[2:]:\n        m = ct.FUTURE_SYMBOL_PATTERN.match(row[0])\n        if not m:\n            continue\n        row_dict = {'date': day_const, 'symbol': row[0], 'variety': m.group(1)}\n        for i,field in enumerate(listed_columns):\n            if row[i+1] == \"\\r\":\n                row_dict[field] = 0.0\n            elif field in ['volume', 'open_interest', 'oi_chg', 'exercise_volume']:\n                row[i+1] = row[i+1].replace(',','')\n                row_dict[field] = int(row[i+1])                \n            else:\n                row[i+1] = row[i+1].replace(',','')\n                row_dict[field] = float(row[i+1])\n        dict_data.append(row_dict)\n        \n    return pd.DataFrame(dict_data)[output_columns]\n\n\ndef get_shfe_vwap(date = None):\n    \"\"\"\n        获取上期所日成交均价数据\n    Parameters\n    ------\n        date: 日期 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天\n    Return\n    -------\n        DataFrame\n            郑商所日交易数据(DataFrame):\n                symbol        合约代码\n                date          日期\n                time_range    vwap时段，分09:00-10:15和09:00-15:00两类\n                vwap          加权平均成交均价\n        或 None(给定日期没有数据)\n    \"\"\"    \n    day = ct.convert_date(date) if date is not None else datetime.date.today()\n\n    try:\n        json_data = json.loads(urlopen(Request(ct.SHFE_VWAP_URL % (day.strftime('%Y%m%d')), \n                                               headers=ct.SIM_HAEDERS)).read().decode('utf8'))\n    except HTTPError as reason:\n        if reason.code != 404:\n            print(ct.SHFE_DAILY_URL % (day.strftime('%Y%m%d')), reason)            \n        return    \n\n    if len(json_data['o_currefprice']) == 0:\n        return\n    \n    df = pd.DataFrame(json_data['o_currefprice'])\n    df['INSTRUMENTID'] = df['INSTRUMENTID'].str.strip()\n    df[':B1'].astype('int16')\n    return df.rename(columns=ct.SHFE_VWAP_COLUMNS)[list(ct.SHFE_VWAP_COLUMNS.values())]    \n\n\ndef get_shfe_daily(date = None):\n    \"\"\"\n        获取上期所日交易数据\n    Parameters\n    ------\n        date: 日期 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天\n    Return\n    -------\n        DataFrame\n            上期所日交易数据(DataFrame):\n                symbol        合约代码\n                date          日期\n                open          开盘价\n                high          最高价\n                low           最低价\n                close         收盘价\n                volume        成交量\n                open_interest 持仓量\n                turnover      成交额\n                settle        结算价\n                pre_settle     前结算价\n                variety       合约类别\n        或 None(给定日期没有交易数据)\n    \"\"\"    \n    day = ct.convert_date(date) if date is not None else datetime.date.today()\n\n    try:\n        json_data = json.loads(urlopen(Request(ct.SHFE_DAILY_URL % (day.strftime('%Y%m%d')), \n                                               headers=ct.SIM_HAEDERS)).read().decode('utf8'))\n    except HTTPError as reason:\n        if reason.code != 404:\n            print(ct.SHFE_DAILY_URL % (day.strftime('%Y%m%d')), reason)            \n        return    \n\n    if len(json_data['o_curinstrument']) == 0:\n        return\n    \n    df = pd.DataFrame([row for row in json_data['o_curinstrument'] if row['DELIVERYMONTH'] != u'小计' and row['DELIVERYMONTH'] != ''])\n    df['variety'] = df.PRODUCTID.str.slice(0, -6).str.upper()\n    df['symbol'] = df['variety'] + df['DELIVERYMONTH']\n    df['date'] = day.strftime('%Y%m%d')\n    vwap_df = get_shfe_vwap(day)\n    if vwap_df is not None:\n        df = pd.merge(df, vwap_df[vwap_df.time_range == '9:00-15:00'], on=['date', 'symbol'], how='left')\n        df['turnover'] = df.vwap * df.VOLUME\n    else:\n        print('Failed to fetch SHFE vwap.', day.strftime('%Y%m%d'))\n        df['turnover'] = .0\n    df.rename(columns=ct.SHFE_COLUMNS, inplace=True)\n    return df[ct.OUTPUT_COLUMNS]\n\n\ndef get_dce_daily(date = None, type=\"future\", retries=0):\n    \"\"\"\n        获取大连商品交易所日交易数据\n    Parameters\n    ------\n        date: 日期 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天\n        type: 数据类型, 为'future'期货 或 'option'期权二者之一\n        retries: int, 当前重试次数，达到3次则获取数据失败\n    Return\n    -------\n        DataFrame\n            大商所日交易数据(DataFrame):\n                symbol        合约代码\n                date          日期\n                open          开盘价\n                high          最高价\n                low           最低价\n                close         收盘价\n                volume        成交量\n                open_interest   持仓量\n                turnover       成交额\n                settle        结算价\n                pre_settle    前结算价\n                variety       合约类别\n        或 \n        DataFrame\n           郑商所每日期权交易数据\n                symbol        合约代码\n                date          日期\n                open          开盘价\n                high          最高价\n                low           最低价\n                close         收盘价\n                pre_settle      前结算价\n                settle         结算价\n                delta          对冲值  \n                volume         成交量\n                open_interest     持仓量\n                oi_change       持仓变化\n                turnover        成交额\n                implied_volatility 隐含波动率\n                exercise_volume   行权量\n                variety        合约类别\n        或 None(给定日期没有交易数据)\n    \"\"\"\n    day = ct.convert_date(date) if date is not None else datetime.date.today()\n    if retries > 3:\n        print(\"maximum retires for DCE market data: \", day.strftime(\"%Y%m%d\"))\n        return\n    \n    if type == 'future':\n        url = ct.DCE_DAILY_URL + '?' + urlencode({\"currDate\":day.strftime('%Y%m%d'), \n                                    \"year\":day.strftime('%Y'), \n                                    \"month\": str(int(day.strftime('%m'))-1), \n                                    \"day\":day.strftime('%d')})   \n        listed_columns = ct.DCE_COLUMNS\n        output_columns = ct.OUTPUT_COLUMNS\n    elif type == 'option':\n        url = ct.DCE_DAILY_URL + '?' + urlencode({\"currDate\":day.strftime('%Y%m%d'), \n                                    \"year\":day.strftime('%Y'), \n                                    \"month\": str(int(day.strftime('%m'))-1), \n                                    \"day\":day.strftime('%d'),\n                                    \"dayQuotes.trade_type\": \"1\"})   \n        listed_columns = ct.DCE_OPTION_COLUMNS\n        output_columns = ct.OPTION_OUTPUT_COLUMNS\n    else:\n        print('invalid type :' + type + ', should be one of \"future\" or \"option\"')\n        return\n\n    try:\n        response = urlopen(Request(url, method='POST', headers=ct.DCE_HEADERS)).read().decode('utf8')\n    except IncompleteRead as reason:\n        return get_dce_daily(day, retries=retries+1)\n    except HTTPError as reason:\n        if reason.code == 504:\n            return get_dce_daily(day, retries=retries+1)\n        elif reason.code != 404:\n            print(ct.DCE_DAILY_URL, reason)            \n        return       \n    \n    if u'错误：您所请求的网址（URL）无法获取' in response:\n        return get_dce_daily(day, retries=retries+1)\n    elif u'暂无数据' in response:\n        return\n    \n    data = BeautifulSoup(response, 'html.parser').find_all('tr')\n    if len(data) == 0:\n        return\n    \n    dict_data = list()\n    implied_data = list()\n    for idata in data[1:]:\n        if u'小计' in idata.text or u'总计' in idata.text:\n            continue\n        x = idata.find_all('td')\n        if type == 'future':\n            row_dict = {'variety': ct.DCE_MAP[x[0].text.strip()]}\n            row_dict['symbol'] = row_dict['variety'] + x[1].text.strip()\n            for i,field in enumerate(listed_columns):\n                field_content = x[i+2].text.strip()\n                if '-' in field_content:\n                    row_dict[field] = 0                \n                elif field in ['volume', 'open_interest']:\n                    row_dict[field] = int(field_content.replace(',',''))\n                else:\n                    row_dict[field] = float(field_content.replace(',',''))   \n            dict_data.append(row_dict)\n        elif len(x) == 16:\n            m = ct.FUTURE_SYMBOL_PATTERN.match(x[1].text.strip())\n            if not m:\n                continue\n            row_dict = {'symbol': x[1].text.strip(), 'variety': m.group(1).upper(), 'contract_id': m.group(0)}\n            for i,field in enumerate(listed_columns):\n                field_content = x[i+2].text.strip()\n                if '-' in field_content:\n                    row_dict[field] = 0                \n                elif field in ['volume', 'open_interest']:\n                    row_dict[field] = int(field_content.replace(',',''))\n                else:\n                    row_dict[field] = float(field_content.replace(',',''))   \n            dict_data.append(row_dict)\n        elif len(x) == 2:\n            implied_data.append({'contract_id': x[0].text.strip(), 'implied_volatility': float(x[1].text.strip())})\n    df = pd.DataFrame(dict_data)\n    df['date'] = day.strftime('%Y%m%d')\n    if type == 'future':\n        return df[output_columns]\n    else:\n        return pd.merge(df, pd.DataFrame(implied_data), on='contract_id', how='left', indicator=False)[output_columns]\n\n\ndef get_future_daily(start = None, end = None, market = 'CFFEX'):\n    \"\"\"\n        获取中金所日交易数据\n    Parameters\n    ------\n        start: 开始日期 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天\n        end: 结束数据 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象 为空时为当天\n        market: 'CFFEX' 中金所, 'CZCE' 郑商所,  'SHFE' 上期所, 'DCE' 大商所 之一。默认为中金所 \n    Return\n    -------\n        DataFrame\n            中金所日交易数据(DataFrame):\n                symbol      合约代码\n                date       日期\n                open       开盘价\n                high       最高价\n                low       最低价\n                close      收盘价\n                volume      成交量\n                open_interest 持仓量\n                turnover    成交额\n                settle     结算价\n                pre_settle   前结算价\n                variety     合约类别\n        或 None(给定日期没有交易数据)\n    \"\"\"\n    if market.upper() == 'CFFEX':\n        f = get_cffex_daily\n    elif market.upper() == 'CZCE':\n        f = get_czce_daily\n    elif market.upper() == 'SHFE':\n        f = get_shfe_daily\n    elif market.upper() == 'DCE':\n        f = get_dce_daily\n    else:\n        print('Invalid market.')\n        return\n    \n    start = ct.convert_date(start) if start is not None else datetime.date.today()\n    end = ct.convert_date(end) if end is not None else datetime.date.today()\n\n    df_list = list()\n    while start <= end:\n        df = f(start)\n        if df is not None:\n            df_list.append(df)\n        start += datetime.timedelta(days = 1)\n\n    if len(df_list) > 0:\n        return pd.concat(df_list)\n\n"
  },
  {
    "path": "tushare/futures/domestic_cons.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*-\n'''\nCreated on 2017年06月04日\n@author: debugo\n@contact: me@debugo.com\n'''\nimport re\nimport datetime\n\n\nCFFEX_DAILY_URL = 'http://www.cffex.com.cn/fzjy/mrhq/%s/%s/%s_1.csv'\nSHFE_DAILY_URL = 'http://www.shfe.com.cn/data/dailydata/kx/kx%s.dat'\nSHFE_VWAP_URL = 'http://www.shfe.com.cn/data/dailydata/ck/%sdailyTimePrice.dat'\nDCE_DAILY_URL = 'http://www.dce.com.cn//publicweb/quotesdata/dayQuotesCh.html'\nCZCE_DAILY_URL = 'http://www.czce.com.cn/portal/DFSStaticFiles/Future/%s/%s/FutureDataDaily.txt'\nCZCE_OPTION_URL = 'http://www.czce.com.cn/portal/DFSStaticFiles/Option/%s/%s/OptionDataDaily.txt'\nCFFEX_COLUMNS = ['open','high','low','volume','turnover','open_interest','close','settle','change1','change2']\nCZCE_COLUMNS = ['pre_settle','open','high','low','close','settle','change1','change2','volume','open_interest','oi_chg','turnover','final_settle']\nCZCE_OPTION_COLUMNS =  ['pre_settle', 'open', 'high', 'low', 'close', 'settle', 'change1', 'change2', 'volume', 'open_interest', 'oi_chg', 'turnover', 'delta', 'implied_volatility', 'exercise_volume']\nSHFE_COLUMNS =  {'CLOSEPRICE': 'close',  'HIGHESTPRICE': 'high', 'LOWESTPRICE': 'low', 'OPENINTEREST': 'open_interest', 'OPENPRICE': 'open',  'PRESETTLEMENTPRICE': 'pre_settle', 'SETTLEMENTPRICE': 'settle',  'VOLUME': 'volume'}\nSHFE_VWAP_COLUMNS = {':B1': 'date', 'INSTRUMENTID': 'symbol', 'TIME': 'time_range', 'REFSETTLEMENTPRICE': 'vwap'}\nDCE_COLUMNS = ['open', 'high', 'low', 'close', 'pre_settle', 'settle', 'change1','change2','volume','open_interest','oi_chg','turnover']\nDCE_OPTION_COLUMNS = ['open', 'high', 'low', 'close', 'pre_settle', 'settle', 'change1', 'change2', 'delta', 'volume', 'open_interest', 'oi_chg', 'turnover', 'exercise_volume']\nOUTPUT_COLUMNS = ['symbol', 'date', 'open', 'high', 'low', 'close', 'volume', 'open_interest', 'turnover', 'settle', 'pre_settle', 'variety']\nOPTION_OUTPUT_COLUMNS = ['symbol', 'date', 'open', 'high', 'low', 'close', 'pre_settle', 'settle', 'delta', 'volume', 'open_interest', 'oi_chg', 'turnover', 'implied_volatility', 'exercise_volume', 'variety']\nCLOSE_LOC = 5\nPRE_SETTLE_LOC = 11\n\nFUTURE_SYMBOL_PATTERN = re.compile(r'(^[A-Za-z]{1,2})[0-9]+')\nDATE_PATTERN = re.compile(r'^([0-9]{4})[-/]?([0-9]{2})[-/]?([0-9]{2})')\nSIM_HAEDERS = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}\nDCE_HEADERS = {\n    'cache-control': \"no-cache\",\n    'postman-token': \"153f42ca-148a-8f03-3302-8172cc4a5185\"\n}\ndef convert_date(date):\n    \"\"\"\n    transform a date string to datetime.date object.\n    :param day, string, e.g. 2016-01-01, 20160101 or 2016/01/01\n    :return: object of datetime.date(such as 2016-01-01) or None\n    \"\"\"\n    if isinstance(date, datetime.date):\n        return date\n    elif isinstance(date, str):\n        match = DATE_PATTERN.match(date)\n        if match:\n            groups = match.groups()\n            if len(groups) == 3:\n                return datetime.date(year=int(groups[0]), month=int(groups[1]), day=int(groups[2]))\n    return None\n\nDCE_MAP =  {\n    '豆一': 'A',\n    '豆二': 'B',\n    '豆粕': 'M',\n    '豆油': 'Y',\n    '棕榈油': 'P',\n    '玉米': 'C',\n    '玉米淀粉': 'CS',\n    '鸡蛋': 'JD',\n    '纤维板': 'FB',\n    '胶合板': 'BB',\n    '聚乙烯': 'L',\n    '聚氯乙烯': 'V',\n    '聚丙烯': 'PP',\n    '焦炭': 'J',\n    '焦煤': 'JM',\n    '铁矿石': 'I'\n}\n\nFUTURE_CODE={ \n    'IH': ('CFFEX', '上证50指数', 300), \n    'IF': ('CFFEX', '沪深300指数', 300), \n    'IC': ('CFFEX', '中证500指数', 200), \n    'T': ('CFFEX', '10年期国债期货', 10000), \n    'TF': ('CFFEX', '5年期国债期货', 10000), \n    'CU': ('SHFE', '沪铜' ,5), \n    'AL': ('SHFE', '沪铝', 5), \n    'ZN': ('SHFE', '沪锌', 5), \n    'PB': ('SHFE', '沪铅', 5), \n    'NI': ('SHFE', '沪镍', 1), \n    'SN': ('SHFE', '沪锡', 1), \n    'AU': ('SHFE', '沪金', 1000), \n    'AG': ('SHFE', '沪银', 15), \n    'RB': ('SHFE', '螺纹钢', 10), \n    'WR': ('SHFE', '线材', 10), \n    'HC': ('SHFE', '热轧卷板', 10), \n    'FU': ('SHFE', '燃油', 50), \n    'BU': ('SHFE', '沥青', 10), \n    'RU': ('SHFE', '橡胶', 10), \n    'A': ('DCE', '豆一', 10), \n    'B': ('DCE', '豆二', 10), \n    'M': ('DCE', '豆粕', 10), \n    'Y': ('DCE', '豆油', 10), \n    'P': ('DCE', '棕榈油', 10), \n    'C': ('DCE', '玉米', 10), \n    'CS': ('DCE', '玉米淀粉', 10), \n    'JD': ('DCE', '鸡蛋', 5), \n    'FB': ('DCE', '纤维板', 500), \n    'BB': ('DCE', '胶合板', 500), \n    'L': ('DCE', '聚乙烯', 5), \n    'V': ('DCE', '聚氯乙烯', 5), \n    'PP': ('DCE', '聚丙烯', 5), \n    'J': ('DCE', '焦炭', 100), \n    'JM': ('DCE', '焦煤', 60), \n    'I': ('DCE', '铁矿石', 100), \n    'SR': ('CZCE', '白糖', 10), \n    'CF': ('CZCE', '棉花',5), \n    'PM': ('CZCE', '普麦',50), \n    'WH': ('CZCE', '强麦',20), \n    'OI': ('CZCE', '菜籽油',10), \n    'PTA': ('CZCE', 'PTA', 0), \n    'RI': ('CZCE', '早籼稻',20), \n    'LR': ('CZCE', '晚籼稻',20), \n    'MA': ('CZCE', '甲醇', 10), \n    'FG': ('CZCE', '玻璃', 20), \n    'RS': ('CZCE', '油菜籽', 10), \n    'RM': ('CZCE', '籽粕', 10), \n    'TC': ('CZCE', '动力煤', 200), \n    'ZC': ('CZCE', '动力煤', 100), \n    'JR': ('CZCE', '粳稻', 20), \n    'SF': ('CZCE', '硅铁', 5), \n    'SM': ('CZCE', '锰硅', 5) \n}\n"
  },
  {
    "path": "tushare/futures/intlfutures.py",
    "content": "# -*- coding:utf-8 -*-\n\n\"\"\"\n国际期货\nCreated on 2016/10/01\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n\"\"\"\n\nimport json\nimport six\nimport pandas as pd\nfrom tushare.futures import cons as ct\n\ntry:\n    from urllib.request import urlopen, Request\nexcept ImportError:\n    from urllib2 import urlopen, Request\n    \n    \ndef get_intlfuture(symbols=None):\n    symbols = ct.INTL_FUTURE_CODE if symbols is None else symbols\n    df = _get_data(ct.INTL_FUTURE_URL%(ct.P_TYPE['http'], ct.DOMAINS['EM'], \n                   ct.PAGES['INTL_FUT'], symbols,\n                   _random(17)))\n    return df\n  \ndef _get_data(url):\n    try:\n        request = Request(url)\n        data_str = urlopen(request, timeout=10).read()\n        data_str = data_str.split('=')[1]\n        data_str = data_str.replace('futures', '\"futures\"')\n        if six.PY3:\n            data_str = data_str.decode('utf-8')\n        data_str = json.loads(data_str)\n        df = pd.DataFrame([[col for col in row.split(',')] for row in data_str.values()[0]]\n                        )\n        df = df[[1, 2, 5, 4, 6, 7, 13, 9, 17, 18, 16, 21, 22]]\n        df.columns = ct.INTL_FUTURES_COL\n        return df\n    except Exception as er:\n        print(str(er))  \n        \n        \ndef _random(n=13):\n    from random import randint\n    start = 10**(n-1)\n    end = (10**n)-1\n    return str(randint(start, end))\n\n"
  },
  {
    "path": "tushare/internet/__init__.py",
    "content": ""
  },
  {
    "path": "tushare/internet/boxoffice.py",
    "content": "# -*- coding:utf-8 -*- \n\"\"\"\n电影票房 \nCreated on 2015/12/24\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n\"\"\"\nimport pandas as pd\nfrom tushare.stock import cons as ct\nfrom tushare.util import dateu as du\ntry:\n    from urllib.request import urlopen, Request\nexcept ImportError:\n    from urllib2 import urlopen, Request\nimport time\nimport json\n\ndef realtime_boxoffice(retry_count=3,pause=0.001):\n    \"\"\"\n    获取实时电影票房数据\n    数据来源：EBOT艺恩票房智库\n    Parameters\n    ------\n        retry_count : int, 默认 3\n                  如遇网络等问题重复执行的次数\n        pause : int, 默认 0\n                 重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\n     return\n     -------\n        DataFrame \n              BoxOffice     实时票房（万） \n              Irank         排名\n              MovieName     影片名 \n              boxPer        票房占比 （%）\n              movieDay      上映天数\n              sumBoxOffice  累计票房（万） \n              time          数据获取时间\n    \"\"\"\n    for _ in range(retry_count):\n        time.sleep(pause)\n        try:\n            request = Request(ct.MOVIE_BOX%(ct.P_TYPE['http'], ct.DOMAINS['mbox'],\n                              ct.BOX, _random()))\n            lines = urlopen(request, timeout = 10).read()\n            if len(lines) < 15: #no data\n                return None\n        except Exception as e:\n            print(e)\n        else:\n            js = json.loads(lines.decode('utf-8') if ct.PY3 else lines)\n            df = pd.DataFrame(js['data2'])\n            df = df.drop(['MovieImg','mId'], axis=1)\n            df['time'] = du.get_now()\n            return df\n\n\ndef day_boxoffice(date=None, retry_count=3, pause=0.001):\n    \"\"\"\n    获取单日电影票房数据\n    数据来源：EBOT艺恩票房智库\n    Parameters\n    ------\n        date:日期，默认为上一日\n        retry_count : int, 默认 3\n                  如遇网络等问题重复执行的次数\n        pause : int, 默认 0\n                 重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\n     return\n     -------\n        DataFrame \n              AvgPrice      平均票价\n              AvpPeoPle     场均人次\n              BoxOffice     单日票房（万）\n              BoxOffice_Up  环比变化 （%）\n              IRank         排名\n              MovieDay      上映天数\n              MovieName     影片名 \n              SumBoxOffice  累计票房（万） \n              WomIndex      口碑指数 \n    \"\"\"\n    for _ in range(retry_count):\n        time.sleep(pause)\n        try:\n            if date is None:\n                date = 0\n            else:\n                date = int(du.diff_day(du.today(), date)) + 1\n                \n            request = Request(ct.BOXOFFICE_DAY%(ct.P_TYPE['http'], ct.DOMAINS['mbox'],\n                              ct.BOX, date, _random()))\n            lines = urlopen(request, timeout = 10).read()\n            if len(lines) < 15: #no data\n                return None\n        except Exception as e:\n            print(e)\n        else:\n            js = json.loads(lines.decode('utf-8') if ct.PY3 else lines)\n            df = pd.DataFrame(js['data1'])\n            df = df.drop(['MovieImg', 'BoxOffice1', 'MovieID', 'Director', 'IRank_pro'], axis=1)\n            return df\n\n\ndef month_boxoffice(date=None, retry_count=3, pause=0.001):\n    \"\"\"\n    获取单月电影票房数据\n    数据来源：EBOT艺恩票房智库\n    Parameters\n    ------\n        date:日期，默认为上一月，格式YYYY-MM\n        retry_count : int, 默认 3\n                  如遇网络等问题重复执行的次数\n        pause : int, 默认 0\n                 重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\n     return\n     -------\n        DataFrame \n              Irank         排名\n              MovieName     电影名称\n              WomIndex      口碑指数\n              avgboxoffice  平均票价\n              avgshowcount  场均人次\n              box_pro       月度占比\n              boxoffice     单月票房(万)     \n              days          月内天数\n              releaseTime   上映日期\n    \"\"\"\n    if date is None:\n        date = du.day_last_week(-30)[0:7] \n    elif len(date)>8:\n        print(ct.BOX_INPUT_ERR_MSG)\n        return\n    date += '-01'\n    for _ in range(retry_count):\n        time.sleep(pause)\n        try:\n            request = Request(ct.BOXOFFICE_MONTH%(ct.P_TYPE['http'], ct.DOMAINS['mbox'],\n                              ct.BOX, date))\n            lines = urlopen(request, timeout = 10).read()\n            if len(lines) < 15: #no data\n                return None\n        except Exception as e:\n            print(e)\n        else:\n            js = json.loads(lines.decode('utf-8') if ct.PY3 else lines)\n            df = pd.DataFrame(js['data1'])\n            df = df.drop(['defaultImage', 'EnMovieID'], axis=1)\n            return df\n\n\ndef day_cinema(date=None, retry_count=3, pause=0.001):\n    \"\"\"\n        获取影院单日票房排行数据\n        数据来源：EBOT艺恩票房智库\n        Parameters\n        ------\n            date:日期，默认为上一日\n            retry_count : int, 默认 3\n                      如遇网络等问题重复执行的次数\n            pause : int, 默认 0\n                     重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\n         return\n         -------\n            DataFrame \n                  Attendance         上座率\n                  AvgPeople          场均人次\n                  CinemaName         影院名称  \n                  RowNum             排名\n                  TodayAudienceCount 当日观众人数\n                  TodayBox           当日票房\n                  TodayShowCount     当日场次\n                  price              场均票价（元）\n    \"\"\"\n    if date is None:\n        date = du.day_last_week(-1)\n    data = pd.DataFrame()\n    ct._write_head()\n    for x in range(1, 11):\n        df = _day_cinema(date, x, retry_count,\n                                       pause)\n        if df is not None:\n            data = pd.concat([data, df])\n    data = data.drop_duplicates()\n    return data.reset_index(drop=True)\n\n\ndef _day_cinema(date=None, pNo=1, retry_count=3, pause=0.001):\n    ct._write_console()\n    for _ in range(retry_count):\n        time.sleep(pause)\n        try:\n            request = Request(ct.BOXOFFICE_CBD%(ct.P_TYPE['http'], ct.DOMAINS['mbox'],\n                              ct.BOX, pNo, date))\n            lines = urlopen(request, timeout = 10).read()\n            if len(lines) < 15: #no data\n                return None\n        except Exception as e:\n            print(e)\n        else:\n            js = json.loads(lines.decode('utf-8') if ct.PY3 else lines)\n            df = pd.DataFrame(js['data1'])\n            df = df.drop(['CinemaID'], axis=1)\n            return df\n\n\ndef _random(n=13):\n    from random import randint\n    start = 10**(n-1)\n    end = (10**n)-1\n    return str(randint(start, end))\n"
  },
  {
    "path": "tushare/internet/caixinnews.py",
    "content": "﻿# -*- coding:utf-8 -*- \n\"\"\"\n财新网新闻数据检索下载\nCreated on 2017/06/09\n@author: Yuan Yifan\n@group : ~\n@contact: tsingjyujing@163.com\n\"\"\"\n\n\"\"\"\n    # 测试脚本\n    from caixinnews import *\n    urls = query_news(start_date='2017-05-09',end_date='2017-05-09')\n    title,text = read_page(urls[0])\n    print(title)\n    print(text)\n\"\"\"\n\nimport re\nimport datetime\nfrom bs4 import BeautifulSoup\ntry:\n    from urllib.request import urlopen, Request\nexcept ImportError:\n    from urllib2 import urlopen, Request\n\ncaixin_search_url = \"http://search.caixin.com/search/search.jsp?startDate=%s&endDate=%s&keyword=%s&x=0&y=0\"\n\ndefault_parser = \"html.parser\"\n#default_parser = \"lxml\"\n\nUA    =    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) \"+\\\n        \"AppleWebKit/537.36 (KHTML, like Gecko) \"+\\\n        \"Chrome/42.0.2311.135 \"+\\\n        \"Safari/537.36 \"+\\\n        \"Edge/12.10240\"\n        \nreq_header = {\\\n        'User-Agent': UA,\\\n        'Accept': '\"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\"',\\\n        'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3'}\n        \nreq_timeout = 10\n\ndef read_url(url):\n    \"\"\"\n    读取URL对应的内容（模拟浏览器）\n    Parameters\n    ------\n        url string 需要读取的链接\n    Return\n    ------\n        string 读取的内容\n    \"\"\"\n    req_header_this = req_header\n    req_header_this['Host'] = re.findall('://.*?/',url,re.DOTALL)[0][3:-1]\n    return urlopen(Request(url,None,req_header),None,req_timeout).read()\n    \ndef get_soup(url):\n    \"\"\"\n    读取URL对应的内容，并解析为Soup\n    Parameters\n        url string 需要读取的链接\n    Return\n        string 读取的内容\n    \"\"\"\n    return BeautifulSoup(read_url(url), default_parser)\n    \ndef query_news(keywords='*',start_date=None,end_date=None):\n    \"\"\"\n    读取某一时间段对应的新闻链接列表\n    Parameters\n    ------\n        keywords string 关键词\n        start_date string 开始日期，格式yyyy-mm-dd\n        end_date string 结束日期，格式yyyy-mm-dd\n    Return\n    ------\n        List<string> 读取的内容\n    \"\"\"\n    if start_date is None or end_date is None:\n        now_time = datetime.datetime.now()\n        last_day = datetime.datetime(now_time.year,now_time.month,now_time.day,12,0) - datetime.timedelta(seconds = 3600*24)\n        start_date = last_day.strftime(\"%Y-%m-%d\")\n        end_date = start_date\n    url = caixin_search_url % (start_date,end_date,keywords)\n    soup = get_soup(url)\n    info_urls = []\n    while(True):\n        next_info = soup.find_all(name='a',attrs={'class','pageNavBtn2'})[0]\n        all_res = soup.find_all(name='div',attrs={'class','searchxt'})\n        for res in all_res:\n            info_urls.append(res.a.attrs['href'])\n        next_info = next_info.attrs['href']    \n\n        if next_info==\"javascript:void();\":\n            break;\n        else:\n            soup = get_soup(caixin_search_url+next_info)\n    return info_urls\n    \ndef is_blog(url):\n    \"\"\"\n    判断某一链接是否博客\n    Parameters\n    ------\n        url string 需要判断的链接\n    Return\n    ------\n        bool 该url是否是博客URL\n    \"\"\"\n    return len(re.findall('blog\\.caixin\\.com',url))>0\n    \ndef read_page(url):\n    \"\"\"\n    读取链接的内容\n    Parameters\n    ------\n        url string 需要判断的链接\n    Return\n    ------\n        title string 文章标题\n        text string 文章内容\n    \"\"\"\n    if is_blog(url):\n        return read_blog(url)\n    else:\n        return read_normal_artical(url)\n        \ndef read_normal_artical(url):\n    soup = get_soup(url)\n    title = soup.title.get_text()\n    ps = soup.find_all('p')\n    text = ''\n    for p in ps:\n        text += p.get_text() + \"\\n\"\n    return title,text\n\ndef read_blog(url):\n    soup = get_soup(url)\n    title = soup.title.get_text()\n    bcontent = soup.find_all(name='div',attrs={'class','blog_content'})\n    ps = bcontent[0].find_all('p')\n    text = ''\n    for p in ps:\n        text += p.get_text() + \"\\n\"\n    return title,text\n    "
  },
  {
    "path": "tushare/internet/indexes.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*- \n\"\"\"\n龙虎榜数据\nCreated on 2017年8月13日\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n\"\"\"\n\nimport pandas as pd\nfrom pandas.compat import StringIO\nfrom tushare.stock import cons as ct\nimport time\nimport re\nimport lxml.html\nfrom lxml import etree\ntry:\n    from urllib.request import urlopen, Request\nexcept ImportError:\n    from urllib2 import urlopen, Request\n\ndef bdi(itype='D', retry_count=3,\n                pause=0.001):\n    for _ in range(retry_count):\n        time.sleep(pause)\n        try:\n            request = Request(ct.BDI_URL%(ct.P_TYPE['http'], ct.DOMAINS['v500']))\n            lines = urlopen(request, timeout = 10).read()\n            if len(lines) < 100: #no data\n                return None\n        except Exception as e:\n                print(e)\n        else:\n            linestr = lines.decode('utf-8') if ct.PY3 else lines\n            if itype == 'D': # Daily\n                reg = re.compile(r'\\\"chart_data\\\",\\\"(.*?)\\\"\\);') \n                lines = reg.findall(linestr)\n                lines = lines[0]\n                lines = lines.replace('chart', 'table').\\\n                        replace('</series><graphs>', '').\\\n                        replace('</graphs>', '').\\\n                        replace('series', 'tr').\\\n                        replace('value', 'td').\\\n                        replace('graph', 'tr').\\\n                        replace('graphs', 'td')\n                df = pd.read_html(lines, encoding='utf8')[0]\n                df = df.T\n                df.columns = ['date', 'index']\n                df['date'] = df['date'].map(lambda x: x.replace(u'年', '-')).\\\n                    map(lambda x: x.replace(u'月', '-')).\\\n                    map(lambda x: x.replace(u'日', ''))\n                df['date'] = pd.to_datetime(df['date'])\n                df['index'] = df['index'].astype(float)\n                df = df.sort_values('date', ascending=False).reset_index(drop = True)\n                df['change'] = df['index'].pct_change(-1)\n                df['change'] = df['change'] * 100\n                df['change'] = df['change'].map(lambda x: '%.2f' % x)\n                df['change'] = df['change'].astype(float)\n                return df\n            else: #Weekly\n                html = lxml.html.parse(StringIO(linestr))\n                res = html.xpath(\"//table[@class=\\\"style33\\\"]/tr/td/table[last()]\")\n                if ct.PY3:\n                    sarr = [etree.tostring(node).decode('utf-8') for node in res]\n                else:\n                    sarr = [etree.tostring(node) for node in res]\n                sarr = ''.join(sarr)\n                sarr = '<table>%s</table>'%sarr\n                df = pd.read_html(sarr)[0][1:]\n                df.columns = ['month', 'index']\n                df['month'] = df['month'].map(lambda x: x.replace(u'年', '-')).\\\n                    map(lambda x: x.replace(u'月', ''))\n                df['month'] = pd.to_datetime(df['month'])\n                df['month'] = df['month'].map(lambda x: str(x).replace('-', '')).\\\n                              map(lambda x: x[:6])\n                df['index'] = df['index'].astype(float)\n                df['change'] = df['index'].pct_change(-1)\n                df['change'] = df['change'].map(lambda x: '%.2f' % x)\n                df['change'] = df['change'].astype(float)\n                return df\n\n"
  },
  {
    "path": "tushare/pro/__init__.py",
    "content": ""
  },
  {
    "path": "tushare/pro/client.py",
    "content": "# !/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nPro数据接口 \nCreated on 2017/07/01\n@author: polo,Jimmy\n@group : tushare.pro\n\"\"\"\n\nimport pandas as pd\nimport simplejson as json\nfrom functools import partial\nimport requests\n\n\nclass DataApi:\n\n    __token = ''\n    __http_url = 'http://api.tushare.pro'\n\n    def __init__(self, token, timeout=10):\n        \"\"\"\n        Parameters\n        ----------\n        token: str\n            API接口TOKEN，用于用户认证\n        \"\"\"\n        self.__token = token\n        self.__timeout = timeout\n\n    def query(self, api_name, fields='', **kwargs):\n        req_params = {\n            'api_name': api_name,\n            'token': self.__token,\n            'params': kwargs,\n            'fields': fields\n        }\n\n        res = requests.post(self.__http_url, json=req_params, timeout=self.__timeout)\n        result = json.loads(res.text)\n        if result['code'] != 0:\n            raise Exception(result['msg'])\n        data = result['data']\n        columns = data['fields']\n        items = data['items']\n\n        return pd.DataFrame(items, columns=columns)\n\n    def __getattr__(self, name):\n        return partial(self.query, name)\n"
  },
  {
    "path": "tushare/pro/data_pro.py",
    "content": "# -*- coding:utf-8 -*- \n\"\"\"\npro init \nCreated on 2018/07/01\n@author: Jimmy Liu\n@group : tushare.pro\n@contact: jimmysoa@sina.cn\n\"\"\"\nfrom tushare.pro import client\nfrom tushare.util import upass\nfrom tushare.util.formula import MA\n\nPRICE_COLS = ['open', 'close', 'high', 'low', 'pre_close']\nFORMAT = lambda x: '%.2f' % x\nFREQS = {'D': '1DAY',\n         'W': '1WEEK',\n         'Y': '1YEAR',\n         }\n\n\ndef pro_api(token=''):\n    \"\"\"\n    初始化pro API,第一次可以通过ts.set_token('your token')来记录自己的token凭证，临时token可以通过本参数传入\n    \"\"\"\n    if token == '' or token is None:\n        token = upass.get_token()\n    if token is not None and token != '':\n        pro = client.DataApi(token)\n        return pro\n    else:\n        raise Exception('api init error.') \n        \n\ndef pro_bar(ts_code='', pro_api=None, start_date=None, end_date=None, freq='D', asset='E', \n           exchange='',\n           adj = None,\n           ma = [],\n           factors = None,\n           contract_type = '',\n           retry_count = 3):\n    \"\"\"\n    BAR数据\n    Parameters:\n    ------------\n    ts_code:证券代码，支持股票,ETF/LOF,期货/期权,港股,数字货币\n    start_date:开始日期  YYYYMMDD\n    end_date:结束日期 YYYYMMDD\n    freq:支持1/5/15/30/60分钟,周/月/季/年\n    asset:证券类型 E:股票和交易所基金，I:沪深指数,C:数字货币,FT:期货 FD:基金/O期权/H港股/中概美国/中证指数/国际指数\n    exchange:市场代码，用户数字货币行情\n    adj:复权类型,None不复权,qfq:前复权,hfq:后复权\n    ma:均线,支持自定义均线频度，如：ma5/ma10/ma20/ma60/maN\n    factors因子数据，目前支持以下两种：\n        vr:量比,默认不返回，返回需指定：factor=['vr']\n        tor:换手率，默认不返回，返回需指定：factor=['tor']\n                    以上两种都需要：factor=['vr', 'tor']\n    retry_count:网络重试次数\n    \n    Return\n    ----------\n    DataFrame\n    code:代码\n    open：开盘close/high/low/vol成交量/amount成交额/maN均价/vr量比/tor换手率\n    \n         期货(asset='X')\n    code/open/close/high/low/avg_price：均价  position：持仓量  vol：成交总量\n    \"\"\"\n    ts_code = ts_code.strip().upper() if asset != 'C' else ts_code.strip().lower()\n    api = pro_api if pro_api is not None else pro_api()\n    for _ in range(retry_count):\n        try:\n            freq = freq.strip().upper() if asset != 'C' else freq.strip().lower()\n            asset = asset.strip().upper()\n            if asset == 'E':\n                if freq == 'D':\n                    df = api.daily(ts_code=ts_code, start_date=start_date, end_date=end_date)\n                    if factors is not None and len(factors) >0 :\n                        ds = api.daily_basic(ts_code=ts_code, start_date=start_date, end_date=end_date)[['trade_date', 'turnover_rate', 'volume_ratio']]\n                        ds = ds.set_index('trade_date')\n                        df = df.set_index('trade_date')\n                        df = df.merge(ds, left_index=True, right_index=True)\n                        df = df.reset_index()\n                        if ('tor' in factors) and ('vr' not in factors):\n                            df = df.drop('volume_ratio', axis=1)\n                        if ('vr' in factors) and ('tor' not in factors):\n                            df = df.drop('turnover_rate', axis=1)\n                if freq == 'W':\n                    df = api.weekly(ts_code=ts_code, start_date=start_date, end_date=end_date)\n                if freq == 'M':\n                    df = api.monthly(ts_code=ts_code, start_date=start_date, end_date=end_date)\n                if adj is not None:\n                    fcts = api.adj_factor(ts_code=ts_code, start_date=start_date, end_date=end_date)[['trade_date', 'adj_factor']]\n                    data = df.set_index('trade_date', drop=False).merge(fcts.set_index('trade_date'), left_index=True, right_index=True, how='left')\n                    data['adj_factor'] = data['adj_factor'].fillna(method='bfill')\n                    for col in PRICE_COLS:\n                        if adj == 'hfq':\n                            data[col] = data[col] * data['adj_factor']\n                        else:\n                            data[col] = data[col] * data['adj_factor'] / float(fcts['adj_factor'][0])\n                        data[col] = data[col].map(FORMAT)\n                    for col in PRICE_COLS:\n                        data[col] = data[col].astype(float)\n                    data = data.drop('adj_factor', axis=1)\n                    df['change'] = df['close'] - df['pre_close']\n                    df['pct_change'] = df['close'].pct_change() * 100\n                else:\n                    data = df\n            elif asset == 'I':\n                if freq == 'D':\n                    data = api.index_daily(ts_code=ts_code, start_date=start_date, end_date=end_date)\n            elif asset == 'FT':\n                if freq == 'D':\n                    data = api.fut_daily(ts_code=ts_code, start_dae=start_date, end_date=end_date, exchange=exchange)\n            elif asset == 'O':\n                if freq == 'D':\n                    data = api.opt_daily(ts_code=ts_code, start_dae=start_date, end_date=end_date, exchange=exchange)\n            elif asset == 'FD':\n                if freq == 'D':\n                    data = api.fund_daily(ts_code=ts_code, start_dae=start_date, end_date=end_date)\n            if asset == 'C':\n                if freq == 'd':\n                    freq = 'daily'\n                elif freq == 'w':\n                    freq = 'week'\n                data = api.coinbar(exchange=exchange, symbol=ts_code, freq=freq, start_dae=start_date, end_date=end_date,\n                                   contract_type=contract_type)\n            if ma is not None and len(ma) > 0:\n                for a in ma:\n                    if isinstance(a, int):\n                        data['ma%s'%a] = MA(data['close'], a).map(FORMAT).shift(-(a-1))\n                        data['ma%s'%a] = data['ma%s'%a].astype(float)\n                        data['ma_v_%s'%a] = MA(data['vol'], a).map(FORMAT).shift(-(a-1))\n                        data['ma_v_%s'%a] = data['ma_v_%s'%a].astype(float)\n            return data\n        except Exception as e:\n            print(e)\n            return None\n        else:\n            return \n    raise IOError('ERROR.')\n\n\nif __name__ == '__main__':\n#     upass.set_token('your token here')\n    pro = pro_api()\n#     print(pro_bar(ts_code='000001.SZ', pro_api=pro, start_date='19990101', end_date='', adj='qfq', ma=[5, 10, 15]))\n#     print(pro_bar(ts_code='000905.SH', pro_api=pro, start_date='20181001', end_date='', asset='I'))\n#     print(pro.trade_cal(exchange_id='', start_date='20131031', end_date='', fields='pretrade_date', is_open='0'))\n#     print(pro_bar(ts_code='CU1811.SHF', pro_api=pro, start_date='20180101', end_date='', asset='FT', ma=[5, 10, 15]))\n#     print(pro_bar(ts_code='150023.SZ', pro_api=pro, start_date='20180101', end_date='', asset='FD', ma=[5, 10, 15]))\n#     print(pro_bar(pro_api=pro, ts_code='000528.SZ',start_date='20180101', end_date='20181121', ma=[20]))\n#     print(pro_bar(ts_code='000528.SZ', pro_api=pro, freq='W', start_date='20180101', end_date='20180820', adj='hfq', ma=[5, 10, 15]))\n#     print(pro_bar(ts_code='000528.SZ', pro_api=pro, freq='M', start_date='20180101', end_date='20180820', adj='qfq', ma=[5, 10, 15]))\n#     print(pro_bar(ts_code='btcusdt', pro_api=pro, exchange='huobi', freq='D', start_date='20180101', end_date='20181123', asset='C', ma=[5, 10]))\n#     df = pro_bar(ts_code='000001.SZ', pro_api=pro, adj='qfq', start_date='19900101', end_date='20050509')\n    df = pro_bar(ts_code='600862.SH', pro_api=pro, start_date='20150118', end_date='20150615', factors=['tor', 'vr'])\n    print(df)\n    "
  },
  {
    "path": "tushare/stock/__init__.py",
    "content": ""
  },
  {
    "path": "tushare/stock/billboard.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*- \n\"\"\"\n龙虎榜数据\nCreated on 2015年6月10日\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n\"\"\"\n\nimport pandas as pd\nfrom pandas.compat import StringIO\nfrom tushare.stock import cons as ct\nimport numpy as np\nimport time\nimport json\nimport re\nimport lxml.html\nfrom lxml import etree\nfrom tushare.util import dateu as du\nfrom tushare.stock import ref_vars as rv\ntry:\n    from urllib.request import urlopen, Request\nexcept ImportError:\n    from urllib2 import urlopen, Request\n\n\ndef top_list(date = None, retry_count=3, pause=0.001):\n    \"\"\"\n    获取每日龙虎榜列表\n    Parameters\n    --------\n    date:string\n                明细数据日期 format：YYYY-MM-DD 如果为空，返回最近一个交易日的数据\n    retry_count : int, 默认 3\n                 如遇网络等问题重复执行的次数 \n    pause : int, 默认 0\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\n    \n    Return\n    ------\n    DataFrame\n        code：代码\n        name ：名称\n        pchange：涨跌幅     \n        amount：龙虎榜成交额(万)\n        buy：买入额(万)\n        bratio：占总成交比例\n        sell：卖出额(万)\n        sratio ：占总成交比例\n        reason：上榜原因\n        date  ：日期\n    \"\"\"\n    if date is None:\n        if du.get_hour() < 18:\n            date = du.last_tddate()\n        else:\n            date = du.today() \n    else:\n        if(du.is_holiday(date)):\n            return None\n    for _ in range(retry_count):\n        time.sleep(pause)\n        try:\n            request = Request(rv.LHB_URL%(ct.P_TYPE['http'], ct.DOMAINS['em'], date, date))\n            text = urlopen(request, timeout=10).read()\n            text = text.decode('GBK')\n            text = text.split('_1=')[1]\n            text = eval(text, type('Dummy', (dict,), \n                                           dict(__getitem__ = lambda s, n:n))())\n            text = json.dumps(text)\n            text = json.loads(text)\n            df = pd.DataFrame(text['data'], columns=rv.LHB_TMP_COLS)\n            df.columns = rv.LHB_COLS\n            df = df.fillna(0)\n            df = df.replace('', 0)\n            df['buy'] = df['buy'].astype(float)\n            df['sell'] = df['sell'].astype(float)\n            df['amount'] = df['amount'].astype(float)\n            df['Turnover'] = df['Turnover'].astype(float)\n            df['bratio'] = df['buy'] / df['Turnover']\n            df['sratio'] = df['sell'] /df['Turnover']\n            df['bratio'] = df['bratio'].map(ct.FORMAT)\n            df['sratio'] = df['sratio'].map(ct.FORMAT)\n            df['date'] = date\n            for col in ['amount', 'buy', 'sell']:\n                df[col] = df[col].astype(float)\n                df[col] = df[col] / 10000\n                df[col] = df[col].map(ct.FORMAT)\n            df = df.drop('Turnover', axis=1)\n        except Exception as e:\n            print(e)\n        else:\n            return df\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\n\n\ndef cap_tops(days= 5, retry_count= 3, pause= 0.001):\n    \"\"\"\n    获取个股上榜统计数据\n    Parameters\n    --------\n        days:int\n                  天数，统计n天以来上榜次数，默认为5天，其余是10、30、60\n        retry_count : int, 默认 3\n                     如遇网络等问题重复执行的次数 \n        pause : int, 默认 0\n                    重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\n    Return\n    ------\n    DataFrame\n        code：代码\n        name：名称\n        count：上榜次数\n        bamount：累积购买额(万)     \n        samount：累积卖出额(万)\n        net：净额(万)\n        bcount：买入席位数\n        scount：卖出席位数\n    \"\"\"\n    \n    if ct._check_lhb_input(days) is True:\n        ct._write_head()\n        df =  _cap_tops(days, pageNo=1, retry_count=retry_count,\n                        pause=pause)\n        if df is not None:\n            df['code'] = df['code'].map(lambda x: str(x).zfill(6))\n            df = df.drop_duplicates('code')\n        return df\n    \n    \ndef _cap_tops(last=5, pageNo=1, retry_count=3, pause=0.001, dataArr=pd.DataFrame()):   \n    ct._write_console()\n    for _ in range(retry_count):\n        time.sleep(pause)\n        try:\n            request = Request(rv.LHB_SINA_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], rv.LHB_KINDS[0],\n                                               ct.PAGES['fd'], last, pageNo))\n            text = urlopen(request, timeout=10).read()\n            text = text.decode('GBK')\n            html = lxml.html.parse(StringIO(text))\n            res = html.xpath(\"//table[@id=\\\"dataTable\\\"]/tr\")\n            if ct.PY3:\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\n            else:\n                sarr = [etree.tostring(node) for node in res]\n            sarr = ''.join(sarr)\n            sarr = '<table>%s</table>'%sarr\n            df = pd.read_html(sarr)[0]\n            df.columns = rv.LHB_GGTJ_COLS\n            dataArr = dataArr.append(df, ignore_index=True)\n            nextPage = html.xpath('//div[@class=\\\"pages\\\"]/a[last()]/@onclick')\n            if len(nextPage)>0:\n                pageNo = re.findall(r'\\d+', nextPage[0])[0]\n                return _cap_tops(last, pageNo, retry_count, pause, dataArr)\n            else:\n                return dataArr\n        except Exception as e:\n            print(e)\n            \n\ndef broker_tops(days= 5, retry_count= 3, pause= 0.001):\n    \"\"\"\n    获取营业部上榜统计数据\n    Parameters\n    --------\n    days:int\n              天数，统计n天以来上榜次数，默认为5天，其余是10、30、60\n    retry_count : int, 默认 3\n                 如遇网络等问题重复执行的次数 \n    pause : int, 默认 0\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\n    Return\n    ---------\n    broker：营业部名称\n    count：上榜次数\n    bamount：累积购买额(万)\n    bcount：买入席位数\n    samount：累积卖出额(万)\n    scount：卖出席位数\n    top3：买入前三股票\n    \"\"\"\n    if ct._check_lhb_input(days) is True:\n        ct._write_head()\n        df =  _broker_tops(days, pageNo=1, retry_count=retry_count,\n                        pause=pause)\n        return df\n\n\ndef _broker_tops(last=5, pageNo=1, retry_count=3, pause=0.001, dataArr=pd.DataFrame()):   \n    ct._write_console()\n    for _ in range(retry_count):\n        time.sleep(pause)\n        try:\n            request = Request(rv.LHB_SINA_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], rv.LHB_KINDS[1],\n                                               ct.PAGES['fd'], last, pageNo))\n            text = urlopen(request, timeout=10).read()\n            text = text.decode('GBK')\n            html = lxml.html.parse(StringIO(text))\n            res = html.xpath(\"//table[@id=\\\"dataTable\\\"]/tr\")\n            if ct.PY3:\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\n            else:\n                sarr = [etree.tostring(node) for node in res]\n            sarr = ''.join(sarr)\n            sarr = '<table>%s</table>'%sarr\n            df = pd.read_html(sarr)[0]\n            df.columns = rv.LHB_YYTJ_COLS\n            dataArr = dataArr.append(df, ignore_index=True)\n            nextPage = html.xpath('//div[@class=\\\"pages\\\"]/a[last()]/@onclick')\n            if len(nextPage)>0:\n                pageNo = re.findall(r'\\d+', nextPage[0])[0]\n                return _broker_tops(last, pageNo, retry_count, pause, dataArr)\n            else:\n                return dataArr\n        except Exception as e:\n            print(e)\n        \n\ndef inst_tops(days= 5, retry_count= 3, pause= 0.001):\n    \"\"\"\n    获取机构席位追踪统计数据\n    Parameters\n    --------\n    days:int\n              天数，统计n天以来上榜次数，默认为5天，其余是10、30、60\n    retry_count : int, 默认 3\n                 如遇网络等问题重复执行的次数 \n    pause : int, 默认 0\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\n                \n    Return\n    --------\n    code:代码\n    name:名称\n    bamount:累积买入额(万)\n    bcount:买入次数\n    samount:累积卖出额(万)\n    scount:卖出次数\n    net:净额(万)\n    \"\"\"\n    if ct._check_lhb_input(days) is True:\n        ct._write_head()\n        df =  _inst_tops(days, pageNo=1, retry_count=retry_count,\n                        pause=pause)\n        df['code'] = df['code'].map(lambda x: str(x).zfill(6))\n        return df \n \n\ndef _inst_tops(last=5, pageNo=1, retry_count=3, pause=0.001, dataArr=pd.DataFrame()):   \n    ct._write_console()\n    for _ in range(retry_count):\n        time.sleep(pause)\n        try:\n            request = Request(rv.LHB_SINA_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], rv.LHB_KINDS[2],\n                                               ct.PAGES['fd'], last, pageNo))\n            text = urlopen(request, timeout=10).read()\n            text = text.decode('GBK')\n            html = lxml.html.parse(StringIO(text))\n            res = html.xpath(\"//table[@id=\\\"dataTable\\\"]/tr\")\n            if ct.PY3:\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\n            else:\n                sarr = [etree.tostring(node) for node in res]\n            sarr = ''.join(sarr)\n            sarr = '<table>%s</table>'%sarr\n            df = pd.read_html(sarr)[0]\n            df = df.drop([2,3], axis=1)\n            df.columns = rv.LHB_JGZZ_COLS\n            dataArr = dataArr.append(df, ignore_index=True)\n            nextPage = html.xpath('//div[@class=\\\"pages\\\"]/a[last()]/@onclick')\n            if len(nextPage)>0:\n                pageNo = re.findall(r'\\d+', nextPage[0])[0]\n                return _inst_tops(last, pageNo, retry_count, pause, dataArr)\n            else:\n                return dataArr\n        except Exception as e:\n            print(e)\n\n\ndef inst_detail(retry_count= 3, pause= 0.001):\n    \"\"\"\n    获取最近一个交易日机构席位成交明细统计数据\n    Parameters\n    --------\n    retry_count : int, 默认 3\n                 如遇网络等问题重复执行的次数 \n    pause : int, 默认 0\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\n                \n    Return\n    ----------\n    code:股票代码\n    name:股票名称     \n    date:交易日期     \n    bamount:机构席位买入额(万)     \n    samount:机构席位卖出额(万)     \n    type:类型\n    \"\"\"\n    ct._write_head()\n    df =  _inst_detail(pageNo=1, retry_count=retry_count,\n                        pause=pause)\n    if len(df)>0:\n        df['code'] = df['code'].map(lambda x: str(x).zfill(6))\n    return df  \n \n\ndef _inst_detail(pageNo=1, retry_count=3, pause=0.001, dataArr=pd.DataFrame()):   \n    ct._write_console()\n    for _ in range(retry_count):\n        time.sleep(pause)\n        try:\n            request = Request(rv.LHB_SINA_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], rv.LHB_KINDS[3],\n                                               ct.PAGES['fd'], '', pageNo))\n            text = urlopen(request, timeout=10).read()\n            text = text.decode('GBK')\n            html = lxml.html.parse(StringIO(text))\n            res = html.xpath(\"//table[@id=\\\"dataTable\\\"]/tr\")\n            if ct.PY3:\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\n            else:\n                sarr = [etree.tostring(node) for node in res]\n            sarr = ''.join(sarr)\n            sarr = '<table>%s</table>'%sarr\n            df = pd.read_html(sarr)[0]\n            df.columns = rv.LHB_JGMX_COLS\n            dataArr = dataArr.append(df, ignore_index=True)\n            nextPage = html.xpath('//div[@class=\\\"pages\\\"]/a[last()]/@onclick')\n            if len(nextPage)>0:\n                pageNo = re.findall(r'\\d+', nextPage[0])[0]\n                return _inst_detail(pageNo, retry_count, pause, dataArr)\n            else:\n                return dataArr\n        except Exception as e:\n            print(e)\n\n            \ndef _f_rows(x):\n    if '%' in x[3]:\n        x[11] = x[6]\n        for i in range(6, 11):\n            x[i] = x[i-5]\n        for i in range(1, 6):\n            x[i] = np.NaN\n    return x\n\n"
  },
  {
    "path": "tushare/stock/classifying.py",
    "content": "# -*- coding:utf-8 -*-\r\n\r\n\"\"\"\r\n获取股票分类数据接口 \r\nCreated on 2015/02/01\r\n@author: Jimmy Liu\r\n@group : waditu\r\n@contact: jimmysoa@sina.cn\r\n\"\"\"\r\n\r\nimport pandas as pd\r\nfrom tushare.stock import cons as ct\r\nfrom tushare.stock import ref_vars as rv\r\nimport json\r\nimport re\r\nfrom pandas.util.testing import _network_error_classes\r\nimport time\r\nimport tushare.stock.fundamental as fd\r\nfrom tushare.util.netbase import Client\r\n\r\ntry:\r\n    from urllib.request import urlopen, Request\r\nexcept ImportError:\r\n    from urllib2 import urlopen, Request\r\n\r\n\r\ndef get_industry_classified(standard='sina'):\r\n    \"\"\"\r\n        获取行业分类数据\r\n    Parameters\r\n    ----------\r\n    standard\r\n    sina:新浪行业 sw：申万 行业\r\n    \r\n    Returns\r\n    -------\r\n    DataFrame\r\n        code :股票代码\r\n        name :股票名称\r\n        c_name :行业名称\r\n    \"\"\"\r\n    if standard == 'sw':\r\n#         df = _get_type_data(ct.SINA_INDUSTRY_INDEX_URL%(ct.P_TYPE['http'],\r\n#                                                     ct.DOMAINS['vsf'], ct.PAGES['ids_sw']))\r\n        df = pd.read_csv(ct.TSDATA_CLASS%(ct.P_TYPE['http'], ct.DOMAINS['oss'], 'industry_sw'),\r\n                         dtype={'code':object})\r\n    else:\r\n#         df = _get_type_data(ct.SINA_INDUSTRY_INDEX_URL%(ct.P_TYPE['http'],\r\n#                                                     ct.DOMAINS['vsf'], ct.PAGES['ids']))\r\n        df = pd.read_csv(ct.TSDATA_CLASS%(ct.P_TYPE['http'], ct.DOMAINS['oss'], 'industry'),\r\n                         dtype={'code':object})\r\n#     data = []\r\n#     ct._write_head()\r\n#     for row in df.values:\r\n#         rowDf =  _get_detail(row[0], retry_count=10, pause=0.01)\r\n#         rowDf['c_name'] = row[1]\r\n#         data.append(rowDf)\r\n#     data = pd.concat(data, ignore_index=True)\r\n    return df\r\n        \r\n\r\ndef get_concept_classified():\r\n    \"\"\"\r\n        获取概念分类数据\r\n    Return\r\n    --------\r\n    DataFrame\r\n        code :股票代码\r\n        name :股票名称\r\n        c_name :概念名称\r\n    \"\"\"\r\n    df = pd.read_csv(ct.TSDATA_CLASS%(ct.P_TYPE['http'], ct.DOMAINS['oss'], 'concept'),\r\n                         dtype={'code':object})\r\n    return df\r\n\r\n\r\ndef concetps():\r\n    ct._write_head()\r\n    df = _get_type_data(ct.SINA_CONCEPTS_INDEX_URL%(ct.P_TYPE['http'],\r\n                                                    ct.DOMAINS['sf'], ct.PAGES['cpt']))\r\n    data = []\r\n    for row in df.values:\r\n        rowDf =  _get_detail(row[0])\r\n        if rowDf is not None:\r\n            rowDf['c_name'] = row[1]\r\n            data.append(rowDf)\r\n    if len(data) > 0:\r\n        data = pd.concat(data, ignore_index=True)\r\n    data.to_csv('d:\\\\cpt.csv', index=False)\r\n\r\n\r\n\r\ndef get_concepts(src='dfcf'):\r\n    \"\"\"\r\n        获取概念板块行情数据\r\n    Return\r\n    --------\r\n    DataFrame\r\n        code :股票代码\r\n        name :股票名称\r\n        c_name :概念名称\r\n    \"\"\"\r\n    clt = Client(ct.ET_CONCEPTS_INDEX_URL%(ct.P_TYPE['http'],\r\n                                                    ct.DOMAINS['dfcf'], _random(15)), ref='')\r\n    content = clt.gvalue()\r\n    content = content.decode('utf-8') if ct.PY3 else content\r\n    js = json.loads(content)\r\n    data = []\r\n    for row in js:\r\n        cols = row.split(',')\r\n        cs = cols[6].split('|')\r\n        arr = [cols[2], cols[3], cs[0], cs[2], cols[7], cols[9]]\r\n        data.append(arr)\r\n    df = pd.DataFrame(data, columns=['concept', 'change', 'up', 'down', 'top_code', 'top_name'])\r\n    return df\r\n\r\n    \r\ndef get_area_classified():\r\n    \"\"\"\r\n        获取地域分类数据\r\n    Return\r\n    --------\r\n    DataFrame\r\n        code :股票代码\r\n        name :股票名称\r\n        area :地域名称\r\n    \"\"\"\r\n    df = fd.get_stock_basics()\r\n    df = df[['name', 'area']]\r\n    df.reset_index(inplace=True)\r\n    df = df.sort_values('area').reset_index(drop=True)\r\n    return df\r\n\r\n\r\ndef get_gem_classified():\r\n    \"\"\"\r\n        获取创业板股票\r\n    Return\r\n    --------\r\n    DataFrame\r\n        code :股票代码\r\n        name :股票名称\r\n    \"\"\"\r\n    df = fd.get_stock_basics()\r\n    df.reset_index(inplace=True)\r\n    df = df[ct.FOR_CLASSIFY_COLS]\r\n    df = df.ix[df.code.str[0] == '3']\r\n    df = df.sort_values('code').reset_index(drop=True)\r\n    return df\r\n    \r\n\r\ndef get_sme_classified():\r\n    \"\"\"\r\n        获取中小板股票\r\n    Return\r\n    --------\r\n    DataFrame\r\n        code :股票代码\r\n        name :股票名称\r\n    \"\"\"\r\n    df = fd.get_stock_basics()\r\n    df.reset_index(inplace=True)\r\n    df = df[ct.FOR_CLASSIFY_COLS]\r\n    df = df.ix[df.code.str[0:3] == '002']\r\n    df = df.sort_values('code').reset_index(drop=True)\r\n    return df \r\n\r\ndef get_st_classified():\r\n    \"\"\"\r\n        获取风险警示板股票\r\n    Return\r\n    --------\r\n    DataFrame\r\n        code :股票代码\r\n        name :股票名称\r\n    \"\"\"\r\n    df = fd.get_stock_basics()\r\n    df.reset_index(inplace=True)\r\n    df = df[ct.FOR_CLASSIFY_COLS]\r\n    df = df.ix[df.name.str.contains('ST')]\r\n    df = df.sort_values('code').reset_index(drop=True)\r\n    return df \r\n\r\n\r\ndef _get_detail(tag, retry_count=3, pause=0.001):\r\n    dfc = pd.DataFrame()\r\n    p = 0\r\n    num_limit = 100\r\n    while(True):\r\n        p = p+1\r\n        for _ in range(retry_count):\r\n            time.sleep(pause)\r\n            try:\r\n                ct._write_console()\r\n                request = Request(ct.SINA_DATA_DETAIL_URL%(ct.P_TYPE['http'],\r\n                                                                   ct.DOMAINS['vsf'], ct.PAGES['jv'],\r\n                                                                   p,tag))\r\n                text = urlopen(request, timeout=10).read()\r\n                text = text.decode('gbk')\r\n            except _network_error_classes:\r\n                pass\r\n            else:\r\n                break\r\n        reg = re.compile(r'\\,(.*?)\\:')\r\n        text = reg.sub(r',\"\\1\":', text)\r\n        text = text.replace('\"{symbol', '{\"symbol')\r\n        text = text.replace('{symbol', '{\"symbol\"')\r\n        jstr = json.dumps(text)\r\n        js = json.loads(jstr)\r\n        df = pd.DataFrame(pd.read_json(js, dtype={'code':object}), columns=ct.THE_FIELDS)\r\n#         df = df[ct.FOR_CLASSIFY_B_COLS]\r\n        df = df[['code', 'name']]\r\n        dfc = pd.concat([dfc, df])\r\n        if df.shape[0] < num_limit:\r\n            return dfc\r\n        #raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n    \r\n\r\ndef _get_type_data(url):\r\n    try:\r\n        request = Request(url)\r\n        data_str = urlopen(request, timeout=10).read()\r\n        data_str = data_str.decode('GBK')\r\n        data_str = data_str.split('=')[1]\r\n        data_json = json.loads(data_str)\r\n        df = pd.DataFrame([[row.split(',')[0], row.split(',')[1]] for row in data_json.values()],\r\n                          columns=['tag', 'name'])\r\n        return df\r\n    except Exception as er:\r\n        print(str(er))\r\n\r\n\r\ndef get_hs300s():\r\n    \"\"\"\r\n    获取沪深300当前成份股及所占权重\r\n    Return\r\n    --------\r\n    DataFrame\r\n        code :股票代码\r\n        name :股票名称\r\n        date :日期\r\n        weight:权重\r\n    \"\"\"\r\n    try:\r\n        wt = pd.read_excel(ct.HS300_CLASSIFY_URL_FTP%(ct.P_TYPE['http'], ct.DOMAINS['idx'], \r\n                                                  ct.PAGES['hs300w']), usecols=[0, 4, 5, 8])\r\n        wt.columns = ct.FOR_CLASSIFY_W_COLS\r\n        wt['code'] = wt['code'].map(lambda x :str(x).zfill(6))\r\n        return wt\r\n    except Exception as er:\r\n        print(str(er))\r\n\r\n\r\ndef get_sz50s():\r\n    \"\"\"\r\n    获取上证50成份股\r\n    Return\r\n    --------\r\n    DataFrame\r\n        date :日期\r\n        code :股票代码\r\n        name :股票名称\r\n    \"\"\"\r\n    try:\r\n        df = pd.read_excel(ct.SZ_CLASSIFY_URL_FTP%(ct.P_TYPE['http'], ct.DOMAINS['idx'], \r\n                                                  ct.PAGES['sz50b']), parse_cols=[0, 4, 5])\r\n        df.columns = ct.FOR_CLASSIFY_B_COLS\r\n        df['code'] = df['code'].map(lambda x :str(x).zfill(6))\r\n        return df\r\n    except Exception as er:\r\n        print(str(er))      \r\n\r\n\r\ndef get_zz500s():\r\n    \"\"\"\r\n    获取中证500成份股\r\n    Return\r\n    --------\r\n    DataFrame\r\n        date :日期\r\n        code :股票代码\r\n        name :股票名称\r\n        weight : 权重\r\n    \"\"\"\r\n    try:\r\n        wt = pd.read_excel(ct.HS300_CLASSIFY_URL_FTP%(ct.P_TYPE['http'], ct.DOMAINS['idx'], \r\n                                                   ct.PAGES['zz500wt']), usecols=[0, 4, 5, 8])\r\n        wt.columns = ct.FOR_CLASSIFY_W_COLS\r\n        wt['code'] = wt['code'].map(lambda x :str(x).zfill(6))\r\n        return wt\r\n    except Exception as er:\r\n        print(str(er)) \r\n\r\n\r\ndef get_terminated():\r\n    \"\"\"\r\n    获取终止上市股票列表\r\n    Return\r\n    --------\r\n    DataFrame\r\n        code :股票代码\r\n        name :股票名称\r\n        oDate:上市日期\r\n        tDate:终止上市日期 \r\n    \"\"\"\r\n    try:\r\n        \r\n        ref = ct.SSEQ_CQ_REF_URL%(ct.P_TYPE['http'], ct.DOMAINS['sse'])\r\n        clt = Client(rv.TERMINATED_URL%(ct.P_TYPE['http'], ct.DOMAINS['sseq'],\r\n                                    ct.PAGES['ssecq'], _random(5),\r\n                                    _random()), ref=ref, cookie=rv.MAR_SH_COOKIESTR)\r\n        lines = clt.gvalue()\r\n        lines = lines.decode('utf-8') if ct.PY3 else lines\r\n        lines = lines[19:-1]\r\n        lines = json.loads(lines)\r\n        df = pd.DataFrame(lines['result'], columns=rv.TERMINATED_T_COLS)\r\n        df.columns = rv.TERMINATED_COLS\r\n        return df\r\n    except Exception as er:\r\n        print(str(er))      \r\n\r\n\r\ndef get_suspended():\r\n    \"\"\"\r\n    获取暂停上市股票列表\r\n    Return\r\n    --------\r\n    DataFrame\r\n        code :股票代码\r\n        name :股票名称\r\n        oDate:上市日期\r\n        tDate:终止上市日期 \r\n    \"\"\"\r\n    try:\r\n        \r\n        ref = ct.SSEQ_CQ_REF_URL%(ct.P_TYPE['http'], ct.DOMAINS['sse'])\r\n        clt = Client(rv.SUSPENDED_URL%(ct.P_TYPE['http'], ct.DOMAINS['sseq'],\r\n                                    ct.PAGES['ssecq'], _random(5),\r\n                                    _random()), ref=ref, cookie=rv.MAR_SH_COOKIESTR)\r\n        lines = clt.gvalue()\r\n        lines = lines.decode('utf-8') if ct.PY3 else lines\r\n        lines = lines[19:-1]\r\n        lines = json.loads(lines)\r\n        df = pd.DataFrame(lines['result'], columns=rv.TERMINATED_T_COLS)\r\n        df.columns = rv.TERMINATED_COLS\r\n        return df\r\n    except Exception as er:\r\n        print(str(er))   \r\n            \r\n\r\n\r\ndef _random(n=13):\r\n    from random import randint\r\n    start = 10**(n-1)\r\n    end = (10**n)-1\r\n    return str(randint(start, end))  \r\n\r\n\r\n"
  },
  {
    "path": "tushare/stock/cons.py",
    "content": "# -*- coding:utf-8 -*-\r\n'''\r\nCreated on 2014/07/31\r\n@author: Jimmy Liu\r\n@group : waditu\r\n@contact: jimmysoa@sina.cn\r\n'''\r\n\r\nVERSION = '1.0.3'\r\nK_LABELS = ['D', 'W', 'M']\r\nK_MIN_LABELS = ['5', '15', '30', '60']\r\nK_TYPE = {'D': 'akdaily', 'W': 'akweekly', 'M': 'akmonthly'}\r\nTT_K_TYPE = {'D': 'day', 'W': 'week', 'M': 'month'}\r\nFQ_KEY = ['qfqday', 'hfqday', 'day']\r\nINDEX_LABELS = ['sh', 'sz', 'hs300', 'sz50', 'cyb', 'zxb', 'zx300', 'zh500']\r\nINDEX_LIST = {'sh': 'sh000001', 'sz': 'sz399001', 'hs300': 'sh000300',\r\n              'sz50': 'sh000016', 'zxb': 'sz399005', 'cyb': 'sz399006', \r\n              'zx300': 'sz399008', 'zh500':'sh000905'}\r\nP_TYPE = {'http': 'http://', 'ftp': 'ftp://'}\r\nPAGE_NUM = [40, 60, 80, 100]\r\nFORMAT = lambda x: '%.2f' % x\r\nFORMAT4 = lambda x: '%.4f' % x\r\nDOMAINS = {'sina': 'sina.com.cn', 'sinahq': 'sinajs.cn',\r\n           'ifeng': 'ifeng.com', 'sf': 'finance.sina.com.cn',\r\n           'vsf': 'vip.stock.finance.sina.com.cn', \r\n           'idx': 'www.csindex.com.cn', '163': 'money.163.com',\r\n           'em': 'eastmoney.com', 'sseq': 'query.sse.com.cn',\r\n           'sse': 'www.sse.com.cn', 'szse': 'www.szse.cn',\r\n           'oss': 'file.tushare.org', 'idxip':'115.29.204.48',\r\n           'shibor': 'www.shibor.org', 'mbox':'www.cbooo.cn',\r\n           'tt': 'gtimg.cn', 'gw': 'gw.com.cn',\r\n           'v500': 'value500.com', 'sstar': 'stock.stockstar.com',\r\n           'dfcf': 'nufm.dfcfw.com'}\r\nPAGES = {'fd': 'index.phtml', 'dl': 'downxls.php', 'jv': 'json_v2.php',\r\n         'cpt': 'newFLJK.php', 'ids': 'newSinaHy.php', 'lnews':'rollnews_ch_out_interface.php',\r\n         'ntinfo':'vCB_BulletinGather.php', 'hs300b':'000300cons.xls',\r\n         'hs300w':'000300closeweight.xls','sz50b':'000016cons.xls',\r\n         'dp':'all_fpya.php', '163dp':'fpyg.html',\r\n         'emxsg':'JS.aspx', '163fh':'jjcgph.php',\r\n         'newstock':'vRPD_NewStockIssue.php', 'zz500b':'000905cons.xls',\r\n         'zz500wt':'000905closeweight.xls',\r\n         't_ticks':'vMS_tradedetail.php', 'dw': 'downLoad.html',\r\n         'qmd':'queryMargin.do', 'szsefc':'ShowReport.szse',\r\n         'ssecq':'commonQuery.do', 'sinadd':'cn_bill_download.php', 'ids_sw':'SwHy.php',\r\n         'idx': 'index.php', 'index': 'index.html'}\r\nTICK_COLUMNS = ['time', 'price', 'change', 'volume', 'amount', 'type']\r\nTODAY_TICK_COLUMNS = ['time', 'price', 'pchange', 'change', 'volume', 'amount', 'type']\r\nDAY_TRADING_COLUMNS = ['code', 'symbol', 'name', 'changepercent',\r\n                       'trade', 'open', 'high', 'low', 'settlement', 'volume', 'turnoverratio',\r\n                       'amount', 'per', 'pb', 'mktcap', 'nmc']\r\nREPORT_COLS = ['code', 'name', 'eps', 'eps_yoy', 'bvps', 'roe',\r\n               'epcf', 'net_profits', 'profits_yoy', 'distrib', 'report_date']\r\nFORECAST_COLS = ['code', 'name', 'type', 'report_date', 'pre_eps', 'range']\r\nPROFIT_COLS = ['code', 'name', 'roe', 'net_profit_ratio',\r\n               'gross_profit_rate', 'net_profits', 'eps', 'business_income', 'bips']\r\nOPERATION_COLS = ['code', 'name', 'arturnover', 'arturndays', 'inventory_turnover',\r\n                  'inventory_days', 'currentasset_turnover', 'currentasset_days']\r\nGROWTH_COLS = ['code', 'name', 'mbrg', 'nprg', 'nav', 'targ', 'epsg', 'seg']\r\nDEBTPAYING_COLS = ['code', 'name', 'currentratio',\r\n                   'quickratio', 'cashratio', 'icratio', 'sheqratio', 'adratio']\r\nCASHFLOW_COLS = ['code', 'name', 'cf_sales', 'rateofreturn',\r\n                 'cf_nm', 'cf_liabilities', 'cashflowratio']\r\nDAY_PRICE_COLUMNS = ['date', 'open', 'high', 'close', 'low', 'volume', 'price_change', 'p_change',\r\n                     'ma5', 'ma10', 'ma20', 'v_ma5', 'v_ma10', 'v_ma20', 'turnover']\r\nINX_DAY_PRICE_COLUMNS = ['date', 'open', 'high', 'close', 'low', 'volume', 'price_change', 'p_change',\r\n                         'ma5', 'ma10', 'ma20', 'v_ma5', 'v_ma10', 'v_ma20']\r\nLIVE_DATA_COLS = ['name', 'open', 'pre_close', 'price', 'high', 'low', 'bid', 'ask', 'volume', 'amount',\r\n                  'b1_v', 'b1_p', 'b2_v', 'b2_p', 'b3_v', 'b3_p', 'b4_v', 'b4_p', 'b5_v', 'b5_p',\r\n                  'a1_v', 'a1_p', 'a2_v', 'a2_p', 'a3_v', 'a3_p', 'a4_v', 'a4_p', 'a5_v', 'a5_p', 'date', 'time', 's']\r\nUS_LIVE_DATA_COLS = ['name', 'price', 'change_percent', 'time', 'change', 'open', 'high', 'low', 'high_52week', 'low_52week', 'volume', 'volume_average', 'mktcap', 'eps', 'pe', 'fpe', 'beta', 'dividend', 'earnings_yield', 'totals', 'instown', 'extended_price', 'extended_change_percent', 'extended_change', 'extended_time', 'time_est', 'pre_close', 'extended_volume']\r\nFOR_CLASSIFY_COLS = ['code','name']\r\nFOR_CLASSIFY_B_COLS = ['date', 'code','name']\r\nFOR_CLASSIFY_W_COLS = ['date','code', 'name', 'weight']\r\nFOR_CLASSIFY_W5_COLS = ['date','code', 'name', 'weight']\r\nTSDATA_CLASS = '%s%s/tsdata/industry/%s.csv'\r\nTHE_FIELDS = ['code','symbol','name','changepercent','trade','open','high','low','settlement','volume','turnoverratio']\r\nKLINE_TT_COLS_MINS = ['date', 'open', 'close', 'high', 'low', 'volume']\r\nKLINE_TT_COLS = ['date', 'open', 'close', 'high', 'low', 'volume', 'amount', 'turnoverratio']\r\nTICK_PRICE_URL = '%smarket.%s/%s?date=%s&symbol=%s'\r\nTICK_PRICE_URL_TT = '%sstock.%s/data/%s?appn=detail&action=download&c=%s&d=%s'\r\nTICK_PRICE_URL_NT = '%squotes.%s/cjmx/%s/%s/%s.xls'\r\nTODAY_TICKS_PAGE_URL = '%s%s/quotes_service/api/%s/CN_Transactions.getAllPageTime?date=%s&symbol=%s'\r\nTODAY_TICKS_URL = '%s%s/quotes_service/view/%s?symbol=%s&date=%s&page=%s'\r\nKLINE_TT_URL = '%sweb.ifzq.%s/appstock/app/%skline/get?_var=kline_day%s&param=%s,%s,%s,%s,640,%s&r=0.%s'\r\nKLINE_TT_MIN_URL = '%sifzq.%s/appstock/app/kline/mkline?param=%s,m%s,,640&_var=m%s_today&r=0.%s'\r\nDAY_PRICE_URL = '%sapi.finance.%s/%s/?code=%s&type=last'\r\nLIVE_DATA_URL = '%shq.%s/rn=%s&list=%s'\r\nDAY_PRICE_MIN_URL = '%sapi.finance.%s/akmin?scode=%s&type=%s'\r\nSINA_DAY_PRICE_URL = '%s%s/quotes_service/api/%s/Market_Center.getHQNodeData?num=80&sort=code&asc=0&node=%s&symbol=&_s_r_a=page&page=%s'\r\n# SINA_DAY_PRICE_URL = '%s%s/quotes_service/api/%s/Market_Center.getHQNodeData?num=10000&node=%s'\r\nREPORT_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/mainindex/%s?s_i=&s_a=&s_c=&reportdate=%s&quarter=%s&p=%s&num=%s'\r\nFORECAST_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'\r\nPROFIT_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/profit/%s?s_i=&s_a=&s_c=&reportdate=%s&quarter=%s&p=%s&num=%s'\r\nOPERATION_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/operation/%s?s_i=&s_a=&s_c=&reportdate=%s&quarter=%s&p=%s&num=%s'\r\nGROWTH_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/grow/%s?s_i=&s_a=&s_c=&reportdate=%s&quarter=%s&p=%s&num=%s'\r\nDEBTPAYING_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/debtpaying/%s?s_i=&s_a=&s_c=&reportdate=%s&quarter=%s&p=%s&num=%s'\r\nCASHFLOW_URL = '%s%s/q/go.php/vFinanceAnalyze/kind/cashflow/%s?s_i=&s_a=&s_c=&reportdate=%s&quarter=%s&p=%s&num=%s'\r\nSHIBOR_TYPE ={'Shibor': 'Shibor数据', 'Quote': '报价数据', 'Tendency': 'Shibor均值数据',\r\n              'LPR': 'LPR数据', 'LPR_Tendency': 'LPR均值数据'}\r\nSHIBOR_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/'\r\nALL_STOCK_BASICS_FILE = P_TYPE['http'] + DOMAINS['oss'] + '/tsdata/%sall%s.csv'\r\nALL_DAY_FILE = P_TYPE['http'] + DOMAINS['oss'] + '/tsdata/h/%s%s.csv'\r\nALL_CAL_FILE = '%s%s/tsdata/calAll.csv'%(P_TYPE['http'], DOMAINS['oss'])\r\nSINA_CONCEPTS_INDEX_URL = '%smoney.%s/q/view/%s?param=class'\r\nET_CONCEPTS_INDEX_URL = '%s%s/EM_Finance2014NumericApplication/JS.aspx?type=CT&cmd=C._BKGN&js=[(x)]&sty=FPGBKI&st=c&sr=-1&p=1&ps=5000&cb=&token=7bc05d0d4c3c22ef9fca8c2a912d779c&v=0.0%s'\r\nSINA_INDUSTRY_INDEX_URL = '%s%s/q/view/%s'\r\nSINA_DATA_DETAIL_URL = '%s%s/quotes_service/api/%s/Market_Center.getHQNodeData?page=%s&num=1000&sort=symbol&asc=1&node=%s&symbol=&_s_r_a=page'\r\nSINA_BALANCESHEET_URL = 'http://money.finance.sina.com.cn/corp/go.php/vDOWN_BalanceSheet/displaytype/4/stockid/%s/ctrl/all.phtml'\r\nSINA_PROFITSTATEMENT_URL = 'http://money.finance.sina.com.cn/corp/go.php/vDOWN_ProfitStatement/displaytype/4/stockid/%s/ctrl/all.phtml'\r\nSINA_CASHFLOW_URL = 'http://money.finance.sina.com.cn/corp/go.php/vDOWN_CashFlow/displaytype/4/stockid/%s/ctrl/all.phtml'\r\nINDEX_C_COMM = 'sseportal/ps/zhs/hqjt/csi'\r\nHS300_CLASSIFY_URL_FTP = '%s%s/uploads/file/autofile/closeweight/%s'\r\nSZ_CLASSIFY_URL_FTP = '%s%s/uploads/file/autofile/cons/%s'\r\nHS300_CLASSIFY_URL_HTTP = '%s%s/%s/%s'\r\nBDI_URL = '%s%s/BDI.asp'\r\nHIST_FQ_URL = '%s%s/corp/go.php/vMS_FuQuanMarketHistory/stockid/%s.phtml?year=%s&jidu=%s'\r\nHIST_INDEX_URL = '%s%s/corp/go.php/vMS_MarketHistory/stockid/%s/type/S.phtml?year=%s&jidu=%s'\r\nHIST_FQ_FACTOR_URL = '%s%s/api/json.php/BasicStockSrv.getStockFuQuanData?symbol=%s&type=hfq'\r\nADJ_FAC_URL = '%s%s/tsdata/f/factor/%s.csv'\r\nMG_URL = '%s%s/tsdata/rzrq/%s/%s%s.csv'\r\nMG_ZSL_URL = '%s%s/tsdata/rzrq/%s/zsl/%s_%s.csv'\r\nGPZY_URL = '%s%s/tsdata/gpzy/%s.csv'\r\nGPZY_D_URL = '%s%s/tsdata/gpzy/%s.csv'\r\nSHS_FAC_URL = '%s%s/tsdata/shares/%s.csv'\r\nZF = '%s%s/tsdata/%s.csv'\r\nINDEX_HQ_URL = '''%shq.%s/rn=xppzh&list=sh000001,sh000002,sh000003,sh000008,sh000009,sh000010,sh000011,sh000012,sh000016,sh000017,sh000300,sh000905,sz399001,sz399002,sz399003,sz399004,sz399005,sz399006,sz399008,sz399100,sz399101,sz399106,sz399107,sz399108,sz399333,sz399606'''\r\nSSEQ_CQ_REF_URL = '%s%s/assortment/stock/list/name'\r\nALL_STK_URL = '%s%s/all.csv'\r\nSINA_DD = '%s%s/quotes_service/view/%s?symbol=%s&num=60&page=1&sort=ticktime&asc=0&volume=%s&amount=0&type=0&day=%s'\r\nBOX = 'boxOffice'\r\nMOVIE_BOX = '%s%s/%s/GetHourBoxOffice?d=%s'\r\nBOXOFFICE_DAY = '%s%s/%s/GetDayBoxOffice?num=%s&d=%s'\r\nBOXOFFICE_MONTH = '%s%s/%s/getMonthBox?sdate=%s'\r\nBOXOFFICE_CBD = '%s%s/%s/getCBD?pIndex=%s&dt=%s'\r\nSHIBOR_COLS = ['date', 'ON', '1W', '2W', '1M', '3M', '6M', '9M', '1Y']\r\nSHIBOR_Q_COLS = ['date', 'bank', 'ON', '1W', '2W', '1M', '3M', '6M', '9M', '1Y']\r\nQUOTE_COLS = ['date', 'bank', 'ON_B', 'ON_A', '1W_B', '1W_A', '2W_B', '2W_A', '1M_B', '1M_A',\r\n                    '3M_B', '3M_A', '6M_B', '6M_A', '9M_B', '9M_A', '1Y_B', '1Y_A']\r\nSHIBOR_MA_COLS = ['date', 'ON_5', 'ON_10', 'ON_20', '1W_5', '1W_10', '1W_20','2W_5', '2W_10', '2W_20',\r\n                  '1M_5', '1M_10', '1M_20', '3M_5', '3M_10', '3M_20', '6M_5', '6M_10', '6M_20',\r\n                  '9M_5', '9M_10', '9M_20','1Y_5', '1Y_10', '1Y_20']\r\nLPR_COLS = ['date', '1Y']\r\nKTYPE = {\r\n         'D'     : 9,\r\n         'XD'    : 4,\r\n         'W'     : 5,\r\n         'M'     : 6,\r\n         'Q'     : 10,\r\n         'Y'     : 11,\r\n         '1MIN'  : 8,\r\n         '5MIN'  : 0,\r\n         '15MIN' : 1,\r\n         '30MIN' : 2,\r\n         '60MIN' : 3,\r\n         }\r\nASSET = {\r\n         'E' : 'get_security_bars',\r\n         'INDEX' : 'get_index_bars',\r\n         'X' : 'get_instrument_bars',\r\n         }\r\nKTYPE_LOW_COLS = ['D', 'XD', 'W', 'M', 'Q', 'Y']\r\nKTYPE_ARR = ['1MIN', '5MIN', '15MIN', '30MIN', '60MIN']\r\nBAR_E_COLS = ['code', 'open', 'close', 'high', 'low', 'vol', 'amount']\r\nBAR_X_COLS = ['code', 'open', 'close', 'high', 'low', 'price', 'position','trade']\r\nBAR_X_FUTURE_COLS = ['code', 'open', 'close', 'high', 'low', 'avg_price', 'position', 'vol']\r\nBAR_X_FUTURE_RL_COLS = ['code', 'open', 'close', 'high', 'low', 'vol', 'avg_price', 'position']\r\nBAR_X_OTHER_COLS = ['code', 'open', 'close', 'high', 'low', 'vol']\r\nT_DROP_COLS = ['year', 'month', 'day', 'hour','minute']\r\nLPR_MA_COLS = ['date', '1Y_5', '1Y_10', '1Y_20']\r\nINDEX_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'\r\nINDEX_COLS = ['code', 'name', 'change', 'open', 'preclose', 'close', 'high', 'low', 'volume', 'amount']\r\nHIST_FQ_COLS = ['date', 'open', 'high', 'close', 'low', 'volume', 'amount', 'factor']\r\nSINA_DD_COLS = ['code', 'name', 'time', 'price', 'volume', 'preprice', 'type']\r\nGLOBAL_HQ_SYMBOL = 'sh000001,hkHSI,znb_UKX,znb_DAX,znb_INDEXCF,znb_CAC,znb_SMI,znb_FTSEMIB,znb_MADX,znb_OMX,znb_SPX,znb_HEX,znb_OSEAX,znb_ISEQ,znb_AEX,znb_ICEXI,znb_NKY,znb_TWSE,znb_FSSTI,znb_KOSPI,znb_FBMKLCI,znb_SET,znb_JCI,znb_PCOMP,znb_KSE100,znb_SENSEX,znb_VNINDEX,znb_CSEALL,znb_SASEIDX,znb_SPTSX,znb_MEXBOL,znb_IBOV,znb_MERVAL,znb_AS51,znb_NZSE50FG,znb_CASE,znb_JALSH,sz399001,znb_INDU,znb_CCMP'\r\nGLOBAL_HQ_COLS = ['symbol', 'name', 'price', 'chga', 'chgp', 'datetime']\r\nINST_PLK_F = 'ts_instrument.plk'\r\nPROFIT_DIVIS = ['code',    \r\n                'name',    \r\n                'year',  \r\n                'bshares',  \r\n                'incshares',\r\n                'totals', \r\n                'cash',\r\n                'plandate',    \r\n                'regdate',    \r\n                'exdate',    \r\n                'eventproc',\r\n                'anndate']\r\nHIST_FQ_FACTOR_COLS = ['code','value']\r\nDATA_GETTING_TIPS = '[Getting data:]'\r\nDATA_GETTING_FLAG = '#'\r\nDATA_ROWS_TIPS = '%s rows data found.Please wait for a moment.'\r\nDATA_INPUT_ERROR_MSG = 'date input error.'\r\nMSG_NOT_CONNECTED = '服务器连接为空，请通过ts.get_apis()获取'\r\nNETWORK_URL_ERROR_MSG = '获取失败，请检查网络.'\r\nDATE_CHK_MSG = '年度输入错误：请输入1989年以后的年份数字，格式：YYYY'\r\nDATE_CHK_Q_MSG = '季度输入错误：请输入1、2、3或4数字'\r\nTOP_PARAS_MSG = 'top有误，请输入整数或all.'\r\nLHB_MSG = '周期输入有误，请输入数字5、10、30或60'\r\nTOKEN_F_P = 'tk.csv'\r\nTOKEN_ERR_MSG = '请设置tushare pro的token凭证码，如果没有请访问https://tushare.pro注册申请'\r\nBOX_INPUT_ERR_MSG = '请输入YYYY-MM格式的年月数据'\r\nTICK_SRCS = ['sn', 'tt', 'nt']\r\nTICK_SRC_ERROR = '数据源代码只能输入sn,tt,nt其中之一'\r\nINDEX_SYMBOL = {'399990': 'sz399990', '000006': 'sh000006', '399998': 'sz399998', \r\n                '399436': 'sz399436', '399678': 'sz399678', '399804': 'sz399804', \r\n                '000104': 'sh000104', '000070': 'sh000070', '399613': 'sz399613', \r\n                '399690': 'sz399690', '399928': 'sz399928', '000928': 'sh000928', \r\n                '000986': 'sh000986', '399806': 'sz399806', '000032': 'sh000032', \r\n                '000005': 'sh000005', '399381': 'sz399381', '399908': 'sz399908', \r\n                '000908': 'sh000908', '399691': 'sz399691', '000139': 'sh000139', \r\n                '399427': 'sz399427', '399248': 'sz399248', '000832': 'sh000832', \r\n                '399901': 'sz399901', '399413': 'sz399413', '000901': 'sh000901', \r\n                '000078': 'sh000078', '000944': 'sh000944', '000025': 'sh000025', \r\n                '399944': 'sz399944', '399307': 'sz399307', '000052': 'sh000052', \r\n                '399680': 'sz399680', '399232': 'sz399232', '399993': 'sz399993', \r\n                '000102': 'sh000102', '000950': 'sh000950', '399950': 'sz399950', \r\n                '399244': 'sz399244', '399925': 'sz399925', '000925': 'sh000925', \r\n                '000003': 'sh000003', '000805': 'sh000805', '000133': 'sh000133', \r\n                '399677': 'sz399677', '399319': 'sz399319', '399397': 'sz399397', \r\n                '399983': 'sz399983', '399654': 'sz399654', '399440': 'sz399440', \r\n                '000043': 'sh000043', '000012': 'sh000012', '000833': 'sh000833', \r\n                '000145': 'sh000145', '000053': 'sh000053', '000013': 'sh000013', \r\n                '000022': 'sh000022', '000094': 'sh000094', '399299': 'sz399299', \r\n                '000101': 'sh000101', '399817': 'sz399817', '399481': 'sz399481', \r\n                '399434': 'sz399434', '399301': 'sz399301', '000029': 'sh000029', \r\n                '399812': 'sz399812', '399441': 'sz399441', '000098': 'sh000098', \r\n                '399557': 'sz399557', '000068': 'sh000068', '399298': 'sz399298', \r\n                '399302': 'sz399302', '000961': 'sh000961', '000959': 'sh000959', \r\n                '399961': 'sz399961', '000126': 'sh000126', '000036': 'sh000036', \r\n                '399305': 'sz399305', '000116': 'sh000116', '399359': 'sz399359', \r\n                '399810': 'sz399810', '000062': 'sh000062', '399618': 'sz399618', \r\n                '399435': 'sz399435', '000149': 'sh000149', '000819': 'sh000819', \r\n                '000020': 'sh000020', '000061': 'sh000061', '000016': 'sh000016', \r\n                '000028': 'sh000028', '399809': 'sz399809', '000999': 'sh000999', \r\n                '399238': 'sz399238', '000100': 'sh000100', '399979': 'sz399979', \r\n                '000979': 'sh000979', '399685': 'sz399685', '000152': 'sh000152', \r\n                '000153': 'sh000153', '399318': 'sz399318', '000853': 'sh000853', \r\n                '000040': 'sh000040', '399693': 'sz399693', '000076': 'sh000076', \r\n                '000017': 'sh000017', '000134': 'sh000134', '399989': 'sz399989', \r\n                '000042': 'sh000042', '000066': 'sh000066', '000008': 'sh000008', \r\n                '000002': 'sh000002', '000001': 'sh000001', '000011': 'sh000011', \r\n                '000031': 'sh000031', '399403': 'sz399403', '000951': 'sh000951', \r\n                '399951': 'sz399951', '000092': 'sh000092', '399234': 'sz399234', \r\n                '000823': 'sh000823', '399986': 'sz399986', '399647': 'sz399647', \r\n                '000050': 'sh000050', '000073': 'sh000073', '399357': 'sz399357', \r\n                '000940': 'sh000940', '000107': 'sh000107', '000048': 'sh000048', \r\n                '399411': 'sz399411', '399366': 'sz399366', '399373': 'sz399373', \r\n                '000015': 'sh000015', '000021': 'sh000021', '000151': 'sh000151', \r\n                '000851': 'sh000851', '000058': 'sh000058', '399404': 'sz399404', \r\n                '399102': 'sz399102', '399431': 'sz399431', '399971': 'sz399971', \r\n                '000125': 'sh000125', '000069': 'sh000069', '000063': 'sh000063', \r\n                '399395': 'sz399395', '000038': 'sh000038', '399240': 'sz399240', \r\n                '399903': 'sz399903', '000989': 'sh000989', '399321': 'sz399321', \r\n                '399675': 'sz399675', '399235': 'sz399235', '000057': 'sh000057', \r\n                '000056': 'sh000056', '000903': 'sh000903', '399310': 'sz399310', \r\n                '000004': 'sh000004', '000019': 'sh000019', '399919': 'sz399919', \r\n                '000974': 'sh000974', '000919': 'sh000919', '399635': 'sz399635', \r\n                '399663': 'sz399663', '399106': 'sz399106', '399107': 'sz399107', \r\n                '399555': 'sz399555', '000090': 'sh000090', '000155': 'sh000155', \r\n                '000060': 'sh000060', '399636': 'sz399636', '000816': 'sh000816', \r\n                '000010': 'sh000010', '399671': 'sz399671', '000035': 'sh000035', \r\n                '399352': 'sz399352', '399683': 'sz399683', '399554': 'sz399554', \r\n                '399409': 'sz399409', '000018': 'sh000018', '399101': 'sz399101', \r\n                '000992': 'sh000992', '399416': 'sz399416', '399918': 'sz399918', \r\n                '399379': 'sz399379', '399674': 'sz399674', '399239': 'sz399239', \r\n                '399384': 'sz399384', '399367': 'sz399367', '000918': 'sh000918', \r\n                '000914': 'sh000914', '399914': 'sz399914', '000054': 'sh000054', \r\n                '000806': 'sh000806', '399619': 'sz399619', '399015': 'sz399015', \r\n                '399393': 'sz399393', '399313': 'sz399313', '399231': 'sz399231', \r\n                '000846': 'sh000846', '000854': 'sh000854', '399010': 'sz399010', \r\n                '399666': 'sz399666', '399387': 'sz399387', '399399': 'sz399399', \r\n                '000026': 'sh000026', '399934': 'sz399934', '000150': 'sh000150', \r\n                '000934': 'sh000934', '399317': 'sz399317', '000138': 'sh000138', \r\n                '399371': 'sz399371', '399394': 'sz399394', '399659': 'sz399659', \r\n                '399665': 'sz399665', '399931': 'sz399931', '000161': 'sh000161', \r\n                '399380': 'sz399380', '000931': 'sh000931', '399704': 'sz399704', \r\n                '399616': 'sz399616', '000817': 'sh000817', '399303': 'sz399303', \r\n                '399629': 'sz399629', '399624': 'sz399624', '399009': 'sz399009', \r\n                '399233': 'sz399233', '399103': 'sz399103', '399242': 'sz399242', \r\n                '399627': 'sz399627', '000971': 'sh000971', '399679': 'sz399679', \r\n                '399912': 'sz399912', '000982': 'sh000982', '399668': 'sz399668', \r\n                '000096': 'sh000096', '399982': 'sz399982', '000849': 'sh000849', \r\n                '000148': 'sh000148', '399364': 'sz399364', '000912': 'sh000912', \r\n                '000129': 'sh000129', '000055': 'sh000055', '000047': 'sh000047', '399355': 'sz399355', '399622': 'sz399622', '000033': 'sh000033', '399640': 'sz399640', '000852': 'sh000852', '399966': 'sz399966', '399615': 'sz399615', '399802': 'sz399802', '399602': 'sz399602', '000105': 'sh000105', '399660': 'sz399660', '399672': 'sz399672', \r\n                '399913': 'sz399913', '399420': 'sz399420', '000159': 'sh000159', '399314': 'sz399314', '399652': 'sz399652', \r\n                '399369': 'sz399369', '000913': 'sh000913', '000065': 'sh000065', \r\n                '000808': 'sh000808', '399386': 'sz399386', '399100': 'sz399100', \r\n                '000997': 'sh000997', '000990': 'sh000990', '000093': 'sh000093', '399637': 'sz399637', '399439': 'sz399439', '399306': 'sz399306', '000855': 'sh000855', '000123': 'sh000123', '399623': 'sz399623', \r\n                '399312': 'sz399312', '399249': 'sz399249', '399311': 'sz399311', '399975': 'sz399975', '399356': 'sz399356', \r\n                '399400': 'sz399400', '399676': 'sz399676', '000136': 'sh000136', '399361': 'sz399361', '399974': 'sz399974', '399995': 'sz399995', '399316': 'sz399316', '399701': 'sz399701', '000300': 'sh000300', '000030': 'sh000030', '000976': 'sh000976', '399686': 'sz399686', '399108': 'sz399108', '399374': 'sz399374', \r\n                '000906': 'sh000906', '399707': 'sz399707', '000064': 'sh000064', '399633': 'sz399633', '399300': 'sz399300', '399628': 'sz399628', '399398': 'sz399398', '000034': 'sh000034', \r\n                '399644': 'sz399644', '399905': 'sz399905', '399626': 'sz399626', \r\n                '399625': 'sz399625', '000978': 'sh000978', '399664': 'sz399664', '399682': 'sz399682', '399322': 'sz399322', '000158': 'sh000158', '000842': 'sh000842', '399550': 'sz399550', '399423': 'sz399423', '399978': 'sz399978', '399996': 'sz399996', '000905': 'sh000905', \r\n                '000007': 'sh000007', '000827': 'sh000827', '399655': 'sz399655', '399401': 'sz399401', '399650': 'sz399650', '000963': 'sh000963', '399661': 'sz399661', '399922': 'sz399922', '000091': 'sh000091', '399375': 'sz399375', '000922': 'sh000922', '399702': 'sz399702', '399963': 'sz399963', '399011': 'sz399011', '399012': 'sz399012', \r\n                '399383': 'sz399383', '399657': 'sz399657', '399910': 'sz399910', '399351': 'sz399351', '000910': 'sh000910', '000051': 'sh000051', '399376': 'sz399376', '399639': 'sz399639', '000821': 'sh000821', '399360': 'sz399360', '399604': 'sz399604', '399315': 'sz399315', '399658': 'sz399658', '000135': 'sh000135', \r\n                '000059': 'sh000059', '399006': 'sz399006', \r\n                '399320': 'sz399320', '000991': 'sh000991', '399606': 'sz399606', \r\n                '399428': 'sz399428', '399406': 'sz399406', '399630': 'sz399630', '000802': 'sh000802', '399803': 'sz399803', '000071': 'sh000071', '399358': 'sz399358', \r\n                '399013': 'sz399013', '399385': 'sz399385', '399008': 'sz399008', '399649': 'sz399649', \r\n                '399673': 'sz399673', '399418': 'sz399418', '399370': 'sz399370', '000814': 'sh000814', \r\n                '399002': 'sz399002', '399814': 'sz399814', '399641': 'sz399641', '399001': 'sz399001', \r\n                '399662': 'sz399662', '399706': 'sz399706', '399932': 'sz399932', '000095': 'sh000095', '000932': 'sh000932', '399965': 'sz399965', '399363': 'sz399363', '399354': 'sz399354', '399638': 'sz399638', '399648': 'sz399648', '399608': 'sz399608', '000939': 'sh000939', '399939': 'sz399939', '399365': 'sz399365', '399382': 'sz399382', '399631': 'sz399631', '399612': 'sz399612', '399611': 'sz399611', '399645': 'sz399645', \r\n                '399324': 'sz399324', '399552': 'sz399552', '000858': 'sh000858', '000045': 'sh000045', \r\n                '000121': 'sh000121', '399703': 'sz399703', '399003': 'sz399003', \r\n                '399348': 'sz399348', '399389': 'sz399389', '399007': 'sz399007', '399391': 'sz399391', '000973': 'sh000973', \r\n                '000984': 'sh000984', '000969': 'sh000969', '000952': 'sh000952', '399332': 'sz399332', '399952': 'sz399952', '399553': 'sz399553', '000856': 'sh000856', \r\n                '399969': 'sz399969', '399643': 'sz399643', '399402': 'sz399402', '399372': 'sz399372', '399632': 'sz399632', '399344': 'sz399344', '399808': 'sz399808', '399620': 'sz399620', '000103': 'sh000103', '399911': 'sz399911', '000993': 'sh000993', '000983': 'sh000983', '399687': 'sz399687', '399933': 'sz399933', '000933': 'sh000933', '399437': 'sz399437', '399433': 'sz399433', '000046': 'sh000046', '000911': 'sh000911', '000114': 'sh000114', '000049': 'sh000049', '399392': 'sz399392', '399653': 'sz399653', '000975': 'sh000975', '000044': 'sh000044', '399378': 'sz399378', '000828': 'sh000828', '399634': 'sz399634', \r\n                '399005': 'sz399005', '000162': 'sh000162', '399333': 'sz399333', '000122': 'sh000122', '399646': 'sz399646', '000077': 'sh000077', '000074': 'sh000074', '399656': 'sz399656', '399396': 'sz399396', '399415': 'sz399415', '399408': 'sz399408', '000115': 'sh000115', '000987': 'sh000987', '399362': 'sz399362', '000841': 'sh000841', '000141': 'sh000141', '000120': 'sh000120', '399992': 'sz399992', '000807': 'sh000807', '399350': 'sz399350', '000009': 'sh000009', '000998': 'sh000998', '399390': 'sz399390', '399405': 'sz399405', '000099': 'sh000099', '399337': 'sz399337', '000142': 'sh000142', '399419': 'sz399419', '399407': 'sz399407', '000909': 'sh000909', '000119': 'sh000119', '399909': 'sz399909', '399805': 'sz399805', '000996': 'sh000996', '000847': 'sh000847', '000130': 'sh000130', '399377': 'sz399377', '399388': 'sz399388', '399610': 'sz399610', '000958': 'sh000958', \r\n                '399958': 'sz399958', '000075': 'sh000075', '399346': 'sz399346', '000147': 'sh000147', '000132': 'sh000132', '000108': 'sh000108', '399642': 'sz399642', '000977': 'sh000977', '399689': 'sz399689', '399335': 'sz399335', '399977': 'sz399977', '399972': 'sz399972', '399970': 'sz399970', '399004': 'sz399004', '399341': 'sz399341', '399330': 'sz399330', '399917': 'sz399917', '000160': 'sh000160', '399432': 'sz399432', '399429': 'sz399429', '000917': 'sh000917', \r\n                '000128': 'sh000128', '000067': 'sh000067', '000079': 'sh000079', '399236': 'sz399236', '399994': 'sz399994', '399237': 'sz399237', '000966': 'sh000966', '000957': 'sh000957', '399328': 'sz399328', \r\n                '399353': 'sz399353', '399957': 'sz399957', '399412': 'sz399412', '000904': 'sh000904', '399904': 'sz399904', '399410': 'sz399410', '000027': 'sh000027', '399667': 'sz399667', '000857': 'sh000857', \r\n                '000131': 'sh000131', '000964': 'sh000964', '399339': 'sz399339', '399964': 'sz399964', '399991': 'sz399991', '399417': 'sz399417', '000146': 'sh000146', '399551': 'sz399551', '000137': 'sh000137', '000118': 'sh000118', '399976': 'sz399976', '000109': 'sh000109', '399681': 'sz399681', '399438': 'sz399438', '000117': 'sh000117', '399614': 'sz399614', '399669': 'sz399669', '000111': 'sh000111', '399670': 'sz399670', '000097': 'sh000097', '000106': 'sh000106', '000039': 'sh000039', '399935': 'sz399935', '000935': 'sh000935', '399813': 'sz399813', '000037': 'sh000037', '399811': 'sz399811', '399705': 'sz399705', '399556': 'sz399556', '000113': 'sh000113', '000072': 'sh000072', '399651': 'sz399651', '399617': 'sz399617', '399684': 'sz399684', '000041': 'sh000041', '399807': 'sz399807', '399959': 'sz399959', '399967': 'sz399967', '399326': 'sz399326', '399688': 'sz399688', '399368': 'sz399368', '399241': 'sz399241', '399696': 'sz399696', '000850': 'sh000850', '000110': 'sh000110', '399621': 'sz399621', '399243': 'sz399243', \r\n                '399973': 'sz399973', '399987': 'sz399987', '000112': 'sh000112', '399997': 'sz399997', \r\n                '000915': 'sh000915', '000916': 'sh000916',\r\n                'hkHSI':'hkHSI'}\r\nMKTS = {\r\n'TP': [1,  1,'临时股'],\r\n'OZ': [4, 12, '郑州商品期权'],\r\n'OD': [5, 12, '大连商品期权'],\r\n'OS': [6, 12, '上海商品期权'],\r\n'QQ': [8, 12, '上海个股期权'],\r\n'FH': [27, 5,    '香港指数'],\r\n'QZ': [28, 3,   '郑州商品'],\r\n'QD': [29, 3,    '大连商品'],\r\n'QS': [30,  3,  '上海期货'],\r\n'KH': [31,  2,  '香港主板'],\r\n'KR': [32,  2,  '香港权证'],\r\n'FU': [33,  8, '开放式基金'],\r\n'FB': [34,  9, '货币型基金'],\r\n'LC': [35,  8,'招商理财产品'],\r\n'LB': [36,  9,'招商货币产品'],\r\n'FW': [37, 11,  '国际指数'],\r\n'HG': [38, 10,'国内宏观指标'],\r\n'CH': [40, 11, '中国概念股'],\r\n'MG': [41, 11,'美股知名公司'],\r\n'HB': [43,  1, 'B股转H股'],\r\n'SB': [44,  1,  '股份转让'],\r\n'CZ': [47,  3,  '股指期货'],\r\n'KG': [48,  2, '香港创业板'],\r\n'KT': [49,  2,'香港信托基金'],\r\n'GY': [54,  6, '国债预发行'],\r\n'MA': [60,  3,'主力期货合约'],\r\n'ZZ': [62,  5,  '中证指数'],\r\n'GH': [71,  2,   '港股通'],\r\n'SZ': [0,   0, 'SHENZHEN'],\r\n'SH': [1,   1, 'SHANGHAI']\r\n}\r\nSLIST = ['180.153.18.170', '180.153.18.171', '202.108.253.130', '202.108.253.131', '60.191.117.167', '115.238.56.198', '218.75.126.9', '115.238.90.165',\r\n             '124.160.88.183', '60.12.136.250', '218.108.98.244', '218.108.47.69', '14.17.75.71', '180.153.39.51']\r\nXXLIST = ['61.152.107.141']\r\nXLIST = ['121.14.110.210', '119.147.212.76', '113.105.73.86', '119.147.171.211', '119.147.164.57', '119.147.164.58', '61.49.50.180', '61.49.50.181',\r\n         '61.135.142.85', '61.135.149.181', '114.80.80.210', '222.73.49.15', '221.194.181.176']\r\nT_PORT = 7709\r\nX_PORT = 7727\r\n\r\nimport sys\r\nPY3 = (sys.version_info[0] >= 3)\r\ndef _write_head():\r\n    sys.stdout.write(DATA_GETTING_TIPS)\r\n    sys.stdout.flush()\r\n\r\ndef _write_console():\r\n    sys.stdout.write(DATA_GETTING_FLAG)\r\n    sys.stdout.flush()\r\n    \r\ndef _write_tips(tip):\r\n    sys.stdout.write(DATA_ROWS_TIPS%tip)\r\n    sys.stdout.flush()\r\n\r\ndef _write_msg(msg):\r\n    sys.stdout.write(msg)\r\n    sys.stdout.flush()\r\n    \r\ndef _check_input(year, quarter):\r\n    if isinstance(year, str) or year < 1989 :\r\n        raise TypeError(DATE_CHK_MSG)\r\n    elif quarter is None or isinstance(quarter, str) or quarter not in [1, 2, 3, 4]:\r\n        raise TypeError(DATE_CHK_Q_MSG)\r\n    else:\r\n        return True\r\n    \r\ndef _check_lhb_input(last):\r\n    if last not in [5, 10, 30, 60]:\r\n        raise TypeError(LHB_MSG)\r\n    else:\r\n        return True\r\n\r\n\r\n\r\ndef _market_code(code):\r\n        code = str(code)\r\n        if code[0] in ['5', '6', '9'] or code[:3] in ['009', '100', '110', '112', \\\r\n                                                      '113', '120', '129', '181', \\\r\n                                                      '126', '201', '202', '203', \\\r\n                                                      '204', '190', '191']:\r\n            return 1\r\n        return 0\r\n\r\ndef _idx_market_code(code):\r\n        code = str(code)\r\n        if code[0] in ['0']:\r\n            return 1\r\n        if code[:3] in ['399']:\r\n            return 0\r\n        return code\r\n\r\n\r\ndef _code_to_symbol(code):\r\n    '''\r\n        生成symbol代码标志\r\n    '''\r\n    if code in INDEX_LABELS:\r\n        return INDEX_LIST[code]\r\n    elif code[:3] == 'gb_':\r\n        return code\r\n    else:\r\n        if len(code) != 6 :\r\n            return code\r\n        else:\r\n            return 'sh%s'%code if code[:1] in ['5', '6', '9'] or code[:2] in ['11', '13'] else 'sz%s'%code\r\n\r\n        \r\ndef _code_to_symbol_dgt(code):\r\n    '''\r\n        生成symbol代码标志\r\n    '''\r\n    if code in INDEX_LABELS:\r\n        return INDEX_LIST[code]\r\n    else:\r\n        if len(code) != 6 :\r\n            return code\r\n        else:\r\n            return '0%s'%code if code[:1] in ['5', '6', '9'] else '1%s'%code\r\n\r\n\r\ndef _get_server():\r\n    import random\r\n    ips = SLIST\r\n    random.shuffle(ips)\r\n    return ips[0]\r\n\r\ndef _get_xserver():\r\n    import random\r\n    ips = XLIST\r\n    random.shuffle(ips)\r\n    return ips[0]\r\n\r\ndef _get_xxserver():\r\n    import random\r\n    ips = XXLIST\r\n    random.shuffle(ips)\r\n    return ips[0]"
  },
  {
    "path": "tushare/stock/fundamental.py",
    "content": "# -*- coding:utf-8 -*- \r\n\"\"\"\r\n基本面数据接口 \r\nCreated on 2015/01/18\r\n@author: Jimmy Liu\r\n@group : waditu\r\n@contact: jimmysoa@sina.cn\r\n\"\"\"\r\nimport pandas as pd\r\nfrom tushare.stock import cons as ct\r\nimport lxml.html\r\nfrom lxml import etree\r\nimport re\r\nimport time\r\nfrom pandas.compat import StringIO\r\nfrom tushare.util import dateu as du\r\ntry:\r\n    from urllib.request import urlopen, Request\r\nexcept ImportError:\r\n    from urllib2 import urlopen, Request\r\n\r\ndef get_stock_basics(date=None):\r\n    \"\"\"\r\n        获取沪深上市公司基本情况\r\n    Parameters\r\n    date:日期YYYY-MM-DD，默认为上一个交易日，目前只能提供2016-08-09之后的历史数据\r\n\r\n    Return\r\n    --------\r\n    DataFrame\r\n               code,代码\r\n               name,名称\r\n               industry,细分行业\r\n               area,地区\r\n               pe,市盈率\r\n               outstanding,流通股本\r\n               totals,总股本(万)\r\n               totalAssets,总资产(万)\r\n               liquidAssets,流动资产\r\n               fixedAssets,固定资产\r\n               reserved,公积金\r\n               reservedPerShare,每股公积金\r\n               eps,每股收益\r\n               bvps,每股净资\r\n               pb,市净率\r\n               timeToMarket,上市日期\r\n    \"\"\"\r\n    wdate = du.last_tddate() if date is None else date\r\n    wdate = wdate.replace('-', '')\r\n    if wdate < '20160809':\r\n        return None\r\n    datepre = '' if date is None else wdate[0:4] + wdate[4:6] + '/'\r\n    request = Request(ct.ALL_STOCK_BASICS_FILE%(datepre, '' if date is None else wdate))\r\n    text = urlopen(request, timeout=10).read()\r\n    text = text.decode('GBK')\r\n    text = text.replace('--', '')\r\n    df = pd.read_csv(StringIO(text), dtype={'code':'object'})\r\n    df = df.set_index('code')\r\n    return df\r\n\r\n\r\ndef get_report_data(year, quarter):\r\n    \"\"\"\r\n        获取业绩报表数据\r\n    Parameters\r\n    --------\r\n    year:int 年度 e.g:2014\r\n    quarter:int 季度 :1、2、3、4，只能输入这4个季度\r\n       说明：由于是从网站获取的数据，需要一页页抓取，速度取决于您当前网络速度\r\n       \r\n    Return\r\n    --------\r\n    DataFrame\r\n        code,代码\r\n        name,名称\r\n        eps,每股收益\r\n        eps_yoy,每股收益同比(%)\r\n        bvps,每股净资产\r\n        roe,净资产收益率(%)\r\n        epcf,每股现金流量(元)\r\n        net_profits,净利润(万元)\r\n        profits_yoy,净利润同比(%)\r\n        distrib,分配方案\r\n        report_date,发布日期\r\n    \"\"\"\r\n    if ct._check_input(year,quarter) is True:\r\n        ct._write_head()\r\n        df =  _get_report_data(year, quarter, 1, pd.DataFrame())\r\n        if df is not None:\r\n#             df = df.drop_duplicates('code')\r\n            df['code'] = df['code'].map(lambda x:str(x).zfill(6))\r\n        return df\r\n\r\n\r\ndef _get_report_data(year, quarter, pageNo, dataArr,\r\n                     retry_count=3, pause=0.001):\r\n    ct._write_console()\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            request = Request(ct.REPORT_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], ct.PAGES['fd'],\r\n                             year, quarter, pageNo, ct.PAGE_NUM[1]))\r\n            text = urlopen(request, timeout=10).read()\r\n            text = text.decode('GBK')\r\n            text = text.replace('--', '')\r\n            html = lxml.html.parse(StringIO(text))\r\n            res = html.xpath(\"//table[@class=\\\"list_table\\\"]/tr\")\r\n            if ct.PY3:\r\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\r\n            else:\r\n                sarr = [etree.tostring(node) for node in res]\r\n            sarr = ''.join(sarr)\r\n            sarr = '<table>%s</table>'%sarr\r\n            df = pd.read_html(sarr)[0]\r\n            df = df.drop(11, axis=1)\r\n            df.columns = ct.REPORT_COLS\r\n            dataArr = dataArr.append(df, ignore_index=True)\r\n            nextPage = html.xpath('//div[@class=\\\"pages\\\"]/a[last()]/@onclick')\r\n            if len(nextPage)>0:\r\n                pageNo = re.findall(r'\\d+', nextPage[0])[0]\r\n                return _get_report_data(year, quarter, pageNo, dataArr)\r\n            else:\r\n                return dataArr\r\n        except Exception as e:\r\n            pass\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef get_profit_data(year, quarter):\r\n    \"\"\"\r\n        获取盈利能力数据\r\n    Parameters\r\n    --------\r\n    year:int 年度 e.g:2014\r\n    quarter:int 季度 :1、2、3、4，只能输入这4个季度\r\n       说明：由于是从网站获取的数据，需要一页页抓取，速度取决于您当前网络速度\r\n       \r\n    Return\r\n    --------\r\n    DataFrame\r\n        code,代码\r\n        name,名称\r\n        roe,净资产收益率(%)\r\n        net_profit_ratio,净利率(%)\r\n        gross_profit_rate,毛利率(%)\r\n        net_profits,净利润(万元)\r\n        eps,每股收益\r\n        business_income,营业收入(百万元)\r\n        bips,每股主营业务收入(元)\r\n    \"\"\"\r\n    if ct._check_input(year, quarter) is True:\r\n        ct._write_head()\r\n        data =  _get_profit_data(year, quarter, 1, pd.DataFrame())\r\n        if data is not None:\r\n#             data = data.drop_duplicates('code')\r\n            data['code'] = data['code'].map(lambda x:str(x).zfill(6))\r\n        return data\r\n\r\n\r\ndef _get_profit_data(year, quarter, pageNo, dataArr,\r\n                     retry_count=3, pause=0.001):\r\n    ct._write_console()\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            request = Request(ct.PROFIT_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'],\r\n                                                  ct.PAGES['fd'], year,\r\n                                                  quarter, pageNo, ct.PAGE_NUM[1]))\r\n            text = urlopen(request, timeout=10).read()\r\n            text = text.decode('GBK')\r\n            text = text.replace('--', '')\r\n            html = lxml.html.parse(StringIO(text))\r\n            res = html.xpath(\"//table[@class=\\\"list_table\\\"]/tr\")\r\n            if ct.PY3:\r\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\r\n            else:\r\n                sarr = [etree.tostring(node) for node in res]\r\n            sarr = ''.join(sarr)\r\n            sarr = '<table>%s</table>'%sarr\r\n            df = pd.read_html(sarr)[0]\r\n            df.columns=ct.PROFIT_COLS\r\n            dataArr = dataArr.append(df, ignore_index=True)\r\n            nextPage = html.xpath('//div[@class=\\\"pages\\\"]/a[last()]/@onclick')\r\n            if len(nextPage)>0:\r\n                pageNo = re.findall(r'\\d+', nextPage[0])[0]\r\n                return _get_profit_data(year, quarter, pageNo, dataArr)\r\n            else:\r\n                return dataArr\r\n        except:\r\n            pass\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef get_operation_data(year, quarter):\r\n    \"\"\"\r\n        获取营运能力数据\r\n    Parameters\r\n    --------\r\n    year:int 年度 e.g:2014\r\n    quarter:int 季度 :1、2、3、4，只能输入这4个季度\r\n       说明：由于是从网站获取的数据，需要一页页抓取，速度取决于您当前网络速度\r\n       \r\n    Return\r\n    --------\r\n    DataFrame\r\n        code,代码\r\n        name,名称\r\n        arturnover,应收账款周转率(次)\r\n        arturndays,应收账款周转天数(天)\r\n        inventory_turnover,存货周转率(次)\r\n        inventory_days,存货周转天数(天)\r\n        currentasset_turnover,流动资产周转率(次)\r\n        currentasset_days,流动资产周转天数(天)\r\n    \"\"\"\r\n    if ct._check_input(year, quarter) is True:\r\n        ct._write_head()\r\n        data =  _get_operation_data(year, quarter, 1, pd.DataFrame())\r\n        if data is not None:\r\n#             data = data.drop_duplicates('code')\r\n            data['code'] = data['code'].map(lambda x:str(x).zfill(6))\r\n        return data\r\n\r\n\r\ndef _get_operation_data(year, quarter, pageNo, dataArr,\r\n                        retry_count=3, pause=0.001):\r\n    ct._write_console()\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            request = Request(ct.OPERATION_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'],\r\n                                                     ct.PAGES['fd'], year,\r\n                                                     quarter, pageNo, ct.PAGE_NUM[1]))\r\n            text = urlopen(request, timeout=10).read()\r\n            text = text.decode('GBK')\r\n            text = text.replace('--', '')\r\n            html = lxml.html.parse(StringIO(text))\r\n            res = html.xpath(\"//table[@class=\\\"list_table\\\"]/tr\")\r\n            if ct.PY3:\r\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\r\n            else:\r\n                sarr = [etree.tostring(node) for node in res]\r\n            sarr = ''.join(sarr)\r\n            sarr = '<table>%s</table>'%sarr\r\n            df = pd.read_html(sarr)[0]\r\n            df.columns=ct.OPERATION_COLS\r\n            dataArr = dataArr.append(df, ignore_index=True)\r\n            nextPage = html.xpath('//div[@class=\\\"pages\\\"]/a[last()]/@onclick')\r\n            if len(nextPage)>0:\r\n                pageNo = re.findall(r'\\d+', nextPage[0])[0]\r\n                return _get_operation_data(year, quarter, pageNo, dataArr)\r\n            else:\r\n                return dataArr\r\n        except Exception as e:\r\n            pass\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef get_growth_data(year, quarter):\r\n    \"\"\"\r\n        获取成长能力数据\r\n    Parameters\r\n    --------\r\n    year:int 年度 e.g:2014\r\n    quarter:int 季度 :1、2、3、4，只能输入这4个季度\r\n       说明：由于是从网站获取的数据，需要一页页抓取，速度取决于您当前网络速度\r\n       \r\n    Return\r\n    --------\r\n    DataFrame\r\n        code,代码\r\n        name,名称\r\n        mbrg,主营业务收入增长率(%)\r\n        nprg,净利润增长率(%)\r\n        nav,净资产增长率\r\n        targ,总资产增长率\r\n        epsg,每股收益增长率\r\n        seg,股东权益增长率\r\n    \"\"\"\r\n    if ct._check_input(year, quarter) is True:\r\n        ct._write_head()\r\n        data =  _get_growth_data(year, quarter, 1, pd.DataFrame())\r\n        if data is not None:\r\n#             data = data.drop_duplicates('code')\r\n            data['code'] = data['code'].map(lambda x:str(x).zfill(6))\r\n        return data\r\n\r\n\r\ndef _get_growth_data(year, quarter, pageNo, dataArr, \r\n                     retry_count=3, pause=0.001):\r\n    ct._write_console()\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            request = Request(ct.GROWTH_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'],\r\n                                                  ct.PAGES['fd'], year,\r\n                                                  quarter, pageNo, ct.PAGE_NUM[1]))\r\n            text = urlopen(request, timeout=50).read()\r\n            text = text.decode('GBK')\r\n            text = text.replace('--', '')\r\n            html = lxml.html.parse(StringIO(text))\r\n            res = html.xpath(\"//table[@class=\\\"list_table\\\"]/tr\")\r\n            if ct.PY3:\r\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\r\n            else:\r\n                sarr = [etree.tostring(node) for node in res]\r\n            sarr = ''.join(sarr)\r\n            sarr = '<table>%s</table>'%sarr\r\n            df = pd.read_html(sarr)[0]\r\n            df.columns=ct.GROWTH_COLS\r\n            dataArr = dataArr.append(df, ignore_index=True)\r\n            nextPage = html.xpath('//div[@class=\\\"pages\\\"]/a[last()]/@onclick')\r\n            if len(nextPage)>0:\r\n                pageNo = re.findall(r'\\d+', nextPage[0])[0]\r\n                return _get_growth_data(year, quarter, pageNo, dataArr)\r\n            else:\r\n                return dataArr\r\n        except Exception as e:\r\n            pass\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef get_debtpaying_data(year, quarter):\r\n    \"\"\"\r\n        获取偿债能力数据\r\n    Parameters\r\n    --------\r\n    year:int 年度 e.g:2014\r\n    quarter:int 季度 :1、2、3、4，只能输入这4个季度\r\n       说明：由于是从网站获取的数据，需要一页页抓取，速度取决于您当前网络速度\r\n       \r\n    Return\r\n    --------\r\n    DataFrame\r\n        code,代码\r\n        name,名称\r\n        currentratio,流动比率\r\n        quickratio,速动比率\r\n        cashratio,现金比率\r\n        icratio,利息支付倍数\r\n        sheqratio,股东权益比率\r\n        adratio,股东权益增长率\r\n    \"\"\"\r\n    if ct._check_input(year, quarter) is True:\r\n        ct._write_head()\r\n        df =  _get_debtpaying_data(year, quarter, 1, pd.DataFrame())\r\n        if df is not None:\r\n#             df = df.drop_duplicates('code')\r\n            df['code'] = df['code'].map(lambda x:str(x).zfill(6))\r\n        return df\r\n\r\n\r\ndef _get_debtpaying_data(year, quarter, pageNo, dataArr,\r\n                         retry_count=3, pause=0.001):\r\n    ct._write_console()\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            request = Request(ct.DEBTPAYING_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'],\r\n                                                      ct.PAGES['fd'], year,\r\n                                                      quarter, pageNo, ct.PAGE_NUM[1]))\r\n            text = urlopen(request, timeout=10).read()\r\n            text = text.decode('GBK')\r\n            html = lxml.html.parse(StringIO(text))\r\n            res = html.xpath(\"//table[@class=\\\"list_table\\\"]/tr\")\r\n            if ct.PY3:\r\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\r\n            else:\r\n                sarr = [etree.tostring(node) for node in res]\r\n            sarr = ''.join(sarr)\r\n            sarr = '<table>%s</table>'%sarr\r\n            df = pd.read_html(sarr)[0]\r\n            df.columns = ct.DEBTPAYING_COLS\r\n            dataArr = dataArr.append(df, ignore_index=True)\r\n            nextPage = html.xpath('//div[@class=\\\"pages\\\"]/a[last()]/@onclick')\r\n            if len(nextPage)>0:\r\n                pageNo = re.findall(r'\\d+', nextPage[0])[0]\r\n                return _get_debtpaying_data(year, quarter, pageNo, dataArr)\r\n            else:\r\n                return dataArr\r\n        except Exception as e:\r\n            pass\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n \r\n \r\ndef get_cashflow_data(year, quarter):\r\n    \"\"\"\r\n        获取现金流量数据\r\n    Parameters\r\n    --------\r\n    year:int 年度 e.g:2014\r\n    quarter:int 季度 :1、2、3、4，只能输入这4个季度\r\n       说明：由于是从网站获取的数据，需要一页页抓取，速度取决于您当前网络速度\r\n       \r\n    Return\r\n    --------\r\n    DataFrame\r\n        code,代码\r\n        name,名称\r\n        cf_sales,经营现金净流量对销售收入比率\r\n        rateofreturn,资产的经营现金流量回报率\r\n        cf_nm,经营现金净流量与净利润的比率\r\n        cf_liabilities,经营现金净流量对负债比率\r\n        cashflowratio,现金流量比率\r\n    \"\"\"\r\n    if ct._check_input(year, quarter) is True:\r\n        ct._write_head()\r\n        df =  _get_cashflow_data(year, quarter, 1, pd.DataFrame())\r\n        if df is not None:\r\n#             df = df.drop_duplicates('code')\r\n            df['code'] = df['code'].map(lambda x:str(x).zfill(6))\r\n        return df\r\n\r\n\r\ndef _get_cashflow_data(year, quarter, pageNo, dataArr,\r\n                       retry_count=3, pause=0.001):\r\n    ct._write_console()\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            request = Request(ct.CASHFLOW_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'],\r\n                                                    ct.PAGES['fd'], year,\r\n                                                    quarter, pageNo, ct.PAGE_NUM[1]))\r\n            text = urlopen(request, timeout=10).read()\r\n            text = text.decode('GBK')\r\n            text = text.replace('--', '')\r\n            html = lxml.html.parse(StringIO(text))\r\n            res = html.xpath(\"//table[@class=\\\"list_table\\\"]/tr\")\r\n            if ct.PY3:\r\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\r\n            else:\r\n                sarr = [etree.tostring(node) for node in res]\r\n            sarr = ''.join(sarr)\r\n            sarr = '<table>%s</table>'%sarr\r\n            df = pd.read_html(sarr)[0]\r\n            df.columns = ct.CASHFLOW_COLS\r\n            dataArr = dataArr.append(df, ignore_index=True)\r\n            nextPage = html.xpath('//div[@class=\\\"pages\\\"]/a[last()]/@onclick')\r\n            if len(nextPage)>0:\r\n                pageNo = re.findall(r'\\d+', nextPage[0])[0]\r\n                return _get_cashflow_data(year, quarter, pageNo, dataArr)\r\n            else:\r\n                return dataArr\r\n        except Exception as e:\r\n            pass\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n       \r\n       \r\ndef _data_path():\r\n    import os\r\n    import inspect\r\n    caller_file = inspect.stack()[1][1]  \r\n    pardir = os.path.abspath(os.path.join(os.path.dirname(caller_file), os.path.pardir))\r\n    return os.path.abspath(os.path.join(pardir, os.path.pardir))\r\n  \r\n\r\ndef get_balance_sheet(code):\r\n    \"\"\"\r\n        获取某股票的历史所有时期资产负债表\r\n    Parameters\r\n    --------\r\n    code:str 股票代码 e.g:600518\r\n       \r\n    Return\r\n    --------\r\n    DataFrame\r\n        行列名称为中文且数目较多，建议获取数据后保存到本地查看\r\n    \"\"\"\r\n    if code.isdigit():\r\n        request = Request(ct.SINA_BALANCESHEET_URL%(code))\r\n        text = urlopen(request, timeout=10).read()\r\n        text = text.decode('GBK')\r\n        text = text.replace('\\t\\n', '\\r\\n')\r\n        text = text.replace('\\t', ',')\r\n        df = pd.read_csv(StringIO(text), dtype={'code':'object'})\r\n        return df\r\n\r\ndef get_profit_statement(code):\r\n    \"\"\"\r\n        获取某股票的历史所有时期利润表\r\n    Parameters\r\n    --------\r\n    code:str 股票代码 e.g:600518\r\n       \r\n    Return\r\n    --------\r\n    DataFrame\r\n        行列名称为中文且数目较多，建议获取数据后保存到本地查看\r\n    \"\"\"\r\n    if code.isdigit():\r\n        request = Request(ct.SINA_PROFITSTATEMENT_URL%(code))\r\n        text = urlopen(request, timeout=10).read()\r\n        text = text.decode('GBK')\r\n        text = text.replace('\\t\\n', '\\r\\n')\r\n        text = text.replace('\\t', ',')\r\n        df = pd.read_csv(StringIO(text), dtype={'code':'object'})\r\n        return df\r\n\r\n      \r\ndef get_cash_flow(code):\r\n    \"\"\"\r\n        获取某股票的历史所有时期现金流表\r\n    Parameters\r\n    --------\r\n    code:str 股票代码 e.g:600518\r\n       \r\n    Return\r\n    --------\r\n    DataFrame\r\n        行列名称为中文且数目较多，建议获取数据后保存到本地查看\r\n    \"\"\"\r\n    if code.isdigit():\r\n        request = Request(ct.SINA_CASHFLOW_URL%(code))\r\n        text = urlopen(request, timeout=10).read()\r\n        text = text.decode('GBK')\r\n        text = text.replace('\\t\\n', '\\r\\n')\r\n        text = text.replace('\\t', ',')\r\n        df = pd.read_csv(StringIO(text), dtype={'code':'object'})\r\n        return df\r\n\r\n"
  },
  {
    "path": "tushare/stock/globals.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*- \n\n'''\n全球市场\nCreated on 2016/11/27\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n'''\nimport pandas as pd\nfrom tushare.stock import cons as ct\nfrom tushare.util import dateu as du\ntry:\n    from urllib.request import urlopen, Request\nexcept ImportError:\n    from urllib2 import urlopen, Request\n\ndef global_realtime(symbols=None):\n    \"\"\"\n    全球实时指数\n    \"\"\"\n    symbols_list = ''\n    if symbols is None or symbols == '':\n        symbols_list = ct.GLOBAL_HQ_SYMBOL\n    else:\n        if isinstance(symbols, list) or isinstance(symbols, set) or isinstance(symbols, tuple) or isinstance(symbols, pd.Series):\n            for code in symbols:\n                symbols_list += 'znb_' + code + ','\n        else:\n            symbols_list = 'znb_' + symbols\n        symbols_list = symbols_list[:-1] if len(symbols_list) > 8 else symbols_list \n    request = Request(ct.LIVE_DATA_URL%(ct.P_TYPE['http'], ct.DOMAINS['sinahq'],\n                                                du._random(), symbols_list))\n    content = urlopen(request,timeout=10).readlines()\n    datalist = []\n    for cont in content:\n        arrs = []\n        cont = cont.decode('GBK')\n        cont = cont.split('=')\n        symbolstr = cont[0].split('_') \n        symbol = symbolstr[2]\n        vals = cont[1][1:-3]\n        valarr = vals.split(',')\n        if (symbol == 'sh000001') or (symbol == 'sz399001'):\n            price = float(valarr[3])\n            preclose = float(valarr[2])\n            chg = (price - preclose) / preclose * 100\n            arrs = [symbol, valarr[0], valarr[3],  price-preclose , chg, valarr[30] + ' ' + valarr[31]]\n        elif symbol == 'hkHSI':\n            arrs = [symbol, valarr[1], valarr[6], valarr[7], valarr[8], valarr[17].replace('/', '-') + ' ' + valarr[18] + ':00']\n        else:\n            arrs = [symbolstr[3], valarr[0], valarr[1], valarr[2], valarr[3], du.int2time(int(valarr[5]))]\n        datalist.append(arrs)\n    df = pd.DataFrame(datalist, columns=ct.GLOBAL_HQ_COLS)\n    return df\n\n"
  },
  {
    "path": "tushare/stock/indictor.py",
    "content": "# -*- coding:utf-8 -*-\n\n\"\"\"\n股票技术指标接口\nCreated on 2018/05/26\n@author: Jackie Liao\n@group : **\n@contact: info@liaocy.net\n\"\"\"\n\n\ndef ma(data, n=10, val_name=\"close\"):\n    import numpy as np\n\n    '''\n    移动平均线 Moving Average\n    Parameters\n    ------\n      data:pandas.DataFrame\n                  通过 get_h_data 取得的股票数据\n      n:int\n                  移动平均线时长，时间单位根据data决定\n      val_name:string\n                  计算哪一列的列名，默认为 close 收盘值\n\n    return\n    -------\n      list\n          移动平均线\n    '''\n\n    values = []\n    MA = []\n\n    for index, row in data.iterrows():\n        values.append(row[val_name])\n        if len(values) == n:\n            del values[0]\n\n        MA.append(np.average(values))\n\n    return np.asarray(MA)\n\n\ndef md(data, n=10, val_name=\"close\"):\n    import numpy as np\n\n    '''\n    移动标准差\n    Parameters\n    ------\n      data:pandas.DataFrame\n                  通过 get_h_data 取得的股票数据\n      n:int\n                  移动平均线时长，时间单位根据data决定\n      val_name:string\n                  计算哪一列的列名，默认为 close 收盘值\n\n    return\n    -------\n      list\n          移动平均线\n    '''\n\n    values = []\n    MD = []\n\n    for index, row in data.iterrows():\n        values.append(row[val_name])\n        if len(values) == n:\n            del values[0]\n\n        MD.append(np.std(values))\n\n    return np.asarray(MD)\n\n\ndef _get_day_ema(prices, n):\n    a = 1 - 2 / (n + 1)\n\n    day_ema = 0\n    for index, price in enumerate(reversed(prices)):\n        day_ema += a ** index * price\n\n    return day_ema\n\n\ndef ema(data, n=12, val_name=\"close\"):\n    import numpy as np\n    '''\n        指数平均数指标 Exponential Moving Average\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n          n:int\n                      移动平均线时长，时间单位根据data决定\n          val_name:string\n                      计算哪一列的列名，默认为 close 收盘值\n\n        return\n        -------\n          EMA:numpy.ndarray<numpy.float64>\n              指数平均数指标\n    '''\n\n    prices = []\n\n    EMA = []\n\n    for index, row in data.iterrows():\n        if index == 0:\n            past_ema = row[val_name]\n            EMA.append(row[val_name])\n        else:\n            # Y=[2*X+(N-1)*Y’]/(N+1)\n            today_ema = (2 * row[val_name] + (n - 1) * past_ema) / (n + 1)\n            past_ema = today_ema\n\n            EMA.append(today_ema)\n\n    return np.asarray(EMA)\n\n\ndef macd(data, quick_n=12, slow_n=26, dem_n=9, val_name=\"close\"):\n    import numpy as np\n    '''\n        指数平滑异同平均线(MACD: Moving Average Convergence Divergence)\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n          quick_n:int\n                      DIFF差离值中快速移动天数\n          slow_n:int\n                      DIFF差离值中慢速移动天数\n          dem_n:int\n                      DEM讯号线的移动天数\n          val_name:string\n                      计算哪一列的列名，默认为 close 收盘值\n\n        return\n        -------\n          OSC:numpy.ndarray<numpy.float64>\n              MACD bar / OSC 差值柱形图 DIFF - DEM\n          DIFF:numpy.ndarray<numpy.float64>\n              差离值\n          DEM:numpy.ndarray<numpy.float64>\n              讯号线\n    '''\n\n    ema_quick = np.asarray(ema(data, quick_n, val_name))\n    ema_slow = np.asarray(ema(data, slow_n, val_name))\n    DIFF = ema_quick - ema_slow\n    data[\"diff\"] = DIFF\n    DEM = ema(data, dem_n, \"diff\")\n    OSC = DIFF - DEM\n    return OSC, DIFF, DEM\n\n\ndef kdj(data):\n    import numpy as np\n    '''\n        随机指标KDJ\n        Parameters\n        ------\n          data:pandas.DataFrame\n                通过 get_h_data 取得的股票数据\n        return\n        -------\n          K:numpy.ndarray<numpy.float64>\n              K线\n          D:numpy.ndarray<numpy.float64>\n              D线\n          J:numpy.ndarray<numpy.float64>\n              J线\n    '''\n\n    K, D, J = [], [], []\n    last_k, last_d = None, None\n    for index, row in data.iterrows():\n        if last_k is None or last_d is None:\n            last_k = 50\n            last_d = 50\n\n        c, l, h = row[\"close\"], row[\"low\"], row[\"high\"]\n\n        rsv = (c - l) / (h - l) * 100\n\n        k = (2 / 3) * last_k + (1 / 3) * rsv\n        d = (2 / 3) * last_d + (1 / 3) * k\n        j = 3 * k - 2 * d\n\n        K.append(k)\n        D.append(d)\n        J.append(j)\n\n        last_k, last_d = k, d\n\n    return np.asarray(K), np.asarray(D), np.asarray(J)\n\n\ndef rsi(data, n=6, val_name=\"close\"):\n    import numpy as np\n\n    '''\n        相对强弱指标RSI\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n          n:int\n                统计时长，时间单位根据data决定\n        return\n        -------\n          RSI:numpy.ndarray<numpy.float64>\n              RSI线\n        \n    '''\n\n    RSI = []\n    UP = []\n    DOWN = []\n    for index, row in data.iterrows():\n        if index == 0:\n            past_value = row[val_name]\n            RSI.append(0)\n        else:\n            diff = row[val_name] - past_value\n            if diff > 0:\n                UP.append(diff)\n                DOWN.append(0)\n            else:\n                UP.append(0)\n                DOWN.append(diff)\n\n            if len(UP) == n:\n                del UP[0]\n            if len(DOWN) == n:\n                del DOWN[0]\n\n            past_value = row[val_name]\n\n            rsi = np.sum(UP) / (-np.sum(DOWN) + np.sum(UP)) * 100\n            RSI.append(rsi)\n\n    return np.asarray(RSI)\n\n\ndef boll(data, n=10, val_name=\"close\", k=2):\n    '''\n        布林线指标BOLL\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n          n:int\n                统计时长，时间单位根据data决定\n        return\n        -------\n          BOLL:numpy.ndarray<numpy.float64>\n              中轨线\n          UPPER:numpy.ndarray<numpy.float64>\n              D线\n          J:numpy.ndarray<numpy.float64>\n              J线\n    '''\n\n    BOLL = ma(data, n, val_name)\n\n    MD = md(data, n, val_name)\n\n    UPPER = BOLL + k * MD\n\n    LOWER = BOLL - k * MD\n\n    return BOLL, UPPER, LOWER\n\n\ndef wnr(data, n=14):\n    '''\n        威廉指标 w&r\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n          n:int\n                统计时长，时间单位根据data决定\n        return\n        -------\n          WNR:numpy.ndarray<numpy.float64>\n              威廉指标\n    '''\n\n    high_prices = []\n    low_prices = []\n    WNR = []\n\n    for index, row in data.iterrows():\n        high_prices.append(row[\"high\"])\n        if len(high_prices) == n:\n            del high_prices[0]\n        low_prices.append(row[\"low\"])\n        if len(low_prices) == n:\n            del low_prices[0]\n\n        highest = max(high_prices)\n        lowest = min(low_prices)\n\n        wnr = (highest - row[\"close\"]) / (highest - lowest) * 100\n        WNR.append(wnr)\n\n    return WNR\n\n\ndef _get_any_ma(arr, n):\n    import numpy as np\n    MA = []\n    values = []\n    for val in arr:\n        values.append(val)\n        if len(values) == n:\n            del values[0]\n        MA.append(np.average(values))\n    return np.asarray(MA)\n\n\ndef dmi(data, n=14, m=14, k=6):\n    import numpy as np\n\n    '''\n        动向指标或趋向指标 DMI\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n          n:int\n              +-DI(n): DI统计时长，默认14\n          m:int\n              ADX(m): ADX统计时常参数，默认14\n              \n          k:int\n              ADXR(k): ADXR统计k个周期前数据，默认6\n        return\n        -------\n          P_DI:numpy.ndarray<numpy.float64>\n              +DI指标\n          M_DI:numpy.ndarray<numpy.float64>\n              -DI指标\n          ADX:numpy.ndarray<numpy.float64>\n              ADX指标\n          ADXR:numpy.ndarray<numpy.float64>\n              ADXR指标\n        ref.\n        -------\n        https://www.mk-mode.com/octopress/2012/03/03/03002038/\n    '''\n\n    # 上升动向（+DM）\n    P_DM = [0.]\n    # 下降动向（-DM）\n    M_DM = [0.]\n    # 真实波幅TR\n    TR = [0.]\n    # 动向\n    DX = [0.]\n\n    P_DI = [0.]\n    M_DI = [0.]\n\n    for index, row in data.iterrows():\n        if index == 0:\n            past_row = row\n        else:\n\n            p_dm = row[\"high\"] - past_row[\"high\"]\n            m_dm = past_row[\"low\"] - row[\"low\"]\n\n            if (p_dm < 0 and m_dm < 0) or (np.isclose(p_dm, m_dm)):\n                p_dm = 0\n                m_dm = 0\n            if p_dm > m_dm:\n                m_dm = 0\n            if m_dm > p_dm:\n                p_dm = 0\n\n            P_DM.append(p_dm)\n            M_DM.append(m_dm)\n\n            tr = max(row[\"high\"] - past_row[\"low\"], row[\"high\"] - past_row[\"close\"], past_row[\"close\"] - row[\"low\"])\n            TR.append(tr)\n\n            if len(P_DM) == n:\n                del P_DM[0]\n            if len(M_DM) == n:\n                del M_DM[0]\n            if len(TR) == n:\n                del TR[0]\n\n            # 上升方向线(+DI)\n            p_di = (np.average(P_DM) / np.average(TR)) * 100\n            P_DI.append(p_di)\n\n            # 下降方向线(-DI)\n            m_di = (np.average(M_DM) / np.average(TR)) * 100\n            M_DI.append(m_di)\n\n            # 当日+DI与-DI\n            # p_day_di = (p_dm / tr) * 100\n            # m_day_di = (m_dm / tr) * 100\n\n            # 动向DX\n            #     dx=(di dif÷di sum) ×100\n            # 　　di dif为上升指标和下降指标的价差的绝对值\n            # 　　di sum为上升指标和下降指标的总和\n            # 　　adx就是dx的一定周期n的移动平均值。\n            if (p_di + m_di) == 0:\n                dx = 0\n            else:\n                dx = (abs(p_di - m_di) / (p_di + m_di)) * 100\n            DX.append(dx)\n\n            past_row = row\n\n    ADX = _get_any_ma(DX, m)\n    #\n    # # 估计数值ADXR\n    ADXR = []\n    for index, adx in enumerate(ADX):\n        if index >= k:\n            adxr = (adx + ADX[index - k]) / 2\n            ADXR.append(adxr)\n        else:\n            ADXR.append(0)\n\n    return P_DI, M_DI, ADX, ADXR\n\n\ndef bias(data, n=5):\n    import numpy as np\n    '''\n        乖离率 bias\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n          n:int\n              统计时长，默认5\n        return\n        -------\n          BIAS:numpy.ndarray<numpy.float64>\n              乖离率指标\n\n    '''\n\n    MA = ma(data, n)\n    CLOSES = data[\"close\"]\n    BIAS = (np.true_divide((CLOSES - MA), MA)) * (100 / 100)\n    return BIAS\n\n\ndef asi(data, n=5):\n    import numpy as np\n    '''\n        振动升降指标 ASI\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n          n:int\n              统计时长，默认5\n        return\n        -------\n          ASI:numpy.ndarray<numpy.float64>\n              振动升降指标\n\n    '''\n\n    SI = []\n    for index, row in data.iterrows():\n        if index == 0:\n            last_row = row\n            SI.append(0.)\n        else:\n\n            a = abs(row[\"close\"] - last_row[\"close\"])\n            b = abs(row[\"low\"] - last_row[\"close\"])\n            c = abs(row[\"high\"] - last_row[\"close\"])\n            d = abs(last_row[\"close\"] - last_row[\"open\"])\n\n            if b > a and b > c:\n                r = b + (1 / 2) * a + (1 / 4) * d\n            elif c > a and c > b:\n                r = c + (1 / 4) * d\n            else:\n                r = 0\n\n            e = row[\"close\"] - last_row[\"close\"]\n            f = row[\"close\"] - last_row[\"open\"]\n            g = last_row[\"close\"] - last_row[\"open\"]\n\n            x = e + (1 / 2) * f + g\n            k = max(a, b)\n            l = 3\n\n            if np.isclose(r, 0) or np.isclose(l, 0):\n                si = 0\n            else:\n                si = 50 * (x / r) * (k / l)\n\n            SI.append(si)\n\n    ASI = _get_any_ma(SI, n)\n    return ASI\n\n\ndef vr(data, n=26):\n    import numpy as np\n    '''\n        Volatility Volume Ratio 成交量变异率\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n          n:int\n              统计时长，默认26\n        return\n        -------\n          VR:numpy.ndarray<numpy.float64>\n              成交量变异率\n\n    '''\n    VR = []\n\n    AV_volumes, BV_volumes, CV_volumes = [], [], []\n    for index, row in data.iterrows():\n\n        if row[\"close\"] > row[\"open\"]:\n            AV_volumes.append(row[\"volume\"])\n        elif row[\"close\"] < row[\"open\"]:\n            BV_volumes.append(row[\"volume\"])\n        else:\n            CV_volumes.append(row[\"volume\"])\n\n        if len(AV_volumes) == n:\n            del AV_volumes[0]\n        if len(BV_volumes) == n:\n            del BV_volumes[0]\n        if len(CV_volumes) == n:\n            del CV_volumes[0]\n\n        avs = sum(AV_volumes)\n        bvs = sum(BV_volumes)\n        cvs = sum(CV_volumes)\n\n        if (bvs + (1 / 2) * cvs) != 0:\n            vr = (avs + (1 / 2) * cvs) / (bvs + (1 / 2) * cvs)\n        else:\n            vr = 0\n\n        VR.append(vr)\n\n    return np.asarray(VR)\n\n\ndef arbr(data, n=26):\n    import numpy as np\n\n    '''\n        AR 指标 BR指标\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n          n:int\n              统计时长，默认26\n        return\n        -------\n          AR:numpy.ndarray<numpy.float64>\n              AR指标\n          BR:numpy.ndarray<numpy.float64>\n              BR指标\n\n    '''\n\n    H, L, O, PC = np.array([0]), np.array([0]), np.array([0]), np.array([0])\n\n    AR, BR = np.array([0]), np.array([0])\n\n    for index, row in data.iterrows():\n        if index == 0:\n            last_row = row\n\n        else:\n\n            h = row[\"high\"]\n            H = np.append(H, [h])\n            if len(H) == n:\n                H = np.delete(H, 0)\n            l = row[\"low\"]\n            L = np.append(L, [l])\n            if len(L) == n:\n                L = np.delete(L, 0)\n            o = row[\"open\"]\n            O = np.append(O, [o])\n            if len(O) == n:\n                O = np.delete(O, 0)\n            pc = last_row[\"close\"]\n            PC = np.append(PC, [pc])\n            if len(PC) == n:\n                PC = np.delete(PC, 0)\n\n            ar = (np.sum(np.asarray(H) - np.asarray(O)) / sum(np.asarray(O) - np.asarray(L))) * 100\n            AR = np.append(AR, [ar])\n            br = (np.sum(np.asarray(H) - np.asarray(PC)) / sum(np.asarray(PC) - np.asarray(L))) * 100\n            BR = np.append(BR, [br])\n\n            last_row = row\n\n    return np.asarray(AR), np.asarray(BR)\n\n\ndef dpo(data, n=20, m=6):\n    '''\n        区间震荡线指标 DPO\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n          n:int\n              统计时长，默认20\n          m:int\n              MADPO的参数M，默认6\n        return\n        -------\n          DPO:numpy.ndarray<numpy.float64>\n              DPO指标\n          MADPO:numpy.ndarray<numpy.float64>\n              MADPO指标\n\n    '''\n\n    CLOSES = data[\"close\"]\n    DPO = CLOSES - ma(data, int(n / 2 + 1))\n    MADPO = _get_any_ma(DPO, m)\n    return DPO, MADPO\n\n\ndef trix(data, n=12, m=20):\n    import numpy as np\n\n    '''\n        三重指数平滑平均线 TRIX\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n          n:int\n              统计时长，默认12\n          m:int\n              TRMA的参数M，默认20\n        return\n        -------\n          TRIX:numpy.ndarray<numpy.float64>\n              AR指标\n          TRMA:numpy.ndarray<numpy.float64>\n              BR指标\n\n    '''\n\n    CLOSES = []\n\n    TRIX = []\n    for index, row in data.iterrows():\n        CLOSES.append(row[\"close\"])\n\n        if len(CLOSES) == n:\n            del CLOSES[0]\n\n        tr = np.average(CLOSES)\n\n        if index == 0:\n            past_tr = tr\n            TRIX.append(0)\n        else:\n\n            trix = (tr - past_tr) / past_tr * 100\n            TRIX.append(trix)\n\n    TRMA = _get_any_ma(TRIX, m)\n\n    return TRIX, TRMA\n\n\ndef bbi(data):\n    import numpy as np\n\n    '''\n        Bull And Bearlndex 多空指标\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n        return\n        -------\n          BBI:numpy.ndarray<numpy.float64>\n              BBI指标\n\n    '''\n\n    CS = []\n    BBI = []\n    for index, row in data.iterrows():\n        CS.append(row[\"close\"])\n\n        if len(CS) < 24:\n            BBI.append(row[\"close\"])\n        else:\n            bbi = np.average([np.average(CS[-3:]), np.average(CS[-6:]), np.average(CS[-12:]), np.average(CS[-24:])])\n            BBI.append(bbi)\n\n    return np.asarray(BBI)\n\n\ndef mtm(data, n=6):\n    import numpy as np\n    '''\n        Momentum Index 动量指标\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n          n:int\n              统计时长，默认6\n        return\n        -------\n          MTM:numpy.ndarray<numpy.float64>\n              MTM动量指标\n\n    '''\n\n    MTM = []\n    CN = []\n    for index, row in data.iterrows():\n        if index < n - 1:\n            MTM.append(0.)\n        else:\n            mtm = row[\"close\"] - CN[index - n]\n            MTM.append(mtm)\n        CN.append(row[\"close\"])\n    return np.asarray(MTM)\n\n\ndef obv(data):\n    import numpy as np\n\n    '''\n        On Balance Volume 能量潮指标\n        Parameters\n        ------\n          data:pandas.DataFrame\n                      通过 get_h_data 取得的股票数据\n        return\n        -------\n          OBV:numpy.ndarray<numpy.float64>\n              OBV能量潮指标\n\n    '''\n\n    tmp = np.true_divide(((data[\"close\"] - data[\"low\"]) - (data[\"high\"] - data[\"close\"])), (data[\"high\"] - data[\"low\"]))\n    OBV = tmp * data[\"volume\"]\n    return OBV\n\n\ndef sar(data, n=4):\n    raise Exception(\"Not implemented yet\")\n\n\ndef plot_all(data, is_show=True, output=None):\n    import matplotlib.pyplot as plt\n    from pylab import rcParams\n    import numpy as np\n    rcParams['figure.figsize'] = 18, 50\n\n    plt.figure()\n    # 收盘价\n    plt.subplot(20, 1, 1)\n    plt.plot(data[\"date\"], data[\"close\"], label=\"close\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 移动平均线\n    plt.subplot(20, 1, 2)\n    MA = ma(data, n=10)\n    plt.plot(data[\"date\"], MA, label=\"MA(n=10)\")\n    plt.plot(data[\"date\"], data[\"close\"], label=\"CLOSE PRICE\")\n    plt.title(\"MA\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 移动标准差\n    n = 10\n    plt.subplot(20, 1, 3)\n    MD = md(data, n)\n    plt.plot(data[\"date\"], MD, label=\"MD(n=10)\")\n    plt.title(\"MD\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 指数平均数指标\n    plt.subplot(20, 1, 4)\n    EMA = ema(data, n)\n    plt.plot(data[\"date\"], EMA, label=\"EMA(n=12)\")\n    plt.title(\"EMA\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 指数平滑异同平均线(MACD: Moving Average Convergence Divergence)\n    plt.subplot(20, 1, 5)\n    OSC, DIFF, DEM = macd(data, n)\n    plt.plot(data[\"date\"], OSC, label=\"OSC\")\n    plt.plot(data[\"date\"], DIFF, label=\"DIFF\")\n    plt.plot(data[\"date\"], DEM, label=\"DEM\")\n    plt.title(\"MACD\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 随机指标\n    plt.subplot(20, 1, 6)\n    K, D, J = kdj(data)\n    plt.plot(data[\"date\"], K, label=\"K\")\n    plt.plot(data[\"date\"], D, label=\"D\")\n    plt.plot(data[\"date\"], J, label=\"J\")\n    plt.title(\"KDJ\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 相对强弱指标\n    plt.subplot(20, 1, 7)\n    RSI6 = rsi(data, 6)\n    RSI12 = rsi(data, 12)\n    RSI24 = rsi(data, 24)\n    plt.plot(data[\"date\"], RSI6, label=\"RSI(n=6)\")\n    plt.plot(data[\"date\"], RSI12, label=\"RSI(n=12)\")\n    plt.plot(data[\"date\"], RSI24, label=\"RSI(n=24)\")\n    plt.title(\"RSI\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # BOLL 林线指标\n    plt.subplot(20, 1, 8)\n    BOLL, UPPER, LOWER = boll(data)\n    plt.plot(data[\"date\"], BOLL, label=\"BOLL(n=10)\")\n    plt.plot(data[\"date\"], UPPER, label=\"UPPER(n=10)\")\n    plt.plot(data[\"date\"], LOWER, label=\"LOWER(n=10)\")\n    plt.plot(data[\"date\"], data[\"close\"], label=\"CLOSE PRICE\")\n    plt.title(\"BOLL\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # W&R 威廉指标\n    plt.subplot(20, 1, 9)\n    WNR = wnr(data, n=14)\n    plt.plot(data[\"date\"], WNR, label=\"WNR(n=14)\")\n    plt.title(\"WNR\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 动向或趋向指标\n    plt.subplot(20, 1, 10)\n    P_DI, M_DI, ADX, ADXR = dmi(data)\n    plt.plot(data[\"date\"], P_DI, label=\"+DI(n=14)\")\n    plt.plot(data[\"date\"], M_DI, label=\"-DI(n=14)\")\n    plt.plot(data[\"date\"], ADX, label=\"ADX(m=14)\")\n    plt.plot(data[\"date\"], ADXR, label=\"ADXR(k=6)\")\n    plt.title(\"DMI\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 乖离值\n    plt.subplot(20, 1, 11)\n    BIAS = bias(data, n=5)\n    plt.plot(data[\"date\"], BIAS, label=\"BIAS(n=5)\")\n    plt.title(\"BIAS\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 振动升降指标\n    plt.subplot(20, 1, 12)\n    ASI = asi(data, n=5)\n    plt.plot(data[\"date\"], ASI, label=\"ASI(n=5)\")\n    plt.title(\"ASI\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 振动升降指标\n    plt.subplot(20, 1, 13)\n    VR = vr(data, n=26)\n    plt.plot(data[\"date\"], VR, label=\"VR(n=26)\")\n    plt.title(\"VR\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 振动升降指标\n    plt.subplot(20, 1, 14)\n    AR, BR = arbr(data, n=26)\n    plt.plot(data[\"date\"], AR, label=\"AR(n=26)\")\n    plt.plot(data[\"date\"], BR, label=\"BR(n=26)\")\n    plt.title(\"ARBR\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 区间震荡线\n    plt.subplot(20, 1, 15)\n    DPO, MADPO = dpo(data, n=20, m=6)\n    plt.plot(data[\"date\"], DPO, label=\"DPO(n=20)\")\n    plt.plot(data[\"date\"], MADPO, label=\"MADPO(m=6)\")\n    plt.title(\"DPO\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 三重指数平滑平均线\n    plt.subplot(20, 1, 16)\n    TRIX, TRMA = trix(data, n=12, m=20)\n    plt.plot(data[\"date\"], TRIX, label=\"DPO(n=12)\")\n    plt.plot(data[\"date\"], TRMA, label=\"MADPO(m=20)\")\n    plt.title(\"TRIX\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 多空指标\n    plt.subplot(20, 1, 17)\n    BBI = bbi(data)\n    plt.plot(data[\"date\"], BBI, label=\"BBI(3,6,12,24)\")\n    plt.title(\"BBI\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 动量指标\n    plt.subplot(20, 1, 18)\n    MTM = mtm(data, n=6)\n    plt.plot(data[\"date\"], MTM, label=\"MTM(n=6)\")\n    plt.title(\"MTM\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    # 动量指标\n    plt.subplot(20, 1, 19)\n    OBV = obv(data)\n    plt.plot(data[\"date\"], OBV, label=\"OBV\")\n    plt.title(\"OBV\")\n    plt.xlabel('date')\n    plt.ylabel('value')\n    plt.legend()\n    plt.xticks(rotation=90)\n\n    plt.tight_layout()\n\n    if is_show:\n        plt.show()\n\n    if output is not None:\n        plt.savefig(output)"
  },
  {
    "path": "tushare/stock/macro.py",
    "content": "# -*- coding:utf-8 -*- \n\n\"\"\"\n宏观经济数据接口 \nCreated on 2015/01/24\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n\"\"\"\n\nimport pandas as pd\nimport numpy as np\nimport re\nimport json\nfrom tushare.stock import macro_vars as vs\nfrom tushare.stock import cons as ct\ntry:\n    from urllib.request import urlopen, Request\nexcept ImportError:\n    from urllib2 import urlopen, Request\n\n\ndef get_gdp_year():\n    \"\"\"\n        获取年度国内生产总值数据\n    Return\n    --------\n    DataFrame\n        year :统计年度\n        gdp :国内生产总值(亿元)\n        pc_gdp :人均国内生产总值(元)\n        gnp :国民生产总值(亿元)\n        pi :第一产业(亿元)\n        si :第二产业(亿元)\n        industry :工业(亿元)\n        cons_industry :建筑业(亿元)\n        ti :第三产业(亿元)\n        trans_industry :交通运输仓储邮电通信业(亿元)\n        lbdy :批发零售贸易及餐饮业(亿元)\n    \"\"\"\n    rdint = vs.random()\n    request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'],\n                                    rdint, vs.MACRO_TYPE[0], 0, 70,\n                                    rdint))\n    text = urlopen(request, timeout=10).read()\n    text = text.decode('gbk') if ct.PY3 else text\n    regSym = re.compile(r'\\,count:(.*?)\\}')\n    datastr = regSym.findall(text)\n    datastr = datastr[0]\n    datastr = datastr.split('data:')[1]\n    datastr = datastr.replace('\"', '').replace('null', '0')\n    js = json.loads(datastr)\n    df = pd.DataFrame(js, columns=vs.GDP_YEAR_COLS)\n    df[df==0] = np.NaN\n    return df\n\n  \ndef get_gdp_quarter():\n    \"\"\"\n        获取季度国内生产总值数据\n    Return\n    --------\n    DataFrame\n        quarter :季度\n        gdp :国内生产总值(亿元)\n        gdp_yoy :国内生产总值同比增长(%)\n        pi :第一产业增加值(亿元)\n        pi_yoy:第一产业增加值同比增长(%)\n        si :第二产业增加值(亿元)\n        si_yoy :第二产业增加值同比增长(%)\n        ti :第三产业增加值(亿元)\n        ti_yoy :第三产业增加值同比增长(%)\n    \"\"\"\n    rdint = vs.random()\n    request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'],\n                                    rdint, vs.MACRO_TYPE[0], 1, 250,\n                                    rdint))\n    text = urlopen(request,timeout=10).read()\n    text = text.decode('gbk') if ct.PY3 else text\n    regSym = re.compile(r'\\,count:(.*?)\\}')\n    datastr = regSym.findall(text)\n    datastr = datastr[0]\n    datastr = datastr.split('data:')[1]\n    datastr = datastr.replace('\"', '').replace('null', '0')\n    js = json.loads(datastr)\n    df = pd.DataFrame(js, columns=vs.GDP_QUARTER_COLS)\n    df['quarter'] = df['quarter'].astype(object)\n    df[df==0] = np.NaN\n    return df\n\n\ndef get_gdp_for():\n    \"\"\"\n        获取三大需求对GDP贡献数据\n    Return\n    --------\n    DataFrame\n        year :统计年度\n        end_for :最终消费支出贡献率(%)\n        for_rate :最终消费支出拉动(百分点)\n        asset_for :资本形成总额贡献率(%)\n        asset_rate:资本形成总额拉动(百分点)\n        goods_for :货物和服务净出口贡献率(%)\n        goods_rate :货物和服务净出口拉动(百分点)\n    \"\"\"\n    rdint = vs.random()\n    request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'],\n                                    rdint, vs.MACRO_TYPE[0], 4, 80, rdint))\n    text = urlopen(request,timeout=10).read()\n    text = text.decode('gbk') if ct.PY3 else text\n    regSym = re.compile(r'\\,count:(.*?)\\}')\n    datastr = regSym.findall(text)\n    datastr = datastr[0]\n    datastr = datastr.split('data:')[1]\n    datastr = datastr.replace('\"','').replace('null','0')\n    js = json.loads(datastr)\n    df = pd.DataFrame(js,columns=vs.GDP_FOR_COLS)\n    df[df==0] = np.NaN\n    return df\n\n\ndef get_gdp_pull():\n    \"\"\"\n        获取三大产业对GDP拉动数据\n    Return\n    --------\n    DataFrame\n        year :统计年度\n        gdp_yoy :国内生产总值同比增长(%)\n        pi :第一产业拉动率(%)\n        si :第二产业拉动率(%)\n        industry:其中工业拉动(%)\n        ti :第三产业拉动率(%)\n    \"\"\"\n    rdint = vs.random()\n    request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'],\n                                    rdint, vs.MACRO_TYPE[0], 5, 60, rdint))\n    text = urlopen(request,timeout=10).read()\n    text = text.decode('gbk') if ct.PY3 else text\n    regSym = re.compile(r'\\,count:(.*?)\\}')\n    datastr = regSym.findall(text)\n    datastr = datastr[0]\n    datastr = datastr.split('data:')[1]\n    datastr = datastr.replace('\"', '').replace('null', '0')\n    js = json.loads(datastr)\n    df = pd.DataFrame(js, columns=vs.GDP_PULL_COLS)\n    df[df==0] = np.NaN\n    return df\n\n\ndef get_gdp_contrib():\n    \"\"\"\n        获取三大产业贡献率数据\n    Return\n    --------\n    DataFrame\n        year :统计年度\n        gdp_yoy :国内生产总值\n        pi :第一产业献率(%)\n        si :第二产业献率(%)\n        industry:其中工业献率(%)\n        ti :第三产业献率(%)\n    \"\"\"\n    rdint = vs.random()\n    request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'], rdint,\n                                    vs.MACRO_TYPE[0], 6, 60, rdint))\n    text = urlopen(request, timeout=10).read()\n    text = text.decode('gbk') if ct.PY3 else text\n    regSym = re.compile(r'\\,count:(.*?)\\}')\n    datastr = regSym.findall(text)\n    datastr = datastr[0]\n    datastr = datastr.split('data:')[1]\n    datastr = datastr.replace('\"', '').replace('null', '0')\n    js = json.loads(datastr)\n    df = pd.DataFrame(js, columns=vs.GDP_CONTRIB_COLS)\n    df[df==0] = np.NaN\n    return df\n\ndef get_cpi():\n    \"\"\"\n        获取居民消费价格指数数据\n    Return\n    --------\n    DataFrame\n        month :统计月份\n        cpi :价格指数\n    \"\"\"\n    rdint = vs.random()\n    request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'],\n                                    rdint, vs.MACRO_TYPE[1], 0, 600,\n                                    rdint))\n    text = urlopen(request,timeout=10).read()\n    text = text.decode('gbk') if ct.PY3 else text\n    regSym = re.compile(r'\\,count:(.*?)\\}')\n    datastr = regSym.findall(text)\n    datastr = datastr[0]\n    datastr = datastr.split('data:')[1]\n    js = json.loads(datastr)\n    df = pd.DataFrame(js, columns=vs.CPI_COLS)\n    df['cpi'] = df['cpi'].astype(float)\n    return df\n\n\ndef get_ppi():\n    \"\"\"\n        获取工业品出厂价格指数数据\n    Return\n    --------\n    DataFrame\n        month :统计月份\n        ppiip :工业品出厂价格指数\n        ppi :生产资料价格指数\n        qm:采掘工业价格指数\n        rmi:原材料工业价格指数\n        pi:加工工业价格指数    \n        cg:生活资料价格指数\n        food:食品类价格指数\n        clothing:衣着类价格指数\n        roeu:一般日用品价格指数\n        dcg:耐用消费品价格指数\n    \"\"\"\n    rdint = vs.random()\n    request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'],\n                                    rdint, vs.MACRO_TYPE[1], 3, 600,\n                                    rdint))\n    text = urlopen(request, timeout=10).read()\n    text = text.decode('gbk') if ct.PY3 else text\n    regSym = re.compile(r'\\,count:(.*?)\\}')\n    datastr = regSym.findall(text)\n    datastr = datastr[0]\n    datastr = datastr.split('data:')[1]\n    js = json.loads(datastr)\n    df = pd.DataFrame(js, columns=vs.PPI_COLS)\n    for i in df.columns:\n        df[i] = df[i].apply(lambda x:np.where(x is None, np.NaN, x))\n        if i != 'month':\n            df[i] = df[i].astype(float)\n    return df\n\n\ndef get_deposit_rate():\n    \"\"\"\n        获取存款利率数据\n    Return\n    --------\n    DataFrame\n        date :变动日期\n        deposit_type :存款种类\n        rate:利率（%）\n    \"\"\"\n    rdint = vs.random()\n    request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'],\n                                    rdint, vs.MACRO_TYPE[2], 2, 600,\n                                    rdint))\n    text = urlopen(request, timeout=10).read()\n    text = text.decode('gbk')\n    regSym = re.compile(r'\\,count:(.*?)\\}')\n    datastr = regSym.findall(text)\n    datastr = datastr[0]\n    datastr = datastr.split('data:')[1]\n    js = json.loads(datastr)\n    df = pd.DataFrame(js, columns=vs.DEPOSIT_COLS)\n    for i in df.columns:\n        df[i] = df[i].apply(lambda x:np.where(x is None, '--', x))\n    return df\n\n\ndef get_loan_rate():\n    \"\"\"\n        获取贷款利率数据\n    Return\n    --------\n    DataFrame\n        date :执行日期\n        loan_type :存款种类\n        rate:利率（%）\n    \"\"\"\n    rdint = vs.random()\n    request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'],\n                                    rdint, vs.MACRO_TYPE[2], 3, 800,\n                                    rdint))\n    text = urlopen(request, timeout=10).read()\n    text = text.decode('gbk')\n    regSym = re.compile(r'\\,count:(.*?)\\}')\n    datastr = regSym.findall(text)\n    datastr = datastr[0]\n    datastr = datastr.split('data:')[1]\n    js = json.loads(datastr)\n    df = pd.DataFrame(js, columns=vs.LOAN_COLS)\n    for i in df.columns:\n        df[i] = df[i].apply(lambda x:np.where(x is None, '--', x))\n    return df\n\n\ndef get_rrr():\n    \"\"\"\n        获取存款准备金率数据\n    Return\n    --------\n    DataFrame\n        date :变动日期\n        before :调整前存款准备金率(%)\n        now:调整后存款准备金率(%)\n        changed:调整幅度(%)\n    \"\"\"\n    rdint = vs.random()\n    request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'],\n                                    rdint, vs.MACRO_TYPE[2], 4, 100,\n                                    rdint))\n    text = urlopen(request, timeout=10).read()\n    text = text.decode('gbk')\n    regSym = re.compile(r'\\,count:(.*?)\\}')\n    datastr = regSym.findall(text)\n    datastr = datastr[0]\n    datastr = datastr.split('data:')[1]\n    js = json.loads(datastr)\n    df = pd.DataFrame(js, columns=vs.RRR_COLS)\n    for i in df.columns:\n        df[i] = df[i].apply(lambda x:np.where(x is None, '--', x))\n    return df\n\n\ndef get_money_supply():\n    \"\"\"\n        获取货币供应量数据\n    Return\n    --------\n    DataFrame\n        month :统计时间\n        m2 :货币和准货币（广义货币M2）(亿元)\n        m2_yoy:货币和准货币（广义货币M2）同比增长(%)\n        m1:货币(狭义货币M1)(亿元)\n        m1_yoy:货币(狭义货币M1)同比增长(%)\n        m0:流通中现金(M0)(亿元)\n        m0_yoy:流通中现金(M0)同比增长(%)\n        cd:活期存款(亿元)\n        cd_yoy:活期存款同比增长(%)\n        qm:准货币(亿元)\n        qm_yoy:准货币同比增长(%)\n        ftd:定期存款(亿元)\n        ftd_yoy:定期存款同比增长(%)\n        sd:储蓄存款(亿元)\n        sd_yoy:储蓄存款同比增长(%)\n        rests:其他存款(亿元)\n        rests_yoy:其他存款同比增长(%)\n    \"\"\"\n    rdint = vs.random()\n    request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'],\n                                    rdint, vs.MACRO_TYPE[2], 1, 600,\n                                    rdint))\n    text = urlopen(request, timeout=10).read()\n    text = text.decode('gbk')\n    regSym = re.compile(r'\\,count:(.*?)\\}')\n    datastr = regSym.findall(text)\n    datastr = datastr[0]\n    datastr = datastr.split('data:')[1]\n    js = json.loads(datastr)\n    df = pd.DataFrame(js, columns=vs.MONEY_SUPPLY_COLS)\n    for i in df.columns:\n        df[i] = df[i].apply(lambda x:np.where(x is None, '--', x))\n    return df\n\n\ndef get_money_supply_bal():\n    \"\"\"\n        获取货币供应量(年底余额)数据\n    Return\n    --------\n    DataFrame\n        year :统计年度\n        m2 :货币和准货币(亿元)\n        m1:货币(亿元)\n        m0:流通中现金(亿元)\n        cd:活期存款(亿元)\n        qm:准货币(亿元)\n        ftd:定期存款(亿元)\n        sd:储蓄存款(亿元)\n        rests:其他存款(亿元)\n    \"\"\"\n    rdint = vs.random()\n    request = Request(vs.MACRO_URL%(vs.P_TYPE['http'], vs.DOMAINS['sina'],\n                                    rdint, vs.MACRO_TYPE[2], 0, 200,\n                                    rdint))\n    text = urlopen(request,timeout=10).read()\n    text = text.decode('gbk')\n    regSym = re.compile(r'\\,count:(.*?)\\}')\n    datastr = regSym.findall(text)\n    datastr = datastr[0]\n    datastr = datastr.split('data:')[1]\n    js = json.loads(datastr)\n    df = pd.DataFrame(js, columns=vs.MONEY_SUPPLY_BLA_COLS)\n    for i in df.columns:\n        df[i] = df[i].apply(lambda x:np.where(x is None, '--', x))\n    return df\n\n\ndef get_gold_and_foreign_reserves():\n    \"\"\"\n    获取外汇储备\n    Returns\n    -------\n    DataFrame\n        month :统计时间\n        gold:黄金储备(万盎司)\n        foreign_reserves:外汇储备(亿美元)\n    \"\"\"\n    rdint = vs.random()\n    request = Request(vs.MACRO_URL % (vs.P_TYPE['http'], vs.DOMAINS['sina'],\n                                      rdint, vs.MACRO_TYPE[2], 5, 200,\n                                      rdint))\n    text = urlopen(request,timeout=10).read()\n    text = text.decode('gbk')\n    regSym = re.compile(r'\\,count:(.*?)\\}')\n    datastr = regSym.findall(text)\n    datastr = datastr[0]\n    datastr = datastr.split('data:')[1]\n    js = json.loads(datastr)\n    df = pd.DataFrame(js, columns=vs.GOLD_AND_FOREIGN_CURRENCY_RESERVES)\n    for i in df.columns:\n        df[i] = df[i].apply(lambda x: np.where(x is None, '--', x))\n    return df\n"
  },
  {
    "path": "tushare/stock/macro_vars.py",
    "content": "# -*- coding:utf-8 -*- \n\nP_TYPE = {'http':'http://','ftp':'ftp://'}\nDOMAINS = {'sina':'sina.com.cn','sinahq':'sinajs.cn','ifeng':'ifeng.com'}\nMACRO_TYPE = ['nation','price','fininfo']\nMACRO_URL = '%smoney.finance.%s/mac/api/jsonp.php/SINAREMOTECALLCALLBACK%s/MacPage_Service.get_pagedata?cate=%s&event=%s&from=0&num=%s&condition=&_=%s'\nGDP_YEAR_COLS = ['year','gdp','pc_gdp','gnp','pi','si','industry','cons_industry','ti','trans_industry','lbdy']\nGDP_QUARTER_COLS = ['quarter','gdp','gdp_yoy','pi','pi_yoy','si','si_yoy','ti','ti_yoy']\nGDP_FOR_COLS = ['year','end_for','for_rate','asset_for','asset_rate','goods_for','goods_rate']\nGDP_PULL_COLS = ['year','gdp_yoy','pi','si','industry','ti']\nGDP_CONTRIB_COLS = ['year','gdp_yoy','pi','si','industry','ti']\nCPI_COLS = ['month','cpi']\nPPI_COLS = ['month','ppiip','ppi','qm','rmi','pi','cg','food','clothing','roeu','dcg']\nDEPOSIT_COLS = ['date','deposit_type','rate']\nLOAN_COLS = ['date','loan_type','rate']\nRRR_COLS = ['date','before','now','changed']\nMONEY_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']\nMONEY_SUPPLY_BLA_COLS = ['year','m2','m1','m0','cd','qm','ftd','sd','rests']\nGOLD_AND_FOREIGN_CURRENCY_RESERVES = ['month','gold','foreign_reserves']\n\ndef random(n=13):\n    from random import randint\n    start = 10**(n-1)\n    end = (10**n)-1\n    return str(randint(start, end))"
  },
  {
    "path": "tushare/stock/news_vars.py",
    "content": "# -*- coding:utf-8 -*- \n\nLATEST_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'\nLATEST_COLS = ['classify','title','time','url']\nLATEST_COLS_C = ['classify','title','time','url','content']\nNOTICE_INFO_URL = '%s%s/corp/view/%s?stock_str=%s'\nNOTICE_INFO_CLS = ['title', 'type', 'date', 'url']\nGUBA_SINA_URL = '%sguba.%s'\nGUBA_SINA_COLS = ['title', 'content', 'ptime', 'rcounts']\n"
  },
  {
    "path": "tushare/stock/newsevent.py",
    "content": "# -*- coding:utf-8 -*-\n\n\"\"\"\n新闻事件数据接口 \nCreated on 2015/02/07\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n\"\"\"\n\nfrom tushare.stock import cons as ct\nfrom tushare.stock import news_vars as nv\nimport pandas as pd\nfrom datetime import datetime\nimport lxml.html\nfrom lxml import etree\nimport re\nimport json\ntry:\n    from urllib.request import urlopen, Request\nexcept ImportError:\n    from urllib2 import urlopen, Request\n\n\n\ndef get_latest_news(top=None, show_content=False):\n    \"\"\"\n        获取即时财经新闻\n    \n    Parameters\n    --------\n        top:数值，显示最新消息的条数，默认为80条\n        show_content:是否显示新闻内容，默认False\n    \n    Return\n    --------\n        DataFrame\n            classify :新闻类别\n            title :新闻标题\n            time :发布时间\n            url :新闻链接\n            content:新闻内容（在show_content为True的情况下出现）\n    \"\"\"\n    top = ct.PAGE_NUM[2] if top is None else top\n    try:\n        request = Request(nv.LATEST_URL % (ct.P_TYPE['http'], ct.DOMAINS['sina'],\n                                                   ct.PAGES['lnews'], top,\n                                                   _random()))\n        data_str = urlopen(request, timeout=10).read()\n        data_str = data_str.decode('GBK')\n        data_str = data_str.split('=')[1][:-1]\n        data_str = eval(data_str, type('Dummy', (dict,), \n                                       dict(__getitem__ = lambda s, n:n))())\n        data_str = json.dumps(data_str)\n        data_str = json.loads(data_str)\n        data_str = data_str['list']\n        data = []\n        for r in data_str:\n            rt = datetime.fromtimestamp(r['time'])\n            rtstr = datetime.strftime(rt, \"%m-%d %H:%M\")\n            arow = [r['channel']['title'], r['title'], rtstr, r['url']]\n            if show_content:\n                arow.append(latest_content(r['url']))\n            data.append(arow)\n        df = pd.DataFrame(data, columns=nv.LATEST_COLS_C if show_content else nv.LATEST_COLS)\n        return df\n    except Exception as er:\n        print(str(er))\n\n\ndef latest_content(url):\n    '''\n        获取即时财经新闻内容\n    Parameter\n    --------\n        url:新闻链接\n    \n    Return\n    --------\n        string:返回新闻的文字内容\n    '''\n    try:\n        html = lxml.html.parse(url)\n        res = html.xpath('//div[@id=\\\"artibody\\\"]/p')\n        if ct.PY3:\n            sarr = [etree.tostring(node).decode('utf-8') for node in res]\n        else:\n            sarr = [etree.tostring(node) for node in res]\n        sarr = ''.join(sarr).replace('&#12288;', '')#.replace('\\n\\n', '\\n').\n        html_content = lxml.html.fromstring(sarr)\n        content = html_content.text_content()\n        return content\n    except Exception as er:\n        print(str(er))  \n\n\ndef get_notices(code=None, date=None):\n    '''\n    个股信息地雷\n    Parameters\n    --------\n        code:股票代码\n        date:信息公布日期\n    \n    Return\n    --------\n        DataFrame，属性列表：\n        title:信息标题\n        type:信息类型\n        date:公告日期\n        url:信息内容URL\n    '''\n    if code is None:\n        return None\n    symbol = 'sh' + code if code[:1] == '6' else 'sz' + code\n    url = nv.NOTICE_INFO_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'],\n                              ct.PAGES['ntinfo'], symbol)\n    url = url if date is None else '%s&gg_date=%s'%(url, date)\n    html = lxml.html.parse(url)\n    res = html.xpath('//table[@class=\\\"body_table\\\"]/tbody/tr')\n    data = []\n    for td in res:\n        title = td.xpath('th/a/text()')[0]\n        type = td.xpath('td[1]/text()')[0]\n        date = td.xpath('td[2]/text()')[0]\n        url = '%s%s%s'%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], td.xpath('th/a/@href')[0])\n        data.append([title, type, date, url])\n    df = pd.DataFrame(data, columns=nv.NOTICE_INFO_CLS)\n    return df\n\n\ndef notice_content(url):\n    '''\n        获取信息地雷内容\n    Parameter\n    --------\n        url:内容链接\n    \n    Return\n    --------\n        string:信息内容\n    '''\n    try:\n        html = lxml.html.parse(url)\n        res = html.xpath('//div[@id=\\\"content\\\"]/pre/text()')[0]\n        return res.strip()\n    except Exception as er:\n        print(str(er))  \n\n\ndef guba_sina(show_content=False):\n    \"\"\"\n       获取sina财经股吧首页的重点消息\n    Parameter\n    --------\n        show_content:是否显示内容，默认False\n    \n    Return\n    --------\n    DataFrame\n        title, 消息标题\n        content, 消息内容（show_content=True的情况下）\n        ptime, 发布时间\n        rcounts,阅读次数\n    \"\"\"\n    \n    from pandas.io.common import urlopen\n    try:\n        with urlopen(nv.GUBA_SINA_URL%(ct.P_TYPE['http'],\n                                       ct.DOMAINS['sina'])) as resp:\n            lines = resp.read()\n        html = lxml.html.document_fromstring(lines)\n        res = html.xpath('//ul[@class=\\\"list_05\\\"]/li[not (@class)]')\n        heads = html.xpath('//div[@class=\\\"tit_04\\\"]')\n        data = []\n        for head in heads:\n            title = head.xpath('a/text()')[0]\n            url = head.xpath('a/@href')[0]\n            ds = [title]\n            ds.extend(_guba_content(url))\n            data.append(ds)\n        for row in res:\n            title = row.xpath('a[2]/text()')[0]\n            url = row.xpath('a[2]/@href')[0]\n            ds = [title]\n            ds.extend(_guba_content(url))\n            data.append(ds)\n        df = pd.DataFrame(data, columns=nv.GUBA_SINA_COLS)\n        df['rcounts'] = df['rcounts'].astype(float)\n        return df if show_content is True else df.drop('content', axis=1)\n    except Exception as er:\n        print(str(er))  \n    \n    \ndef _guba_content(url):\n    try:\n        html = lxml.html.parse(url)\n        res = html.xpath('//div[@class=\\\"ilt_p\\\"]/p')\n        if ct.PY3:\n            sarr = [etree.tostring(node).decode('utf-8') for node in res]\n        else:\n            sarr = [etree.tostring(node) for node in res]\n        sarr = ''.join(sarr).replace('&#12288;', '')#.replace('\\n\\n', '\\n').\n        html_content = lxml.html.fromstring(sarr)\n        content = html_content.text_content()\n        ptime = html.xpath('//div[@class=\\\"fl_left iltp_time\\\"]/span/text()')[0]\n        rcounts = html.xpath('//div[@class=\\\"fl_right iltp_span\\\"]/span[2]/text()')[0]\n        reg = re.compile(r'\\((.*?)\\)') \n        rcounts = reg.findall(rcounts)[0]\n        return [content, ptime, rcounts]\n    except Exception:\n        return ['', '', '0']\n\n\ndef _random(n=16):\n    from random import randint\n    start = 10 ** (n - 1)\n    end = (10 ** n) - 1\n    return str(randint(start, end))\n\n"
  },
  {
    "path": "tushare/stock/ref_vars.py",
    "content": "# -*- coding:utf-8 -*- \r\n\r\nDP_URL = '%sapp.finance.%s/data/stock/%s?day=&page=%s'\r\nDP_163_URL = '%squotes.%s/data/caibao/%s?reportdate=%s&sort=declaredate&order=desc&page=%s'\r\nFUND_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'\r\nXSG_URL = '%sdatainterface.%s/EM_DataCenter/%s?type=FD&sty=BST&st=3&sr=true&fd=%s&stat=%s'\r\n# LHB_URL = '%sdata.%s/stock/lhb/%s.html'\r\nLHB_URL = '%sdata.%s/DataCenter_V3/stock2016/TradeDetail/pagesize=200,page=1,sortRule=-1,sortType=,startDate=%s,endDate=%s,gpfw=0,js=vardata_tab_1.html'\r\nLHB_SINA_URL = '%s%s/q/go.php/vLHBData/kind/%s/%s?last=%s&p=%s'\r\nLHB_TMP_COLS = ['SCode', 'SName', 'Chgradio', 'ZeMoney', 'Bmoney', 'Smoney', 'Ctypedes', 'Turnover']\r\nLHB_COLS = ['code', 'name', 'pchange', 'amount', 'buy', 'sell', 'reason', 'Turnover']\r\nNEW_STOCKS_URL = '%s%s/corp/view/%s?page=%s&cngem=0&orderBy=NetDate&orderType=desc'\r\nNEW_CBONDS_URL = '%s%s/ipo/kzz_7_1_%s.html'\r\nMAR_SH_HZ_URL = '%s%s/marketdata/tradedata/%s?jsonCallBack=jsonpCallback%s&isPagination=true&tabType=&pageHelp.pageSize=100&beginDate=%s&endDate=%s%s&_=%s'\r\nMAR_SH_HZ_REF_URL = '%s%s/market/dealingdata/overview/margin/'\r\nMAR_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'\r\nMAR_SZ_HZ_URL = '%s%s/szseWeb/%s?SHOWTYPE=EXCEL&ACTIONID=8&CATALOGID=1837_xxpl&txtDate=%s&tab2PAGENUM=1&ENCODE=1&TABKEY=tab1'\r\nMAR_SZ_MX_URL = '%s%s/szseWeb/%s?SHOWTYPE=EXCEL&ACTIONID=8&CATALOGID=1837_xxpl&txtDate=%s&tab2PAGENUM=1&ENCODE=1&TABKEY=tab2'\r\nMAR_SH_HZ_TAIL_URL = '&pageHelp.pageNo=%s&pageHelp.beginPage=%s&pageHelp.endPage=%s'\r\nTERMINATED_URL = '%s%s/%s?jsonCallBack=jsonpCallback%s&isPagination=true&sqlId=COMMON_SSE_ZQPZ_GPLB_MCJS_ZZSSGGJBXX_L&pageHelp.pageSize=50&_=%s'\r\nSUSPENDED_URL = '%s%s/%s?jsonCallBack=jsonpCallback%s&isPagination=true&sqlId=COMMON_SSE_ZQPZ_GPLB_MCJS_ZTSSGS_L&pageHelp.pageSize=50&_=%s'\r\nTOP10_HOLDERS_URL = '%swebf10.%s/SDGD/SD%sGD%s.js'\r\nTOP10_SUMM_COLS = ['quarter', 'amount', 'changed' ,'props']\r\nTOP10_PER_COLS = ['quarter', 'name', 'hold', 'h_pro', 'sharetype', 'status']\r\nTERMINATED_T_COLS = ['COMPANY_CODE', 'COMPANY_ABBR', 'LISTING_DATE', 'CHANGE_DATE']\r\nLHB_KINDS = ['ggtj', 'yytj', 'jgzz', 'jgmx']\r\nLHB_GGTJ_COLS = ['code', 'name', 'count', 'bamount', 'samount', 'net', 'bcount', 'scount']\r\nLHB_YYTJ_COLS = ['broker', 'count', 'bamount', 'bcount', 'samount', 'scount', 'top3']\r\nLHB_JGZZ_COLS = ['code', 'name', 'bamount', 'bcount', 'samount', 'scount', 'net']\r\nLHB_JGMX_COLS = ['code', 'name', 'date', 'bamount', 'samount', 'type']\r\nTERMINATED_COLS = ['code', 'name', 'oDate', 'tDate']\r\nDP_COLS = ['report_date', 'quarter', 'code', 'name', 'plan']\r\nDP_163_COLS = ['code', 'name', 'year', 'plan', 'report_date']\r\nXSG_COLS = ['code', 'name', 'date', 'count', 'ratio']\r\nQUARTS_DIC = {'1':('%s-12-31', '%s-03-31'), '2':('%s-03-31', '%s-06-30'), \r\n              '3':('%s-06-30', '%s-09-30'), '4':('%s-9-30', '%s-12-31')}\r\nFUND_HOLDS_COLS = ['count', 'clast', 'date', 'ratio', 'amount', 'nums','nlast', 'name', 'code']\r\nNEW_STOCKS_COLS = ['code', 'xcode', 'name', 'ipo_date', 'issue_date', 'amount', 'markets', 'price', 'pe',\r\n                   'limit', 'funds', 'ballot']\r\nNEW_CBONDS_COLS = ['bcode', 'bname', 'scode', 'sname', 'xcode', 'amount', 'marketprice', 'convprice', 'firstdayprice',\r\n                   'ipo_date', 'issue_date', 'ballot', 'return', 'perreturn']\r\nMAR_SH_COOKIESTR = '_gscu_1808689395=27850607moztu036'\r\nMAR_SH_HZ_COLS = ['opDate', 'rzye', 'rzmre', 'rqyl', 'rqylje', 'rqmcl', 'rzrqjyzl']\r\nMAR_SH_MX_COLS = ['opDate', 'stockCode', 'securityAbbr', 'rzye', 'rzmre', 'rzche', 'rqyl', 'rqmcl', 'rqchl']\r\nMAR_SZ_HZ_COLS = ['rzmre', 'rzye', 'rqmcl', 'rqyl', 'rqye', 'rzrqye']\r\nMAR_SZ_MX_COLS = ['stockCode', 'securityAbbr', 'rzmre', 'rzye', 'rqmcl', 'rqyl', 'rqye', 'rzrqye']\r\nMAR_SZ_HZ_MSG = 'please do not input more than a year,you can obtaining the data year by year.'\r\nMAR_SZ_HZ_MSG2 = 'start and end date all need input.'\r\n\r\nHSGT_TEMP = ['DateTime', 'GGHSMoney', 'GGSSMoney', 'HSMoney', 'SSMoney', 'NorthMoney', 'SouthSumMoney']\r\nHSGT_COLS = ['date', 'ggt_ss', 'ggt_sz', 'hgt', 'sgt', 'north_money', 'south_money']\r\nHSGT_REF = '%sdata.%s/hsgt/%s'\r\nHSGT_DATA = '%sdcfm.%s/EM_MutiSvcExpandInterface/api/js/get?type=HSGTZJZS&token=70f12f2f4f091e459a279469fe49eca5'\r\n"
  },
  {
    "path": "tushare/stock/reference.py",
    "content": "# -*- coding:utf-8 -*- \r\n\"\"\"\r\n投资参考数据接口 \r\nCreated on 2015/03/21\r\n@author: Jimmy Liu\r\n@group : waditu\r\n@contact: jimmysoa@sina.cn\r\n\"\"\"\r\nfrom __future__ import division\r\nfrom tushare.stock import cons as ct\r\nfrom tushare.stock import ref_vars as rv\r\nimport pandas as pd\r\nimport numpy as np\r\nimport time\r\nimport lxml.html\r\nfrom lxml import etree\r\nimport re\r\nimport json\r\nfrom pandas.compat import StringIO\r\nfrom tushare.util import dateu as du\r\nfrom tushare.util.netbase import Client\r\ntry:\r\n    from urllib.request import urlopen, Request\r\nexcept ImportError:\r\n    from urllib2 import urlopen, Request\r\n\r\n\r\ndef profit_data(year=2017, top=25, \r\n              retry_count=3, pause=0.001):\r\n    \"\"\"\r\n    获取分配预案数据\r\n    Parameters\r\n    --------\r\n    year:年份\r\n    top:取最新n条数据，默认取最近公布的25条\r\n    retry_count : int, 默认 3\r\n                 如遇网络等问题重复执行的次数 \r\n      pause : int, 默认 0\r\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n    \r\n    returns\r\n    -------\r\n    DataFrame\r\n    code:股票代码\r\n    name:股票名称\r\n    year:分配年份\r\n    report_date:公布日期\r\n    divi:分红金额（每10股）\r\n    shares:转增和送股数（每10股）\r\n    \"\"\"\r\n    \r\n    if top == 'all':\r\n        ct._write_head()\r\n        df, pages = _dist_cotent(year, 0, retry_count, pause)\r\n        for idx in range(1,int(pages)):\r\n            df = df.append(_dist_cotent(year, idx, retry_count,\r\n                                        pause), ignore_index=True)\r\n        return df\r\n    elif top <= 25:\r\n        df, pages = _dist_cotent(year, 0, retry_count, pause)\r\n        return df.head(top)\r\n    else:\r\n        if isinstance(top, int):\r\n            ct._write_head()\r\n            allPages = top/25+1 if top%25>0 else top/25\r\n            df, pages = _dist_cotent(year, 0, retry_count, pause)\r\n            if int(allPages) < int(pages):\r\n                pages = allPages\r\n            for idx in range(1, int(pages)):\r\n                df = df.append(_dist_cotent(year, idx, retry_count,\r\n                                            pause), ignore_index=True)\r\n            return df.head(top)\r\n        else:\r\n            print(ct.TOP_PARAS_MSG)\r\n    \r\n\r\ndef _fun_divi(x):\r\n    if ct.PY3:\r\n        reg = re.compile(r'分红(.*?)元', re.UNICODE)\r\n        res = reg.findall(x)\r\n        return 0 if len(res)<1 else float(res[0]) \r\n    else:\r\n        if isinstance(x, unicode):\r\n            s1 = unicode('分红','utf-8')\r\n            s2 = unicode('元','utf-8')\r\n            reg = re.compile(r'%s(.*?)%s'%(s1, s2), re.UNICODE)\r\n            res = reg.findall(x)\r\n            return 0 if len(res)<1 else float(res[0])\r\n        else:\r\n            return 0\r\n\r\n\r\ndef _fun_into(x):\r\n    if ct.PY3:\r\n            reg1 = re.compile(r'转增(.*?)股', re.UNICODE)\r\n            reg2 = re.compile(r'送股(.*?)股', re.UNICODE)\r\n            res1 = reg1.findall(x)\r\n            res2 = reg2.findall(x)\r\n            res1 = 0 if len(res1)<1 else float(res1[0])\r\n            res2 = 0 if len(res2)<1 else float(res2[0])\r\n            return res1 + res2\r\n    else:\r\n        if isinstance(x, unicode):\r\n            s1 = unicode('转增','utf-8')\r\n            s2 = unicode('送股','utf-8')\r\n            s3 = unicode('股','utf-8')\r\n            reg1 = re.compile(r'%s(.*?)%s'%(s1, s3), re.UNICODE)\r\n            reg2 = re.compile(r'%s(.*?)%s'%(s2, s3), re.UNICODE)\r\n            res1 = reg1.findall(x)\r\n            res2 = reg2.findall(x)\r\n            res1 = 0 if len(res1)<1 else float(res1[0])\r\n            res2 = 0 if len(res2)<1 else float(res2[0])\r\n            return res1 + res2\r\n        else:\r\n            return 0\r\n    \r\n    \r\ndef _dist_cotent(year, pageNo, retry_count, pause):\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            if pageNo > 0:\r\n                ct._write_console()\r\n            html = lxml.html.parse(rv.DP_163_URL%(ct.P_TYPE['http'], ct.DOMAINS['163'],\r\n                     ct.PAGES['163dp'], year, pageNo))  \r\n            res = html.xpath('//div[@class=\\\"fn_rp_list\\\"]/table')\r\n            if ct.PY3:\r\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\r\n            else:\r\n                sarr = [etree.tostring(node) for node in res]\r\n            sarr = ''.join(sarr)\r\n            df = pd.read_html(sarr, skiprows=[0])[0]\r\n            df = df.drop(df.columns[0], axis=1)\r\n            df.columns = rv.DP_163_COLS\r\n            df['divi'] = df['plan'].map(_fun_divi)\r\n            df['shares'] = df['plan'].map(_fun_into)\r\n            df = df.drop('plan', axis=1)\r\n            df['code'] = df['code'].astype(object)\r\n            df['code'] = df['code'].map(lambda x : str(x).zfill(6))\r\n            pages = []\r\n            if pageNo == 0:\r\n                page = html.xpath('//div[@class=\\\"mod_pages\\\"]/a')\r\n                if len(page)>1:\r\n                    asr = page[len(page)-2]\r\n                    pages = asr.xpath('text()')\r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            if pageNo == 0:\r\n                return df, pages[0] if len(pages)>0 else 0\r\n            else:\r\n                return df\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)    \r\n\r\n\r\ndef profit_divis():\r\n        '''\r\n                        获取分送送股数据\r\n            -------\r\n            Return:DataFrame\r\n                code:代码    \r\n                name:证券简称    \r\n                year:分配年度    \r\n                bshares:送股  \r\n                incshares:转增股\r\n                totals:送转总数 \r\n                cash:派现   \r\n                plandate:预案公布日    \r\n                regdate:股权登记日    \r\n                exdate:除权除息日    \r\n                eventproc:事件进程 ,预案或实施\r\n                anndate:公告日期\r\n                \r\n    '''\r\n        ct._write_head()\r\n        p = 'cfidata.aspx?sortfd=&sortway=&curpage=1&fr=content&ndk=A0A1934A1939A1957A1966A1983&xztj=&mystock='\r\n        df =  _profit_divis(1, pd.DataFrame(), p)\r\n        df = df.drop([3], axis=1)\r\n        df.columns = ct.PROFIT_DIVIS\r\n        df['code'] = df['code'].map(lambda x: str(x).zfill(6))\r\n        return df\r\n\r\n\r\ndef _profit_divis(pageNo, dataArr, nextPage):\r\n        ct._write_console()\r\n        html = lxml.html.parse('%sdata.cfi.cn/%s'%(ct.P_TYPE['http'], nextPage))\r\n        res = html.xpath(\"//table[@class=\\\"table_data\\\"]/tr\")\r\n        if ct.PY3:\r\n            sarr = [etree.tostring(node).decode('utf-8') for node in res]\r\n        else:\r\n            sarr = [etree.tostring(node) for node in res]\r\n        sarr = ''.join(sarr)\r\n        sarr = sarr.replace('--', '0')\r\n        sarr = '<table>%s</table>'%sarr\r\n        df = pd.read_html(sarr, skiprows=[0])[0]\r\n        dataArr = dataArr.append(df, ignore_index=True)\r\n        nextPage = html.xpath('//div[@id=\\\"content\\\"]/div[2]/a[last()]/@href')[0]\r\n        np = nextPage.split('&')[2].split('=')[1]\r\n        if pageNo < int(np):\r\n            return _profit_divis(int(np), dataArr, nextPage)\r\n        else:\r\n            return dataArr\r\n\r\n\r\ndef forecast_data(year, quarter):\r\n    \"\"\"\r\n        获取业绩预告数据\r\n    Parameters\r\n    --------\r\n    year:int 年度 e.g:2014\r\n    quarter:int 季度 :1、2、3、4，只能输入这4个季度\r\n       说明：由于是从网站获取的数据，需要一页页抓取，速度取决于您当前网络速度\r\n       \r\n    Return\r\n    --------\r\n    DataFrame\r\n        code,代码\r\n        name,名称\r\n        type,业绩变动类型【预增、预亏等】\r\n        report_date,发布日期\r\n        pre_eps,上年同期每股收益\r\n        range,业绩变动范围\r\n        \r\n    \"\"\"\r\n    if ct._check_input(year, quarter) is True:\r\n        ct._write_head()\r\n        data =  _get_forecast_data(year, quarter, 1, pd.DataFrame())\r\n        df = pd.DataFrame(data, columns=ct.FORECAST_COLS)\r\n        df['code'] = df['code'].map(lambda x: str(x).zfill(6))\r\n        return df\r\n\r\n\r\ndef _get_forecast_data(year, quarter, pageNo, dataArr):\r\n    ct._write_console()\r\n    try:\r\n        gparser = etree.HTMLParser(encoding='GBK')\r\n        html = lxml.html.parse(ct.FORECAST_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'], \r\n                                                ct.PAGES['fd'], year, quarter, pageNo,\r\n                                                ct.PAGE_NUM[1]),\r\n                               parser=gparser)\r\n        res = html.xpath(\"//table[@class=\\\"list_table\\\"]/tr\")\r\n        if ct.PY3:\r\n            sarr = [etree.tostring(node).decode('utf-8') for node in res]\r\n        else:\r\n            sarr = [etree.tostring(node) for node in res]\r\n        sarr = ''.join(sarr)\r\n        sarr = sarr.replace('--', '0')\r\n        sarr = '<table>%s</table>'%sarr\r\n        df = pd.read_html(sarr)[0]\r\n        df = df.drop([4, 5, 8], axis=1)\r\n        df.columns = ct.FORECAST_COLS\r\n        dataArr = dataArr.append(df, ignore_index=True)\r\n        nextPage = html.xpath('//div[@class=\\\"pages\\\"]/a[last()]/@onclick')\r\n        if len(nextPage)>0:\r\n            pageNo = re.findall(r'\\d+',nextPage[0])[0]\r\n            return _get_forecast_data(year, quarter, pageNo, dataArr)\r\n        else:\r\n            return dataArr\r\n    except Exception as e:\r\n            print(e)\r\n    \r\n\r\ndef xsg_data(year=None, month=None, \r\n            retry_count=3, pause=0.001):\r\n    \"\"\"\r\n    获取限售股解禁数据\r\n    Parameters\r\n    --------\r\n    year:年份,默认为当前年\r\n    month:解禁月份，默认为当前月\r\n    retry_count : int, 默认 3\r\n                 如遇网络等问题重复执行的次数 \r\n    pause : int, 默认 0\r\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n    \r\n    Return\r\n    ------\r\n    DataFrame\r\n    code:股票代码\r\n    name:名称\r\n    date:解禁日期\r\n    count:解禁数量（万股）\r\n    ratio:占总盘比率\r\n    \"\"\"\r\n    year = du.get_year() if year is None else year\r\n    month = du.get_month() if month is None else month\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            request = Request(rv.XSG_URL%(ct.P_TYPE['http'], ct.DOMAINS['em'],\r\n                                     ct.PAGES['emxsg'], year, month))\r\n            lines = urlopen(request, timeout = 10).read()\r\n            lines = lines.decode('utf-8') if ct.PY3 else lines\r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            da = lines[3:len(lines)-3]\r\n            list =  []\r\n            for row in da.split('\",\"'):\r\n                list.append([data for data in row.split(',')])\r\n            df = pd.DataFrame(list)\r\n            df = df[[1, 3, 4, 5, 6]]\r\n            for col in [5, 6]:\r\n                df[col] = df[col].astype(float)\r\n            df[5] = df[5]/10000\r\n            df[6] = df[6]*100\r\n            df[5] = df[5].map(ct.FORMAT)\r\n            df[6] = df[6].map(ct.FORMAT)\r\n            df.columns = rv.XSG_COLS\r\n            return df\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)   \r\n\r\n\r\ndef fund_holdings(year, quarter,\r\n                  retry_count=3, pause=0.001):\r\n    \"\"\"\r\n    获取基金持股数据\r\n    Parameters\r\n    --------\r\n    year:年份e.g 2014\r\n    quarter:季度（只能输入1，2，3，4这个四个数字）\r\n    retry_count : int, 默认 3\r\n                 如遇网络等问题重复执行的次数 \r\n    pause : int, 默认 0\r\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n    \r\n    Return\r\n    ------\r\n    DataFrame\r\n    code:股票代码\r\n    name:名称\r\n    date:报告日期\r\n    nums:基金家数\r\n    nlast:与上期相比（增加或减少了）\r\n    count:基金持股数（万股）\r\n    clast:与上期相比\r\n    amount:基金持股市值\r\n    ratio:占流通盘比率\r\n    \"\"\"\r\n    start,end = rv.QUARTS_DIC[str(quarter)]\r\n    if quarter == 1:\r\n        start = start % str(year-1)\r\n        end = end%year\r\n    else:\r\n        start, end = start%year, end%year\r\n    ct._write_head()\r\n    df, pages = _holding_cotent(start, end, 0, retry_count, pause)\r\n    for idx in range(1, pages):\r\n        df = df.append(_holding_cotent(start, end, idx, retry_count, pause),\r\n                  ignore_index=True)\r\n    return df\r\n\r\n\r\ndef _holding_cotent(start, end, pageNo, retry_count, pause):\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        if pageNo>0:\r\n                ct._write_console()\r\n        try:\r\n            request = Request(rv.FUND_HOLDS_URL%(ct.P_TYPE['http'], ct.DOMAINS['163'],\r\n                     ct.PAGES['163fh'], ct.PAGES['163fh'],\r\n                     pageNo, start, end, _random(5)))\r\n            lines = urlopen(request, timeout = 10).read()\r\n            lines = lines.decode('utf-8') if ct.PY3 else lines\r\n            lines = lines.replace('--', '0')\r\n            lines = json.loads(lines)\r\n            data = lines['list']\r\n            df = pd.DataFrame(data)\r\n            df = df.drop(['CODE', 'ESYMBOL', 'EXCHANGE', 'NAME', 'RN', 'SHANGQIGUSHU',\r\n                              'SHANGQISHIZHI', 'SHANGQISHULIANG'], axis=1)\r\n            for col in ['GUSHU', 'GUSHUBIJIAO', 'SHIZHI', 'SCSTC27']:\r\n                df[col] = df[col].astype(float)\r\n            df['SCSTC27'] = df['SCSTC27']*100\r\n            df['GUSHU'] = df['GUSHU']/10000\r\n            df['GUSHUBIJIAO'] = df['GUSHUBIJIAO']/10000\r\n            df['SHIZHI'] = df['SHIZHI']/10000\r\n            df['GUSHU'] = df['GUSHU'].map(ct.FORMAT)\r\n            df['GUSHUBIJIAO'] = df['GUSHUBIJIAO'].map(ct.FORMAT)\r\n            df['SHIZHI'] = df['SHIZHI'].map(ct.FORMAT)\r\n            df['SCSTC27'] = df['SCSTC27'].map(ct.FORMAT)\r\n            df.columns = rv.FUND_HOLDS_COLS\r\n            df = df[['code', 'name', 'date', 'nums', 'nlast', 'count', \r\n                         'clast', 'amount', 'ratio']]\r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            if pageNo == 0:\r\n                return df, int(lines['pagecount'])\r\n            else:\r\n                return df\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)    \r\n    \r\n\r\ndef new_stocks(retry_count=3, pause=0.001):\r\n    \"\"\"\r\n    获取新股上市数据\r\n    Parameters\r\n    --------\r\n    retry_count : int, 默认 3\r\n                 如遇网络等问题重复执行的次数 \r\n    pause : int, 默认 0\r\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n    \r\n    Return\r\n    ------\r\n    DataFrame\r\n    code:股票代码\r\n    xcode:申购代码\r\n    name:名称\r\n    ipo_date:上网发行日期\r\n    issue_date:上市日期\r\n    amount:发行数量(万股)\r\n    markets:上网发行数量(万股)\r\n    price:发行价格(元)\r\n    pe:发行市盈率\r\n    limit:个人申购上限(万股)\r\n    funds：募集资金(亿元)\r\n    ballot:网上中签率(%)\r\n    \"\"\"\r\n    data = pd.DataFrame()\r\n    ct._write_head()\r\n    df = _newstocks(data, 1, retry_count,\r\n                    pause)\r\n    return df\r\n\r\n\r\ndef _newstocks(data, pageNo, retry_count, pause):\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        ct._write_console()\r\n        try:\r\n            html = lxml.html.parse(rv.NEW_STOCKS_URL%(ct.P_TYPE['http'],ct.DOMAINS['vsf'],\r\n                         ct.PAGES['newstock'], pageNo))\r\n            res = html.xpath('//table[@id=\\\"NewStockTable\\\"]/tr')\r\n            if len(res) == 0:\r\n                return data\r\n            if ct.PY3:\r\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\r\n            else:\r\n                sarr = [etree.tostring(node) for node in res]\r\n            sarr = ''.join(sarr)\r\n            sarr = sarr.replace('<font color=\"red\">*</font>', '')\r\n            sarr = '<table>%s</table>'%sarr\r\n            df = pd.read_html(StringIO(sarr), skiprows=[0, 1])[0]\r\n            df = df.drop([df.columns[idx] for idx in [12, 13, 14]], axis=1)\r\n            df.columns = rv.NEW_STOCKS_COLS\r\n            df['code'] = df['code'].map(lambda x : str(x).zfill(6))\r\n            df['xcode'] = df['xcode'].map(lambda x : str(x).zfill(6))\r\n            res = html.xpath('//table[@class=\\\"table2\\\"]/tr[1]/td[1]/a/text()')\r\n            tag = '下一页' if ct.PY3 else unicode('下一页', 'utf-8')\r\n            hasNext = True if tag in res else False \r\n            data = data.append(df, ignore_index=True)\r\n            pageNo += 1\r\n            if hasNext:\r\n                data = _newstocks(data, pageNo, retry_count, pause)\r\n        except Exception as ex:\r\n            print(ex)\r\n        else:\r\n            return data \r\n\r\n\r\ndef new_cbonds(default=1, retry_count=3, pause=0.001):\r\n    \"\"\"\r\n    获取可转债申购列表\r\n    Parameters\r\n    --------\r\n    retry_count : int, 默认 3\r\n                 如遇网络等问题重复执行的次数 \r\n    pause : int, 默认 0\r\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n    \r\n    Return\r\n    ------\r\n    DataFrame\r\n    bcode:债券代码\r\n    bname:债券名称\r\n    scode:股票代码\r\n    sname:股票名称\r\n    xcode:申购代码\r\n    amount:发行总数(亿元)\r\n    marketprice:最新市场价格\r\n    convprice:转股价格\r\n    firstdayprice:首日收盘价\r\n    ipo_date:上网发行日期\r\n    issue_date:上市日期\r\n    ballot:中签率(%)\r\n    return：打新收益率(%)\r\n    perreturn:每中一股收益（万元）\r\n    \r\n    \"\"\"\r\n    data = pd.DataFrame()\r\n    if default == 1:\r\n        data = _newcbonds(1, retry_count,\r\n                    pause)\r\n    else:\r\n        for page in range(1, 50):\r\n            df = _newcbonds(page, retry_count,\r\n                    pause)\r\n            if df is not None:\r\n                data = data.append(df, ignore_index=True)\r\n            else:\r\n                break\r\n    return data\r\n\r\n\r\ndef _newcbonds(pageNo, retry_count, pause):\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        if pageNo != 1:\r\n            ct._write_console()\r\n        try:\r\n            html = lxml.html.parse(rv.NEW_CBONDS_URL%(ct.P_TYPE['http'],ct.DOMAINS['sstar'],\r\n                         pageNo))\r\n            res = html.xpath('//table/tr')\r\n            if len(res) == 0:\r\n                return None\r\n            if ct.PY3:\r\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\r\n            else:\r\n                sarr = [etree.tostring(node) for node in res]\r\n            sarr = ''.join(sarr)\r\n            sarr = '<table>%s</table>'%sarr\r\n            df = pd.read_html(StringIO(sarr), skiprows=[0])\r\n            if len(df) < 1:\r\n                return None\r\n            df = df[0]\r\n            df = df.drop([df.columns[14], df.columns[15]], axis=1)\r\n            df.columns = rv.NEW_CBONDS_COLS\r\n            df['scode'] = df['scode'].map(lambda x: str(x).zfill(6))\r\n            df['xcode'] = df['xcode'].map(lambda x: str(x).zfill(6))\r\n        except Exception as ex:\r\n            print(ex)\r\n        else:\r\n            return df \r\n\r\n\r\n\r\ndef sh_margins(start=None, end=None, retry_count=3, pause=0.001):\r\n    \"\"\"\r\n    获取沪市融资融券数据列表\r\n    Parameters\r\n    --------\r\n    start:string\r\n                  开始日期 format：YYYY-MM-DD 为空时取去年今日\r\n    end:string\r\n                  结束日期 format：YYYY-MM-DD 为空时取当前日期\r\n    retry_count : int, 默认 3\r\n                 如遇网络等问题重复执行的次数 \r\n    pause : int, 默认 0\r\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n    \r\n    Return\r\n    ------\r\n    DataFrame\r\n    opDate:信用交易日期\r\n    rzye:本日融资余额(元)\r\n    rzmre: 本日融资买入额(元)\r\n    rqyl: 本日融券余量\r\n    rqylje: 本日融券余量金额(元)\r\n    rqmcl: 本日融券卖出量\r\n    rzrqjyzl:本日融资融券余额(元)\r\n    \"\"\"\r\n    start = du.today_last_year() if start is None else start\r\n    end = du.today() if end is None else end\r\n    if du.diff_day(start, end) < 0:\r\n        return None\r\n    start, end = start.replace('-', ''), end.replace('-', '')\r\n    data = pd.DataFrame()\r\n    ct._write_head()\r\n    df = _sh_hz(data, start=start, end=end,\r\n                retry_count=retry_count,\r\n                pause=pause)\r\n    return df\r\n\r\n\r\ndef _sh_hz(data, start=None, end=None, \r\n           pageNo='', beginPage='',\r\n           endPage='',\r\n           retry_count=3, pause=0.001):\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        ct._write_console()\r\n        try:\r\n            tail = rv.MAR_SH_HZ_TAIL_URL%(pageNo,\r\n                                    beginPage, endPage)\r\n            if pageNo == '':\r\n                pageNo = 6\r\n                tail = ''\r\n            else:\r\n                pageNo += 5\r\n            beginPage = pageNo\r\n            endPage = pageNo + 4\r\n            url = rv.MAR_SH_HZ_URL%(ct.P_TYPE['http'], ct.DOMAINS['sseq'],\r\n                                    ct.PAGES['qmd'], _random(5),\r\n                                    start, end, tail,\r\n                                    _random())\r\n            ref = rv.MAR_SH_HZ_REF_URL%(ct.P_TYPE['http'], ct.DOMAINS['sse'])\r\n            clt = Client(url, ref=ref, cookie=rv.MAR_SH_COOKIESTR)\r\n            lines = clt.gvalue()\r\n            lines = lines.decode('utf-8') if ct.PY3 else lines\r\n            lines = lines[19:-1]\r\n            lines = json.loads(lines)\r\n            pagecount = int(lines['pageHelp'].get('pageCount'))\r\n            datapage = int(pagecount/5+1 if pagecount%5>0 else pagecount/5)\r\n            df = pd.DataFrame(lines['result'], columns=rv.MAR_SH_HZ_COLS)\r\n            df['opDate'] = df['opDate'].map(lambda x: '%s-%s-%s'%(x[0:4], x[4:6], x[6:8]))\r\n            data = data.append(df, ignore_index=True)\r\n            if beginPage < datapage*5:\r\n                data = _sh_hz(data, start=start, end=end, pageNo=pageNo, \r\n                       beginPage=beginPage, endPage=endPage, \r\n                       retry_count=retry_count, pause=pause)\r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            return data\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef sh_margin_details(date='', symbol='', \r\n                      start='', end='',\r\n                      retry_count=3, pause=0.001):\r\n    \"\"\"\r\n    获取沪市融资融券明细列表\r\n    Parameters\r\n    --------\r\n    date:string\r\n                明细数据日期 format：YYYY-MM-DD 默认为空''\r\n    symbol：string\r\n                标的代码，6位数字e.g.600848，默认为空  \r\n    start:string\r\n                  开始日期 format：YYYY-MM-DD 默认为空''\r\n    end:string\r\n                  结束日期 format：YYYY-MM-DD 默认为空''\r\n    retry_count : int, 默认 3\r\n                 如遇网络等问题重复执行的次数 \r\n    pause : int, 默认 0\r\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n    \r\n    Return\r\n    ------\r\n    DataFrame\r\n    opDate:信用交易日期\r\n    stockCode:标的证券代码\r\n    securityAbbr:标的证券简称\r\n    rzye:本日融资余额(元)\r\n    rzmre: 本日融资买入额(元)\r\n    rzche:本日融资偿还额(元)\r\n    rqyl: 本日融券余量\r\n    rqmcl: 本日融券卖出量\r\n    rqchl: 本日融券偿还量\r\n    \"\"\"\r\n    date = date if date == '' else date.replace('-', '')\r\n    start = start if start == '' else start.replace('-', '')\r\n    end = end if end == '' else end.replace('-', '')\r\n    if (start != '') & (end != ''):\r\n        date = ''\r\n    data = pd.DataFrame()\r\n    ct._write_head()\r\n    df = _sh_mx(data, date=date, start=start,\r\n                end=end, symbol=symbol,\r\n                retry_count=retry_count,\r\n                pause=pause)\r\n    return df\r\n\r\n\r\ndef _sh_mx(data, date='', start='', end='', \r\n           symbol='',\r\n           pageNo='', beginPage='',\r\n           endPage='',\r\n           retry_count=3, pause=0.001):\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        ct._write_console()\r\n        try:\r\n            tail = '&pageHelp.pageNo=%s&pageHelp.beginPage=%s&pageHelp.endPage=%s'%(pageNo,\r\n                                    beginPage, endPage)\r\n            if pageNo == '':\r\n                pageNo = 6\r\n                tail = ''\r\n            else:\r\n                pageNo += 5\r\n            beginPage = pageNo\r\n            endPage = pageNo + 4\r\n            ref = rv.MAR_SH_HZ_REF_URL%(ct.P_TYPE['http'], ct.DOMAINS['sse'])\r\n            clt = Client(rv.MAR_SH_MX_URL%(ct.P_TYPE['http'], ct.DOMAINS['sseq'],\r\n                                    ct.PAGES['qmd'], _random(5), date, \r\n                                    symbol, start, end, tail,\r\n                                    _random()), ref=ref, cookie=rv.MAR_SH_COOKIESTR)\r\n            lines = clt.gvalue()\r\n            lines = lines.decode('utf-8') if ct.PY3 else lines\r\n            lines = lines[19:-1]\r\n            lines = json.loads(lines)\r\n            pagecount = int(lines['pageHelp'].get('pageCount'))\r\n            datapage = int(pagecount/5+1 if pagecount%5>0 else pagecount/5)\r\n            if pagecount == 0:\r\n                return data\r\n            if pageNo == 6:\r\n                ct._write_tips(lines['pageHelp'].get('total'))\r\n            df = pd.DataFrame(lines['result'], columns=rv.MAR_SH_MX_COLS)\r\n            df['opDate'] = df['opDate'].map(lambda x: '%s-%s-%s'%(x[0:4], x[4:6], x[6:8]))\r\n            data = data.append(df, ignore_index=True)\r\n            if beginPage < datapage*5:\r\n                data = _sh_mx(data, start=start, end=end, pageNo=pageNo, \r\n                       beginPage=beginPage, endPage=endPage, \r\n                       retry_count=retry_count, pause=pause)\r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            return data\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef sz_margins(start=None, end=None, retry_count=3, pause=0.001):\r\n    \"\"\"\r\n    获取深市融资融券数据列表\r\n    Parameters\r\n    --------\r\n    start:string\r\n                  开始日期 format：YYYY-MM-DD 默认为上一周的今天\r\n    end:string\r\n                  结束日期 format：YYYY-MM-DD 默认为今日\r\n    retry_count : int, 默认 3\r\n                 如遇网络等问题重复执行的次数 \r\n    pause : int, 默认 0\r\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n    \r\n    Return\r\n    ------\r\n    DataFrame\r\n    opDate:信用交易日期(index)\r\n    rzmre: 融资买入额(元)\r\n    rzye:融资余额(元)\r\n    rqmcl: 融券卖出量\r\n    rqyl: 融券余量\r\n    rqye: 融券余量(元)\r\n    rzrqye:融资融券余额(元)\r\n    \"\"\"\r\n    data = pd.DataFrame()\r\n    if start is None and end is None:\r\n        end = du.today()\r\n        start = du.day_last_week()\r\n    if start is None or end is None:\r\n        ct._write_msg(rv.MAR_SZ_HZ_MSG2)\r\n        return None\r\n    try:\r\n        date_range = pd.date_range(start=start, end=end, freq='B')\r\n        if len(date_range)>261:\r\n            ct._write_msg(rv.MAR_SZ_HZ_MSG)\r\n        else:\r\n            ct._write_head()\r\n            for date in date_range:\r\n                data = data.append(_sz_hz(str(date.date()), retry_count, pause) )\r\n    except:\r\n        ct._write_msg(ct.DATA_INPUT_ERROR_MSG)\r\n    else:\r\n        return data\r\n        \r\n\r\ndef _sz_hz(date='', retry_count=3, pause=0.001):\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        ct._write_console()\r\n        try:\r\n            request = Request(rv.MAR_SZ_HZ_URL%(ct.P_TYPE['http'], ct.DOMAINS['szse'],\r\n                                    ct.PAGES['szsefc'], date))\r\n            lines = urlopen(request, timeout = 10).read()\r\n            if len(lines) <= 200:\r\n                return pd.DataFrame()\r\n            df = pd.read_html(lines, skiprows=[0])[0]\r\n            df.columns = rv.MAR_SZ_HZ_COLS\r\n            df['opDate'] = date\r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            return df\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef sz_margin_details(date='', retry_count=3, pause=0.001):\r\n    \"\"\"\r\n    获取深市融资融券明细列表\r\n    Parameters\r\n    --------\r\n    date:string\r\n                明细数据日期 format：YYYY-MM-DD 默认为空''\r\n    retry_count : int, 默认 3\r\n                 如遇网络等问题重复执行的次数 \r\n    pause : int, 默认 0\r\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n    \r\n    Return\r\n    ------\r\n    DataFrame\r\n    opDate:信用交易日期\r\n    stockCode:标的证券代码\r\n    securityAbbr:标的证券简称\r\n    rzmre: 融资买入额(元)\r\n    rzye:融资余额(元)\r\n    rqmcl: 融券卖出量\r\n    rqyl: 融券余量\r\n    rqye: 融券余量(元)\r\n    rzrqye:融资融券余额(元)\r\n    \"\"\"\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            request = Request(rv.MAR_SZ_MX_URL%(ct.P_TYPE['http'], ct.DOMAINS['szse'],\r\n                                    ct.PAGES['szsefc'], date))\r\n            lines = urlopen(request, timeout = 10).read()\r\n            if len(lines) <= 200:\r\n                return pd.DataFrame()\r\n            df = pd.read_html(lines, skiprows=[0])[0]\r\n            df.columns = rv.MAR_SZ_MX_COLS\r\n            df['stockCode'] = df['stockCode'].map(lambda x:str(x).zfill(6))\r\n            df['opDate'] = date\r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            return df\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef top10_holders(code=None, year=None, quarter=None, gdtype='0',\r\n                  retry_count=3, pause=0.001):\r\n    if code is None:\r\n        return None\r\n    else:\r\n        code = ct._code_to_symbol(code)\r\n    gdtype = 'LT' if gdtype == '1' else ''\r\n    qdate = ''\r\n    if (year is not None) & (quarter is not None):\r\n        qdate = du.get_q_date(year, quarter)\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            request = Request(rv.TOP10_HOLDERS_URL%(ct.P_TYPE['http'], ct.DOMAINS['gw'],\r\n                                    gdtype, code.upper()))\r\n            lines = urlopen(request, timeout = 10).read()\r\n            lines = lines.decode('utf8') if ct.PY3 else lines\r\n            reg = re.compile(r'= \\'\\[(.*?)\\]\\';')\r\n            lines = reg.findall(lines)[0]\r\n            jss = json.loads('[%s]' %lines)\r\n            summ = []\r\n            data = pd.DataFrame()\r\n            for row in jss:\r\n                qt = row['jzrq'] if 'jzrq' in row.keys() else None\r\n                hold = row['ljcy'] if 'ljcy' in row.keys() else None\r\n                change = row['ljbh'] if 'ljbh' in row.keys() else None \r\n                props = row['ljzb'] if 'ljzb' in row.keys() else None\r\n                arow = [qt, hold, change ,props]\r\n                summ.append(arow)\r\n                ls = row['sdgdList'] if 'sdgdList' in row.keys() else None\r\n                dlist = []\r\n                for inrow in ls:\r\n                    sharetype = inrow['gbxz']\r\n                    name = inrow['gdmc']\r\n                    hold = inrow['cgs']\r\n                    h_pro = inrow['zzgs']\r\n                    status = inrow['zjqk']\r\n                    dlist.append([qt, name, hold, h_pro, sharetype, status])\r\n                ddata = pd.DataFrame(dlist, columns=rv.TOP10_PER_COLS)\r\n                data = data.append(ddata, ignore_index=True)\r\n            df = pd.DataFrame(summ, columns=rv.TOP10_SUMM_COLS)\r\n            if qdate != '':\r\n                df = df[df.quarter == qdate]\r\n                data = data[data.quarter == qdate]\r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            return df, data\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef moneyflow_hsgt():\r\n    \"\"\"\r\n    获取沪深港通资金流向\r\n    return:\r\n    DataFrame,单位: 百万元\r\n    --------------\r\n    date: 交易日期\r\n    ggt_ss: 港股通(沪)\r\n    ggt_sz: 港股通(深)\r\n    hgt: 沪港通\r\n    sgt: 深港通\r\n    north_money: 北向资金流入\r\n    south_money: 南向资金流入\r\n    \"\"\"\r\n    clt = Client(rv.HSGT_DATA%(ct.P_TYPE['http'], ct.DOMAINS['em']), \r\n                        ref=rv.HSGT_REF%(ct.P_TYPE['http'], ct.DOMAINS['em'], ct.PAGES['index']))\r\n    content = clt.gvalue()\r\n    content = content.decode('utf-8') if ct.PY3 else content\r\n    js = json.loads(content)\r\n    df = pd.DataFrame(js)\r\n    df['DateTime'] = df['DateTime'].map(lambda x: x[0:10])\r\n    df = df.replace('-', np.NaN)\r\n    df = df[rv.HSGT_TEMP]\r\n    df.columns = rv.HSGT_COLS\r\n    df = df.sort_values('date', ascending=False)\r\n    return df\r\n    \r\n\r\ndef margin_detail(date=''):\r\n    \"\"\"\r\n         沪深融券融券明细\r\n    Parameters\r\n    ---------------\r\n    date:string\r\n            日期 format：YYYY-MM-DD 或者 YYYYMMDD\r\n            \r\n    return DataFrame\r\n    --------------\r\n    code: 证券代码\r\n    name: 证券名称\r\n    buy: 今日买入额\r\n    buy_total:融资余额\r\n    sell: 今日卖出量（股）\r\n    sell_total: 融券余量（股）\r\n    sell_amount: 融券余额\r\n    total: 融资融券余额(元)\r\n    buy_repay: 本日融资偿还额(元)\r\n    sell_repay: 本日融券偿还量\r\n    \r\n    \"\"\"\r\n    date = str(date).replace('-', '')\r\n    df = pd.read_csv(ct.MG_URL%(ct.P_TYPE['http'],\r\n                                             ct.DOMAINS['oss'], date[0:6], 'mx', date),\r\n                     dtype={'code': object})\r\n    return df\r\n\r\n\r\ndef margin_target(date=''):\r\n    \"\"\"\r\n         沪深融券融券标的\r\n    Parameters\r\n    ---------------\r\n    date:string\r\n            日期 format：YYYY-MM-DD 或者 YYYYMMDD\r\n            \r\n    return DataFrame\r\n    --------------\r\n    code: 证券代码\r\n    name: 证券名称\r\n    long: 融资标的\r\n    short: 融券标的\r\n    \r\n    \"\"\"\r\n    date = str(date).replace('-', '')\r\n    df = pd.read_csv(ct.MG_URL%(ct.P_TYPE['http'],\r\n                                             ct.DOMAINS['oss'], date[0:6], 'bd', date),\r\n                     dtype={'code': object})\r\n    return df\r\n\r\n\r\ndef margin_offset(date):\r\n    \"\"\"\r\n         融资融券可充抵保证金证券\r\n    Parameters\r\n    ---------------\r\n    date:string\r\n            日期 format：YYYY-MM-DD 或者 YYYYMMDD\r\n            \r\n    return DataFrame\r\n    --------------\r\n    code: 证券代码\r\n    name: 证券名称\r\n    \r\n    \"\"\"\r\n    date = str(date).replace('-', '')\r\n    df = pd.read_csv(ct.MG_URL%(ct.P_TYPE['http'],\r\n                                             ct.DOMAINS['oss'], date[0:6], 'cd', date),\r\n                     dtype={'code': object})\r\n    return df\r\n\r\n\r\ndef stock_pledged():   \r\n    \"\"\"\r\n    股票质押数据\r\n    \r\n    return DataFrame\r\n    --------------\r\n    code: 证券代码\r\n    name: 证券名称\r\n    deals: 质押次数\r\n    unrest_pledged: 无限售股质押数量(万)\r\n    rest_pledged: 限售股质押数量(万)\r\n    totals: 总股本\r\n    p_ratio:质押比例（%）\r\n    \"\"\"\r\n    df = pd.read_csv(ct.GPZY_URL%(ct.P_TYPE['http'],\r\n                                             ct.DOMAINS['oss'], 'gpzy'),\r\n                     dtype={'code': object})\r\n    return df\r\n\r\n\r\ndef pledged_detail():   \r\n    \"\"\"\r\n    股票质押数据\r\n    \r\n    return DataFrame\r\n    --------------\r\n    code: 证券代码\r\n    name: 证券名称\r\n    ann_date: 公告日期\r\n    pledgor:出质人\r\n    pledgee:质权人\r\n    volume:质押数量\r\n    from_date:质押日期\r\n    end_date: 解除日期\r\n    \"\"\"\r\n    df = pd.read_csv(ct.GPZY_D_URL%(ct.P_TYPE['http'],\r\n                                             ct.DOMAINS['oss'], 'gpzy_detail'),\r\n                     dtype={'code': object, 'ann_date': object, 'end_date': object})\r\n    df['code'] = df['code'].map(lambda x : str(x).zfill(6))\r\n    df['end_date'] = np.where(df['end_date'] == '--', np.NaN, df['end_date'])\r\n    return df\r\n\r\n\r\n\r\ndef margin_zsl(date='', broker=''):   \r\n    \"\"\"\r\n         融资融券充抵保证金折算率\r\n    Parameters\r\n    ---------------\r\n    date:string\r\n            日期 format：YYYY-MM-DD 或者 YYYYMMDD\r\n    broker:\r\n    gtja:国泰君安\r\n    yhzq:银河证券\r\n    gfzq：广发证券\r\n    zszq：招商证券\r\n    gxzq：国信证券\r\n    swhy：申万宏源\r\n    zxjt：中信建投\r\n    zxzq：中信证券\r\n    \r\n    return DataFrame\r\n    --------------\r\n    code: 证券代码\r\n    name: 证券名称\r\n    ratio:比率\r\n    broker:券商代码\r\n    \"\"\"\r\n    date = str(date).replace('-', '')\r\n    df = pd.read_csv(ct.MG_ZSL_URL%(ct.P_TYPE['http'],\r\n                                             ct.DOMAINS['oss'], date[0:6], broker, date),\r\n                     dtype={'code': object})\r\n    return df\r\n\r\n\r\ndef stock_issuance(start_date='', end_date=''):\r\n    \"\"\"\r\n         股票增发\r\n    Parameters\r\n    ---------------\r\n    start_date:string\r\n    end_date:string\r\n            日期 format：YYYY-MM-DD\r\n            \r\n    return DataFrame\r\n    --------------\r\n    code: 证券代码\r\n    name: 证券名称\r\n    type:类型，定向增发/公开增发\r\n    count:数量\r\n    price:增发价格\r\n    close:最近收盘价\r\n    issue_date:增发日期\r\n    list_date:上市日期\r\n    locked_year:锁定年数\r\n    prem:截止当前溢价(%)\r\n    \"\"\"\r\n    df = pd.read_csv(ct.ZF%(ct.P_TYPE['http'],\r\n                                             ct.DOMAINS['oss'], 'zf'),\r\n                     dtype={'code': object})\r\n    if start_date != '' and start_date is not None:\r\n        df = df[df.issue_date >= start_date]\r\n    if end_date != '' and end_date is not None:\r\n        df = df[df.issue_date <= start_date]\r\n    df['prem'] = (df['close'] - df['price']) / df['price'] * 100\r\n    df['prem'] = df['prem'].map(ct.FORMAT)\r\n    df['prem'] = df['prem'].astype(float)\r\n    return df\r\n \r\n    \r\ndef _random(n=13):\r\n    from random import randint\r\n    start = 10**(n-1)\r\n    end = (10**n)-1\r\n    return str(randint(start, end))\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tushare/stock/shibor.py",
    "content": "# -*- coding:utf-8 -*-\n\"\"\"\n上海银行间同业拆放利率（Shibor）数据接口\nCreated on 2014/07/31\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n\"\"\"\nimport pandas as pd\nimport numpy as np\nfrom tushare.stock import cons as ct\nfrom tushare.util import dateu as du\nfrom tushare.util.netbase import Client\nfrom pandas.compat import StringIO\n\ndef shibor_data(year=None):\n    \"\"\"\n    获取上海银行间同业拆放利率（Shibor）\n    Parameters\n    ------\n      year:年份(int)\n      \n    Return\n    ------\n    date:日期\n    ON:隔夜拆放利率\n    1W:1周拆放利率\n    2W:2周拆放利率\n    1M:1个月拆放利率\n    3M:3个月拆放利率\n    6M:6个月拆放利率\n    9M:9个月拆放利率\n    1Y:1年拆放利率\n    \"\"\"\n    year = du.get_year() if year is None else year\n    lab = ct.SHIBOR_TYPE['Shibor']\n    lab = lab.encode('utf-8') if ct.PY3 else lab\n    try:\n        clt = Client(url=ct.SHIBOR_DATA_URL%(ct.P_TYPE['http'], ct.DOMAINS['shibor'],\n                                               ct.PAGES['dw'], 'Shibor',\n                                               year, lab,\n                                               year))\n        content = clt.gvalue()\n        df = pd.read_excel(StringIO(content))\n        df.columns = ct.SHIBOR_COLS\n        df['date'] = df['date'].map(lambda x: x.date())\n        if pd.__version__ < '0.21':\n            df['date'] = df['date'].astype(np.datetime64)\n        else:\n            df['date'] = df['date'].astype('datetime64[D]')\n        return df\n    except:\n        return None\n\ndef shibor_quote_data(year=None):\n    \"\"\"\n    获取Shibor银行报价数据\n    Parameters\n    ------\n      year:年份(int)\n      \n    Return\n    ------\n    date:日期\n    bank:报价银行名称\n    ON:隔夜拆放利率\n    ON_B:隔夜拆放买入价\n    ON_A:隔夜拆放卖出价\n    1W_B:1周买入\n    1W_A:1周卖出\n    2W_B:买入\n    2W_A:卖出\n    1M_B:买入\n    1M_A:卖出\n    3M_B:买入\n    3M_A:卖出\n    6M_B:买入\n    6M_A:卖出\n    9M_B:买入\n    9M_A:卖出\n    1Y_B:买入\n    1Y_A:卖出\n    \"\"\"\n    year = du.get_year() if year is None else year\n    lab = ct.SHIBOR_TYPE['Quote']\n    lab = lab.encode('utf-8') if ct.PY3 else lab\n    try:\n        clt = Client(url=ct.SHIBOR_DATA_URL%(ct.P_TYPE['http'], ct.DOMAINS['shibor'],\n                                               ct.PAGES['dw'], 'Quote',\n                                               year, lab,\n                                               year))\n        content = clt.gvalue()\n        df = pd.read_excel(StringIO(content), skiprows=[0])\n#         df.columns = ct.QUOTE_COLS\n        df.columns = ct.SHIBOR_Q_COLS\n        df['date'] = df['date'].map(lambda x: x.date())\n        if pd.__version__ < '0.21':\n            df['date'] = df['date'].astype(np.datetime64)\n        else:\n            df['date'] = df['date'].astype('datetime64[D]')\n        return df\n    except:\n        return None\n\ndef shibor_ma_data(year=None):\n    \"\"\"\n    获取Shibor均值数据\n    Parameters\n    ------\n      year:年份(int)\n      \n    Return\n    ------\n    date:日期\n       其它分别为各周期5、10、20均价\n    \"\"\"\n    year = du.get_year() if year is None else year\n    lab = ct.SHIBOR_TYPE['Tendency']\n    lab = lab.encode('utf-8') if ct.PY3 else lab\n    try:\n        clt = Client(url=ct.SHIBOR_DATA_URL%(ct.P_TYPE['http'], ct.DOMAINS['shibor'],\n                                               ct.PAGES['dw'], 'Shibor_Tendency',\n                                               year, lab,\n                                               year))\n        content = clt.gvalue()\n        df = pd.read_excel(StringIO(content), skiprows=[0])\n        df.columns = ct.SHIBOR_MA_COLS\n        df['date'] = df['date'].map(lambda x: x.date())\n        if pd.__version__ < '0.21':\n            df['date'] = df['date'].astype(np.datetime64)\n        else:\n            df['date'] = df['date'].astype('datetime64[D]')\n        return df\n    except:\n        return None\n\n\ndef lpr_data(year=None):\n    \"\"\"\n    获取贷款基础利率（LPR）\n    Parameters\n    ------\n      year:年份(int)\n      \n    Return\n    ------\n    date:日期\n    1Y:1年贷款基础利率\n    \"\"\"\n    year = du.get_year() if year is None else year\n    lab = ct.SHIBOR_TYPE['LPR']\n    lab = lab.encode('utf-8') if ct.PY3 else lab\n    try:\n        clt = Client(url=ct.SHIBOR_DATA_URL%(ct.P_TYPE['http'], ct.DOMAINS['shibor'],\n                                               ct.PAGES['dw'], 'LPR',\n                                               year, lab,\n                                               year))\n        content = clt.gvalue()\n        df = pd.read_excel(StringIO(content), skiprows=[0])\n        df.columns = ct.LPR_COLS\n        df['date'] = df['date'].map(lambda x: x.date())\n        if pd.__version__ < '0.21':\n            df['date'] = df['date'].astype(np.datetime64)\n        else:\n            df['date'] = df['date'].astype('datetime64[D]')\n        return df\n    except:\n        return None\n    \n\ndef lpr_ma_data(year=None):\n    \"\"\"\n    获取贷款基础利率均值数据\n    Parameters\n    ------\n      year:年份(int)\n      \n    Return\n    ------\n    date:日期\n    1Y_5:5日均值\n    1Y_10:10日均值\n    1Y_20:20日均值\n    \"\"\"\n    year = du.get_year() if year is None else year\n    lab = ct.SHIBOR_TYPE['LPR_Tendency']\n    lab = lab.encode('utf-8') if ct.PY3 else lab\n    try:\n        clt = Client(url=ct.SHIBOR_DATA_URL%(ct.P_TYPE['http'], ct.DOMAINS['shibor'],\n                                               ct.PAGES['dw'], 'LPR_Tendency',\n                                               year, lab,\n                                               year))\n        content = clt.gvalue()\n        df = pd.read_excel(StringIO(content), skiprows=[0])\n        df.columns = ct.LPR_MA_COLS\n        df['date'] = df['date'].map(lambda x: x.date())\n        if pd.__version__ < '0.21':\n            df['date'] = df['date'].astype(np.datetime64)\n        else:\n            df['date'] = df['date'].astype('datetime64[D]')\n        return df\n    except:\n        return None\n    \n    \n\n"
  },
  {
    "path": "tushare/stock/trading.py",
    "content": "# -*- coding:utf-8 -*- \r\n\"\"\"\r\n交易数据接口 \r\nCreated on 2014/07/31\r\n@author: Jimmy Liu\r\n@group : waditu\r\n@contact: jimmysoa@sina.cn\r\n\"\"\"\r\nfrom __future__ import division\r\n\r\nimport time\r\nimport json\r\nimport lxml.html\r\nfrom lxml import etree\r\nimport pandas as pd\r\nimport numpy as np\r\nimport datetime\r\nfrom tushare.stock import cons as ct\r\nimport re\r\nfrom pandas.compat import StringIO\r\nfrom tushare.util import dateu as du\r\nfrom tushare.util.formula import MA\r\nimport os\r\nfrom tushare.util.conns import get_apis, close_apis\r\nfrom tushare.stock.fundamental import get_stock_basics\r\ntry:\r\n    from urllib.request import urlopen, Request\r\nexcept ImportError:\r\n    from urllib2 import urlopen, Request\r\n\r\n\r\ndef get_hist_data(code=None, start=None, end=None,\r\n                  ktype='D', retry_count=3,\r\n                  pause=0.001):\r\n    \"\"\"\r\n        获取个股历史交易记录\r\n    Parameters\r\n    ------\r\n      code:string\r\n                  股票代码 e.g. 600848\r\n      start:string\r\n                  开始日期 format：YYYY-MM-DD 为空时取到API所提供的最早日期数据\r\n      end:string\r\n                  结束日期 format：YYYY-MM-DD 为空时取到最近一个交易日数据\r\n      ktype：string\r\n                  数据类型，D=日k线 W=周 M=月 5=5分钟 15=15分钟 30=30分钟 60=60分钟，默认为D\r\n      retry_count : int, 默认 3\r\n                 如遇网络等问题重复执行的次数 \r\n      pause : int, 默认 0\r\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n    return\r\n    -------\r\n      DataFrame\r\n          属性:日期 ，开盘价， 最高价， 收盘价， 最低价， 成交量， 价格变动 ，涨跌幅，5日均价，10日均价，20日均价，5日均量，10日均量，20日均量，换手率\r\n    \"\"\"\r\n    symbol = ct._code_to_symbol(code)\r\n    url = ''\r\n    if ktype.upper() in ct.K_LABELS:\r\n        url = ct.DAY_PRICE_URL%(ct.P_TYPE['http'], ct.DOMAINS['ifeng'],\r\n                                ct.K_TYPE[ktype.upper()], symbol)\r\n    elif ktype in ct.K_MIN_LABELS:\r\n        url = ct.DAY_PRICE_MIN_URL%(ct.P_TYPE['http'], ct.DOMAINS['ifeng'],\r\n                                    symbol, ktype)\r\n    else:\r\n        raise TypeError('ktype input error.')\r\n    \r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            request = Request(url)\r\n            lines = urlopen(request, timeout = 10).read()\r\n            if len(lines) < 15: #no data\r\n                return None\r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            js = json.loads(lines.decode('utf-8') if ct.PY3 else lines)\r\n            cols = []\r\n            if (code in ct.INDEX_LABELS) & (ktype.upper() in ct.K_LABELS):\r\n                cols = ct.INX_DAY_PRICE_COLUMNS\r\n            else:\r\n                cols = ct.DAY_PRICE_COLUMNS\r\n            if len(js['record'][0]) == 14:\r\n                cols = ct.INX_DAY_PRICE_COLUMNS\r\n            df = pd.DataFrame(js['record'], columns=cols)\r\n            if ktype.upper() in ['D', 'W', 'M']:\r\n                df = df.applymap(lambda x: x.replace(u',', u''))\r\n                df[df==''] = 0\r\n            for col in cols[1:]:\r\n                df[col] = df[col].astype(float)\r\n            if start is not None:\r\n                df = df[df.date >= start]\r\n            if end is not None:\r\n                df = df[df.date <= end]\r\n            if (code in ct.INDEX_LABELS) & (ktype in ct.K_MIN_LABELS):\r\n                df = df.drop('turnover', axis=1)\r\n            df = df.set_index('date')\r\n            df = df.sort_index(ascending = False)\r\n            return df\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef _parsing_dayprice_json(types=None, page=1):\r\n    \"\"\"\r\n           处理当日行情分页数据，格式为json\r\n     Parameters\r\n     ------\r\n        pageNum:页码\r\n     return\r\n     -------\r\n        DataFrame 当日所有股票交易数据(DataFrame)\r\n    \"\"\"\r\n    ct._write_console()\r\n    request = Request(ct.SINA_DAY_PRICE_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'],\r\n                                 ct.PAGES['jv'], types, page))\r\n    text = urlopen(request, timeout=10).read()\r\n    if text == 'null':\r\n        return None\r\n    reg = re.compile(r'\\,(.*?)\\:') \r\n    text = reg.sub(r',\"\\1\":', text.decode('gbk') if ct.PY3 else text) \r\n    text = text.replace('\"{symbol', '{\"symbol')\r\n    text = text.replace('{symbol', '{\"symbol\"')\r\n    if ct.PY3:\r\n        jstr = json.dumps(text)\r\n    else:\r\n        jstr = json.dumps(text, encoding='GBK')\r\n    js = json.loads(jstr)\r\n    df = pd.DataFrame(pd.read_json(js, dtype={'code':object}),\r\n                      columns=ct.DAY_TRADING_COLUMNS)\r\n    df = df.drop('symbol', axis=1)\r\n#     df = df.ix[df.volume > 0]\r\n    return df\r\n\r\n\r\ndef get_tick_data(code=None, date=None, retry_count=3, pause=0.001,\r\n                  src='sn'):\r\n    \"\"\"\r\n        获取分笔数据\r\n    Parameters\r\n    ------\r\n        code:string\r\n                  股票代码 e.g. 600848\r\n        date:string\r\n                  日期 format: YYYY-MM-DD\r\n        retry_count : int, 默认 3\r\n                  如遇网络等问题重复执行的次数\r\n        pause : int, 默认 0\r\n                 重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n        src : 数据源选择，可输入sn(新浪)、tt(腾讯)、nt(网易)，默认sn\r\n     return\r\n     -------\r\n        DataFrame 当日所有股票交易数据(DataFrame)\r\n              属性:成交时间、成交价格、价格变动，成交手、成交金额(元)，买卖类型\r\n    \"\"\"\r\n    if (src.strip() not in ct.TICK_SRCS):\r\n        print(ct.TICK_SRC_ERROR)\r\n        return None\r\n    symbol = ct._code_to_symbol(code)\r\n    symbol_dgt = ct._code_to_symbol_dgt(code)\r\n    datestr = date.replace('-', '')\r\n    url = {\r\n            ct.TICK_SRCS[0] : ct.TICK_PRICE_URL % (ct.P_TYPE['http'], ct.DOMAINS['sf'], ct.PAGES['dl'],\r\n                                date, symbol),\r\n            ct.TICK_SRCS[1] : ct.TICK_PRICE_URL_TT % (ct.P_TYPE['http'], ct.DOMAINS['tt'], ct.PAGES['idx'],\r\n                                           symbol, datestr),\r\n            ct.TICK_SRCS[2] : ct.TICK_PRICE_URL_NT % (ct.P_TYPE['http'], ct.DOMAINS['163'], date[0:4], \r\n                                         datestr, symbol_dgt)\r\n             }\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            if src == ct.TICK_SRCS[2]:\r\n                df = pd.read_excel(url[src])\r\n                df.columns = ct.TICK_COLUMNS\r\n            else:\r\n                re = Request(url[src])\r\n                lines = urlopen(re, timeout=10).read()\r\n                lines = lines.decode('GBK') \r\n                if len(lines) < 20:\r\n                    return None\r\n                df = pd.read_table(StringIO(lines), names=ct.TICK_COLUMNS,\r\n                                   skiprows=[0])      \r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            return df\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef get_sina_dd(code=None, date=None, vol=400, retry_count=3, pause=0.001):\r\n    \"\"\"\r\n        获取sina大单数据\r\n    Parameters\r\n    ------\r\n        code:string\r\n                  股票代码 e.g. 600848\r\n        date:string\r\n                  日期 format：YYYY-MM-DD\r\n        retry_count : int, 默认 3\r\n                  如遇网络等问题重复执行的次数\r\n        pause : int, 默认 0\r\n                 重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n     return\r\n     -------\r\n        DataFrame 当日所有股票交易数据(DataFrame)\r\n              属性:股票代码    股票名称    交易时间    价格    成交量    前一笔价格    类型（买、卖、中性盘）\r\n    \"\"\"\r\n    if code is None or len(code)!=6 or date is None:\r\n        return None\r\n    symbol = ct._code_to_symbol(code)\r\n    vol = vol*100\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            re = Request(ct.SINA_DD % (ct.P_TYPE['http'], ct.DOMAINS['vsf'], ct.PAGES['sinadd'],\r\n                                symbol, vol, date))\r\n            lines = urlopen(re, timeout=10).read()\r\n            lines = lines.decode('GBK') \r\n            if len(lines) < 100:\r\n                return None\r\n            df = pd.read_csv(StringIO(lines), names=ct.SINA_DD_COLS,\r\n                               skiprows=[0])    \r\n            if df is not None:\r\n                df['code'] = df['code'].map(lambda x: x[2:])\r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            return df\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef get_today_ticks(code=None, retry_count=3, pause=0.001):\r\n    \"\"\"\r\n        获取当日分笔明细数据\r\n    Parameters\r\n    ------\r\n        code:string\r\n                  股票代码 e.g. 600848\r\n        retry_count : int, 默认 3\r\n                  如遇网络等问题重复执行的次数\r\n        pause : int, 默认 0\r\n                 重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n     return\r\n     -------\r\n        DataFrame 当日所有股票交易数据(DataFrame)\r\n              属性:成交时间、成交价格、价格变动，成交手、成交金额(元)，买卖类型\r\n    \"\"\"\r\n    if code is None or len(code)!=6 :\r\n        return None\r\n    symbol = ct._code_to_symbol(code)\r\n    date = du.today()\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            request = Request(ct.TODAY_TICKS_PAGE_URL % (ct.P_TYPE['http'], ct.DOMAINS['vsf'],\r\n                                                       ct.PAGES['jv'], date,\r\n                                                       symbol))\r\n            data_str = urlopen(request, timeout=10).read()\r\n            data_str = data_str.decode('GBK')\r\n            data_str = data_str[1:-1]\r\n            data_str = eval(data_str, type('Dummy', (dict,), \r\n                                           dict(__getitem__ = lambda s, n:n))())\r\n            data_str = json.dumps(data_str)\r\n            data_str = json.loads(data_str)\r\n            pages = len(data_str['detailPages'])\r\n            data = pd.DataFrame()\r\n            ct._write_head()\r\n            for pNo in range(1, pages+1):\r\n                data = data.append(_today_ticks(symbol, date, pNo,\r\n                                                retry_count, pause), ignore_index=True)\r\n        except Exception as er:\r\n            print(str(er))\r\n        else:\r\n            return data\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef _today_ticks(symbol, tdate, pageNo, retry_count, pause):\r\n    ct._write_console()\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            html = lxml.html.parse(ct.TODAY_TICKS_URL % (ct.P_TYPE['http'],\r\n                                                         ct.DOMAINS['vsf'], ct.PAGES['t_ticks'],\r\n                                                         symbol, tdate, pageNo\r\n                                ))  \r\n            res = html.xpath('//table[@id=\\\"datatbl\\\"]/tbody/tr')\r\n            if ct.PY3:\r\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\r\n            else:\r\n                sarr = [etree.tostring(node) for node in res]\r\n            sarr = ''.join(sarr)\r\n            sarr = '<table>%s</table>'%sarr\r\n            sarr = sarr.replace('--', '0')\r\n            df = pd.read_html(StringIO(sarr), parse_dates=False)[0]\r\n            df.columns = ct.TODAY_TICK_COLUMNS\r\n            df['pchange'] = df['pchange'].map(lambda x : x.replace('%', ''))\r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            return df\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n        \r\n    \r\ndef get_today_all():\r\n    \"\"\"\r\n        一次性获取最近一个日交易日所有股票的交易数据\r\n    return\r\n    -------\r\n      DataFrame\r\n           属性：代码，名称，涨跌幅，现价，开盘价，最高价，最低价，最日收盘价，成交量，换手率，成交额，市盈率，市净率，总市值，流通市值\r\n    \"\"\"\r\n    ct._write_head()\r\n    df = _parsing_dayprice_json('hs_a', 1)\r\n    if df is not None:\r\n        for i in range(2, ct.PAGE_NUM[1]):\r\n            newdf = _parsing_dayprice_json('hs_a', i)\r\n            df = df.append(newdf, ignore_index=True)\r\n    df = df.append(_parsing_dayprice_json('shfxjs', 1),\r\n                                               ignore_index=True)\r\n    return df\r\n\r\n\r\ndef get_realtime_quotes(symbols=None):\r\n    \"\"\"\r\n        获取实时交易数据 getting real time quotes data\r\n       用于跟踪交易情况（本次执行的结果-上一次执行的数据）\r\n    Parameters\r\n    ------\r\n        symbols : string, array-like object (list, tuple, Series).\r\n        \r\n    return\r\n    -------\r\n        DataFrame 实时交易数据\r\n              属性:0：name，股票名字\r\n            1：open，今日开盘价\r\n            2：pre_close，昨日收盘价\r\n            3：price，当前价格\r\n            4：high，今日最高价\r\n            5：low，今日最低价\r\n            6：bid，竞买价，即“买一”报价\r\n            7：ask，竞卖价，即“卖一”报价\r\n            8：volumn，成交量 maybe you need do volumn/100\r\n            9：amount，成交金额（元 CNY）\r\n            10：b1_v，委买一（笔数 bid volume）\r\n            11：b1_p，委买一（价格 bid price）\r\n            12：b2_v，“买二”\r\n            13：b2_p，“买二”\r\n            14：b3_v，“买三”\r\n            15：b3_p，“买三”\r\n            16：b4_v，“买四”\r\n            17：b4_p，“买四”\r\n            18：b5_v，“买五”\r\n            19：b5_p，“买五”\r\n            20：a1_v，委卖一（笔数 ask volume）\r\n            21：a1_p，委卖一（价格 ask price）\r\n            ...\r\n            30：date，日期；\r\n            31：time，时间；\r\n    \"\"\"\r\n    symbols_list = ''\r\n    if isinstance(symbols, list) or isinstance(symbols, set) or isinstance(symbols, tuple) or isinstance(symbols, pd.Series):\r\n        for code in symbols:\r\n            symbols_list += ct._code_to_symbol(code) + ','\r\n    else:\r\n        symbols_list = ct._code_to_symbol(symbols)\r\n        \r\n    symbols_list = symbols_list[:-1] if len(symbols_list) > 8 else symbols_list \r\n    request = Request(ct.LIVE_DATA_URL%(ct.P_TYPE['http'], ct.DOMAINS['sinahq'],\r\n                                                _random(), symbols_list))\r\n    text = urlopen(request,timeout=10).read()\r\n    text = text.decode('GBK')\r\n    reg = re.compile(r'\\=\"(.*?)\\\";')\r\n    data = reg.findall(text)\r\n    regSym = re.compile(r'(?:sh|sz|gb_)(.*?)\\=')\r\n    syms = regSym.findall(text)\r\n    data_list = []\r\n    syms_list = []\r\n    for index, row in enumerate(data):\r\n        if len(row)>1:\r\n            data_list.append([astr for astr in row.split(',')])\r\n            syms_list.append(syms[index])\r\n    if len(syms_list) == 0:\r\n        return None\r\n    if len(data_list[0]) == 28:\r\n        df = pd.DataFrame(data_list, columns=ct.US_LIVE_DATA_COLS)\r\n    else:\r\n        df = pd.DataFrame(data_list, columns=ct.LIVE_DATA_COLS)\r\n        df = df.drop('s', axis=1)\r\n    df['code'] = syms_list\r\n    ls = [cls for cls in df.columns if '_v' in cls]\r\n    for txt in ls:\r\n        df[txt] = df[txt].map(lambda x : x[:-2])\r\n    return df\r\n\r\n\r\ndef get_h_data(code, start=None, end=None, autype='qfq',\r\n               index=False, retry_count=3, pause=0.001, drop_factor=True):\r\n    '''\r\n    获取历史复权数据\r\n    Parameters\r\n    ------\r\n      code:string\r\n                  股票代码 e.g. 600848\r\n      start:string\r\n                  开始日期 format：YYYY-MM-DD 为空时取当前日期\r\n      end:string\r\n                  结束日期 format：YYYY-MM-DD 为空时取去年今日\r\n      autype:string\r\n                  复权类型，qfq-前复权 hfq-后复权 None-不复权，默认为qfq\r\n      retry_count : int, 默认 3\r\n                 如遇网络等问题重复执行的次数 \r\n      pause : int, 默认 0\r\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n      drop_factor : bool, 默认 True\r\n                是否移除复权因子，在分析过程中可能复权因子意义不大，但是如需要先储存到数据库之后再分析的话，有该项目会更加灵活\r\n    return\r\n    -------\r\n      DataFrame\r\n          date 交易日期 (index)\r\n          open 开盘价\r\n          high  最高价\r\n          close 收盘价\r\n          low 最低价\r\n          volume 成交量\r\n          amount 成交金额\r\n    '''\r\n    \r\n    start = du.today_last_year() if start is None else start\r\n    end = du.today() if end is None else end\r\n    qs = du.get_quarts(start, end)\r\n    qt = qs[0]\r\n    ct._write_head()\r\n    data = _parse_fq_data(_get_index_url(index, code, qt), index,\r\n                          retry_count, pause)\r\n    if data is None:\r\n        data = pd.DataFrame()\r\n    if len(qs)>1:\r\n        for d in range(1, len(qs)):\r\n            qt = qs[d]\r\n            ct._write_console()\r\n            df = _parse_fq_data(_get_index_url(index, code, qt), index,\r\n                                retry_count, pause)\r\n            if df is None:  # 可能df为空，退出循环\r\n                break\r\n            else:\r\n                data = data.append(df, ignore_index = True)\r\n    if len(data) == 0 or len(data[(data.date >= start) & (data.date <= end)]) == 0:\r\n        return pd.DataFrame()\r\n    data = data.drop_duplicates('date')\r\n    if index:\r\n        data = data[(data.date >= start) & (data.date <= end)]\r\n        data = data.set_index('date')\r\n        data = data.sort_index(ascending = False)\r\n        return data\r\n    if autype == 'hfq':\r\n        if drop_factor:\r\n            data = data.drop('factor', axis=1)\r\n        data = data[(data.date >= start) & (data.date <= end)]\r\n        for label in ['open', 'high', 'close', 'low']:\r\n            data[label] = data[label].map(ct.FORMAT)\r\n            data[label] = data[label].astype(float)\r\n        data = data.set_index('date')\r\n        data = data.sort_index(ascending = False)\r\n        return data\r\n    else:\r\n        if autype == 'qfq':\r\n            if drop_factor:\r\n                data = data.drop('factor', axis = 1)\r\n            df = _parase_fq_factor(code, start, end)\r\n            df = df.drop_duplicates('date')\r\n            df = df.sort_values('date', ascending = False)\r\n            firstDate = data.head(1)['date']\r\n            frow = df[df.date == firstDate[0]]\r\n            rt = get_realtime_quotes(code)\r\n            if rt is None:\r\n                return pd.DataFrame()\r\n            if ((float(rt['high']) == 0) & (float(rt['low']) == 0)):\r\n                preClose = float(rt['pre_close'])\r\n            else:\r\n                if du.is_holiday(du.today()):\r\n                    preClose = float(rt['price'])\r\n                else:\r\n                    if (du.get_hour() > 9) & (du.get_hour() < 18):\r\n                        preClose = float(rt['pre_close'])\r\n                    else:\r\n                        preClose = float(rt['price'])\r\n            \r\n            rate = float(frow['factor']) / preClose\r\n            data = data[(data.date >= start) & (data.date <= end)]\r\n            for label in ['open', 'high', 'low', 'close']:\r\n                data[label] = data[label] / rate\r\n                data[label] = data[label].map(ct.FORMAT)\r\n                data[label] = data[label].astype(float)\r\n            data = data.set_index('date')\r\n            data = data.sort_index(ascending = False)\r\n            return data\r\n        else:\r\n            for label in ['open', 'high', 'close', 'low']:\r\n                data[label] = data[label] / data['factor']\r\n            if drop_factor:\r\n                data = data.drop('factor', axis=1)\r\n            data = data[(data.date >= start) & (data.date <= end)]\r\n            for label in ['open', 'high', 'close', 'low']:\r\n                data[label] = data[label].map(ct.FORMAT)\r\n            data = data.set_index('date')\r\n            data = data.sort_index(ascending = False)\r\n            data = data.astype(float)\r\n            return data\r\n\r\n\r\ndef _parase_fq_factor(code, start, end):\r\n    symbol = ct._code_to_symbol(code)\r\n    request = Request(ct.HIST_FQ_FACTOR_URL%(ct.P_TYPE['http'],\r\n                                             ct.DOMAINS['vsf'], symbol))\r\n    text = urlopen(request, timeout=10).read()\r\n    text = text[1:len(text)-1]\r\n    text = text.decode('utf-8') if ct.PY3 else text\r\n    text = text.replace('{_', '{\"')\r\n    text = text.replace('total', '\"total\"')\r\n    text = text.replace('data', '\"data\"')\r\n    text = text.replace(':\"', '\":\"')\r\n    text = text.replace('\",_', '\",\"')\r\n    text = text.replace('_', '-')\r\n    text = json.loads(text)\r\n    df = pd.DataFrame({'date':list(text['data'].keys()), 'factor':list(text['data'].values())})\r\n    df['date'] = df['date'].map(_fun_except) # for null case\r\n    if df['date'].dtypes == np.object:\r\n        df['date'] = pd.to_datetime(df['date'])\r\n    df = df.drop_duplicates('date')\r\n    df['factor'] = df['factor'].astype(float)\r\n    return df\r\n\r\n\r\ndef _fun_except(x):\r\n    if len(x) > 10:\r\n        return x[-10:]\r\n    else:\r\n        return x\r\n\r\n\r\ndef _parse_fq_data(url, index, retry_count, pause):\r\n    for _ in range(retry_count):\r\n        time.sleep(pause)\r\n        try:\r\n            request = Request(url)\r\n            text = urlopen(request, timeout=10).read()\r\n            text = text.decode('GBK')\r\n            html = lxml.html.parse(StringIO(text))\r\n            res = html.xpath('//table[@id=\\\"FundHoldSharesTable\\\"]')\r\n            if ct.PY3:\r\n                sarr = [etree.tostring(node).decode('utf-8') for node in res]\r\n            else:\r\n                sarr = [etree.tostring(node) for node in res]\r\n            sarr = ''.join(sarr)\r\n            if sarr == '':\r\n                return None\r\n            df = pd.read_html(sarr, skiprows = [0, 1])[0]\r\n            if len(df) == 0:\r\n                return pd.DataFrame()\r\n            if index:\r\n                df.columns = ct.HIST_FQ_COLS[0:7]\r\n            else:\r\n                df.columns = ct.HIST_FQ_COLS\r\n            if df['date'].dtypes == np.object:\r\n                df['date'] = pd.to_datetime(df['date'])\r\n            df = df.drop_duplicates('date')\r\n        except ValueError as e:\r\n            # 时间较早，已经读不到数据\r\n            return None\r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            return df\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef get_index():\r\n    \"\"\"\r\n    获取大盘指数行情\r\n    return\r\n    -------\r\n      DataFrame\r\n          code:指数代码\r\n          name:指数名称\r\n          change:涨跌幅\r\n          open:开盘价\r\n          preclose:昨日收盘价\r\n          close:收盘价\r\n          high:最高价\r\n          low:最低价\r\n          volume:成交量(手)\r\n          amount:成交金额（亿元）\r\n    \"\"\"\r\n    request = Request(ct.INDEX_HQ_URL%(ct.P_TYPE['http'],\r\n                                             ct.DOMAINS['sinahq']))\r\n    text = urlopen(request, timeout=10).read()\r\n    text = text.decode('GBK')\r\n    text = text.replace('var hq_str_sh', '').replace('var hq_str_sz', '')\r\n    text = text.replace('\";', '').replace('\"', '').replace('=', ',')\r\n    text = '%s%s'%(ct.INDEX_HEADER, text)\r\n    df = pd.read_csv(StringIO(text), sep=',', thousands=',')\r\n    df['change'] = (df['close'] / df['preclose'] - 1 ) * 100\r\n    df['amount'] = df['amount'] / 100000000\r\n    df['change'] = df['change'].map(ct.FORMAT)\r\n    df['amount'] = df['amount'].map(ct.FORMAT4)\r\n    df = df[ct.INDEX_COLS]\r\n    df['code'] = df['code'].map(lambda x:str(x).zfill(6))\r\n    df['change'] = df['change'].astype(float)\r\n    df['amount'] = df['amount'].astype(float)\r\n    return df\r\n \r\n\r\ndef _get_index_url(index, code, qt):\r\n    if index:\r\n        url = ct.HIST_INDEX_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'],\r\n                              code, qt[0], qt[1])\r\n    else:\r\n        url = ct.HIST_FQ_URL%(ct.P_TYPE['http'], ct.DOMAINS['vsf'],\r\n                              code, qt[0], qt[1])\r\n    return url\r\n\r\n\r\ndef get_k_data(code=None, start='', end='',\r\n                  ktype='D', autype='qfq', \r\n                  index=False,\r\n                  retry_count=3,\r\n                  pause=0.001):\r\n    \"\"\"\r\n    获取k线数据\r\n    ---------\r\n    Parameters:\r\n      code:string\r\n                  股票代码 e.g. 600848\r\n      start:string\r\n                  开始日期 format：YYYY-MM-DD 为空时取上市首日\r\n      end:string\r\n                  结束日期 format：YYYY-MM-DD 为空时取最近一个交易日\r\n      autype:string\r\n                  复权类型，qfq-前复权 hfq-后复权 None-不复权，默认为qfq\r\n      ktype：string\r\n                  数据类型，D=日k线 W=周 M=月 5=5分钟 15=15分钟 30=30分钟 60=60分钟，默认为D\r\n      retry_count : int, 默认 3\r\n                 如遇网络等问题重复执行的次数 \r\n      pause : int, 默认 0\r\n                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题\r\n    return\r\n    -------\r\n      DataFrame\r\n          date 交易日期 (index)\r\n          open 开盘价\r\n          high  最高价\r\n          close 收盘价\r\n          low 最低价\r\n          volume 成交量\r\n          amount 成交额\r\n          turnoverratio 换手率\r\n          code 股票代码\r\n    \"\"\"\r\n    symbol = ct.INDEX_SYMBOL[code] if index else ct._code_to_symbol(code)\r\n    url = ''\r\n    dataflag = ''\r\n    autype = '' if autype is None else autype\r\n    if (start is not None) & (start != ''):\r\n        end = du.today() if end is None or end == '' else end\r\n    if ktype.upper() in ct.K_LABELS:\r\n        fq = autype if autype is not None else ''\r\n        if code[:1] in ('1', '5') or index:\r\n            fq = ''\r\n        kline = '' if autype is None else 'fq'\r\n        if (start is None or start == '') & (end is None or end == ''):\r\n            urls = [ct.KLINE_TT_URL%(ct.P_TYPE['http'], ct.DOMAINS['tt'],\r\n                                    kline, fq, symbol, \r\n                                    ct.TT_K_TYPE[ktype.upper()], start, end,\r\n                                    fq, _random(17))]\r\n        else:\r\n            years = du.tt_dates(start, end)\r\n            urls = []\r\n            for year in years:\r\n                startdate = str(year) + '-01-01'\r\n                enddate = str(year+1) + '-12-31'\r\n                url = ct.KLINE_TT_URL%(ct.P_TYPE['http'], ct.DOMAINS['tt'],\r\n                                    kline, fq+str(year), symbol, \r\n                                    ct.TT_K_TYPE[ktype.upper()], startdate, enddate,\r\n                                    fq, _random(17))\r\n                urls.append(url)\r\n        dataflag = '%s%s'%(fq, ct.TT_K_TYPE[ktype.upper()])\r\n    elif ktype in ct.K_MIN_LABELS:\r\n        urls = [ct.KLINE_TT_MIN_URL%(ct.P_TYPE['http'], ct.DOMAINS['tt'],\r\n                                    symbol, ktype, ktype,\r\n                                    _random(16))]\r\n        dataflag = 'm%s'%ktype\r\n    else:\r\n        raise TypeError('ktype input error.')\r\n    data = pd.DataFrame()\r\n    for url in urls:\r\n        data = data.append(_get_k_data(url, dataflag, \r\n                                       symbol, code,\r\n                                       index, ktype,\r\n                                       retry_count, pause), \r\n                           ignore_index=True)\r\n    if ktype not in ct.K_MIN_LABELS:\r\n        if ((start is not None) & (start != '')) & ((end is not None) & (end != '')):\r\n            if data.empty==False:       \r\n                data = data[(data.date >= start) & (data.date <= end)]\r\n    return data\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n    \r\n\r\ndef _get_k_data(url, dataflag='',\r\n                symbol='',\r\n                code = '',\r\n                index = False,\r\n                ktype = '',\r\n                retry_count=3,\r\n                pause=0.001):\r\n    for _ in range(retry_count):\r\n            time.sleep(pause)\r\n            try:\r\n                request = Request(url)\r\n                lines = urlopen(request, timeout = 10).read()\r\n                if len(lines) < 100: #no data\r\n                    return None\r\n            except Exception as e:\r\n                print(e)\r\n            else:\r\n                lines = lines.decode('utf-8') if ct.PY3 else lines\r\n                lines = lines.split('=')[1]\r\n                reg = re.compile(r',{\"nd.*?}') \r\n                lines = re.subn(reg, '', lines) \r\n                js = json.loads(lines[0])\r\n                dataflag = dataflag if dataflag in list(js['data'][symbol].keys()) else ct.TT_K_TYPE[ktype.upper()]\r\n                if len(js['data'][symbol][dataflag]) == 0:\r\n                    return None\r\n                if len(js['data'][symbol][dataflag][0]) == 6:\r\n                    df = pd.DataFrame(js['data'][symbol][dataflag], \r\n                                  columns = ct.KLINE_TT_COLS_MINS)\r\n                else:\r\n                    df = pd.DataFrame(js['data'][symbol][dataflag], \r\n                                  columns = ct.KLINE_TT_COLS)\r\n                df['code'] = symbol if index else code\r\n                if ktype in ct.K_MIN_LABELS:\r\n                    df['date'] = df['date'].map(lambda x: '%s-%s-%s %s:%s'%(x[0:4], x[4:6], \r\n                                                                            x[6:8], x[8:10], \r\n                                                                            x[10:12]))\r\n                for col in df.columns[1:6]:\r\n                    df[col] = df[col].astype(float)\r\n                return df\r\n\r\ndef get_hists(symbols, start=None, end=None,\r\n                  ktype='D', retry_count=3,\r\n                  pause=0.001):\r\n    \"\"\"\r\n    批量获取历史行情数据，具体参数和返回数据类型请参考get_hist_data接口\r\n    \"\"\"\r\n    df = pd.DataFrame()\r\n    if isinstance(symbols, list) or isinstance(symbols, set) or isinstance(symbols, tuple) or isinstance(symbols, pd.Series):\r\n        for symbol in symbols:\r\n            data = get_hist_data(symbol, start=start, end=end,\r\n                                 ktype=ktype, retry_count=retry_count,\r\n                                 pause=pause)\r\n            data['code'] = symbol\r\n            df = df.append(data, ignore_index=True)\r\n        return df\r\n    else:\r\n        return None\r\n  \r\n  \r\ndef get_day_all(date=None):\r\n    \"\"\"\r\n    获取每日收盘行情\r\n    Parameters:\r\n    -------------\r\n    date:交易日期，格式:YYYY-MM-DD\r\n    \r\n    Return:\r\n    -------------\r\n    DataFrame\r\n    code 代码, name 名称, p_change 涨幅%,\r\n    price 现价, change 涨跌, open 今开, high 最高,\r\n    low 最低, preprice 昨收, pe 市盈(动),\r\n    volratio 量比, turnover 换手%, range 振幅%%,\r\n    volume 总量, selling 内盘, buying 外盘,\r\n    amount 总金额, totals 总股本(万), industry 细分行业,\r\n    area 地区, floats 流通股本(万), fvalues 流通市值,\r\n    abvalues AB股总市值, avgprice 均价, strength 强弱度%,\r\n    activity 活跃度, avgturnover 笔换手, attack 攻击波%,\r\n    interval3 近3月涨幅 ，interval 近6月涨幅\r\n    \"\"\"\r\n    wdate = du.last_tddate() if date is None else date\r\n    wdate = wdate.replace('-', '')\r\n    if wdate < '20170614':\r\n        return None\r\n    datepre = '' if date is None else wdate[0:4] + wdate[4:6] + '/'\r\n    df = pd.read_csv(ct.ALL_DAY_FILE%(datepre, \\\r\n                                      'hq' if date is None else wdate), \\\r\n                                      dtype={'code':'object'})\r\n    return df\r\n\r\n\r\ndef get_dt_time(t):\r\n    tstr = str(t)[:-2]\r\n    tstr = tstr.replace('-', '').replace(':', '')\r\n    return tstr\r\n\r\n\r\ndef bar2h5(market='', date='', freq='D', asset='E', filepath=''):\r\n    cons = get_apis()\r\n    stks = get_stock_basics()\r\n    fname = \"%s%s%sbar%s.h5\"%(filepath, market, date, freq)\r\n    store = pd.HDFStore(fname, \"a\")\r\n    if market in ['SH', 'SZ']:\r\n        if market == 'SH':\r\n            stks = stks.ix[stks.index.str[0]=='6', :]\r\n        elif market == 'SZ':\r\n            stks = stks.ix[stks.index.str[0]!='6', :]\r\n        else:\r\n            stks = ''\r\n        market = 1 if market == 'SH' else 0\r\n        for stk in stks.index:\r\n            symbol = '%s.SH'%stk\r\n            if 'min' in freq:\r\n                df = bar(stk, conn=cons, start_date=date, end_date=date, freq=freq, \r\n                             market=market, asset=asset)\r\n                df['Time'] = df.index\r\n                df['Time'] = df['Time'].apply(get_dt_time) \r\n                df.index = df['Time']\r\n                df.drop(['code','Time'], axis = 1, inplace=True)    \r\n                df.rename(columns={'open':'OPEN'}, inplace=True) \r\n                df.rename(columns={'close':'CLOSE'}, inplace=True)\r\n                df.rename(columns={'low':'LOW'}, inplace=True)\r\n                df.rename(columns={'high':'HIGH'}, inplace=True)\r\n                df.rename(columns={'vol':'VOLUME'}, inplace=True) \r\n                df.rename(columns={'amount':'TURNOVER'}, inplace=True) \r\n                df.loc[:,'HIGH'] =  df.loc[:,'HIGH'].astype(\"int64\")\r\n                df.loc[:,'LOW'] =  df.loc[:,'LOW'].astype(\"int64\")\r\n                df.loc[:,'OPEN'] =  df.loc[:,'OPEN'].astype(\"int64\")\r\n                df.loc[:,'CLOSE'] =  df.loc[:,'CLOSE'].astype(\"int64\")\r\n                df.loc[:,'VOLUME'] =  df.loc[:,'VOLUME'].astype(\"int64\")\r\n                df.loc[:,'TURNOVER'] =  df.loc[:,'TURNOVER'].astype(\"int64\")    \r\n                df.loc[:,'OPEN'] *= 10000   \r\n                df.loc[:,'CLOSE'] *= 10000    \r\n                df.loc[:,'HIGH'] *= 10000    \r\n                df.loc[:,'LOW'] *= 10000\r\n                df.loc[:,'ASKPRICE1']  = 0\r\n                df.loc[:,'ASKPRICE2']  = 0\r\n                df.loc[:,'ASKPRICE3']  = 0\r\n                df.loc[:,'ASKPRICE4']  = 0\r\n                df.loc[:,'ASKPRICE5']  = 0\r\n                df.loc[:,'ASKPRICE6']  = 0\r\n                df.loc[:,'ASKPRICE7']  = 0\r\n                df.loc[:,'ASKPRICE8']  = 0\r\n                df.loc[:,'ASKPRICE9']  = 0\r\n                df.loc[:,'ASKPRICE10'] = 0    \r\n                df.loc[:,'BIDPRICE1']  = 0\r\n                df.loc[:,'BIDPRICE2']  = 0\r\n                df.loc[:,'BIDPRICE3']  = 0\r\n                df.loc[:,'BIDPRICE4']  = 0\r\n                df.loc[:,'BIDPRICE5']  = 0\r\n                df.loc[:,'BIDPRICE6']  = 0\r\n                df.loc[:,'BIDPRICE7']  = 0\r\n                df.loc[:,'BIDPRICE8']  = 0\r\n                df.loc[:,'BIDPRICE9']  = 0\r\n                df.loc[:,'BIDPRICE10'] = 0    \r\n                df.loc[:,'ASKVOL1']  = 0\r\n                df.loc[:,'ASKVOL2']  = 0\r\n                df.loc[:,'ASKVOL3']  = 0\r\n                df.loc[:,'ASKVOL4']  = 0\r\n                df.loc[:,'ASKVOL5']  = 0\r\n                df.loc[:,'ASKVOL6']  = 0\r\n                df.loc[:,'ASKVOL7']  = 0\r\n                df.loc[:,'ASKVOL8']  = 0\r\n                df.loc[:,'ASKVOL9']  = 0\r\n                df.loc[:,'ASKVOL10'] = 0    \r\n                df.loc[:,'BIDVOL1']  = 0\r\n                df.loc[:,'BIDVOL2']  = 0\r\n                df.loc[:,'BIDVOL3']  = 0\r\n                df.loc[:,'BIDVOL4']  = 0\r\n                df.loc[:,'BIDVOL5']  = 0\r\n                df.loc[:,'BIDVOL6']  = 0\r\n                df.loc[:,'BIDVOL7']  = 0\r\n                df.loc[:,'BIDVOL8']  = 0\r\n                df.loc[:,'BIDVOL9']  = 0\r\n                df.loc[:,'BIDVOL10'] = 0    \r\n                df.loc[:,'VWAP'] = 0.0\r\n                df.loc[:,'VOL30']=0.0\r\n                df.loc[:,'TOTAL_VOLUME']=0.0\r\n                df.loc[:,'TOTAL_TURNOVER']=0.0\r\n                df.loc[:,'INTEREST']=0.0\r\n                print(df)\r\n#             if market == 1 and stk[0] == '6':\r\n#                 df = bar(stk, conn=cons, start_date=date, end_date=date, freq=freq, market=market, asset=asset)\r\n                \r\n            store[symbol] = df\r\n    \r\n    store.close()\r\n    close_apis(cons)\r\n \r\n\r\ndef bar(code, conn=None, start_date=None, end_date=None, freq='D', asset='E', \r\n           market='',\r\n           adj = None,\r\n           ma = [],\r\n           factors = [],\r\n           retry_count = 3):\r\n    \"\"\"\r\n    BAR数据\r\n    Parameters:\r\n    ------------\r\n    code:证券代码，支持股票,ETF/LOF,期货/期权,港股\r\n    con:服务器连接 ，通过ts.api()或者ts.xpi()获得\r\n    start_date:开始日期  YYYY-MM-DD/YYYYMMDD\r\n    end_date:结束日期 YYYY-MM-DD/YYYYMMDD\r\n    freq:支持1/5/15/30/60分钟,周/月/季/年\r\n    asset:证券类型 E:股票和交易所基金，INDEX:沪深指数,X:期货/期权/港股/中概美国/中证指数/国际指数\r\n    market:市场代码，通过ts.get_markets()获取\r\n    adj:复权类型,None不复权,qfq:前复权,hfq:后复权\r\n    ma:均线,支持自定义均线频度，如：ma5/ma10/ma20/ma60/maN\r\n    factors因子数据，目前支持以下两种：\r\n        vr:量比,默认不返回，返回需指定：factor=['vr']\r\n        tor:换手率，默认不返回，返回需指定：factor=['tor']\r\n                    以上两种都需要：factor=['vr', 'tor']\r\n    retry_count:网络重试次数\r\n    \r\n    Return\r\n    ----------\r\n    DataFrame\r\n    code:代码\r\n    open：开盘close/high/low/vol成交量/amount成交额/maN均价/vr量比/tor换手率\r\n    \r\n         期货(asset='X')\r\n    code/open/close/high/low/avg_price：均价  position：持仓量  vol：成交总量\r\n    \"\"\"\r\n    code = code.strip().upper()\r\n    for _ in range(retry_count):\r\n        try:\r\n            if conn is None:\r\n                print(ct.MSG_NOT_CONNECTED)\r\n                return None\r\n            api, xapi = conn\r\n            ktype = freq.strip().upper()\r\n            asset = asset.strip().upper()\r\n            mkcode = _get_mkcode(code, asset=asset, xapi=xapi) if market == '' else market\r\n            if asset in['E', 'INDEX']:\r\n                func = getattr(api, ct.ASSET[asset])\r\n            else:\r\n                ktype = 'XD' if ktype == 'D' else ktype\r\n                func = getattr(xapi, ct.ASSET['X'])\r\n            if ktype in ct.KTYPE_LOW_COLS:\r\n                data = pd.DataFrame()\r\n                for i in range(100): \r\n                    ds = func(ct.KTYPE[ktype], mkcode, code, i * 800, 800)\r\n                    df =  api.to_df(ds)\r\n                    data = data.append(df) if i == 0 else df.append(data,  ignore_index=True)\r\n                    if len(ds) < 800:\r\n                        break\r\n                data['datetime'] = data['datetime'].apply(lambda x: str(x[0:10]))\r\n            if ktype in ct.KTYPE_ARR:\r\n                data = pd.DataFrame()\r\n                for i in range(100): \r\n                    ds = func(ct.KTYPE[ktype], mkcode, code, i * 800, 800)\r\n                    df =  api.to_df(ds)\r\n                    data = data.append(df) if i == 0 else df.append(data,  ignore_index=True)\r\n                    if len(ds) < 800:\r\n                        break\r\n            data['datetime'] = pd.to_datetime(data['datetime'])\r\n            data = data.assign(code=str(code)) \\\r\n                .set_index('datetime', drop=True, inplace=False) \\\r\n                .drop(ct.T_DROP_COLS, axis=1)[ None if start_date == '' else start_date : \r\n                                              None if end_date == '' else end_date]\r\n            data = data.sort_index(ascending=False)\r\n            if asset in['E', 'INDEX']:\r\n                data = data[ct.BAR_E_COLS]\r\n                if ktype in ct.KTYPE_ARR:\r\n                    data['vol'] = data['vol'] / 100\r\n            else:\r\n                data = data[ct.BAR_X_COLS]\r\n                if mkcode in [28, 29, 30, 47, 60]:\r\n                    data.columns = ct.BAR_X_FUTURE_COLS\r\n                    data = data[ct.BAR_X_FUTURE_RL_COLS]\r\n                else:\r\n                    data = data.drop(['price', 'position'], axis=1)\r\n                    data.columns = ct.BAR_X_OTHER_COLS\r\n            if asset == 'E':\r\n                if adj is not None:\r\n                    df = factor_adj(code)\r\n                    if ktype in ct.KTYPE_LOW_COLS: \r\n                        data = data.merge(df, left_index=True, right_index=True)\r\n                        data['adj_factor'] = data['adj_factor'].fillna(method='bfill')\r\n                    else:\r\n                        def get_val(day):\r\n                            return df.ix[day]['adj_factor']\r\n                        data['adj_factor'] = data.index.map(lambda x: get_val(str(x)[0:10]))\r\n                    for col in ct.BAR_E_COLS[1:5]:\r\n                        if adj == 'hfq':\r\n                            data[col] = data[col] * data['adj_factor']\r\n                        else:\r\n                            data[col] = data[col] * data['adj_factor'] / float(df['adj_factor'][0])\r\n                        data[col] = data[col].map(ct.FORMAT)\r\n                    data = data.drop('adj_factor', axis=1)\r\n                if factors is not None and len(factors) >0 :\r\n                    if 'tor' in factors:\r\n                        df = factor_shares(code)\r\n                        if ktype in ct.KTYPE_LOW_COLS: \r\n                            data = data.merge(df, left_index=True, right_index=True)\r\n                            data['floats'] = data['floats'].fillna(method='bfill')\r\n                        else:\r\n                            def get_val(day):\r\n                                return df.ix[day]['floats']\r\n                            data['floats'] = data.index.map(lambda x: get_val(str(x)[0:10]))\r\n                        data['tor'] = data['vol'] / data['floats'] \r\n                        data['tor'] = data['tor'].map(ct.FORMAT)\r\n                        data['tor'] = data['tor'].astype(float)\r\n                        data = data.drop('floats', axis=1)\r\n                    if 'vr' in factors:\r\n                        data['vol5'] = MA(data['vol'], 5)\r\n                        data['mean'] = data['vol5'].shift(-5)\r\n                        data['vr'] = (data['vol'] / data['mean']).map(ct.FORMAT)\r\n                        data['vr'] = data['vr'].astype(float)\r\n                        data = data.drop(['vol5', 'mean'], axis=1)\r\n            if ma is not None and len(ma) > 0:\r\n                for a in ma:\r\n                    if isinstance(a, int):\r\n                        data['ma%s'%a] = MA(data['close'], a).map(ct.FORMAT).shift(-(a-1))\r\n                        data['ma%s'%a] = data['ma%s'%a].astype(float)\r\n            for col in ['open', 'high', 'low', 'close']:\r\n                data[col] = data[col].astype(float)\r\n            data['p_change'] = data['close'].pct_change(-1) * 100\r\n            data['p_change'] = data['p_change'].map(ct.FORMAT).astype(float)\r\n            return data\r\n        except:\r\n            return None\r\n        else:\r\n            data['p_change'] = data['close'].pct_change(-1) * 100\r\n            data['p_change'] = data['p_change'].map(ct.FORMAT).astype(float)\r\n            return data\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\ndef _get_mkcode(code='', asset='E', xapi=None):\r\n    mkcode = ''\r\n    if asset == 'E':\r\n        mkcode = ct._market_code(code)\r\n    elif asset == 'INDEX':\r\n        mkcode = ct._idx_market_code(code)\r\n    else:\r\n        if os.path.exists(ct.INST_PLK_F):\r\n            mks = pd.read_pickle(ct.INST_PLK_F)\r\n        else:\r\n            mks = get_instrument(xapi)\r\n            mks.to_pickle(ct.INST_PLK_F)\r\n        mkcode = mks[mks.code == code]['market'].values[0]\r\n    return mkcode\r\n\r\n\r\ndef tick(code, conn=None, date='', asset='E', market='', retry_count = 3):\r\n    \"\"\"\r\n    tick数据\r\n    Parameters:\r\n    ------------\r\n    code:证券代码，支持股票,ETF/LOF,期货/期权,港股\r\n    conn:服务器连接 ，通过ts.api()或者ts.xpi()获得\r\n    date:日期\r\n    asset:证券品种，E:沪深交易所股票和基金, INDEX:沪深交易所指数， X:其他证券品种，大致如下：\r\n                     支持的扩展行情包括(asset='X')：\r\n                            郑州商品期权         OZ 大连商品期权         OD 上海商品期权         OS\r\n                            上海个股期权         QQ 香港指数         FH 郑州商品         QZ 大连商品         QD 上海期货         QS\r\n                            香港主板         KH 香港权证         KR 开放式基金         FU 货币型基金         FB\r\n                            招商理财产品         LC 招商货币产品         LB 国际指数         FW 国内宏观指标         HG 中国概念股         CH\r\n                            美股知名公司         MG B股转H股         HB 股份转让         SB 股指期货         CZ 香港创业板         KG 香港信托基金         KT\r\n                             国债预发行         GY 主力期货合约         MA\r\n                              中证指数         ZZ 港股通         GH\r\n    market:市场代码，通过ts.get_markets()获取\r\n                  \r\n    Return\r\n    ----------\r\n    DataFrame\r\n    date:日期\r\n    time:时间\r\n    price:成交价\r\n    vol:成交量\r\n    type:买卖方向，0-买入 1-卖出 2-集合竞价成交\r\n            期货  0:开仓  1:多开   -1:空开\r\n         期货多一列数据oi_change:增仓数据\r\n\r\n    \"\"\"\r\n    code = code.strip().upper()\r\n    date = int(date.replace('-', ''))\r\n    today = int(str(du.today()).replace('-', ''))\r\n    for _ in range(retry_count):\r\n        try:\r\n            if conn is None:\r\n                print(ct.MSG_NOT_CONNECTED)\r\n                return None\r\n            api, xapi = conn\r\n            data = pd.DataFrame()\r\n            mkcode = _get_mkcode(code, asset=asset, xapi=xapi) if market == '' else market\r\n            con = api if asset in['E', 'INDEX'] else xapi\r\n            for i in range(200):\r\n                if date == today:\r\n                    ds = con.get_transaction_data(market=mkcode, code=code, start=i * 300, count=300)\r\n                else:\r\n                    ds = con.get_history_transaction_data(market=mkcode, code=code, date=date, start=i * 300, count=300)\r\n                df =  api.to_df(ds)\r\n                data = data.append(df) if i == 0 else df.append(data,  ignore_index=True)\r\n                if len(ds) < 300:\r\n                    break\r\n            if asset in['E', 'INDEX']:\r\n                data['date'] = date\r\n                data['date'] = data['date'].map(lambda x: '%s-%s-%s '%(str(x)[0:4], str(x)[4:6], str(x)[6:8]))\r\n                data['datetime'] = data['date'] + data['time']\r\n                data = data[['datetime', 'price', 'vol', 'buyorsell']]\r\n                data.columns = ['datetime', 'price', 'vol', 'type']\r\n            else:\r\n                if mkcode in [31, 71]:\r\n                    if date == today:\r\n                        data = data.drop(['hour', 'minute', 'nature_name', 'zengcang', 'direction', \r\n                                        'second', 'nature_mark', 'nature_value'], axis=1)\r\n                    else:\r\n                        data = data.drop(['hour', 'minute', 'nature_name', 'zengcang', 'direction'], axis=1)\r\n                    data.loc[data.nature== 512, 'nature' ] = 2\r\n                    data.loc[data.nature== 256, 'nature' ] = 1\r\n                    data = data.sort_values('date')\r\n                    data.columns = ['date', 'price', 'vol', 'type']\r\n                elif mkcode in [28, 29, 30, 47, 60]:\r\n                    if date == today:\r\n                        data = data.drop(['hour', 'minute', 'nature', 'direction', \r\n                                            'second', 'nature_mark', 'nature_value'], axis=1)\r\n                    else:\r\n                        data = data.drop(['hour', 'minute', 'nature', 'direction'], axis=1)\r\n                    data.columns = ['date', 'price', 'vol', 'oi_change', 'type']\r\n                else:\r\n                    data = data.drop(['hour', 'minute', 'nature_name', 'zengcang', 'direction', 'nature'], axis=1)\r\n            \r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            return data\r\n\r\n\r\n\r\ndef quotes(symbols, conn=None, asset='E', market=[], retry_count = 3):\r\n    \"\"\"\r\n        获取实时快照\r\n    Parameters\r\n    ------\r\n        symbols : string, array-like object (list, tuple, Series).\r\n        \r\n    return\r\n    -------\r\n        DataFrame 实时快照，5档行情\r\n    \"\"\"\r\n    for _ in range(retry_count):\r\n        try:\r\n            if conn is None:\r\n                print(ct.MSG_NOT_CONNECTED)\r\n                return None\r\n            api, xapi = conn\r\n            data = pd.DataFrame()\r\n            if isinstance(symbols, list) or isinstance(symbols, set) or isinstance(symbols, tuple) or isinstance(symbols, pd.Series):\r\n                for code in symbols:\r\n                    mkcode = _get_mkcode(code, asset=asset, xapi=xapi)\r\n                    if asset == 'E':\r\n                        df = api.to_df(api.get_security_quotes([(mkcode, code)]))\r\n                    elif asset == 'INDEX':\r\n                        df = api.to_df(api.get_security_quotes([(mkcode, code)]))\r\n                    else:\r\n                        df = xapi.to_df(xapi.get_instrument_quote(mkcode, code))\r\n                    data = data.append(df)\r\n            else:\r\n                mkcode = _get_mkcode(symbols, asset=asset, xapi=xapi)\r\n                if asset == 'E':\r\n                    data = api.to_df(api.get_security_quotes([(mkcode, symbols)]))\r\n                elif asset == 'INDEX':\r\n                    data = api.to_df(api.get_security_quotes([(mkcode, symbols)]))\r\n                else:\r\n                    data = xapi.to_df(xapi.get_instrument_quote(mkcode, symbols))\r\n            if asset in ['E', 'INDEX']:\r\n                data = data.drop(['market', 'active1', 'active2', 'reversed_bytes0', 'reversed_bytes1', 'reversed_bytes2',\r\n                                  'reversed_bytes3',\r\n                                  'reversed_bytes4',\r\n                                  'reversed_bytes5',\r\n                                  'reversed_bytes6',\r\n                                  'reversed_bytes7',\r\n                                  'reversed_bytes8',\r\n                                  'reversed_bytes9'], axis=1)\r\n            else:\r\n                data = data.drop(['market'], axis=1)\r\n        except Exception as e:\r\n            print(e)\r\n        else:\r\n            return data\r\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\r\n\r\n\r\n\r\ndef get_security(api):\r\n    \"\"\"\r\n            获取股票列表\r\n    \"\"\"\r\n    data = []\r\n    for p in range(100):\r\n        ds = api.get_security_list(0, p*1000)\r\n        data += ds\r\n        if len(ds) < 1000:\r\n            break\r\n    data = api.to_df(data)\r\n    return data\r\n\r\n\r\ndef reset_instrument(xapi=None):\r\n    \"\"\"\r\n            重新设置本地证券列表\r\n    \"\"\"\r\n    import tushare.util.conns as cs \r\n    xapi = cs.xapi_x() if xapi is None else xapi\r\n    data=[]\r\n    for i in range(200): \r\n        ds = xapi.get_instrument_info(i * 300, 300)\r\n        data += ds\r\n        if len(ds) < 300:\r\n            break\r\n    data = xapi.to_df(data)\r\n    data.to_pickle(ct.INST_PLK_F)\r\n    return data\r\n\r\n\r\n\r\ndef get_instrument(xapi=None):\r\n    \"\"\"\r\n            获取证券列表\r\n    \"\"\"\r\n    import tushare.util.conns as cs \r\n    xapi = cs.xapi_x() if xapi is None else xapi\r\n    if xapi is None:\r\n        print(ct.MSG_NOT_CONNECTED)\r\n        return None\r\n    data=[]\r\n    for i in range(200): # range for python2/3\r\n        ds = xapi.get_instrument_info(i * 300, 300)\r\n        data += ds\r\n        if len(ds) < 300:\r\n            break\r\n    data = xapi.to_df(data)\r\n    return data\r\n\r\n\r\ndef get_markets(xapi=None):\r\n    \"\"\"\r\n            获取市场代码\r\n    \"\"\"\r\n    if xapi is None:\r\n        print(ct.MSG_NOT_CONNECTED)\r\n        return None\r\n    data = xapi.get_markets()\r\n    data = xapi.to_df(data)\r\n    return data\r\n    \r\n    \r\ndef factor_adj(code):\r\n    df = pd.read_csv(ct.ADJ_FAC_URL%(ct.P_TYPE['http'],\r\n                                             ct.DOMAINS['oss'], code))\r\n    df = df.set_index('datetime')\r\n    return df\r\n\r\n\r\ndef factor_shares(code):\r\n    df = pd.read_csv(ct.SHS_FAC_URL%(ct.P_TYPE['http'],\r\n                                             ct.DOMAINS['oss'], code))[['datetime', 'floats']]\r\n    df = df.set_index('datetime')\r\n    return df\r\n\r\n\r\ndef _random(n=13):\r\n    from random import randint\r\n    start = 10**(n-1)\r\n    end = (10**n)-1\r\n    return str(randint(start, end))\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tushare/stock/trendline.py",
    "content": "# -*- coding:utf-8 -*-\n\n\"\"\"\n股票技术指标接口\nCreated on 2018/07/26\n@author: Wangzili\n@group : **\n@contact: 446406177@qq.com\n\n所有指标中参数df为通过get_k_data获取的股票数据\n\"\"\"\nimport pandas as pd\nimport numpy as np\nimport itertools\n\n\ndef ma(df, n=10):\n    \"\"\"\n    移动平均线 Moving Average\n    MA（N）=（第1日收盘价+第2日收盘价—+……+第N日收盘价）/N\n    \"\"\"\n    pv = pd.DataFrame()\n    pv['date'] = df['date']\n    pv['v'] = df.close.rolling(n).mean()\n    return pv\n\n\ndef _ma(series, n):\n    \"\"\"\n    移动平均\n    \"\"\"\n    return series.rolling(n).mean()\n\n\ndef md(df, n=10):\n    \"\"\"\n    移动标准差\n    STD=S（CLOSE,N）=[∑（CLOSE-MA(CLOSE，N)）^2/N]^0.5\n    \"\"\"\n    _md = pd.DataFrame()\n    _md['date'] = df.date\n    _md[\"md\"] = df.close.rolling(n).std(ddof=0)\n    return _md\n\n\ndef _md(series, n):\n    \"\"\"\n    标准差MD\n    \"\"\"\n    return series.rolling(n).std(ddof=0)  # 有时候会用ddof=1\n\n\ndef ema(df, n=12):\n    \"\"\"\n    指数平均数指标 Exponential Moving Average\n    今日EMA（N）=2/（N+1）×今日收盘价+(N-1)/（N+1）×昨日EMA（N）\n    EMA(X,N)=[2×X+(N-1)×EMA(ref(X),N]/(N+1)\n    \"\"\"\n    _ema = pd.DataFrame()\n    _ema['date'] = df['date']\n    _ema['ema'] = df.close.ewm(ignore_na=False, span=n, min_periods=0, adjust=False).mean()\n    return _ema\n\n\ndef _ema(series, n):\n    \"\"\"\n    指数平均数\n    \"\"\"\n    return series.ewm(ignore_na=False, span=n, min_periods=0, adjust=False).mean()\n\n\ndef macd(df, n=12, m=26, k=9):\n    \"\"\"\n    平滑异同移动平均线(Moving Average Convergence Divergence)\n    今日EMA（N）=2/（N+1）×今日收盘价+(N-1)/（N+1）×昨日EMA（N）\n    DIFF= EMA（N1）- EMA（N2）\n    DEA(DIF,M)= 2/(M+1)×DIF +[1-2/(M+1)]×DEA(REF(DIF,1),M)\n    MACD（BAR）=2×（DIF-DEA）\n    return:\n          osc: MACD bar / OSC 差值柱形图 DIFF - DEM\n          diff: 差离值\n          dea: 讯号线\n    \"\"\"\n    _macd = pd.DataFrame()\n    _macd['date'] = df['date']\n    _macd['diff'] = _ema(df.close, n) - _ema(df.close, m)\n    _macd['dea'] = _ema(_macd['diff'], k)\n    _macd['macd'] = _macd['diff'] - _macd['dea']\n    return _macd\n\n\ndef kdj(df, n=9):\n    \"\"\"\n    随机指标KDJ\n    N日RSV=（第N日收盘价-N日内最低价）/（N日内最高价-N日内最低价）×100%\n    当日K值=2/3前1日K值+1/3×当日RSV=SMA（RSV,M1）\n    当日D值=2/3前1日D值+1/3×当日K= SMA（K,M2）\n    当日J值=3 ×当日K值-2×当日D值\n    \"\"\"\n    _kdj = pd.DataFrame()\n    _kdj['date'] = df['date']\n    rsv = (df.close - df.low.rolling(n).min()) / (df.high.rolling(n).max() - df.low.rolling(n).min()) * 100\n    _kdj['k'] = sma(rsv, 3)\n    _kdj['d'] = sma(_kdj.k, 3)\n    _kdj['j'] = 3 * _kdj.k - 2 * _kdj.d\n    return _kdj\n\n\ndef rsi(df, n=6):\n    \"\"\"\n    相对强弱指标（Relative Strength Index，简称RSI\n    LC= REF(CLOSE,1)\n    RSI=SMA(MAX(CLOSE-LC,0),N,1)/SMA(ABS(CLOSE-LC),N1,1)×100\n    SMA（C,N,M）=M/N×今日收盘价+(N-M)/N×昨日SMA（N）\n    \"\"\"\n    # pd.set_option('display.max_rows', 1000)\n    _rsi = pd.DataFrame()\n    _rsi['date'] = df['date']\n    px = df.close - df.close.shift(1)\n    px[px < 0] = 0\n    _rsi['rsi'] = sma(px, n) / sma((df['close'] - df['close'].shift(1)).abs(), n) * 100\n    # def tmax(x):\n    #     if x < 0:\n    #         x = 0\n    #     return x\n    # _rsi['rsi'] = sma((df['close'] - df['close'].shift(1)).apply(tmax), n) / sma((df['close'] - df['close'].shift(1)).abs(), n) * 100\n    return _rsi\n\n\ndef vrsi(df, n=6):\n    \"\"\"\n    量相对强弱指标\n    VRSI=SMA（最大值（成交量-REF（成交量，1），0），N,1）/SMA（ABS（（成交量-REF（成交量，1），N，1）×100%\n    \"\"\"\n    _vrsi = pd.DataFrame()\n    _vrsi['date'] = df['date']\n    px = df['volume'] - df['volume'].shift(1)\n    px[px < 0] = 0\n    _vrsi['vrsi'] = sma(px, n) / sma((df['volume'] - df['volume'].shift(1)).abs(), n) * 100\n    return _vrsi\n\n\ndef boll(df, n=26, k=2):\n    \"\"\"\n    布林线指标BOLL boll(26,2)\tMID=MA(N)\n    标准差MD=根号[∑（CLOSE-MA(CLOSE，N)）^2/N]\n    UPPER=MID＋k×MD\n    LOWER=MID－k×MD\n    \"\"\"\n    _boll = pd.DataFrame()\n    _boll['date'] = df.date\n    _boll['mid'] = _ma(df.close, n)\n    _mdd = _md(df.close, n)\n    _boll['up'] = _boll.mid + k * _mdd\n    _boll['low'] = _boll.mid - k * _mdd\n    return _boll\n\n\ndef bbiboll(df, n=10, k=3):\n    \"\"\"\n    BBI多空布林线\tbbiboll(10,3)\n    BBI={MA(3)+ MA(6)+ MA(12)+ MA(24)}/4\n    标准差MD=根号[∑（BBI-MA(BBI，N)）^2/N]\n    UPR= BBI＋k×MD\n    DWN= BBI－k×MD\n    \"\"\"\n    # pd.set_option('display.max_rows', 1000)\n    _bbiboll = pd.DataFrame()\n    _bbiboll['date'] = df.date\n    _bbiboll['bbi'] = (_ma(df.close, 3) + _ma(df.close, 6) + _ma(df.close, 12) + _ma(df.close, 24)) / 4\n    _bbiboll['md'] = _md(_bbiboll.bbi, n)\n    _bbiboll['upr'] = _bbiboll.bbi + k * _bbiboll.md\n    _bbiboll['dwn'] = _bbiboll.bbi - k * _bbiboll.md\n    return _bbiboll\n\n\ndef wr(df, n=14):\n    \"\"\"\n    威廉指标 w&r\n    WR=[最高值（最高价，N）-收盘价]/[最高值（最高价，N）-最低值（最低价，N）]×100%\n    \"\"\"\n\n    _wr = pd.DataFrame()\n    _wr['date'] = df['date']\n    higest = df.high.rolling(n).max()\n    _wr['wr'] = (higest - df.close) / (higest - df.low.rolling(n).min()) * 100\n    return _wr\n\n\ndef bias(df, n=12):\n    \"\"\"\n    乖离率 bias\n    bias=[(当日收盘价-12日平均价)/12日平均价]×100%\n    \"\"\"\n    _bias = pd.DataFrame()\n    _bias['date'] = df.date\n    _mav = df.close.rolling(n).mean()\n    _bias['bias'] = (np.true_divide((df.close - _mav), _mav)) * 100\n    # _bias[\"bias\"] = np.vectorize(lambda x: round(Decimal(x), 4))(BIAS)\n    return _bias\n\n\ndef asi(df, n=5):\n    \"\"\"\n    振动升降指标(累计震动升降因子) ASI  # 同花顺给出的公式不完整就不贴出来了\n    \"\"\"\n    _asi = pd.DataFrame()\n    _asi['date'] = df.date\n    _m = pd.DataFrame()\n    _m['a'] = (df.high - df.close.shift()).abs()\n    _m['b'] = (df.low - df.close.shift()).abs()\n    _m['c'] = (df.high - df.low.shift()).abs()\n    _m['d'] = (df.close.shift() - df.open.shift()).abs()\n    _m['r'] = _m.apply(lambda x: x.a + 0.5 * x.b + 0.25 * x.d if max(x.a, x.b, x.c) == x.a else (\n        x.b + 0.5 * x.a + 0.25 * x.d if max(x.a, x.b, x.c) == x.b else x.c + 0.25 * x.d\n    ), axis=1)\n    _m['x'] = df.close - df.close.shift() + 0.5 * (df.close - df.open) + df.close.shift() - df.open.shift()\n    _m['k'] = np.maximum(_m.a, _m.b)\n    _asi['si'] = 16 * (_m.x / _m.r) * _m.k\n    _asi[\"asi\"] = _ma(_asi.si, n)\n    return _asi\n\n\ndef vr_rate(df, n=26):\n    \"\"\"\n    成交量变异率 vr or vr_rate\n    VR=（AVS+1/2CVS）/（BVS+1/2CVS）×100\n    其中：\n    AVS：表示N日内股价上涨成交量之和\n    BVS：表示N日内股价下跌成交量之和\n    CVS：表示N日内股价不涨不跌成交量之和\n    \"\"\"\n    _vr = pd.DataFrame()\n    _vr['date'] = df['date']\n    _m = pd.DataFrame()\n    _m['volume'] = df.volume\n    _m['cs'] = df.close - df.close.shift(1)\n    _m['avs'] = _m.apply(lambda x: x.volume if x.cs > 0 else 0, axis=1)\n    _m['bvs'] = _m.apply(lambda x: x.volume if x.cs < 0 else 0, axis=1)\n    _m['cvs'] = _m.apply(lambda x: x.volume if x.cs == 0 else 0, axis=1)\n    _vr[\"vr\"] = (_m.avs.rolling(n).sum() + 1 / 2 * _m.cvs.rolling(n).sum()\n                 ) / (_m.bvs.rolling(n).sum() + 1 / 2 * _m.cvs.rolling(n).sum()) * 100\n    return _vr\n\n\ndef vr(df, n=5):\n    \"\"\"\n    开市后平均每分钟的成交量与过去5个交易日平均每分钟成交量之比\n    量比:=V/REF(MA(V,5),1);\n    涨幅:=(C-REF(C,1))/REF(C,1)*100;\n    1)量比大于1.8，涨幅小于2%，现价涨幅在0—2%之间，在盘中选股的\n    选股:量比>1.8 AND 涨幅>0 AND 涨幅<2;\n    \"\"\"\n    _vr = pd.DataFrame()\n    _vr['date'] = df.date\n    _vr['vr'] = df.volume / _ma(df.volume, n).shift(1)\n    _vr['rr'] = (df.close - df.close.shift(1)) / df.close.shift(1) * 100\n    return _vr\n\n\ndef arbr(df, n=26):\n    \"\"\"\n    人气意愿指标\tarbr(26)\n    N日AR=N日内（H－O）之和除以N日内（O－L）之和\n    其中，H为当日最高价，L为当日最低价，O为当日开盘价，N为设定的时间参数，一般原始参数日设定为26日\n    N日BR=N日内（H－CY）之和除以N日内（CY－L）之和\n    其中，H为当日最高价，L为当日最低价，CY为前一交易日的收盘价，N为设定的时间参数，一般原始参数日设定为26日。\n    \"\"\"\n    _arbr = pd.DataFrame()\n    _arbr['date'] = df.date\n    _arbr['ar'] = (df.high - df.open).rolling(n).sum() / (df.open - df.low).rolling(n).sum() * 100\n    _arbr['br'] = (df.high - df.close.shift(1)).rolling(n).sum() / (df.close.shift() - df.low).rolling(n).sum() * 100\n    return _arbr\n\n\ndef dpo(df, n=20, m=6):\n    \"\"\"\n    区间震荡线指标\tdpo(20,6)\n    DPO=CLOSE-MA（CLOSE, N/2+1）\n    MADPO=MA（DPO,M）\n    \"\"\"\n    _dpo = pd.DataFrame()\n    _dpo['date'] = df['date']\n    _dpo['dpo'] = df.close - _ma(df.close, int(n / 2 + 1))\n    _dpo['dopma'] = _ma(_dpo.dpo, m)\n    return _dpo\n\n\ndef trix(df, n=12, m=20):\n    \"\"\"\n    三重指数平滑平均\tTRIX(12)\n    TR= EMA(EMA(EMA(CLOSE,N),N),N)，即进行三次平滑处理\n    TRIX=(TR-昨日TR)/ 昨日TR×100\n    TRMA=MA（TRIX，M）\n    \"\"\"\n    _trix = pd.DataFrame()\n    _trix['date'] = df.date\n    tr = _ema(_ema(_ema(df.close, n), n), n)\n    _trix['trix'] = (tr - tr.shift()) / tr.shift() * 100\n    _trix['trma'] = _ma(_trix.trix, m)\n    return _trix\n\n\ndef bbi(df):\n    \"\"\"\n    多空指数\tBBI(3,6,12,24)\n    BBI=（3日均价+6日均价+12日均价+24日均价）/4\n    \"\"\"\n    _bbi = pd.DataFrame()\n    _bbi['date'] = df['date']\n    _bbi['bbi'] = (_ma(df.close, 3) + _ma(df.close, 6) + _ma(df.close, 12) + _ma(df.close, 24)) / 4\n    return _bbi\n\n\ndef mtm(df, n=6, m=5):\n    \"\"\"\n    动力指标\tMTM(6,5)\n    MTM（N日）=C-REF(C,N)式中，C=当日的收盘价，REF(C,N)=N日前的收盘价；N日是只计算交易日期，剔除掉节假日。\n    MTMMA（MTM，N1）= MA（MTM，N1）\n    N表示间隔天数，N1表示天数\n    \"\"\"\n    _mtm = pd.DataFrame()\n    _mtm['date'] = df.date\n    _mtm['mtm'] = df.close - df.close.shift(n)\n    _mtm['mtmma'] = _ma(_mtm.mtm, m)\n    return _mtm\n\n\ndef obv(df):\n    \"\"\"\n    能量潮  On Balance Volume\n    多空比率净额= [（收盘价－最低价）－（最高价-收盘价）] ÷（ 最高价－最低价）×V  # 同花顺貌似用的下面公式\n    主公式：当日OBV=前一日OBV+今日成交量\n    1.基期OBV值为0，即该股上市的第一天，OBV值为0\n    2.若当日收盘价＞上日收盘价，则当日OBV=前一日OBV＋今日成交量\n    3.若当日收盘价＜上日收盘价，则当日OBV=前一日OBV－今日成交量\n    4.若当日收盘价＝上日收盘价，则当日OBV=前一日OBV\n    \"\"\"\n    _obv = pd.DataFrame()\n    _obv[\"date\"] = df['date']\n    # tmp = np.true_divide(((df.close - df.low) - (df.high - df.close)), (df.high - df.low))\n    # _obv['obvv'] = tmp * df.volume\n    # _obv[\"obv\"] = _obv.obvv.expanding(1).sum() / 100\n    _m = pd.DataFrame()\n    _m['date'] = df.date\n    _m['cs'] = df.close - df.close.shift()\n    _m['v'] = df.volume\n    _m['vv'] = _m.apply(lambda x: x.v if x.cs > 0 else (-x.v if x.cs < 0 else 0), axis=1)\n    _obv['obv'] = _m.vv.expanding(1).sum()\n    return _obv\n\n\ndef cci(df, n=14):\n    \"\"\"\n    顺势指标\n    TYP:=(HIGH+LOW+CLOSE)/3\n    CCI:=(TYP-MA(TYP,N))/(0.015×AVEDEV(TYP,N))\n    \"\"\"\n    _cci = pd.DataFrame()\n    _cci[\"date\"] = df['date']\n    typ = (df.high + df.low + df.close) / 3\n    _cci['cci'] = ((typ - typ.rolling(n).mean()) /\n                   (0.015 * typ.rolling(min_periods=1, center=False, window=n).apply(\n                    lambda x: np.fabs(x - x.mean()).mean())))\n    return _cci\n\n\ndef priceosc(df, n=12, m=26):\n    \"\"\"\n    价格振动指数\n    PRICEOSC=(MA(C,12)-MA(C,26))/MA(C,12) * 100\n    \"\"\"\n    _c = pd.DataFrame()\n    _c['date'] = df['date']\n    man = _ma(df.close, n)\n    _c['osc'] = (man - _ma(df.close, m)) / man * 100\n    return _c\n\n\ndef sma(a, n, m=1):\n    \"\"\"\n    平滑移动指标 Smooth Moving Average\n    \"\"\"\n    ''' # 方法一，此方法有缺陷\n    _sma = []\n    for index, value in enumerate(a):\n        if index == 0 or pd.isna(value) or np.isnan(value):\n            tsma = 0\n        else:\n            # Y=(M*X+(N-M)*Y')/N\n            tsma = (m * value + (n - m) * tsma) / n\n        _sma.append(tsma)\n    return pd.Series(_sma)\n    '''\n    ''' # 方法二\n\n    results = np.nan_to_num(a).copy()\n    # FIXME this is very slow\n    for i in range(1, len(a)):\n        results[i] = (m * results[i] + (n - m) * results[i - 1]) / n\n        # results[i] = ((n - 1) * results[i - 1] + results[i]) / n\n    # return results\n    '''\n    # b = np.nan_to_num(a).copy()\n    # return ((n - m) * a.shift(1) + m * a) / n\n\n    a = a.fillna(0)\n    b = a.ewm(min_periods=0, ignore_na=False, adjust=False, alpha=m/n).mean()\n    return b\n\n\ndef dbcd(df, n=5, m=16, t=76):\n    \"\"\"\n    异同离差乖离率\tdbcd(5,16,76)\n    BIAS=(C-MA(C,N))/MA(C,N)\n    DIF=(BIAS-REF(BIAS,M))\n    DBCD=SMA(DIF,T,1) =（1-1/T）×SMA(REF(DIF,1),T,1)+ 1/T×DIF\n    MM=MA(DBCD,5)\n    \"\"\"\n    _dbcd = pd.DataFrame()\n    _dbcd['date'] = df.date\n    man = _ma(df.close, n)\n    _bias = (df.close - man) / man\n    _dif = _bias - _bias.shift(m)\n    _dbcd['dbcd'] = sma(_dif, t)\n    _dbcd['mm'] = _ma(_dbcd.dbcd, n)\n    return _dbcd\n\n\ndef roc(df, n=12, m=6):\n    \"\"\"\n    变动速率\troc(12,6)\n    ROC=(今日收盘价-N日前的收盘价)/ N日前的收盘价×100%\n    ROCMA=MA（ROC，M）\n    ROC:(CLOSE-REF(CLOSE,N))/REF(CLOSE,N)×100\n    ROCMA:MA(ROC,M)\n    \"\"\"\n    _roc = pd.DataFrame()\n    _roc['date'] = df['date']\n    _roc['roc'] = (df.close - df.close.shift(n))/df.close.shift(n) * 100\n    _roc['rocma'] = _ma(_roc.roc, m)\n    return _roc\n\n\ndef vroc(df, n=12):\n    \"\"\"\n    量变动速率\n    VROC=(当日成交量-N日前的成交量)/ N日前的成交量×100%\n    \"\"\"\n    _vroc = pd.DataFrame()\n    _vroc['date'] = df['date']\n    _vroc['vroc'] = (df.volume - df.volume.shift(n)) / df.volume.shift(n) * 100\n    return _vroc\n\n\ndef cr(df, n=26):\n    \"\"\" 能量指标\n    CR=∑（H-PM）/∑（PM-L）×100\n    PM:上一交易日中价（(最高、最低、收盘价的均值)\n    H：当天最高价\n    L：当天最低价\n    \"\"\"\n    _cr = pd.DataFrame()\n    _cr['date'] = df.date\n    # pm = ((df['high'] + df['low'] + df['close']) / 3).shift(1)\n    pm = (df[['high', 'low', 'close']]).mean(axis=1).shift(1)\n    _cr['cr'] = (df.high - pm).rolling(n).sum()/(pm - df.low).rolling(n).sum() * 100\n    return _cr\n\n\ndef psy(df, n=12):\n    \"\"\"\n    心理指标\tPSY(12)\n    PSY=N日内上涨天数/N×100\n    PSY:COUNT(CLOSE>REF(CLOSE,1),N)/N×100\n    MAPSY=PSY的M日简单移动平均\n    \"\"\"\n    _psy = pd.DataFrame()\n    _psy['date'] = df.date\n    p = df.close - df.close.shift()\n    p[p <= 0] = np.nan\n    _psy['psy'] = p.rolling(n).count() / n * 100\n    return _psy\n\n\ndef wad(df, n=30):\n    \"\"\"\n    威廉聚散指标\tWAD(30)\n    TRL=昨日收盘价与今日最低价中价格最低者；TRH=昨日收盘价与今日最高价中价格最高者\n    如果今日的收盘价>昨日的收盘价，则今日的A/D=今日的收盘价－今日的TRL\n    如果今日的收盘价<昨日的收盘价，则今日的A/D=今日的收盘价－今日的TRH\n    如果今日的收盘价=昨日的收盘价，则今日的A/D=0\n    WAD=今日的A/D+昨日的WAD；MAWAD=WAD的M日简单移动平均\n    \"\"\"\n    def dmd(x):\n        if x.c > 0:\n            y = x.close - x.trl\n        elif x.c < 0:\n            y = x.close - x.trh\n        else:\n            y = 0\n        return y\n\n    _wad = pd.DataFrame()\n    _wad['date'] = df['date']\n    _ad = pd.DataFrame()\n    _ad['trl'] = np.minimum(df.low, df.close.shift(1))\n    _ad['trh'] = np.maximum(df.high, df.close.shift(1))\n    _ad['c'] = df.close - df.close.shift()\n    _ad['close'] = df.close\n    _ad['ad'] = _ad.apply(dmd, axis=1)\n    _wad['wad'] = _ad.ad.expanding(1).sum()\n    _wad['mawad'] = _ma(_wad.wad, n)\n    return _wad\n\n\ndef mfi(df, n=14):\n    \"\"\"\n    资金流向指标\tmfi(14)\n    MF＝TYP×成交量；TYP:当日中价（(最高、最低、收盘价的均值)\n    如果当日TYP>昨日TYP，则将当日的MF值视为当日PMF值。而当日NMF值＝0\n    如果当日TYP<=昨日TYP，则将当日的MF值视为当日NMF值。而当日PMF值=0\n    MR=∑PMF/∑NMF\n    MFI＝100-（100÷(1＋MR)）\n    \"\"\"\n    _mfi = pd.DataFrame()\n    _mfi['date'] = df.date\n    _m = pd.DataFrame()\n    _m['typ'] = df[['high', 'low', 'close']].mean(axis=1)\n    _m['mf'] = _m.typ * df.volume\n    _m['typ_shift'] = _m.typ - _m.typ.shift(1)\n    _m['pmf'] = _m.apply(lambda x: x.mf if x.typ_shift > 0 else 0, axis=1)\n    _m['nmf'] = _m.apply(lambda x: x.mf if x.typ_shift <= 0 else 0, axis=1)\n    # _mfi['mfi'] = 100 - (100 / (1 + _m.pmf.rolling(n).sum() / _m.nmf.rolling(n).sum()))\n    _m['mr'] = _m.pmf.rolling(n).sum() / _m.nmf.rolling(n).sum()\n    _mfi['mfi'] = 100 * _m.mr / (1 + _m.mr)  # 同花顺自己给出的公式和实际用的公式不一样，真操蛋，浪费两个小时时间\n    return _mfi\n\n\ndef pvt(df):\n    \"\"\"\n    pvt\t量价趋势指标\tpvt\n    如果设x=(今日收盘价—昨日收盘价)/昨日收盘价×当日成交量，\n    那么当日PVT指标值则为从第一个交易日起每日X值的累加。\n    \"\"\"\n    _pvt = pd.DataFrame()\n    _pvt['date'] = df.date\n\n    x = (df.close - df.close.shift(1)) / df.close.shift(1) * df.volume\n    _pvt['pvt'] = x.expanding(1).sum()\n    return _pvt\n\n\ndef wvad(df, n=24, m=6):\n    \"\"\"  # 算法是对的，同花顺计算wvad用的n=6\n    威廉变异离散量\twvad(24,6)\n    WVAD=N1日的∑ {(当日收盘价－当日开盘价)/(当日最高价－当日最低价)×成交量}\n    MAWVAD=MA（WVAD，N2）\n    \"\"\"\n    _wvad = pd.DataFrame()\n    _wvad['date'] = df.date\n    # _wvad['wvad'] = (np.true_divide((df.close - df.open), (df.high - df.low)) * df.volume).rolling(n).sum()\n    _wvad['wvad'] = (np.true_divide((df.close - df.open), (df.high - df.low)) * df.volume).rolling(n).sum()\n    _wvad['mawvad'] = _ma(_wvad.wvad, m)\n    return _wvad\n\n\ndef cdp(df):\n    \"\"\"\n    逆势操作\tcdp\n    CDP=(最高价+最低价+收盘价)/3  # 同花顺实际用的(H+L+2*c)/4\n    AH=CDP+(前日最高价-前日最低价)\n    NH=CDP×2-最低价\n    NL=CDP×2-最高价\n    AL=CDP-(前日最高价-前日最低价)\n    \"\"\"\n    _cdp = pd.DataFrame()\n    _cdp['date'] = df.date\n    # _cdp['cdp'] = (df.high + df.low + df.close * 2).shift(1) / 4\n    _cdp['cdp'] = df[['high', 'low', 'close', 'close']].shift().mean(axis=1)\n    _cdp['ah'] = _cdp.cdp + (df.high.shift(1) - df.low.shift())\n    _cdp['al'] = _cdp.cdp - (df.high.shift(1) - df.low.shift())\n    _cdp['nh'] = _cdp.cdp * 2 - df.low.shift(1)\n    _cdp['nl'] = _cdp.cdp * 2 - df.high.shift(1)\n    return _cdp\n\n\ndef env(df, n=14):\n    \"\"\"\n    ENV指标\tENV(14)\n    Upper=MA(CLOSE，N)×1.06\n    LOWER= MA(CLOSE，N)×0.94\n    \"\"\"\n    _env = pd.DataFrame()\n    _env['date'] = df.date\n    _env['up'] = df.close.rolling(n).mean() * 1.06\n    _env['low'] = df.close.rolling(n).mean() * 0.94\n    return _env\n\n\ndef mike(df, n=12):\n    \"\"\"\n    麦克指标\tmike(12)\n    初始价（TYP）=（当日最高价＋当日最低价＋当日收盘价）/3\n    HV=N日内区间最高价\n    LV=N日内区间最低价\n    初级压力线（WR）=TYP×2-LV\n    中级压力线（MR）=TYP+HV-LV\n    强力压力线（SR）=2×HV-LV\n    初级支撑线（WS）=TYP×2-HV\n    中级支撑线（MS）=TYP-HV+LV\n    强力支撑线（SS）=2×LV-HV\n    \"\"\"\n    _mike = pd.DataFrame()\n    _mike['date'] = df.date\n    typ = df[['high', 'low', 'close']].mean(axis=1)\n    hv = df.high.rolling(n).max()\n    lv = df.low.rolling(n).min()\n    _mike['wr'] = typ * 2 - lv\n    _mike['mr'] = typ + hv - lv\n    _mike['sr'] = 2 * hv - lv\n    _mike['ws'] = typ * 2 - hv\n    _mike['ms'] = typ - hv + lv\n    _mike['ss'] = 2 * lv - hv\n    return _mike\n\n\ndef vma(df, n=5):\n    \"\"\"\n    量简单移动平均\tVMA(5)\tVMA=MA(volume,N)\n    VOLUME表示成交量；N表示天数\n    \"\"\"\n    _vma = pd.DataFrame()\n    _vma['date'] = df.date\n    _vma['vma'] = _ma(df.volume, n)\n    return _vma\n\n\ndef vmacd(df, qn=12, sn=26, m=9):\n    \"\"\"\n    量指数平滑异同平均\tvmacd(12,26,9)\n    今日EMA（N）=2/（N+1）×今日成交量+(N-1)/（N+1）×昨日EMA（N）\n    DIFF= EMA（N1）- EMA（N2）\n    DEA(DIF,M)= 2/(M+1)×DIF +[1-2/(M+1)]×DEA(REF(DIF,1),M)\n    MACD（BAR）=2×（DIF-DEA）\n    \"\"\"\n    _vmacd = pd.DataFrame()\n    _vmacd['date'] = df.date\n    _vmacd['diff'] = _ema(df.volume, qn) - _ema(df.volume, sn)\n    _vmacd['dea'] = _ema(_vmacd['diff'], m)  # TODO: 不能用_vmacd.diff, 不知道为什么\n    _vmacd['macd'] = (_vmacd['diff'] - _vmacd['dea'])\n    return _vmacd\n\n\ndef vosc(df, n=12, m=26):\n    \"\"\"\n    成交量震荡\tvosc(12,26)\n    VOSC=（MA（VOLUME,SHORT）- MA（VOLUME,LONG））/MA（VOLUME,SHORT）×100\n    \"\"\"\n    _c = pd.DataFrame()\n    _c['date'] = df['date']\n    _c['osc'] = (_ma(df.volume, n) - _ma(df.volume, m)) / _ma(df.volume, n) * 100\n    return _c\n\n\ndef tapi(df, n=6):\n    \"\"\" # TODO: 由于get_k_data返回数据中没有amount，可以用get_h_data中amount，算法是正确的\n    加权指数成交值\ttapi(6)\n    TAPI=每日成交总值/当日加权指数=a/PI；A表示每日的成交金额，PI表示当天的股价指数即指收盘价\n    \"\"\"\n    _tapi = pd.DataFrame()\n    # _tapi['date'] = df.date\n    _tapi['tapi'] = df.amount / df.close\n    _tapi['matapi'] = _ma(_tapi.tapi, n)\n    return _tapi\n\n\ndef vstd(df, n=10):\n    \"\"\"\n    成交量标准差\tvstd(10)\n    VSTD=STD（Volume,N）=[∑（Volume-MA(Volume，N)）^2/N]^0.5\n    \"\"\"\n    _vstd = pd.DataFrame()\n    _vstd['date'] = df.date\n    _vstd['vstd'] = df.volume.rolling(n).std(ddof=1)\n    return _vstd\n\n\ndef adtm(df, n=23, m=8):\n    \"\"\"\n    动态买卖气指标\tadtm(23,8)\n    如果开盘价≤昨日开盘价，DTM=0\n    如果开盘价＞昨日开盘价，DTM=(最高价-开盘价)和(开盘价-昨日开盘价)的较大值\n    如果开盘价≥昨日开盘价，DBM=0\n    如果开盘价＜昨日开盘价，DBM=(开盘价-最低价)\n    STM=DTM在N日内的和\n    SBM=DBM在N日内的和\n    如果STM > SBM,ADTM=(STM-SBM)/STM\n    如果STM < SBM , ADTM = (STM-SBM)/SBM\n    如果STM = SBM,ADTM=0\n    ADTMMA=MA(ADTM,M)\n    \"\"\"\n    _adtm = pd.DataFrame()\n    _adtm['date'] = df.date\n    _m = pd.DataFrame()\n    _m['cc'] = df.open - df.open.shift(1)\n    _m['ho'] = df.high - df.open\n    _m['ol'] = df.open - df.low\n    _m['dtm'] = _m.apply(lambda x: max(x.ho, x.cc) if x.cc > 0 else 0, axis=1)\n    _m['dbm'] = _m.apply(lambda x: x.ol if x.cc < 0 else 0, axis=1)\n    _m['stm'] = _m.dtm.rolling(n).sum()\n    _m['sbm'] = _m.dbm.rolling(n).sum()\n    _m['ss'] = _m.stm - _m.sbm\n    _adtm['adtm'] = _m.apply(lambda x: x.ss / x.stm if x.ss > 0 else (x.ss / x.sbm if x.ss < 0 else 0), axis=1)\n    _adtm['adtmma'] = _ma(_adtm.adtm, m)\n    return _adtm\n\n\ndef mi(df, n=12):\n    \"\"\"\n    动量指标\tmi(12)\n    A=CLOSE-REF(CLOSE,N)\n    MI=SMA(A,N,1)\n    \"\"\"\n    _mi = pd.DataFrame()\n    _mi['date'] = df.date\n    _mi['mi'] = sma(df.close - df.close.shift(n), n)\n    return _mi\n\n\ndef micd(df, n=3, m=10, k=20):\n    \"\"\"\n    异同离差动力指数\tmicd(3,10,20)\n    MI=CLOSE-ref(CLOSE,1)AMI=SMA(MI,N1,1)\n    DIF=MA(ref(AMI,1),N2)-MA(ref(AMI,1),N3)\n    MICD=SMA(DIF,10,1)\n    \"\"\"\n    _micd = pd.DataFrame()\n    _micd['date'] = df.date\n    mi = df.close - df.close.shift(1)\n    ami = sma(mi, n)\n    dif = _ma(ami.shift(1), m) - _ma(ami.shift(1), k)\n    _micd['micd'] = sma(dif, m)\n    return _micd\n\n\ndef rc(df, n=50):\n    \"\"\"\n    变化率指数\trc(50)\n    RC=收盘价/REF（收盘价，N）×100\n    ARC=EMA（REF（RC，1），N，1）\n    \"\"\"\n    _rc = pd.DataFrame()\n    _rc['date'] = df.date\n    _rc['rc'] = df.close / df.close.shift(n) * 100\n    _rc['arc'] = sma(_rc.rc.shift(1), n)\n    return _rc\n\n\ndef rccd(df, n=59, m=21, k=28):\n    \"\"\"  # TODO: 计算结果错误和同花顺不同，检查不出来为什么\n    异同离差变化率指数 rate of change convergence divergence\trccd(59,21,28)\n    RC=收盘价/REF（收盘价，N）×100%\n    ARC=EMA(REF(RC,1),N,1)\n    DIF=MA(ref(ARC,1),N1)-MA MA(ref(ARC,1),N2)\n    RCCD=SMA(DIF,N,1)\n    \"\"\"\n    _rccd = pd.DataFrame()\n    _rccd['date'] = df.date\n    rc = df.close / df.close.shift(n) * 100\n    arc = sma(rc.shift(), n)\n    dif = _ma(arc.shift(), m) - _ma(arc.shift(), k)\n    _rccd['rccd'] = sma(dif, n)\n    return _rccd\n\n\ndef srmi(df, n=9):\n    \"\"\"\n    SRMIMI修正指标\tsrmi(9)\n    如果收盘价>N日前的收盘价，SRMI就等于（收盘价-N日前的收盘价）/收盘价\n    如果收盘价<N日前的收盘价，SRMI就等于（收盘价-N日签的收盘价）/N日前的收盘价\n    如果收盘价=N日前的收盘价，SRMI就等于0\n    \"\"\"\n    _srmi = pd.DataFrame()\n    _srmi['date'] = df.date\n    _m = pd.DataFrame()\n    _m['close'] = df.close\n    _m['cp'] = df.close.shift(n)\n    _m['cs'] = df.close - df.close.shift(n)\n    _srmi['srmi'] = _m.apply(lambda x: x.cs/x.close if x.cs > 0 else (x.cs/x.cp if x.cs < 0 else 0), axis=1)\n    return _srmi\n\n\ndef dptb(df, n=7):\n    \"\"\"\n    大盘同步指标\tdptb(7)\n    DPTB=（统计N天中个股收盘价>开盘价，且指数收盘价>开盘价的天数或者个股收盘价<开盘价，且指数收盘价<开盘价）/N\n    \"\"\"\n    ind = ts.get_k_data(\"sh000001\", start=df.date.iloc[0], end=df.date.iloc[-1])\n    sd = df.copy()\n    sd.set_index('date', inplace=True)  # 可能出现停盘等情况，所以将date设为index\n    ind.set_index('date', inplace=True)\n    _dptb = pd.DataFrame(index=df.date)\n    q = ind.close - ind.open\n    _dptb['p'] = sd.close - sd.open\n    _dptb['q'] = q\n    _dptb['m'] = _dptb.apply(lambda x: 1 if (x.p > 0 and x.q > 0) or (x.p < 0 and x.q < 0) else np.nan, axis=1)\n    _dptb['jdrs'] = _dptb.m.rolling(n).count() / n\n    _dptb.drop(columns=['p', 'q', 'm'], inplace=True)\n    _dptb.reset_index(inplace=True)\n    return _dptb\n\n\ndef jdqs(df, n=20):\n    \"\"\"\n    阶段强势指标\tjdqs(20)\n    JDQS=（统计N天中个股收盘价>开盘价，且指数收盘价<开盘价的天数）/（统计N天中指数收盘价<开盘价的天数）\n    \"\"\"\n    ind = ts.get_k_data(\"sh000001\", start=df.date.iloc[0], end=df.date.iloc[-1])\n    sd = df.copy()\n    sd.set_index('date', inplace=True)   # 可能出现停盘等情况，所以将date设为index\n    ind.set_index('date', inplace=True)\n    _jdrs = pd.DataFrame(index=df.date)\n    q = ind.close - ind.open\n    _jdrs['p'] = sd.close - sd.open\n    _jdrs['q'] = q\n    _jdrs['m'] = _jdrs.apply(lambda x: 1 if (x.p > 0 and x.q < 0) else np.nan, axis=1)\n    q[q > 0] = np.nan\n    _jdrs['t'] = q\n    _jdrs['jdrs'] = _jdrs.m.rolling(n).count() / _jdrs.t.rolling(n).count()\n    _jdrs.drop(columns=['p', 'q', 'm', 't'], inplace=True)\n    _jdrs.reset_index(inplace=True)\n    return _jdrs\n\n\ndef jdrs(df, n=20):\n    \"\"\"\n    阶段弱势指标\tjdrs(20)\n    JDRS=（统计N天中个股收盘价<开盘价，且指数收盘价>开盘价的天数）/（统计N天中指数收盘价>开盘价的天数）\n    \"\"\"\n    ind = ts.get_k_data(\"sh000001\", start=df.date.iloc[0], end=df.date.iloc[-1])\n    sd = df.copy()\n    sd.set_index('date', inplace=True)\n    ind.set_index('date', inplace=True)\n    _jdrs = pd.DataFrame(index=df.date)\n    q = ind.close - ind.open\n    _jdrs['p'] = sd.close - sd.open\n    _jdrs['q'] = q\n    _jdrs['m'] = _jdrs.apply(lambda x: 1 if (x.p < 0 and x.q > 0) else np.nan, axis=1)\n    q[q < 0] = np.nan\n    _jdrs['t'] = q\n    _jdrs['jdrs'] = _jdrs.m.rolling(n).count() / _jdrs.t.rolling(n).count()\n    _jdrs.drop(columns=['p', 'q', 'm', 't'], inplace=True)\n    _jdrs.reset_index(inplace=True)\n    return _jdrs\n\n\ndef zdzb(df, n=125, m=5, k=20):\n    \"\"\"\n    筑底指标\tzdzb(125,5,20)\n    A=（统计N1日内收盘价>=前收盘价的天数）/（统计N1日内收盘价<前收盘价的天数）\n    B=MA（A,N2）\n    D=MA（A，N3）\n    \"\"\"\n    _zdzb = pd.DataFrame()\n    _zdzb['date'] = df.date\n    p = df.close - df.close.shift(1)\n    q = p.copy()\n    p[p < 0] = np.nan\n    q[q >= 0] = np.nan\n    _zdzb['a'] = p.rolling(n).count() / q.rolling(n).count()\n    _zdzb['b'] = _zdzb.a.rolling(m).mean()\n    _zdzb['d'] = _zdzb.a.rolling(k).mean()\n    return _zdzb\n\n\ndef atr(df, n=14):\n    \"\"\"\n    真实波幅\tatr(14)\n    TR:MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW))\n    ATR:MA(TR,N)\n    \"\"\"\n    _atr = pd.DataFrame()\n    _atr['date'] = df.date\n    # _atr['tr'] = np.maximum(df.high - df.low, (df.close.shift(1) - df.low).abs())\n    # _atr['tr'] = np.maximum.reduce([df.high - df.low, (df.close.shift(1) - df.high).abs(), (df.close.shift(1) - df.low).abs()])\n    _atr['tr'] = np.vstack([df.high - df.low, (df.close.shift(1) - df.high).abs(), (df.close.shift(1) - df.low).abs()]).max(axis=0)\n    _atr['atr'] = _atr.tr.rolling(n).mean()\n    return _atr\n\n\ndef mass(df, n=9, m=25):\n    \"\"\"\n    梅丝线\tmass(9,25)\n    AHL=MA(（H-L）,N1)\n    BHL= MA（AHL，N1）\n    MASS=SUM（AHL/BHL，N2）\n    H：表示最高价；L：表示最低价\n    \"\"\"\n    _mass = pd.DataFrame()\n    _mass['date'] = df.date\n    ahl = _ma((df.high - df.low), n)\n    bhl = _ma(ahl, n)\n    _mass['mass'] = (ahl / bhl).rolling(m).sum()\n    return _mass\n\n\ndef vhf(df, n=28):\n    \"\"\"\n    纵横指标\tvhf(28)\n    VHF=（N日内最大收盘价与N日内最小收盘价之前的差）/（N日收盘价与前收盘价差的绝对值之和）\n    \"\"\"\n    _vhf = pd.DataFrame()\n    _vhf['date'] = df.date\n    _vhf['vhf'] = (df.close.rolling(n).max() - df.close.rolling(n).min()) / (df.close - df.close.shift(1)).abs().rolling(n).sum()\n    return _vhf\n\n\ndef cvlt(df, n=10):\n    \"\"\"\n    佳庆离散指标\tcvlt(10)\n    cvlt=（最高价与最低价的差的指数移动平均-前N日的最高价与最低价的差的指数移动平均）/前N日的最高价与最低价的差的指数移动平均\n    \"\"\"\n    _cvlt = pd.DataFrame()\n    _cvlt['date'] = df.date\n    p = _ema(df.high.shift(n) - df.low.shift(n), n)\n    _cvlt['cvlt'] = (_ema(df.high - df.low, n) - p) / p * 100\n    return _cvlt\n\n\ndef up_n(df):\n    \"\"\"\n    连涨天数\tup_n\t连续上涨天数，当天收盘价大于开盘价即为上涨一天 # 同花顺实际结果用收盘价-前一天收盘价\n    \"\"\"\n    _up = pd.DataFrame()\n    _up['date'] = df.date\n    p = df.close - df.close.shift()\n    p[p > 0] = 1\n    p[p < 0] = 0\n    m = []\n    for k, g in itertools.groupby(p):\n        t = 0\n        for i in g:\n            if k == 0:\n                m.append(0)\n            else:\n                t += 1\n                m.append(t)\n    # _up['p'] = p\n    _up['up'] = m\n    return _up\n\n\ndef down_n(df):\n    \"\"\"\n    连跌天数\tdown_n\t连续下跌天数，当天收盘价小于开盘价即为下跌一天\n    \"\"\"\n    _down = pd.DataFrame()\n    _down['date'] = df.date\n    p = df.close - df.close.shift()\n    p[p > 0] = 0\n    p[p < 0] = 1\n    m = []\n    for k, g in itertools.groupby(p):\n        t = 0\n        for i in g:\n            if k == 0:\n                m.append(0)\n            else:\n                t += 1\n                m.append(t)\n    _down['down'] = m\n    return _down\n\n\ndef join_frame(d1, d2, column='date'):\n    # 将两个DataFrame 按照datetime合并\n    return d1.join(d2.set_index(column), on=column)\n\n\nif __name__ == \"__main__\":\n    import tushare as ts\n    # data = ts.get_k_data(\"000063\", start=\"2017-05-01\")\n    data = ts.get_k_data(\"601138\", start=\"2017-05-01\")\n    # print(data)\n    # maf = ma(data, n=[5, 10, 20])\n    # 将均线合并到data中\n    # print(join_frame(data, maf))\n\n    # data = pd.DataFrame({\"close\": [1,2,3,4,5,6,7,8,9,0]})\n    # print(ma(data))\n    # mdf = md(data)\n    # print(md(data, n=26))\n    # print(join_frame(data, mdf))\n    # emaf = ema(data)\n    # print(ema(data, 5))\n    # print(join_frame(data, emaf))\n    # print(macd(data))\n    # print(kdj(data))\n    # print(vrsi(data, 6))\n    # print(boll(data))\n    # print(bbiboll(data))\n    # print(wr(data))\n    # print(bias(data))\n    # print(asi(data))\n    # print(vr_rate(data))\n    # print(vr(data))\n    # print(arbr(data))\n    # print(dpo(data))\n    # print(trix(data))\n    # print(bbi(data))\n    # print(ts.top_list(date=\"2019-01-17\"))\n    # print(mtm(data))\n    # print(obv(data))\n    # print(cci(data))\n    # print(priceosc(data))\n    # print(dbcd(data))\n    # print(roc(data))\n    # print(vroc(data))\n    # print(cr(data))\n    # print(psy(data))\n    # print(wad(data))\n    # print(mfi(data))\n    # print(pvt(data))\n    # print(wvad(data))\n    # print(cdp(data))\n    # print(env(data))\n    # print(mike(data))\n    # print(vr(data))\n    # print(vma(data))\n    # print(vmacd(data))\n    # print(vosc(data))\n    # print(tapi(data))\n    # print(vstd(data))\n    # print(adtm(data))\n    # print(mi(data))\n    # print(micd(data))\n    # print(rc(data))\n    print(rccd(data))\n    # print(srmi(data))\n    # print(dptb(data))\n    # print(jdqs(data))\n    # pd.set_option('display.max_rows', 1000)\n    # print(jdrs(data))\n    # print(join_frame(data, jdrs(data)))\n    # print(data)\n    # print(zdzb(data))\n    # print(atr(data))\n    # print(mass(data))\n    # print(vhf(data))\n    # print(cvlt(data))\n    # print(up_n(data))\n    # print(down_n(data))\n"
  },
  {
    "path": "tushare/trader/__init__.py",
    "content": ""
  },
  {
    "path": "tushare/trader/trader.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*- \n\n'''\nCreated on 2016年9月25日\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n'''\nimport six\nimport pandas as pd\nimport requests\nimport time\nfrom threading import Thread\nfrom tushare.trader import vars as vs\nfrom tushare.trader import utils\nfrom tushare.util import upass as up\nfrom tushare.util.upass import set_broker\n\nclass TraderAPI(object):\n    \"\"\"\n    股票实盘交易接口\n    提醒：本文涉及的思路和内容仅限于量化投资及程序化交易的研究与尝试，不作为个人或机构常规程序化交易的依据，\n    不对实盘的交易风险和政策风险产生的影响负责，如有问题请与我联系。\n    投资有风险，下单须谨慎。\n    \"\"\"\n    def __init__(self, broker = ''):\n        if broker == '':\n            return None\n        self.broker = broker\n        self.trade_prefix = vs.CSC_PREFIX % (vs.P_TYPE['https'], \n                                             vs.DOMAINS['csc'],\n                                             vs.PAGES['csclogin'])\n        self.heart_active = True\n        self.s = requests.session()\n        if six.PY2:\n            self.heart_thread = Thread(target = self.send_heartbeat)\n            self.heart_thread.setDaemon(True)\n        else:\n            self.heart_thread = Thread(target = self.send_heartbeat, \n                                       daemon=True)\n            \n            \n    def login(self):\n        self.s.headers.update(vs.AGENT)\n        self.s.get(vs.CSC_PREFIX % (vs.P_TYPE['https'], vs.DOMAINS['csc'],\n                                             vs.PAGES['csclogin']))\n        res = self.s.get(vs.V_CODE_URL%(vs.P_TYPE['https'],\n                                          vs.DOMAINS['cscsh'],\n                                          vs.PAGES['vimg']))\n        if self._login(utils.get_vcode('csc', res)) is False:\n            print('请确认账号或密码是否正确 ，或券商服务器是否处于维护中。 ')\n        self.keepalive()\n        \n        \n    def _login(self, v_code):\n        brokerinfo = up.get_broker(self.broker)\n        user = brokerinfo['user'][0]\n        login_params = dict(\n            inputid = user,                                 \n            j_username = user,\n            j_inputid = user,\n            AppendCode = v_code,\n            isCheckAppendCode = 'false',\n            logined = 'false',\n            f_tdx = '',\n            j_cpu = '',\n            j_password = brokerinfo['passwd'][0]\n        )\n        logined = self.s.post(vs.CSC_LOGIN_ACTION % (vs.P_TYPE['https'], \n                                                     vs.DOMAINS['csc']), \n                              params = login_params)\n        if logined.text.find(u'消息中心') != -1:\n            return True\n        return False\n    \n    \n    def keepalive(self):\n        if self.heart_thread.is_alive():\n            self.heart_active = True\n        else:\n            self.heart_thread.start()\n\n\n    def send_heartbeat(self):\n        while True:\n            if self.heart_active:\n                try:\n                    response = self.heartbeat()\n                    self.check_account_live(response)\n                except:\n                    self.login()\n                time.sleep(100)\n            else:\n                time.sleep(10)\n\n\n    def heartbeat(self):\n        return self.baseinfo\n\n\n    def exit(self):\n        self.heart_active = False\n\n    \n    def buy(self, stkcode, price=0, count=0, amount=0):\n        \"\"\"\n    买入证券\n        params\n        ---------\n        stkcode:股票代码，string\n        pricce:委托价格，int\n        count:买入数量\n        amount:买入金额\n        \"\"\"\n        jsonobj = utils.get_jdata(self._trading(stkcode, price, \n                                                count, amount, 'B', 'buy'))\n        res = True if jsonobj['result'] == 'true' else False\n        return res\n        \n    \n    def sell(self, stkcode, price=0, count=0, amount=0):\n        \"\"\"\n    卖出证券\n        params\n        ---------\n        stkcode:股票代码，string\n        pricce:委托价格，int\n        count:卖出数量\n        amount:卖出金额\n        \"\"\"\n        jsonobj = utils.get_jdata(self._trading(stkcode, price, count, \n                                                amount, 'S', 'sell'))\n        res = True if jsonobj['result'] == 'true' else False\n        return res\n    \n    \n    def _trading(self, stkcode, price, count, amount, tradeflag, tradetype):\n        txtdata = self.s.get(vs.TRADE_CHECK_URL % (vs.P_TYPE['https'], \n                                                   vs.DOMAINS['csc'], \n                                                   vs.PAGES['tradecheck'],\n                                                   tradeflag, stkcode, \n                                                   tradetype, utils.nowtime_str()))\n        jsonobj = utils.get_jdata(txtdata)\n        list = jsonobj['returnList'][0]\n        secuid = list['buysSecuid']\n        fundavl = list['fundavl']\n        stkname = list['stkname']\n        if secuid is not None:\n            if tradeflag == 'B':\n                buytype = vs.BUY\n                count = count if count else amount // price // 100 * 100 \n            else:\n                buytype = vs.SELL\n                count = count if count else amount // price\n                \n            tradeparams = dict(\n            stkname = stkname,\n            stkcode = stkcode,\n            secuid = secuid,\n            buytype = buytype,\n            bsflag = tradeflag,\n            maxstkqty = '',\n            buycount = count,\n            buyprice = price,\n            _ = utils.nowtime_str()\n            )\n            tradeResult = self.s.post(vs.TRADE_URL % (vs.P_TYPE['https'], \n                                                      vs.DOMAINS['csc'], \n                                                      vs.PAGES['trade']), \n                        params = tradeparams)\n            return tradeResult\n        return None\n        \n\n    def position(self):\n        \"\"\"\n    获取持仓列表\n        return:DataFrame\n        ----------------------\n        stkcode:证券代码\n        stkname:证券名称\n        stkqty :证券数量\n        stkavl :可用数量\n        lastprice:最新价格\n        costprice:成本价\n        income :参考盈亏（元）\n        \"\"\"\n        return self._get_position()\n    \n    \n    def _get_position(self):\n        self.s.headers.update(vs.AGENT)\n        txtdata = self.s.get(vs.BASE_URL % (vs.P_TYPE['https'], \n                                            vs.DOMAINS['csc'], \n                                            vs.PAGES['position']))\n        jsonobj = utils.get_jdata(txtdata)\n        df = pd.DataFrame(jsonobj['data'], columns=vs.POSITION_COLS)\n        return df\n    \n    \n    def entrust_list(self):\n        \"\"\"\n       获取委托单列表\n       return:DataFrame\n       ----------\n       ordersno:委托单号\n       stkcode:证券代码\n       stkname:证券名称\n       bsflagState:买卖标志\n       orderqty:委托数量\n       matchqty:成交数量\n       orderprice:委托价格\n       operdate:交易日期\n       opertime:交易时间\n       orderdate:下单日期\n       state:状态\n        \"\"\"\n        txtdata = self.s.get(vs.ENTRUST_LIST_URL % (vs.P_TYPE['https'], \n                                                    vs.DOMAINS['csc'], \n                                                    vs.PAGES['entrustlist'],\n                                            utils.nowtime_str()))\n        jsonobj = utils.get_jdata(txtdata)\n        df = pd.DataFrame(jsonobj['data'], columns=vs.ENTRUST_LIST_COLS)\n        return df\n    \n    \n    def deal_list(self, begin=None, end=None):\n        \"\"\"\n    获取成交列表\n        params\n        -----------\n        begin:开始日期  YYYYMMDD\n        end:结束日期  YYYYMMDD\n        \n        return: DataFrame\n        -----------\n        ordersno:委托单号\n        matchcode:成交编号\n        trddate:交易日期\n        matchtime:交易时间\n        stkcode:证券代码\n        stkname:证券名称\n        bsflagState:买卖标志\n        orderprice:委托价格\n        matchprice:成交价格\n        orderqty:委托数量\n        matchqty:成交数量\n        matchamt:成交金额\n        \"\"\"\n        daterange = ''\n        if (begin is None) & (end is None):\n            selecttype = 'intraDay'\n        else:\n            daterange = vs.DEAL_DATE_RANGE % (begin, end)\n            selecttype = 'all'\n        txtdata = self.s.get(vs.DEAL_LIST_URL % (vs.P_TYPE['https'], \n                                                 vs.DOMAINS['csc'], \n                                                 vs.PAGES['deallist'],\n                                                 selecttype, daterange, \n                                                 utils.nowtime_str()))\n        jsonobj = utils.get_jdata(txtdata)\n        df = pd.DataFrame(jsonobj['data'], columns=vs.DEAL_LIST_COLS)\n        return df\n    \n    \n    def cancel(self, ordersno='', orderdate=''):\n        \"\"\"\n                 撤单\n        params\n        -----------\n        ordersno:委托单号，多个以逗号分隔，e.g. 1866,1867\n        orderdata:委托日期 YYYYMMDD，多个以逗号分隔，对应委托单好\n        return\n        ------------\n        string\n        \"\"\"\n        if (ordersno != '') & (orderdate != ''):\n            params = dict(\n                  ordersno = ordersno,\n                  orderdate = orderdate,\n                  _ = utils.nowtime_str()             \n                               \n            )\n            result = self.s.post(vs.CANCEL_URL % (vs.P_TYPE['https'], vs.DOMAINS['csc'], vs.PAGES['cancel']), \n                            params = params)\n            jsonobj = utils.get_jdata(result.text)  \n            return jsonobj['msgMap']['ResultSucess']\n        return None\n    \n    \n    def baseinfo(self):\n        \"\"\"\n    获取帐户基本信息\n        return: Series\n        -------------\n        fundid:帐户ID\n        gpsz: 股票市值\n        fundvalue:基金市值\n        jihelicai:集合理财\n        fundbal:帐户余额\n        marketvalue:总资产\n        fundavl:可用余额\n        daixiao:代销份额\n        otc:OTC份额\n        \"\"\"\n        return self._get_baseinfo()\n    \n    def _get_baseinfo(self):\n        self.s.headers.update(vs.AGENT)\n        txtdata = self.s.get(vs.BASE_URL % (vs.P_TYPE['https'], vs.DOMAINS['csc'], vs.PAGES['baseInfo']))\n        jsonobj = utils.get_jdata(txtdata)\n        stkdata = jsonobj['data']['moneytype0']\n        stkdata['fundid'] = jsonobj['fundid']\n        return pd.Series(stkdata)\n    \n\n    def check_login_status(self, return_data):\n        if hasattr(return_data, 'get') and return_data.get('error_no') == '-1':\n            raise NotLoginError\n        \n        \nclass NotLoginError(Exception):\n    def __init__(self, result=None):\n        super(NotLoginError, self).__init__()\n        self.result = result\n    def heartbeat(self):\n        return self.baseinfo\n    "
  },
  {
    "path": "tushare/trader/utils.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*- \n\n'''\nCreated on 2016年10月1日\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n'''\n\nimport json\nimport time\nimport six\nfrom tushare.trader import vars as vs\n\ndef nowtime_str():\n    return time.time() * 1000\n\n\ndef get_jdata(txtdata):\n    txtdata = txtdata.content\n    if six.PY3:\n        txtdata = txtdata.decode('utf-8')\n    jsonobj = json.loads(txtdata)\n    return jsonobj\n        \n        \ndef get_vcode(broker, res):\n    from PIL import Image\n    import pytesseract as pt\n    import io\n    if broker == 'csc':\n        imgdata = res.content\n        img = Image.open(io.BytesIO(imgdata))\n        vcode = pt.image_to_string(img)\n        return vcode\n    "
  },
  {
    "path": "tushare/trader/vars.py",
    "content": "# -*- coding:utf-8 -*-\n\"\"\"\nCreated on 2016/09/31\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n\"\"\"\n\nP_TYPE = {'http': 'http://', 'https': 'https://'}\nDOMAINS = {\n           'csc': 'newetrade.csc108.com',\n           'cscsh': 'newetradesh.csc108.com',\n           'cscbj': 'newetradebj.csc108.com'\n           }\nPAGES = {\n         'csclogin': 'loginMain.jspx',\n         'baseInfo': 'main_zcgy_List.json',\n         'position': 'main_ccgp_list.json',\n         'tradecheck': 'securitybuys.json',\n         'trade': 'tradingTransSubmit.json',\n         'entrustlist': 'securityOrdersCancelListInit.json',\n         'cancel': 'securityOrdersCancelSubmit.json',\n         'deallist': 'securityBuysFindListInit.json',\n         'vimg': 'image.jsp'\n         }\nAGENT = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'}\nPOSITION_COLS = ['stkcode', 'stkname', 'stkqty', 'stkavl', 'lastprice', 'costprice', 'income']\nCSC_PREFIX = '%s%s/login/%s'\nCSC_LOGIN_ACTION = '%s%s/j_spring_security_check'\nBASE_URL = '%s%s/mainHomePage/%s'\nTRADE_CHECK_URL = '%s%s/trading/%s?bsflag=%s&stkcode=%s&buyflag=%s&price=0&_=%d'\nENTRUST_LIST_URL = '%s%s/securityfind/%s?_=%s'\nV_CODE_URL = '%s%s/commons/%s'\nENTRUST_LIST_COLS = ['ordersno', 'stkcode', 'stkname', 'bsflagState', 'orderqty', 'matchqty', 'orderprice', 'operdate', 'opertime', 'orderdate', 'state']\nTRADE_URL = '%s%s/trading/%s'\nCANCEL_URL = '%s%s/securityfind/%s'\nDEAL_LIST_URL = '%s%s/securityfind/%s?selectType=%s%s&_=%d'\nDEAL_DATE_RANGE = '&beginDate=%s&endDate=%s'\nDEAL_LIST_COLS = ['ordersno', 'matchcode', 'trddate', 'matchtime',  'stkcode', 'stkname', 'bsflagState', 'orderprice', 'matchprice', 'orderqty', 'matchqty', 'matchamt']\nBUY = '买入'\nSELL = '卖出'\n"
  },
  {
    "path": "tushare/util/__init__.py",
    "content": ""
  },
  {
    "path": "tushare/util/common.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*- \n\"\"\"\nCreated on 2015年7月31日\n@author: Jimmy Liu\n@group: DataYes Data.dept\n@QQ:52799046\n\"\"\"\n\ntry:\n    from httplib import HTTPSConnection\nexcept ImportError:\n    from http.client import HTTPSConnection\nimport urllib\nfrom tushare.util import vars as vs\nfrom tushare.stock import cons as ct\n\nclass Client:\n    httpClient = None\n    def __init__(self , token):\n        self.token = token\n        self.httpClient = HTTPSConnection(vs.HTTP_URL, vs.HTTP_PORT)\n        \n        \n    def __del__( self ):\n        if self.httpClient is not None:\n            self.httpClient.close()\n            \n            \n    def encodepath(self, path):\n        start = 0\n        n = len(path)\n        re = ''\n        i = path.find('=', start)\n        while i != -1 :\n            re += path[start:i+1]\n            start = i+1\n            i = path.find('&', start)\n            if(i>=0):\n                for j in range(start, i):\n                    if(path[j] > '~'):\n                        if ct.PY3:\n                            re += urllib.parse.quote(path[j])\n                        else:\n                            re += urllib.quote(path[j])\n                    else:\n                        re += path[j]  \n                re += '&'\n                start = i+1\n            else:\n                for j in range(start, n):\n                    if(path[j] > '~'):\n                        if ct.PY3:\n                            re += urllib.parse.quote(path[j])\n                        else:\n                            re += urllib.quote(path[j])\n                    else:\n                        re += path[j]  \n                start = n\n            i = path.find('=', start)\n        return re\n    \n    \n    def init(self, token):\n        self.token = token\n        \n        \n    def getData(self, path):\n        result = None\n        path='/data/v1' + path\n        path=self.encodepath(path)\n        try:\n            self.httpClient.request('GET', path,\n                                    headers = {\"Authorization\": \"Bearer \" + self.token})\n            response = self.httpClient.getresponse()\n            if response.status == vs.HTTP_OK:\n                result = response.read()\n            else:\n                result = response.read()\n            if(path.find('.csv?') != -1):\n                result=result.decode('GBK').encode('utf-8')\n            return response.status, result\n        except Exception as e:\n            raise e\n        return -1, result\n"
  },
  {
    "path": "tushare/util/conns.py",
    "content": "# -*- coding:utf-8 -*- \n\"\"\"\nconnection for api \nCreated on 2017/09/23\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n\"\"\"\nfrom pytdx.hq import TdxHq_API\nfrom pytdx.exhq import TdxExHq_API\nfrom tushare.stock import cons as ct\n\n\ndef api(retry_count=3):\n    for _ in range(retry_count):\n        try:\n            api = TdxHq_API(heartbeat=True)\n            api.connect(ct._get_server(), ct.T_PORT)\n        except Exception as e:\n            print(e)\n        else:\n            return api\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\n\n\ndef xapi(retry_count=3):\n    for _ in range(retry_count):\n        try:\n            api = TdxExHq_API(heartbeat=True)\n            api.connect(ct._get_xserver(), ct.X_PORT)\n        except Exception as e:\n            print(e)\n        else:\n            return api\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\n\n\ndef xapi_x(retry_count=3):\n    for _ in range(retry_count):\n        try:\n            api = TdxExHq_API(heartbeat=True)\n            api.connect(ct._get_xxserver(), ct.X_PORT)\n        except Exception as e:\n            print(e)\n        else:\n            return api\n    raise IOError(ct.NETWORK_URL_ERROR_MSG)\n\n\ndef get_apis():\n    return api(), xapi()\n\n\ndef close_apis(conn):\n    api, xapi = conn\n    try:\n        api.disconnect()\n        xapi.disconnect()\n    except Exception as e:\n        print(e)\n"
  },
  {
    "path": "tushare/util/dateu.py",
    "content": "# -*- coding:utf-8 -*-\r\n\r\nimport datetime\r\nimport time\r\nimport pandas as pd\r\nfrom tushare.stock import cons as ct\r\n\r\ndef year_qua(date):\r\n    mon = date[5:7]\r\n    mon = int(mon)\r\n    return[date[0:4], _quar(mon)]\r\n    \r\n\r\ndef _quar(mon):\r\n    if mon in [1, 2, 3]:\r\n        return '1'\r\n    elif mon in [4, 5, 6]:\r\n        return '2'\r\n    elif mon in [7, 8, 9]:\r\n        return '3'\r\n    elif mon in [10, 11, 12]:\r\n        return '4'\r\n    else:\r\n        return None\r\n \r\n \r\ndef today():\r\n    day = datetime.datetime.today().date()\r\n    return str(day) \r\n\r\n\r\ndef get_year():\r\n    year = datetime.datetime.today().year\r\n    return year\r\n\r\n\r\ndef get_month():\r\n    month = datetime.datetime.today().month\r\n    return month\r\n\r\ndef get_hour():\r\n    return datetime.datetime.today().hour\r\n    \r\n    \r\ndef today_last_year():\r\n    lasty = datetime.datetime.today().date() + datetime.timedelta(-365)\r\n    return str(lasty)\r\n\r\n\r\ndef day_last_week(days=-7):\r\n    lasty = datetime.datetime.today().date() + datetime.timedelta(days)\r\n    return str(lasty)\r\n\r\n\r\ndef get_now():\r\n    return time.strftime('%Y-%m-%d %H:%M:%S')\r\n\r\n\r\ndef int2time(timestamp):\r\n    datearr = datetime.datetime.utcfromtimestamp(timestamp)\r\n    timestr = datearr.strftime(\"%Y-%m-%d %H:%M:%S\")\r\n    return timestr\r\n\r\n\r\ndef diff_day(start=None, end=None):\r\n    d1 = datetime.datetime.strptime(end, '%Y-%m-%d')\r\n    d2 = datetime.datetime.strptime(start, '%Y-%m-%d')\r\n    delta = d1 - d2\r\n    return delta.days\r\n\r\n\r\ndef get_quarts(start, end):\r\n    idx = pd.period_range('Q'.join(year_qua(start)), 'Q'.join(year_qua(end)),\r\n                          freq='Q-JAN')\r\n    return [str(d).split('Q') for d in idx][::-1]\r\n\r\n\r\ndef trade_cal():\r\n    '''\r\n            交易日历\r\n    isOpen=1是交易日，isOpen=0为休市\r\n    '''\r\n    df = pd.read_csv(ct.ALL_CAL_FILE)\r\n    return df\r\n\r\n\r\ndef is_holiday(date):\r\n    '''\r\n            判断是否为交易日，返回True or False\r\n    '''\r\n    df = trade_cal()\r\n    holiday = df[df.isOpen == 0]['calendarDate'].values\r\n    if isinstance(date, str):\r\n        today = datetime.datetime.strptime(date, '%Y-%m-%d')\r\n\r\n    if today.isoweekday() in [6, 7] or str(date) in holiday:\r\n        return True\r\n    else:\r\n        return False\r\n\r\n\r\ndef last_tddate():\r\n    today = datetime.datetime.today().date()\r\n    today=int(today.strftime(\"%w\"))\r\n    if today == 0:\r\n        return day_last_week(-2)\r\n    else:\r\n        return day_last_week(-1)\r\n        \r\n\r\ndef tt_dates(start='', end=''):\r\n    startyear = int(start[0:4])\r\n    endyear = int(end[0:4])\r\n    dates = [d for d in range(startyear, endyear+1, 2)]\r\n    return dates\r\n    \r\n    \r\ndef _random(n=13):\r\n    from random import randint\r\n    start = 10**(n-1)\r\n    end = (10**n)-1\r\n    return str(randint(start, end))\r\n\r\ndef get_q_date(year=None, quarter=None):\r\n    dt = {'1': '-03-31', '2': '-06-30', '3': '-09-30', '4': '-12-31'}\r\n    return '%s%s'%(str(year), dt[str(quarter)])\r\n\r\n\r\n"
  },
  {
    "path": "tushare/util/formula.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n\nimport numpy as np\nimport pandas as pd\n\n\ndef EMA(DF, N):\n    return pd.Series.ewm(DF, span=N, min_periods=N - 1, adjust=True).mean()\n\n\ndef MA(DF, N):\n    return pd.Series.rolling(DF, N).mean()\n\n\ndef SMA(DF, N, M):\n    DF = DF.fillna(0)\n    z = len(DF)\n    var = np.zeros(z)\n    var[0] = DF[0]\n    for i in range(1, z):\n        var[i] = (DF[i] * M + var[i - 1] * (N - M)) / N\n    for i in range(z):\n        DF[i] = var[i]\n    return DF\n\n\ndef ATR(DF, N):\n    C = DF['close']\n    H = DF['high']\n    L = DF['low']\n    TR1 = MAX(MAX((H - L), ABS(REF(C, 1) - H)), ABS(REF(C, 1) - L))\n    atr = MA(TR1, N)\n    return atr\n\n\ndef HHV(DF, N):\n    return pd.Series.rolling(DF, N).max()\n\n\ndef LLV(DF, N):\n    return pd.Series.rolling(DF, N).min()\n\n\ndef SUM(DF, N):\n    return pd.Series.rolling(DF, N).sum()\n\n\ndef ABS(DF):\n    return abs(DF)\n\n\ndef MAX(A, B):\n    var = IF(A > B, A, B)\n    return var\n\n\ndef MIN(A, B):\n    var = IF(A < B, A, B)\n    return var\n\n\ndef IF(COND, V1, V2):\n    var = np.where(COND, V1, V2)\n    for i in range(len(var)):\n        V1[i] = var[i]\n    return V1\n\n\ndef REF(DF, N):\n    var = DF.diff(N)\n    var = DF - var\n    return var\n\n\ndef STD(DF, N):\n    return pd.Series.rolling(DF, N).std()\n\n\ndef MACD(DF, FAST, SLOW, MID):\n    EMAFAST = EMA(DF, FAST)\n    EMASLOW = EMA(DF, SLOW)\n    DIFF = EMAFAST - EMASLOW\n    DEA = EMA(DIFF, MID)\n    MACD = (DIFF - DEA) * 2\n    DICT = {'DIFF': DIFF, 'DEA': DEA, 'MACD': MACD}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef KDJ(DF, N, M1, M2):\n    C = DF['close']\n    H = DF['high']\n    L = DF['low']\n    RSV = (C - LLV(L, N)) / (HHV(H, N) - LLV(L, N)) * 100\n    K = SMA(RSV, M1, 1)\n    D = SMA(K, M2, 1)\n    J = 3 * K - 2 * D\n    DICT = {'KDJ_K': K, 'KDJ_D': D, 'KDJ_J': J}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef OSC(DF, N, M):  # 变动速率线\n    C = DF['close']\n    OS = (C - MA(C, N)) * 100\n    MAOSC = EMA(OS, M)\n    DICT = {'OSC': OS, 'MAOSC': MAOSC}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef BBI(DF, N1, N2, N3, N4):  # 多空指标\n    C = DF['close']\n    bbi = (MA(C, N1) + MA(C, N2) + MA(C, N3) + MA(C, N4)) / 4\n    DICT = {'BBI': bbi}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef BBIBOLL(DF, N1, N2, N3, N4, N, M):  # 多空布林线\n    bbiboll = BBI(DF, N1, N2, N3, N4)\n    UPER = bbiboll + M * STD(bbiboll, N)\n    DOWN = bbiboll - M * STD(bbiboll, N)\n    DICT = {'BBIBOLL': bbiboll, 'UPER': UPER, 'DOWN': DOWN}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef PBX(DF, N1, N2, N3, N4, N5, N6):  # 瀑布线\n    C = DF['close']\n    PBX1 = (EMA(C, N1) + EMA(C, 2 * N1) + EMA(C, 4 * N1)) / 3\n    PBX2 = (EMA(C, N2) + EMA(C, 2 * N2) + EMA(C, 4 * N2)) / 3\n    PBX3 = (EMA(C, N3) + EMA(C, 2 * N3) + EMA(C, 4 * N3)) / 3\n    PBX4 = (EMA(C, N4) + EMA(C, 2 * N4) + EMA(C, 4 * N4)) / 3\n    PBX5 = (EMA(C, N5) + EMA(C, 2 * N5) + EMA(C, 4 * N5)) / 3\n    PBX6 = (EMA(C, N6) + EMA(C, 2 * N6) + EMA(C, 4 * N6)) / 3\n    DICT = {'PBX1': PBX1, 'PBX2': PBX2, 'PBX3': PBX3,\n            'PBX4': PBX4, 'PBX5': PBX5, 'PBX6': PBX6}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef BOLL(DF, N):  # 布林线\n    C = DF['close']\n    boll = MA(C, N)\n    UB = boll + 2 * STD(C, N)\n    LB = boll - 2 * STD(C, N)\n    DICT = {'BOLL': boll, 'UB': UB, 'LB': LB}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef ROC(DF, N, M):  # 变动率指标\n    C = DF['close']\n    roc = 100 * (C - REF(C, N)) / REF(C, N)\n    MAROC = MA(roc, M)\n    DICT = {'ROC': roc, 'MAROC': MAROC}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef MTM(DF, N, M):  # 动量线\n    C = DF['close']\n    mtm = C - REF(C, N)\n    MTMMA = MA(mtm, M)\n    DICT = {'MTM': mtm, 'MTMMA': MTMMA}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef MFI(DF, N):  # 资金指标\n    C = DF['close']\n    H = DF['high']\n    L = DF['low']\n    VOL = DF['vol']\n    TYP = (C + H + L) / 3\n    V1 = SUM(IF(TYP > REF(TYP, 1), TYP * VOL, 0), N) / \\\n        SUM(IF(TYP < REF(TYP, 1), TYP * VOL, 0), N)\n    mfi = 100 - (100 / (1 + V1))\n    DICT = {'MFI': mfi}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef SKDJ(DF, N, M):\n    CLOSE = DF['close']\n    LOWV = LLV(DF['low'], N)\n    HIGHV = HHV(DF['high'], N)\n    RSV = EMA((CLOSE - LOWV) / (HIGHV - LOWV) * 100, M)\n    K = EMA(RSV, M)\n    D = MA(K, M)\n    DICT = {'SKDJ_K': K, 'SKDJ_D': D}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef WR(DF, N, N1):  # 威廉指标\n    HIGH = DF['high']\n    LOW = DF['low']\n    CLOSE = DF['close']\n    WR1 = 100 * (HHV(HIGH, N) - CLOSE) / (HHV(HIGH, N) - LLV(LOW, N))\n    WR2 = 100 * (HHV(HIGH, N1) - CLOSE) / (HHV(HIGH, N1) - LLV(LOW, N1))\n    DICT = {'WR1': WR1, 'WR2': WR2}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef BIAS(DF, N1, N2, N3):  # 乖离率\n    CLOSE = DF['close']\n    BIAS1 = (CLOSE - MA(CLOSE, N1)) / MA(CLOSE, N1) * 100\n    BIAS2 = (CLOSE - MA(CLOSE, N2)) / MA(CLOSE, N2) * 100\n    BIAS3 = (CLOSE - MA(CLOSE, N3)) / MA(CLOSE, N3) * 100\n    DICT = {'BIAS1': BIAS1, 'BIAS2': BIAS2, 'BIAS3': BIAS3}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef RSI(DF, N1, N2, N3):  # 相对强弱指标RSI1:SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100;\n    CLOSE = DF['close']\n    LC = REF(CLOSE, 1)\n    RSI1 = SMA(MAX(CLOSE - LC, 0), N1, 1) / SMA(ABS(CLOSE - LC), N1, 1) * 100\n    RSI2 = SMA(MAX(CLOSE - LC, 0), N2, 1) / SMA(ABS(CLOSE - LC), N2, 1) * 100\n    RSI3 = SMA(MAX(CLOSE - LC, 0), N3, 1) / SMA(ABS(CLOSE - LC), N3, 1) * 100\n    DICT = {'RSI1': RSI1, 'RSI2': RSI2, 'RSI3': RSI3}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef ADTM(DF, N, M):  # 动态买卖气指标\n    HIGH = DF['high']\n    LOW = DF['low']\n    OPEN = DF['open']\n    DTM = IF(OPEN <= REF(OPEN, 1), 0, MAX(\n        (HIGH - OPEN), (OPEN - REF(OPEN, 1))))\n    DBM = IF(OPEN >= REF(OPEN, 1), 0, MAX((OPEN - LOW), (OPEN - REF(OPEN, 1))))\n    STM = SUM(DTM, N)\n    SBM = SUM(DBM, N)\n    ADTM1 = IF(STM > SBM, (STM - SBM) / STM,\n               IF(STM == SBM, 0, (STM - SBM) / SBM))\n    MAADTM = MA(ADTM1, M)\n    DICT = {'ADTM': ADTM1, 'MAADTM': MAADTM}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n\n\ndef DDI(DF, N, N1, M, M1):  # 方向标准离差指数\n    H = DF['high']\n    L = DF['low']\n    DMZ = IF((H + L) <= (REF(H, 1) + REF(L, 1)), 0,\n             MAX(ABS(H - REF(H, 1)), ABS(L - REF(L, 1))))\n    DMF = IF((H + L) >= (REF(H, 1) + REF(L, 1)), 0,\n             MAX(ABS(H - REF(H, 1)), ABS(L - REF(L, 1))))\n    DIZ = SUM(DMZ, N) / (SUM(DMZ, N) + SUM(DMF, N))\n    DIF = SUM(DMF, N) / (SUM(DMF, N) + SUM(DMZ, N))\n    ddi = DIZ - DIF\n    ADDI = SMA(ddi, N1, M)\n    AD = MA(ADDI, M1)\n    DICT = {'DDI': ddi, 'ADDI': ADDI, 'AD': AD}\n    VAR = pd.DataFrame(DICT)\n    return VAR\n"
  },
  {
    "path": "tushare/util/mailmerge.py",
    "content": "from copy import deepcopy\nimport re\nfrom lxml.etree import Element\nfrom lxml import etree\nfrom zipfile import ZipFile, ZIP_DEFLATED\n\nNAMESPACES = {\n    'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',\n    'mc': 'http://schemas.openxmlformats.org/markup-compatibility/2006',\n    'ct': 'http://schemas.openxmlformats.org/package/2006/content-types',\n}\n\nCONTENT_TYPES_PARTS = (\n    'application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml',\n    'application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml',\n    'application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml',\n)\n\nCONTENT_TYPE_SETTINGS = 'application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml'\n\n\nclass MailMerge(object):\n    def __init__(self, file, remove_empty_tables=False):\n        self.zip = ZipFile(file)\n        self.parts = {}\n        self.settings = None\n        self._settings_info = None\n        self.remove_empty_tables = remove_empty_tables\n\n        content_types = etree.parse(self.zip.open('[Content_Types].xml'))\n        for file in content_types.findall('{%(ct)s}Override' % NAMESPACES):\n            type = file.attrib['ContentType' % NAMESPACES]\n            if type in CONTENT_TYPES_PARTS:\n                zi, self.parts[zi] = self.__get_tree_of_file(file)\n            elif type == CONTENT_TYPE_SETTINGS:\n                self._settings_info, self.settings = self.__get_tree_of_file(file)\n\n        to_delete = []\n\n        r = re.compile(r' MERGEFIELD +\"?([^ ]+?)\"? +(|\\\\\\* MERGEFORMAT )', re.I)\n        for part in self.parts.values():\n\n            for parent in part.findall('.//{%(w)s}fldSimple/..' % NAMESPACES):\n                for idx, child in enumerate(parent):\n                    if child.tag != '{%(w)s}fldSimple' % NAMESPACES:\n                        continue\n                    instr = child.attrib['{%(w)s}instr' % NAMESPACES]\n\n                    m = r.match(instr)\n                    if m is None:\n                        continue\n                    parent[idx] = Element('MergeField', name=m.group(1))\n\n            for parent in part.findall('.//{%(w)s}instrText/../..' % NAMESPACES):\n                children = list(parent)\n                fields = zip(\n                    [children.index(e) for e in\n                     parent.findall('{%(w)s}r/{%(w)s}fldChar[@{%(w)s}fldCharType=\"begin\"]/..' % NAMESPACES)],\n                    [children.index(e) for e in\n                     parent.findall('{%(w)s}r/{%(w)s}fldChar[@{%(w)s}fldCharType=\"end\"]/..' % NAMESPACES)],\n                    [e for e in\n                     parent.findall('{%(w)s}r/{%(w)s}instrText' % NAMESPACES)]\n                )\n\n                for idx_begin, idx_end, instr in fields:\n                    m = r.match(instr.text)\n                    if m is None:\n                        continue\n                    parent[idx_begin] = Element('MergeField', name=m.group(1))\n\n                    # use this so we know *where* to put the replacement\n                    instr.tag = 'MergeText'\n                    block = instr.getparent()\n                    # append the other tags in the w:r block too\n                    parent[idx_begin].extend(list(block))\n\n                    to_delete += [(parent, parent[i + 1])\n                                  for i in range(idx_begin, idx_end)]\n\n        for parent, child in to_delete:\n            parent.remove(child)\n\n        # Remove mail merge settings to avoid error messages when opening document in Winword\n        if self.settings:\n            settings_root = self.settings.getroot()\n            mail_merge = settings_root.find('{%(w)s}mailMerge' % NAMESPACES)\n            if mail_merge is not None:\n                settings_root.remove(mail_merge)\n\n    def __get_tree_of_file(self, file):\n        fn = file.attrib['PartName' % NAMESPACES].split('/', 1)[1]\n        zi = self.zip.getinfo(fn)\n        return zi, etree.parse(self.zip.open(zi))\n\n    def write(self, file):\n        # Replace all remaining merge fields with empty values\n        for field in self.get_merge_fields():\n            self.merge(**{field: ''})\n\n        output = ZipFile(file, 'w', ZIP_DEFLATED)\n        for zi in self.zip.filelist:\n            if zi in self.parts:\n                xml = etree.tostring(self.parts[zi].getroot())\n                output.writestr(zi.filename, xml)\n            elif zi == self._settings_info:\n                xml = etree.tostring(self.settings.getroot())\n                output.writestr(zi.filename, xml)\n            else:\n                output.writestr(zi.filename, self.zip.read(zi))\n        output.close()\n\n    def get_merge_fields(self, parts=None):\n        if not parts:\n            parts = self.parts.values()\n        fields = set()\n        for part in parts:\n            for mf in part.findall('.//MergeField'):\n                fields.add(mf.attrib['name'])\n        return fields\n\n    def merge_pages(self, replacements):\n        \"\"\"\n        Duplicate template page. Creates a copy of the template for each item\n        in the list, does a merge, and separates the them by page breaks.\n        \"\"\"\n        for part in self.parts.values():\n            root = part.getroot()\n\n            tag = root.tag\n            if tag == '{%(w)s}ftr' % NAMESPACES or tag == '{%(w)s}hdr' % NAMESPACES:\n                continue\n\n            children = []\n            for child in root:\n                root.remove(child)\n                children.append(child)\n\n            for i, repl in enumerate(replacements):\n                # Add page break in between replacements\n                if i > 0:\n                    pagebreak = Element('{%(w)s}br' % NAMESPACES)\n                    pagebreak.attrib['{%(w)s}type' % NAMESPACES] = 'page'\n                    root.append(pagebreak)\n\n                parts = []\n                for child in children:\n                    child_copy = deepcopy(child)\n                    root.append(child_copy)\n                    parts.append(child_copy)\n                self.merge(parts, **repl)\n\n    def merge(self, parts=None, **replacements):\n        if not parts:\n            parts = self.parts.values()\n\n        for field, replacement in replacements.items():\n            if isinstance(replacement, list):\n                self.merge_rows(field, replacement)\n            else:\n                for part in parts:\n                    self.__merge_field(part, field, replacement)\n\n    def __merge_field(self, part, field, text):\n        for mf in part.findall('.//MergeField[@name=\"%s\"]' % field):\n            children = list(mf)\n            mf.clear()  # clear away the attributes\n            mf.tag = '{%(w)s}r' % NAMESPACES\n            mf.extend(children)\n            text = text if text is None else str(text)\n            nodes = []\n            # preserve new lines in replacement text\n            text = text or ''  # text might be None\n            text_parts = text.replace('\\r', '').split('\\n')\n            for i, text_part in enumerate(text_parts):\n                text_node = Element('{%(w)s}t' % NAMESPACES)\n                text_node.text = text_part\n                nodes.append(text_node)\n\n                # if not last node add new line node\n                if i < (len(text_parts) - 1):\n                    nodes.append(Element('{%(w)s}br' % NAMESPACES))\n\n            ph = mf.find('MergeText')\n            if ph is not None:\n                # add text nodes at the exact position where\n                # MergeText was found\n                index = mf.index(ph)\n                for node in reversed(nodes):\n                    mf.insert(index, node)\n                mf.remove(ph)\n            else:\n                mf.extend(nodes)\n\n    def merge_rows(self, anchor, rows):\n        table, idx, template = self.__find_row_anchor(anchor)\n        if table is not None:\n            if len(rows) > 0:\n                del table[idx]\n                for i, row_data in enumerate(rows):\n                    row = deepcopy(template)\n                    self.merge([row], **row_data)\n                    table.insert(idx + i, row)\n            else:\n                # if there is no data for a given table\n                # we check whether table needs to be removed\n                if self.remove_empty_tables:\n                    parent = table.getparent()\n                    parent.remove(table)\n\n    def __find_row_anchor(self, field, parts=None):\n        if not parts:\n            parts = self.parts.values()\n        for part in parts:\n            for table in part.findall('.//{%(w)s}tbl' % NAMESPACES):\n                for idx, row in enumerate(table):\n                    if row.find('.//MergeField[@name=\"%s\"]' % field) is not None:\n                        return table, idx, row\n        return None, None, None\n"
  },
  {
    "path": "tushare/util/netbase.py",
    "content": "# -*- coding:utf-8 -*- \n\ntry:\n    from urllib.request import urlopen, Request\nexcept ImportError:\n    from urllib2 import urlopen, Request\n\n\nclass Client(object):\n    def __init__(self, url=None, ref=None, cookie=None):\n        self._ref = ref\n        self._cookie = cookie\n        self._url = url\n        self._setOpener()\n        \n    def _setOpener(self):\n        request = Request(self._url)\n        request.add_header(\"Accept-Language\", \"en-US,en;q=0.5\")\n        request.add_header(\"Connection\", \"keep-alive\")\n#         request.add_header('Referer', self._ref)\n        if self._cookie is not None:\n            request.add_header(\"Cookie\", self._cookie)\n        request.add_header(\"User-Agent\", 'Mozilla/5.0 (Windows NT 6.1; rv:37.0) Gecko/20100101 Firefox/37.0')\n        self._request = request\n        \n    def gvalue(self):\n        values = urlopen(self._request, timeout = 10).read()\n        return values\n"
  },
  {
    "path": "tushare/util/store.py",
    "content": "# -*- coding:utf-8 -*-\n\"\"\"\nCreated on 2015/02/04\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n\"\"\"\nimport pandas as pd\nimport tushare as ts\nfrom pandas import compat\nimport os\n\n\nclass Store(object):\n\n    def __init__(self, data=None, name=None, path=None):\n        if isinstance(data, pd.DataFrame):\n            self.data = data\n        else:\n            raise RuntimeError('data type is incorrect')\n        self.name = name\n        self.path = path\n\n    def save_as(self, name, path, to='csv'):\n        if name is None:\n            name = self.name\n        if path is None:\n            path = self.path\n        file_path = '%s%s%s.%s'\n        if isinstance(name, compat.string_types) and name is not '':\n            if (path is None) or (path == ''):\n                file_path = '.'.join([name, to])\n            else:\n                try:\n                    if os.path.exists(path) is False:\n                        os.mkdir(path) \n                    file_path = file_path%(path, '/', name, to)\n                except:\n                    pass\n            \n        else:\n            print('input error')\n\n"
  },
  {
    "path": "tushare/util/upass.py",
    "content": "# -*- coding:utf-8 -*- \n\n\"\"\"\nCreated on 2015/08/24\n@author: Jimmy Liu\n@group : waditu\n@contact: jimmysoa@sina.cn\n\"\"\"\n\nimport pandas as pd\nimport os\nfrom tushare.stock import cons as ct\n\nBK = 'bk'\n\ndef set_token(token):\n    df = pd.DataFrame([token], columns=['token'])\n    user_home = os.path.expanduser('~')\n    fp = os.path.join(user_home, ct.TOKEN_F_P)\n    df.to_csv(fp, index=False)\n    \n    \ndef get_token():\n    user_home = os.path.expanduser('~')\n    fp = os.path.join(user_home, ct.TOKEN_F_P)\n    if os.path.exists(fp):\n        df = pd.read_csv(fp)\n        return str(df.ix[0]['token'])\n    else:\n        print(ct.TOKEN_ERR_MSG)\n        return None\n\n\ndef set_broker(broker='', user='', passwd=''):\n    df = pd.DataFrame([[broker, user, passwd]], \n                      columns=['broker', 'user', 'passwd'],\n                      dtype=object)\n    if os.path.exists(BK):\n        all = pd.read_csv(BK, dtype=object)\n        if (all[all.broker == broker]['user']).any():\n            all = all[all.broker != broker]\n        all = all.append(df, ignore_index=True)\n        all.to_csv(BK, index=False)\n    else:\n        df.to_csv(BK, index=False)\n        \n        \ndef get_broker(broker=''):\n    if os.path.exists(BK):\n        df = pd.read_csv(BK, dtype=object)\n        if broker == '':\n            return df\n        else:\n            return  df[df.broker == broker]\n    else:\n        return None\n    \n    \ndef remove_broker():\n    os.remove(BK)\n    \n"
  },
  {
    "path": "tushare/util/vars.py",
    "content": "# -*- coding:utf-8 -*- \nimport sys\nPY3 = (sys.version_info[0] >= 3)\nHTTP_OK = 200\nHTTP_AUTHORIZATION_ERROR = 401\nHTTP_URL = 'api.wmcloud.com'\nHTTP_PORT = 443\nBOND = '/api/bond/getBond.csv?secID=%s&ticker=%s&field=%s'\nBONDCF = '/api/bond/getBondCf.csv?secID=%s&ticker=%s&beginDate=%s&cashTypeCD=%s&endDate=%s&field=%s'\nBONDCOUPON = '/api/bond/getBondCoupon.csv?secID=%s&ticker=%s&field=%s'\nBONDGUAR = '/api/bond/getBondGuar.csv?secID=%s&ticker=%s&guarModeCD=%s&field=%s'\nBONDISSUE = '/api/bond/getBondIssue.csv?secID=%s&ticker=%s&raiseModeCD=%s&field=%s'\nBONDOPTION = '/api/bond/getBondOption.csv?secID=%s&ticker=%s&field=%s'\nBONDRATING = '/api/bond/getBondRating.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nEQU = '/api/equity/getEqu.csv?equTypeCD=%s&secID=%s&ticker=%s&listStatusCD=%s&field=%s'\nEQUALLOT = '/api/equity/getEquAllot.csv?isAllotment=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nEQUDIV = '/api/equity/getEquDiv.csv?eventProcessCD=%s&exDivDate=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nEQUINDUSTRY = '/api/equity/getEquIndustry.csv?industry=%s&industryID=%s&industryVersionCD=%s&secID=%s&ticker=%s&intoDate=%s&field=%s'\nEQUIPO = '/api/equity/getEquIPO.csv?eventProcessCD=%s&secID=%s&ticker=%s&field=%s'\nEQUREF = '/api/equity/getEquRef.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&eventProcessCD=%s&field=%s'\nEQURETUD = '/api/equity/getEquRetud.csv?listStatusCD=%s&secID=%s&ticker=%s&beginDate=%s&dailyReturnNoReinvLower=%s&dailyReturnNoReinvUpper=%s&dailyReturnReinvLower=%s&dailyReturnReinvUpper=%s&endDate=%s&isChgPctl=%s&field=%s'\nEQUSPLITS = '/api/equity/getEquSplits.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nFUTU = '/api/future/getFutu.csv?exchangeCD=%s&secID=%s&ticker=%s&contractObject=%s&field=%s'\nFUTUCONVF = '/api/future/getFutuConvf.csv?secID=%s&ticker=%s&field=%s'\nGUARRATING = '/api/bond/getGuarRating.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nIDX = '/api/idx/getIdx.csv?secID=%s&ticker=%s&field=%s'\nIDXCONS = '/api/idx/getIdxCons.csv?secID=%s&ticker=%s&intoDate=%s&intoDate=%s&isNew=%s&field=%s'\nIDXWEIGHT = '/api/idx/getIdxCloseWeight.json?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nISSUERRATING = '/api/bond/getIssuerRating.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nMKTEQUD = '/api/market/getMktEqud.csv?secID=%s&ticker=%s&tradeDate=%s&beginDate=%s&endDate=%s&field=%s'\nMKTFUTD = '/api/market/getMktFutd.csv?secID=%s&ticker=%s&tradeDate=%s&beginDate=%s&endDate=%s&field=%s'\nMKTIDXD = '/api/market/getMktIdxd.csv?indexID=%s&ticker=%s&tradeDate=%s&beginDate=%s&endDate=%s&field=%s'\nSECID = '/api/master/getSecID.csv?assetClass=%s&cnSpell=%s&partyID=%s&ticker=%s&field=%s'\nFUND = '/api/fund/getFund.csv?etfLof=%s&listStatusCd=%s&secID=%s&ticker=%s&category=%s&operationMode=%s&field=%s'\nFUNDNAV = '/api/fund/getFundNav.csv?dataDate=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nFUNDDIVM = '/api/fund/getFundDivm.csv?dataDate=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nFUNDDIV = '/api/fund/getFundDiv.csv?secID=%s&ticker=%s&adjustedType=%s&beginDate=%s&endDate=%s&field=%s'\nFUNDASSETS = '/api/fund/getFundAssets.csv?reportDate=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nFUNDHOLDINGS = '/api/fund/getFundHoldings.csv?reportDate=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&secType=%s&field=%s'\nFDMTBS = '/api/fundamental/getFdmtBS.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTBSBANK = '/api/fundamental/getFdmtBSBank.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTBSSECU = '/api/fundamental/getFdmtBSSecu.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTBSINDU = '/api/fundamental/getFdmtBSIndu.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTBSINSU = '/api/fundamental/getFdmtBSInsu.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTCF = '/api/fundamental/getFdmtCF.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTCFBANK = '/api/fundamental/getFdmtCFBank.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTCFSECU = '/api/fundamental/getFdmtCFSecu.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTCFINDU = '/api/fundamental/getFdmtCFIndu.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTCFINSU = '/api/fundamental/getFdmtCFInsu.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTIS = '/api/fundamental/getFdmtIS.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTISBANK = '/api/fundamental/getFdmtISBank.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTISSECU = '/api/fundamental/getFdmtISSecu.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTISINDU = '/api/fundamental/getFdmtISIndu.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTISINSU = '/api/fundamental/getFdmtISInsu.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTEE = '/api/fundamental/getFdmtEe.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nFDMTEF = '/api/fundamental/getFdmtEf.csv?reportType=%s&secID=%s&ticker=%s&beginDate=%s&endDate=%s&forecastType=%s&publishDateBegin=%s&publishDateEnd=%s&field=%s'\nTRADECAL = '/api/master/getTradeCal.csv?exchangeCD=%s&beginDate=%s&endDate=%s&field=%s'\nINDUSTRY = '/api/master/getIndustry.csv?industryVersion=%s&industryVersionCD=%s&industryLevel=%s&isNew=%s&field=%s'\nFSTTOTAL = '/api/equity/getFstTotal.csv?beginDate=%s&endDate=%s&exchangeCD=%s&field=%s'\nFSTDETAIL = '/api/equity/getFstDetail.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nMKTBLOCKD = '/api/market/getMktBlockd.csv?secID=%s&ticker=%s&tradeDate=%s&assetClass=%s&beginDate=%s&endDate=%s&field=%s'\nHKEQU = '/api/HKequity/getHKEqu.csv?listStatusCD=%s&secID=%s&ticker=%s&field=%s'\nHKEQUCA = '/api/HKequity/getHKEquCA.csv?secID=%s&ticker=%s&eventTypeCD=%s&field=%s'\nMKTREPOD = '/api/market/getMktRepod.csv?secID=%s&ticker=%s&tradeDate=%s&beginDate=%s&endDate=%s&field=%s'\nMKTBONDD = '/api/market/getMktBondd.csv?secID=%s&ticker=%s&tradeDate=%s&beginDate=%s&endDate=%s&field=%s'\nEQUSHARE = '/api/equity/getEquShare.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&partyID=%s&field=%s'\nREPO = '/api/bond/getRepo.csv?secID=%s&ticker=%s&field=%s'\nMKTHKEQUD = '/api/market/getMktHKEqud.csv?secID=%s&ticker=%s&tradeDate=%s&beginDate=%s&endDate=%s&field=%s'\nTICKRTSNAPSHOT = '/api/market/getTickRTSnapshot.csv?securityID=%s&field=%s'\nTICKRTSNAPSHOTINDEX = '/api/market/getTickRTSnapshotIndex.csv?securityID=%s&field=%s'\nFUTURETICKRTSNAPSHOT = '/api/market/getFutureTickRTSnapshot.csv?instrumentID=%s&field=%s'\nTICKRTINTRADAY = '/api/market/getTickRTIntraDay.csv?securityID=%s&endTime=%s&startTime=%s&field=%s'\nBARRTINTRADAY = '/api/market/getBarRTIntraDay.csv?securityID=%s&endTime=%s&startTime=%s&field=%s'\nBARHISTONEDAY = '/api/market/getBarHistOneDay.csv?securityID=%s&date=%s&endTime=%s&startTime=%s&field=%s'\nBARHISTDAYRANGE = '/api/market/getBarHistDateRange.csv?securityID=%s&startDate=%s&&endDate=%s&field=%s'\nFUTURETICKRTINTRADAY = '/api/market/getFutureTickRTIntraDay.csv?instrumentID=%s&endTime=%s&startTime=%s&field=%s'\nFUTUREBARINDAY = '/api/market/getFutureBarHistOneDay.csv?instrumentID=%s&date=%s&field=%s'\nFUTUREBARDATERANGE = '/api/market/getFutureBarHistDateRange.csv?instrumentID=%s&startDate=%s&endDate=%s&field=%s'\nSTOCKFACTORSONEDAY = '/api/market/getStockFactorsOneDay.csv?tradeDate=%s&secID=%s&ticker=%s&field=%s'\nSTOCKFACTORSDATERANGE = '/api/market/getStockFactorsDateRange.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nMKTFUNDD = '/api/market/getMktFundd.csv?secID=%s&ticker=%s&tradeDate=%s&beginDate=%s&endDate=%s&field=%s'\nMKTFUTMTR = '/api/market/getMktFutMTR.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nMKTFUTMSR = '/api/market/getMktFutMSR.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nMKTFUTMLR = '/api/market/getMktFutMLR.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nFUNDETFPRLIST = '/api/fund/getFundETFPRList.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nFUNDETFCONS = '/api/fund/getFundETFCons.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nFUNDRATING = '/api/fund/getFundRating.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nCHINAMACRODATA = '/api/macro/getChinaMacroData.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINAMACROINFO = '/api/macro/getChinaMacroInfo.csv?indicID=%s&indicNameAbbr=%s&parentID=%s&field=%s'\nGLOBALMACRODATA = '/api/macro/getGlobalMacroData.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nGLOBALMACROINFO = '/api/macro/getGlobalMacroInfo.csv?indicID=%s&indicNameAbbr=%s&parentID=%s&field=%s'\nINDUSTRIALDATA = '/api/macro/getIndustrialData.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDUSTRIALINFO = '/api/macro/getIndustrialInfo.csv?indicID=%s&indicNameAbbr=%s&parentID=%s&field=%s'\nECOMMERCEDATA = '/api/macro/getEcommerceData.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEINFO = '/api/macro/getEcommerceInfo.csv?indicID=%s&indicNameAbbr=%s&parentID=%s&field=%s'\nMKTMFUTD = '/api/market/getMktMFutd.csv?contractMark=%s&contractObject=%s&mainCon=%s&tradeDate=%s&endDate=%s&startDate=%s&field=%s'\nCHINADATAGDP = '/api/macro/getChinaDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAECI = '/api/macro/getChinaDataECI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAPMI = '/api/macro/getChinaDataPMI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATACCI = '/api/macro/getChinaDataCCI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAECONOMISTSBOOMINDEX = '/api/macro/getChinaDataEconomistsBoomIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAINDUSTRIALBUSINESSCLIMATEINDEX = '/api/macro/getChinaDataIndustrialBusinessClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATACPI = '/api/macro/getChinaDataCPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAPPI = '/api/macro/getChinaDataPPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAINDUSTRY = '/api/macro/getChinaDataIndustry.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATARETAILSALES = '/api/macro/getChinaDataRetailSales.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATARESIDENTINCOMEEXP = '/api/macro/getChinaDataResidentIncomeExp.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAFAI = '/api/macro/getChinaDataFAI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAREALESTATE = '/api/macro/getChinaDataRealEstate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAFOREIGNTRADE = '/api/macro/getChinaDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAFDI = '/api/macro/getChinaDataFDI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAMONEYSTATISTICS = '/api/macro/getChinaDataMoneyStatistics.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAALLSYSTEMFINANCING = '/api/macro/getChinaDataAllSystemFinancing.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATALENDINGDEPOSIT = '/api/macro/getChinaDataLendingDeposit.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATACREDITFUNDSTABLE = '/api/macro/getChinaDataCreditFundsTable.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAOPENMARKETOPERATION = '/api/macro/getChinaDataOpenMarketOperation.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAEXCHANGERATE = '/api/macro/getChinaDataExchangeRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAINTERESTRATELENDINGDEPOSIT = '/api/macro/getChinaDataInterestRateLendingDeposit.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAINTERESTRATESHIBOR = '/api/macro/getChinaDataInterestRateSHIBOR.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAINTERESTRATEINTERBANKREPO = '/api/macro/getChinaDataInterestRateInterbankRepo.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAFINANCE = '/api/macro/getChinaDataFinance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCHINADATAGOLDCLOSEPRICE = '/api/macro/getChinaDataGoldClosePrice.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUSDATAGDP = '/api/macro/getUSDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUSDATAFOREIGNTRADE = '/api/macro/getUSDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUSDATAPRICEINDEX = '/api/macro/getUSDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUSDATAEMPLOYMENTUNEMPLOYMENT = '/api/macro/getUSDataEmploymentUnemployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUSDATAINTERESTRATE = '/api/macro/getUSDataInterestRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUSDATAEXCHANGERATE = '/api/macro/getUSDataExchangeRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUSDATAMONEYSUPPLY = '/api/macro/getUSDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUSDATACONSUMERCREDIT = '/api/macro/getUSDataConsumerCredit.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUSDATACLIMATEINDEX = '/api/macro/getUSDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUSDATADURABLEGOODS = '/api/macro/getUSDataDurableGoods.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUSDATAREALESTATE = '/api/macro/getUSDataRealEstate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUSDATADOMESTICTRADE = '/api/macro/getUSDataDomesticTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nEUDATAGDP = '/api/macro/getEUDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nEUDATAFOREIGNTRADE = '/api/macro/getEUDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nEUDATAPRICEINDEX = '/api/macro/getEUDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nEUDATAEMPLOYMENTUNEMPLOYMENT = '/api/macro/getEUDataEmploymentUnemployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nEUDATAINTERESTRATE = '/api/macro/getEUDataInterestRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nEUDATAEXCHANGERATE = '/api/macro/getEUDataExchangeRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nEUDATABANKING = '/api/macro/getEUDataBanking.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nEUDATACLIMATEINDEX = '/api/macro/getEUDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nEUDATAINDUSTRY = '/api/macro/getEUDataIndustry.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nEUDATARETAIL = '/api/macro/getEUDataRetail.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSWITZERLANDDATAGDP = '/api/macro/getSwitzerlandDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSWITZERLANDDATAPRICEINDEX = '/api/macro/getSwitzerlandDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSWITZERLANDDATACLIMATEINDEX = '/api/macro/getSwitzerlandDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSWITZERLANDDATAMONEYSUPPLY = '/api/macro/getSwitzerlandDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSWEDENDATAGDP = '/api/macro/getSwedenDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSWEDENDATAPRICEINDEX = '/api/macro/getSwedenDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSWEDENDATAFOREIGNTRADE = '/api/macro/getSwedenDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nKOREADATAGDP = '/api/macro/getKoreaDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nKOREADATAPRICEINDEX = '/api/macro/getKoreaDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nKOREADATAEMPLOYMENTUNEMPLOYMENT = '/api/macro/getKoreaDataEmploymentUnemployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nKOREADATAINTERESTRATES = '/api/macro/getKoreaDataInterestRates.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nKOREADATAEXCHANGERATE = '/api/macro/getKoreaDataExchangeRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nKOREADATAMONEYSUPPLY = '/api/macro/getKoreaDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nKOREADATACLIMATEINDEX = '/api/macro/getKoreaDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nKOREADATA_EXTERNALDEBT = '/api/macro/getKoreaData_ExternalDebt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nKOREADATAINDUSTRYANDSERVICE = '/api/macro/getKoreaDataIndustryandService.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nKOREADATAREALESTATE = '/api/macro/getKoreaDataRealEstate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nAUSTRALIADATAGDP = '/api/macro/getAustraliaDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nAUSTRALIADATAFOREIGNTRADE = '/api/macro/getAustraliaDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nAUSTRALIADATAPRICEINDEX = '/api/macro/getAustraliaDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nAUSTRALIADATAEMPLOYMENT = '/api/macro/getAustraliaDataEmployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nAUSTRALIADATACLIMATEINDEX = '/api/macro/getAustraliaDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nITALYDATAGDP = '/api/macro/getItalyDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nITALYDATAPAYMENTSBALANCE = '/api/macro/getItalyDataPaymentsBalance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nITALYDATAPRICEINDEX = '/api/macro/getItalyDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nITALYDATAEMPLOYMENT = '/api/macro/getItalyDataEmployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nITALYDATAFINANCE = '/api/macro/getItalyDataFinance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nITALYDATACLIMATEINDEX = '/api/macro/getItalyDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nITALYDATAINTERESTRATE = '/api/macro/getItalyDataInterestRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSPAINDATAGDP = '/api/macro/getSpainDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSPAINDATAFOREIGNTRADE = '/api/macro/getSpainDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSPAINDATAPAYMENTSBALANCE = '/api/macro/getSpainDataPaymentsBalance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSPAINDATABANKING = '/api/macro/getSpainDataBanking.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSPAINDATATRANSPORTATION = '/api/macro/getSpainDataTransportation.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSPAINDATAENERGY = '/api/macro/getSpainDataEnergy.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSPAINDATAFINANCE = '/api/macro/getSpainDataFinance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCANADADATAGDP = '/api/macro/getCanadaDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCANADADATAPAYMENTSBALANCE = '/api/macro/getCanadaDataPaymentsBalance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCANADADATAFOREIGNTRADE = '/api/macro/getCanadaDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCANADADATAPRICEINDEX = '/api/macro/getCanadaDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCANADADATABANKING = '/api/macro/getCanadaDataBanking.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCANADADATAEMPLOYMENT = '/api/macro/getCanadaDataEmployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCANADADATAMANUFACTURING = '/api/macro/getCanadaDataManufacturing.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCANADADATAREALESTATE = '/api/macro/getCanadaDataRealEstate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCANADADATACLIMATEINDEX = '/api/macro/getCanadaDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHKDATAGDP = '/api/macro/getHKDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHKDATAFOREIGNTRADE = '/api/macro/getHKDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHKDATAPRICEINDEX = '/api/macro/getHKDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHKDATAFINANCE = '/api/macro/getHKDataFinance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHKDATABANKING = '/api/macro/getHKDataBanking.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHKDATAINDUSTRY = '/api/macro/getHKDataIndustry.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHKDATACONSUMPTION = '/api/macro/getHKDataConsumption.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHKDATATHROUGHPUT = '/api/macro/getHKDataThroughput.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHKDATAEMPLOYMENT = '/api/macro/getHKDataEmployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHKDATAINTERESTRATE = '/api/macro/getHKDataInterestRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHKDATAEXCHANGERATE = '/api/macro/getHKDataExchangeRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHKDATAREALESTATE = '/api/macro/getHKDataRealEstate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHKDATATOURISM = '/api/macro/getHKDataTourism.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDIADATAGDP = '/api/macro/getIndiaDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDIADATAPAYMENTSBALANCE = '/api/macro/getIndiaDataPaymentsBalance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDIADATAPRICEINDEX = '/api/macro/getIndiaDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDIADATATOURISM = '/api/macro/getIndiaDataTourism.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDIADATAENERGY = '/api/macro/getIndiaDataEnergy.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDIADATACLIMATEINDEX = '/api/macro/getIndiaDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDIADATABANKING = '/api/macro/getIndiaDataBanking.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDIADATAINDUSTRY = '/api/macro/getIndiaDataIndustry.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDIADATAFOREIGNTRADE = '/api/macro/getIndiaDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMALAYSIADATAGDP = '/api/macro/getMalaysiaDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMALAYSIADATAPAYMENTSBALANCE = '/api/macro/getMalaysiaDataPaymentsBalance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMALAYSIADATAFOREIGNTRADE = '/api/macro/getMalaysiaDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMALAYSIADATAPRICEINDEX = '/api/macro/getMalaysiaDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMALAYSIADATAEMPLOYMENT = '/api/macro/getMalaysiaDataEmployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMALAYSIADATAINDUSTRY = '/api/macro/getMalaysiaDataIndustry.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMALAYSIADATAFINANCE = '/api/macro/getMalaysiaDataFinance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMALAYSIADATAMONEYSUPPLY = '/api/macro/getMalaysiaDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMALAYSIADATAREALESTATE = '/api/macro/getMalaysiaDataRealEstate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDONESIADATAGDP = '/api/macro/getIndonesiaDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDONESIADATAPAYMENTSBALANCE = '/api/macro/getIndonesiaDataPaymentsBalance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDONESIADATAFOREIGNTRADE = '/api/macro/getIndonesiaDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDONESIADATAPRICEINDEX = '/api/macro/getIndonesiaDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDONESIADATAINDUSTRY = '/api/macro/getIndonesiaDataIndustry.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDONESIADATAFINANCE = '/api/macro/getIndonesiaDataFinance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDONESIADATABANKING = '/api/macro/getIndonesiaDataBanking.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDONESIADATASECURITY = '/api/macro/getIndonesiaDataSecurity.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINDONESIADATATOURISM = '/api/macro/getIndonesiaDataTourism.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTURKEYDATAGDP = '/api/macro/getTurkeyDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTURKEYDATAPAYMENTSBALANCE = '/api/macro/getTurkeyDataPaymentsBalance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTURKEYDATAFOREIGNTRADE = '/api/macro/getTurkeyDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTURKEYDATAPRICEINDEX = '/api/macro/getTurkeyDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTURKEYDATAEMPLOYMENT = '/api/macro/getTurkeyDataEmployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTURKEYDATAINDUSTRY = '/api/macro/getTurkeyDataIndustry.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTURKEYDATAFINANCE = '/api/macro/getTurkeyDataFinance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTURKEYDATAMONEYSUPPLY = '/api/macro/getTurkeyDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTHAILANDDATAGDP = '/api/macro/getThailandDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTHAILANDDATAPAYMENTSBALANCE = '/api/macro/getThailandDataPaymentsBalance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTHAILANDDATAFOREIGNTRADE = '/api/macro/getThailandDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTHAILANDDATAPRICEINDEX = '/api/macro/getThailandDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTHAILANDDATAEMPLOYMENT = '/api/macro/getThailandDataEmployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTHAILANDDATAINDUSTRY = '/api/macro/getThailandDataIndustry.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTHAILANDDATAFINANCE = '/api/macro/getThailandDataFinance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTHAILANDDATACLIMATEINDEX = '/api/macro/getThailandDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTHAILANDDATAMONEYSUPPLY = '/api/macro/getThailandDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUKDATAGDP = '/api/macro/getUKDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUKDATAFOREIGNTRADE = '/api/macro/getUKDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUKDATACPI = '/api/macro/getUKDataCPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUKDATARPI = '/api/macro/getUKDataRPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUKDATAEMPLOYMENT = '/api/macro/getUKDataEmployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUKDATAMONEYSUPPLY = '/api/macro/getUKDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUKDATACONSUMERCREDIT = '/api/macro/getUKDataConsumerCredit.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUKDATACLIMATEINDEX = '/api/macro/getUKDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUKDATAFINANCE = '/api/macro/getUKDataFinance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUKDATAINDUSTRIALPI = '/api/macro/getUKDataIndustrialPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUKDATAHOUSEPI = '/api/macro/getUKDataHousePI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUKDATAINTERESTRATES = '/api/macro/getUKDataInterestRates.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUKDATAEXCHANGERATE = '/api/macro/getUKDataExchangeRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nJAPANDATAGDP = '/api/macro/getJapanDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nJAPANDATAFOREIGNTRADE = '/api/macro/getJapanDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nJAPANDATACPI = '/api/macro/getJapanDataCPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nJAPANDATAEMPLOYMENT = '/api/macro/getJapanDataEmployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nJAPANDATAMONEYSUPPLY = '/api/macro/getJapanDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nJAPANDATACLIMATEINDEX = '/api/macro/getJapanDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nJAPANDATAINDUSTRIALPI = '/api/macro/getJapanDataIndustrialPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nJAPANDATAHOUSEPI = '/api/macro/getJapanDataHousePI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nJAPANDATAINTERESTRATES = '/api/macro/getJapanDataInterestRates.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nJAPANDATAEXCHANGERATE = '/api/macro/getJapanDataExchangeRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nGERMANYDATAGDP = '/api/macro/getGermanyDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nGERMANYDATAFOREIGNTRADE = '/api/macro/getGermanyDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nGERMANYDATACPI = '/api/macro/getGermanyDataCPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nGERMANYDATAPPI = '/api/macro/getGermanyDataPPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nGERMANYDATAIMPORTEXPORTPI = '/api/macro/getGermanyDataImportExportPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nGERMANYDATAEMPLOYMENT = '/api/macro/getGermanyDataEmployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nGERMANYDATAMONEYSUPPLY = '/api/macro/getGermanyDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nGERMANYDATACLIMATEINDEX = '/api/macro/getGermanyDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nGERMANYDATAFINANCE = '/api/macro/getGermanyDataFinance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nGERMANYDATAINDUSTRIALPI = '/api/macro/getGermanyDataIndustrialPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nGERMANYDATAREALESTATE = '/api/macro/getGermanyDataRealEstate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nGERMANYDATADOMESTICTRADE = '/api/macro/getGermanyDataDomesticTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nGERMANYDATAINTERESTRATES = '/api/macro/getGermanyDataInterestRates.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFRANCEDATAFINANCE = '/api/macro/getFranceDataFinance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFRANCEDATAGDP = '/api/macro/getFranceDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFRANCEDATAFOREIGNTRADE = '/api/macro/getFranceDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFRANCEDATACPI = '/api/macro/getFranceDataCPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFRANCEDATAPPI = '/api/macro/getFranceDataPPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFRANCEDATAIMPORTPI = '/api/macro/getFranceDataImportPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFRANCEDATAEMPLOYMENT = '/api/macro/getFranceDataEmployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFRANCEDATAMONEYSUPPLY = '/api/macro/getFranceDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFRANCEDATACLIMATEINDEX = '/api/macro/getFranceDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFRANCEDATAINDUSTRIALPI = '/api/macro/getFranceDataIndustrialPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFRANCEDATADOMESTICTRADE = '/api/macro/getFranceDataDomesticTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFRANCEDATAINTERESTRATES = '/api/macro/getFranceDataInterestRates.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATAGDP = '/api/macro/getTaiwanDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATAEXTERNALDEBT = '/api/macro/getTaiwanDataExternalDebt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATAFOREIGNTRADE = '/api/macro/getTaiwanDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATACPI = '/api/macro/getTaiwanDataCPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATAIMPORTEXPORTPI = '/api/macro/getTaiwanDataImportExportPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATAEMPLOYMENT = '/api/macro/getTaiwanDataEmployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATAMONEYSUPPLY = '/api/macro/getTaiwanDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATALENDINGDEPOSIT = '/api/macro/getTaiwanDataLendingDeposit.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATARESERVEFUND = '/api/macro/getTaiwanDataReserveFund.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATACLIMATEINDEX = '/api/macro/getTaiwanDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATAFINANCE = '/api/macro/getTaiwanDataFinance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATAINDUSTRIALPI = '/api/macro/getTaiwanDataIndustrialPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATAREALESTATE = '/api/macro/getTaiwanDataRealEstate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATATOURISM = '/api/macro/getTaiwanDataTourism.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATACROSSSTRAITTRADE = '/api/macro/getTaiwanDataCrossStraitTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATABUSINESSANDECONOMY = '/api/macro/getTaiwanDataBusinessandEconomy.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATAINTERESTRATES = '/api/macro/getTaiwanDataInterestRates.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTAIWANDATAEXCHANGERATE = '/api/macro/getTaiwanDataExchangeRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMACAODATAGDP = '/api/macro/getMacaoDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMACAODATAPRICEINDEX = '/api/macro/getMacaoDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMACAODATAEMPLOYMENT = '/api/macro/getMacaoDataEmployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMACAODATAMONEYSUPPLY = '/api/macro/getMacaoDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMACAODATAFOREIGNEXCHANGERESERVES = '/api/macro/getMacaoDataForeignExchangeReserves.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMACAODATATOURISM = '/api/macro/getMacaoDataTourism.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMACAODATAGAMINGINDUSTRY = '/api/macro/getMacaoDataGamingIndustry.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMACAODATAINTERESTRATES = '/api/macro/getMacaoDataInterestRates.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMACAODATAEXCHANGERATE = '/api/macro/getMacaoDataExchangeRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nRUSSIADATAGDP = '/api/macro/getRussiaDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nRUSSIADATAFOREIGNTRADE = '/api/macro/getRussiaDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nRUSSIADATACPI = '/api/macro/getRussiaDataCPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nRUSSIADATAMONEYSUPPLY = '/api/macro/getRussiaDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nRUSSIADATACLIMATEINDEX = '/api/macro/getRussiaDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nRUSSIADATAINTERESTRATES = '/api/macro/getRussiaDataInterestRates.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nRUSSIADATAEXCHANGERATE = '/api/macro/getRussiaDataExchangeRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBRAZILDATAGDP = '/api/macro/getBrazilDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBRAZILDATAFOREIGNTRADE = '/api/macro/getBrazilDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBRAZILDATAPRICEINDEX = '/api/macro/getBrazilDataPriceIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBRAZILDATAEMPLOYMENT = '/api/macro/getBrazilDataEmployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBRAZILDATAMONEYSUPPLY = '/api/macro/getBrazilDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBRAZILDATACLIMATEINDEX = '/api/macro/getBrazilDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBRAZILDATARETAILSALE = '/api/macro/getBrazilDataRetailSale.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBRAZILDATAINTERESTRATES = '/api/macro/getBrazilDataInterestRates.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBRAZILDATAEXCHANGERATE = '/api/macro/getBrazilDataExchangeRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSOUTHAFRICADATAGDP = '/api/macro/getSouthAfricaDataGDP.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSOUTHAFRICADATAEMPLOYMENTUNEMPLOYMENT = '/api/macro/getSouthAfricaDataEmploymentUnemployment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSOUTHAFRICADATAFOREIGNTRADE = '/api/macro/getSouthAfricaDataForeignTrade.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSOUTHAFRICADATACPI = '/api/macro/getSouthAfricaDataCPI.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSOUTHAFRICADATAMONEYSUPPLY = '/api/macro/getSouthAfricaDataMoneySupply.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSOUTHAFRICADATACLIMATEINDEX = '/api/macro/getSouthAfricaDataClimateIndex.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSOUTHAFRICADATAINDUSTRY = '/api/macro/getSouthAfricaDataIndustry.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSOUTHAFRICADATAREALESTATE = '/api/macro/getSouthAfricaDataRealEstate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSOUTHAFRICADATARETAILSALES = '/api/macro/getSouthAfricaDataRetailSales.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSOUTHAFRICADATAINTERESTRATES = '/api/macro/getSouthAfricaDataInterestRates.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSOUTHAFRICADATAEXCHANGERATE = '/api/macro/getSouthAfricaDataExchangeRate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nAGRICDATAPRICE = '/api/macro/getAgricDataPrice.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nAGRICDATAOUTPV = '/api/macro/getAgricDataOutpV.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nAGRICDATAWASDE = '/api/macro/getAgricDataWASDE.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nAGRICDATAIMPTEXPT = '/api/macro/getAgricDataImptExpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFOODBVGDATAPRICE = '/api/macro/getFoodBvgDataPrice.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFOODBVGDATASALESOUTPUT = '/api/macro/getFoodBvgDataSalesOutput.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFOODBVGDATAIMPTEXPT = '/api/macro/getFoodBvgDataImptExpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCOMMTRADEDATATRSCG = '/api/macro/getCommTradeDataTRSCG.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCOMMTRADEDATASALES50LARGEEN = '/api/macro/getCommTradeDataSales50LargeEn.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCOMMTRADEDATAINDEXKEYCIRCEN = '/api/macro/getCommTradeDataIndexKeyCircEn.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCATERTOURDATATRSCG = '/api/macro/getCaterTourDataTRSCG.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCATERTOURDATAHOTELSOPER = '/api/macro/getCaterTourDataHotelsOper.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCATERTOURDATANEWHOTEL = '/api/macro/getCaterTourDataNewHotel.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCATERTOURDATAINBOUNDTOUR = '/api/macro/getCaterTourDataInboundTour.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBIOMEDICINEDATASALESOUTPUT = '/api/macro/getBioMedicineDataSalesOutput.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBIOMEDICINEDATAIMPTEXPT = '/api/macro/getBioMedicineDataImptExpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nPETROCHEMDATAPRICE = '/api/macro/getPetrochemDataPrice.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nPETROCHEMDATASALESOUTPUT = '/api/macro/getPetrochemDataSalesOutput.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nPETROCHEMDATAIMPTEXPT = '/api/macro/getPetrochemDataImptExpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCLOTHTEXDATAPRICE = '/api/macro/getClothTexDataPrice.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCLOTHTEXDATASALESOUTPUT = '/api/macro/getClothTexDataSalesOutput.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCLOTHTEXDATACOTTONWASDE = '/api/macro/getClothTexDataCottonWASDE.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nCLOTHTEXDATAIMPTEXPT = '/api/macro/getClothTexDataImptExpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nLIGHTMANUFDATAPRICE = '/api/macro/getLightManufDataPrice.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nLIGHTMANUFDATASALESOUTPUT = '/api/macro/getLightManufDataSalesOutput.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nLIGHTMANUFDATAIMPTEXPT = '/api/macro/getLightManufDataImptExpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMININGDATAPRICE = '/api/macro/getMiningDataPrice.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMININGDATAOUTPSALESTRANSP = '/api/macro/getMiningDataOutpSalesTransp.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMININGDATAIMPTEXPT = '/api/macro/getMiningDataImptExpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFERMETALDATAPRICE = '/api/macro/getFerMetalDataPrice.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFERMETALDATASALESOUTPUT = '/api/macro/getFerMetalDataSalesOutput.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nFERMETALDATAIMPTEXPT = '/api/macro/getFerMetalDataImptExpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nNONFERMETALDATAPRICE = '/api/macro/getNonferMetalDataPrice.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nNONFERMETALDATASALESOUTPUT = '/api/macro/getNonferMetalDataSalesOutput.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nNONFERMETALDATAIMPTEXPT = '/api/macro/getNonferMetalDataImptExpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nDELIVERYEQDATAPRICE = '/api/macro/getDeliveryEqDataPrice.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nDELIVERYEQDATASALESOUTPUT = '/api/macro/getDeliveryEqDataSalesOutput.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nDELIVERYEQDATAIMPTEXPT = '/api/macro/getDeliveryEqDataImptExpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTRAFFICTRANSDATARAILWAY = '/api/macro/getTrafficTransDataRailway.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTRAFFICTRANSDATAROAD = '/api/macro/getTrafficTransDataRoad.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTRAFFICTRANSDATAWATERWAY = '/api/macro/getTrafficTransDataWaterway.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTRAFFICTRANSDATAAIR = '/api/macro/getTrafficTransDataAir.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUTILINDUSTRYDATAPOWER = '/api/macro/getUtilIndustryDataPower.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUTILINDUSTRYDATAWATER = '/api/macro/getUtilIndustryDataWater.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUTILINDUSTRYDATAGAS = '/api/macro/getUtilIndustryDataGas.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nUTILINDUSTRYDATAENVIRPROT = '/api/macro/getUtilIndustryDataEnvirProt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nELECCOMPDATAPRICE = '/api/macro/getElecCompDataPrice.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nELECCOMPDATASALESOUTPUT = '/api/macro/getElecCompDataSalesOutput.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nELECCOMPDATAIMPTEXPT = '/api/macro/getElecCompDataImptExpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINFOEQPTDATAPRICE = '/api/macro/getInfoEqptDataPrice.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINFOEQPTDATASALESOUTPUT = '/api/macro/getInfoEqptDataSalesOutput.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINFOEQPTDATAIMPTEXPT = '/api/macro/getInfoEqptDataImptExpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHOUSEHOLDAPLSDATASALESOUTPUT = '/api/macro/getHouseholdAplsDataSalesOutput.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nHOUSEHOLDAPLSDATAIMPTEXPT = '/api/macro/getHouseholdAplsDataImptExpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINFOSERVDATASOFTWARE = '/api/macro/getInfoServDataSoftware.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINFOSERVDATACOMM = '/api/macro/getInfoServDataComm.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINFOSERVDATAINTERNET = '/api/macro/getInfoServDataInternet.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nREALESTDATAPRICE = '/api/macro/getRealEstDataPrice.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nREALESTDATAINVESTDVPT = '/api/macro/getRealEstDataInvestDvpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nREALESTDATALAND = '/api/macro/getRealEstDataLand.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nREALESTDATASALES = '/api/macro/getRealEstDataSales.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBLDGMATERDATAPRICE = '/api/macro/getBldgMaterDataPrice.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBLDGMATERDATASALESOUTPUT = '/api/macro/getBldgMaterDataSalesOutput.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMCHNREQPTDATASALESOUTPUT = '/api/macro/getMchnrEqptDataSalesOutput.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nMCHNREQPTDATAIMPTEXPT = '/api/macro/getMchnrEqptDataImptExpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBANKDATAASSETSLIABILITIES = '/api/macro/getBankDataAssetsLiabilities.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nBANKDATANONPERFORMINGLOANS = '/api/macro/getBankDataNonPerformingLoans.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nSECURITIESDATAOPERINDIC = '/api/macro/getSecuritiesDataOperIndic.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINSDATAPREMPRYINSURANCE = '/api/macro/getInsDataPremPryInsurance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINSDATACLAIMPAYMENT = '/api/macro/getInsDataClaimPayment.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINSDATAFUNDBALANCE = '/api/macro/getInsDataFundBalance.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nINSDATAASSETS = '/api/macro/getInsDataAssets.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAYILI = '/api/macro/getEcommerceDataYili.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAGUANGMING = '/api/macro/getEcommerceDataGuangming.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATACHENGDELOLO = '/api/macro/getEcommerceDataChengDeLolo.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAQIAQIA = '/api/macro/getEcommerceDataQiaqia.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAVVGROUP = '/api/macro/getEcommerceDataVVGroup.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAJINFENGWINE = '/api/macro/getEcommerceDataJinfengWine.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAGUYUELONGSHAN = '/api/macro/getEcommerceDataGuyueLongshan.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATASHANXIFENJIU = '/api/macro/getEcommerceDataShanxiFenjiu.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAZHANGYUA = '/api/macro/getEcommerceDataZhangyuA.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAMOGAO = '/api/macro/getEcommerceDataMogao.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAKEMENNOODLEMFG = '/api/macro/getEcommerceDataKemenNoodleMFG.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAJINZIHAM = '/api/macro/getEcommerceDataJinziHam.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATALOTUS = '/api/macro/getEcommerceDataLotus.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATABEIYINMATE = '/api/macro/getEcommerceDataBeiyinMate.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAQINGDAOHAIER = '/api/macro/getEcommerceDataQingdaoHaier.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATATCLGROUP = '/api/macro/getEcommerceDataTCLGroup.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAMIDEAGROUP = '/api/macro/getEcommerceDataMideaGroup.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAWHIRLPOOL = '/api/macro/getEcommerceDataWhirlpool.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAJOYOUNG = '/api/macro/getEcommerceDataJoyoung.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAVATTI = '/api/macro/getEcommerceDataVatti.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATASUPOR = '/api/macro/getEcommerceDataSupor.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAKONKA = '/api/macro/getEcommerceDataKonka.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATACHANGHONG = '/api/macro/getEcommerceDataChanghong.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATALITTLESWAN = '/api/macro/getEcommerceDataLittleSwan.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAMEILING = '/api/macro/getEcommerceDataMeiling.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAZTE = '/api/macro/getEcommerceDataZTE.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATADATANGTELECOM = '/api/macro/getEcommerceDataDatangTelecom.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATABIRD = '/api/macro/getEcommerceDataBird.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATADAHUATECHNOLOGY = '/api/macro/getEcommerceDataDahuaTechnology.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATATSINGHUATONGFANG = '/api/macro/getEcommerceDataTsinghuaTongfang.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAHEDY = '/api/macro/getEcommerceDataHedy.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAHADAY = '/api/macro/getEcommerceDataHaday.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAYANJINGBEER = '/api/macro/getEcommerceDataYanjingBeer.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAMAIQUER = '/api/macro/getEcommerceDataMaiquer.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATACITICGUOANWINE = '/api/macro/getEcommerceDataCiticGuoanWine.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAQINGQINGBARLEYWINE = '/api/macro/getEcommerceDataQingqingBarleyWine.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAHAOXIANGNI = '/api/macro/getEcommerceDataHaoxiangni.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAFULINGZHACAI = '/api/macro/getEcommerceDataFulingZhacai.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAHUANGSHANGHUANG = '/api/macro/getEcommerceDataHuangshanghuang.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAHAINANYEDAO = '/api/macro/getEcommerceDataHainanYedao.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATASHUANGTAFOOD = '/api/macro/getEcommerceDataShuangtaFood.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAJIUGUILIQUOR = '/api/macro/getEcommerceDataJiuguiLiquor.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATABLACKSESAME = '/api/macro/getEcommerceDataBlackSesame.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAKINGSLUCK = '/api/macro/getEcommerceDataKingsLuck.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATALAOBAIGANLIQUOR = '/api/macro/getEcommerceDataLaobaiganLiquor.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATASHUANGHUIDVPT = '/api/macro/getEcommerceDataShuanghuiDvpt.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nOPT = '/api/options/getOpt.csv?contractStatus=%s&optID=%s&secID=%s&ticker=%s&varSecID=%s&varticker=%s&field=%s'\nMKTOPTD = '/api/market/getMktOptd.csv?optID=%s&secID=%s&ticker=%s&tradeDate=%s&beginDate=%s&endDate=%s&field=%s'\nSOCIALDATAXQ = '/api/subject/getSocialDataXQ.csv?beginDate=%s&endDate=%s&ticker=%s&field=%s'\nSOCIALDATAXQBYTICKER = '/api/subject/getSocialDataXQByTicker.csv?ticker=%s&field=%s'\nSOCIALDATAXQBYDATE = '/api/subject/getSocialDataXQByDate.csv?statisticsDate=%s&field=%s'\nOPTVAR = '/api/options/getOptVar.csv?exchangeCD=%s&secID=%s&ticker=%s&contractType=%s&exerType=%s&field=%s'\nNEWSINFO = '/api/subject/getNewsInfo.csv?newsID=%s&field=%s'\nNEWSINFOBYTIME = '/api/subject/getNewsInfoByTime.csv?newsPublishDate=%s&beginTime=%s&endTime=%s&field=%s'\nNEWSCONTENT = '/api/subject/getNewsContent.csv?newsID=%s&field=%s'\nNEWSCONTENTBYTIME = '/api/subject/getNewsContentByTime.csv?newsPublishDate=%s&beginTime=%s&endTime=%s&field=%s'\nCOMPANYBYNEWS = '/api/subject/getCompanyByNews.csv?newsID=%s&field=%s'\nNEWSBYCOMPANY = '/api/subject/getNewsByCompany.csv?partyID=%s&beginDate=%s&endDate=%s&field=%s'\nTICKERSBYNEWS = '/api/subject/getTickersByNews.csv?newsID=%s&field=%s'\nNEWSBYTICKERS = '/api/subject/getNewsByTickers.csv?secID=%s&secShortName=%s&ticker=%s&beginDate=%s&endDate=%s&exchangeCD=%s&field=%s'\nMKTEQUDADJ = '/api/market/getMktEqudAdj.csv?secID=%s&ticker=%s&tradeDate=%s&beginDate=%s&endDate=%s&field=%s'\nMKTADJF = '/api/market/getMktAdjf.csv?secID=%s&ticker=%s&field=%s'\nOPTIONTICKRTSNAPSHOT = '/api/market/getOptionTickRTSnapshot.csv?optionId=%s&field=%s'\nFUTUREBARRTINTRADAY = '/api/market/getFutureBarRTIntraDay.csv?instrumentID=%s&endTime=%s&startTime=%s&field=%s'\nMKTFUTDVOL = '/api/market/getMktFutdVol.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nTHEMESCONTENT = '/api/subject/getThemesContent.csv?isMain=%s&themeID=%s&themeName=%s&themeSource=%s&field=%s'\nTICKERSBYTHEMES = '/api/subject/getTickersByThemes.csv?themeID=%s&themeName=%s&beginDate=%s&endDate=%s&isNew=%s&field=%s'\nTHEMESTICKERSINSERT = '/api/subject/getThemesTickersInsert.csv?themeID=%s&themeName=%s&beginDate=%s&endDate=%s&field=%s'\nTHEMESTICKERSDELETE = '/api/subject/getThemesTickersDelete.csv?themeID=%s&themeName=%s&beginDate=%s&endDate=%s&field=%s'\nTHEMESBYTICKERS = '/api/subject/getThemesByTickers.csv?secID=%s&secShortName=%s&ticker=%s&beginDate=%s&endDate=%s&exchangeCD=%s&field=%s'\nTHEMESPERIOD = '/api/subject/getThemesPeriod.csv?isLatest=%s&themeID=%s&themeName=%s&field=%s'\nACTIVETHEMES = '/api/subject/getActiveThemes.csv?date=%s&field=%s'\nTHEMESSIMILARITY = '/api/subject/getThemesSimilarity.csv?themeID=%s&themeName=%s&field=%s'\nTHEMESHEAT = '/api/subject/getThemesHeat.csv?themeID=%s&themeName=%s&beginDate=%s&endDate=%s&field=%s'\nSECTORTHEMESBYTICKERS = '/api/subject/getSectorThemesByTickers.csv?secID=%s&secShortName=%s&ticker=%s&beginDate=%s&endDate=%s&exchangeCD=%s&field=%s'\nWEBTHEMESBYTICKERS = '/api/subject/getWebThemesByTickers.csv?secID=%s&secShortName=%s&ticker=%s&beginDate=%s&endDate=%s&exchangeCD=%s&field=%s'\nMKTEQUDLATELY = '/api/market/getMktEqudLately.csv?field=%s'\nFDMTISLATELY = '/api/fundamental/getFdmtISLately.csv?field=%s'\nNEWSHEATINDEX = '/api/subject/getNewsHeatIndex.csv?beginDate=%s&endDate=%s&exchangeCD=%s&secID=%s&secShortName=%s&ticker=%s&field=%s'\nNEWSSENTIMENTINDEX = '/api/subject/getNewsSentimentIndex.csv?beginDate=%s&endDate=%s&exchangeCD=%s&secID=%s&secShortName=%s&ticker=%s&field=%s'\nSECTYPEREL = '/api/master/getSecTypeRel.csv?secID=%s&ticker=%s&typeID=%s&field=%s'\nREPORTBYTICKER = '/api/subject/getReportByTicker.csv?ticker=%s&beginDate=%s&endDate=%s&field=%s'\nREPORTBYCATEGORY = '/api/subject/getReportByCategory.csv?beginDate=%s&Category=%s&endDate=%s&field=%s'\nREPORTCONTENT = '/api/subject/getReportContent.csv?ticker=%s&beginDate=%s&endDate=%s&field=%s'\nMKTLIMIT = '/api/market/getMktLimit.csv?secID=%s&ticker=%s&tradeDate=%s&field=%s'\nECOMMERCEDATAWULIANGYE = '/api/macro/getEcommerceDataWuliangye.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAGREE = '/api/macro/getEcommerceDataGree.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAHISENSEELECTRIC = '/api/macro/getEcommerceDataHisenseElectric.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAHISENSE = '/api/macro/getEcommerceDataHisense.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAJIAJIAFOOD = '/api/macro/getEcommerceDataJiajiaFood.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAROBAM = '/api/macro/getEcommerceDataRobam.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAASD = '/api/macro/getEcommerceDataASD.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAMACRO = '/api/macro/getEcommerceDataMacro.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAELECPRO = '/api/macro/getEcommerceDataElecpro.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATASANGLEJIN = '/api/macro/getEcommerceDataSanglejin.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAHOMA = '/api/macro/getEcommerceDataHoma.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATALONGDAMEAT = '/api/macro/getEcommerceDataLongdaMeat.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATABYHEALTH = '/api/macro/getEcommerceDataByHealth.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAHAIXIN = '/api/macro/getEcommerceDataHaixin.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAVANWARD = '/api/macro/getEcommerceDataVanward.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAMEIDA = '/api/macro/getEcommerceDataMeida.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAHENGSHUNVINEGARINDUSTRY = '/api/macro/getEcommerceDataHengshunVinegarindustry.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATASHUIJINGFANG = '/api/macro/getEcommerceDataShuijingfang.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATACHUNLAN = '/api/macro/getEcommerceDataChunlan.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAYILITE = '/api/macro/getEcommerceDataYilite.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAHUANGSHI = '/api/macro/getEcommerceDataHuangshi.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAYANGHE = '/api/macro/getEcommerceDataYanghe.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATASANYUAN = '/api/macro/getEcommerceDataSanyuan.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATATUOPAISHEDE = '/api/macro/getEcommerceDataTuopaiShede.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAKUAIJISHAN = '/api/macro/getEcommerceDataKuaijishan.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATATONGHUA = '/api/macro/getEcommerceDataTonghua.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAKWEICHOWMOUTAIGROUP = '/api/macro/getEcommerceDataKweichowMoutaiGroup.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATATSINGTAO = '/api/macro/getEcommerceDataTsingTao.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nACTIVETHEMESINSERT = '/api/subject/getActiveThemesInsert.csv?beginDate=%s&endDate=%s&isLatest=%s&themeSource=%s&field=%s'\nACTIVETHEMESDELETE = '/api/subject/getActiveThemesDelete.csv?beginDate=%s&endDate=%s&isLatest=%s&themeSource=%s&field=%s'\nEQUINFO = '/api/master/getEquInfo.csv?ticker=%s&field=%s'\nSECTIPS = '/api/market/getSecTips.csv?tipsTypeCD=%s&field=%s'\nTHEMESCLUSTER = '/api/subject/getThemesCluster.csv?isMain=%s&themeID=%s&themeName=%s&field=%s'\nTHEMESBYNEWS = '/api/subject/getThemesByNews.csv?insertDate=%s&insertDate=%s&newsID=%s&beginTime=%s&endTime=%s&field=%s'\nBARRTINTRADAYONEMINUTE = '/api/market/getBarRTIntraDayOneMinute.csv?time=%s&field=%s'\nEQURTRANK = '/api/market/getEquRTRank.csv?desc=%s&exchangeCD=%s&field=%s'\nECOMMERCEDATAGUJING = '/api/macro/getEcommerceDataGujing.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATALUZHOULAOJIAO = '/api/macro/getEcommerceDataLuzhouLaojiao.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATASHANGHAIMALING = '/api/macro/getEcommerceDataShanghaiMaling.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATABLACKCATTLEFOOD = '/api/macro/getEcommerceDataBlackCattleFood.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATADELISI = '/api/macro/getEcommerceDataDelisi.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATASTARLAKEBIOSCIENCE = '/api/macro/getEcommerceDataStarLakeBioscience.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAJONJEEHITECH = '/api/macro/getEcommerceDataJonjeeHiTech.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATACRSANJIU = '/api/macro/getEcommerceDataCRSanjiu.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAJIUZHITANG = '/api/macro/getEcommerceDataJiuzhitang.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAFUANNA = '/api/macro/getEcommerceDataFuanna.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATALUOLAI = '/api/macro/getEcommerceDataLuolai.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAGUIRENNIAO = '/api/macro/getEcommerceDataGuirenniao.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATABAOXINIAO = '/api/macro/getEcommerceDataBaoxiniao.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATALAOFENGXIANG = '/api/macro/getEcommerceDataLaofengxiang.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAFIYTAA = '/api/macro/getEcommerceDataFiytaA.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAGOLDLEAFJEWELRY = '/api/macro/getEcommerceDataGoldleafJewelry.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATACOMIXGROUP = '/api/macro/getEcommerceDataComixGroup.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAYAOJIPLAYINGCARD = '/api/macro/getEcommerceDataYaojiPlayingCard.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAMGSTATIONERY = '/api/macro/getEcommerceDataMGStationery.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATACS = '/api/macro/getEcommerceDataCS.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAEDIFIER = '/api/macro/getEcommerceDataEdifier.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAHIKVISION = '/api/macro/getEcommerceDataHikVision.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATASOLAREAST = '/api/macro/getEcommerceDataSolareast.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATACHIGO = '/api/macro/getEcommerceDataChigo.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nECOMMERCEDATAAUCMA = '/api/macro/getEcommerceDataAucma.csv?indicID=%s&indicName=%s&beginDate=%s&endDate=%s&field=%s'\nTHEMESBYNEWSCOMPANYREL = '/api/subject/getThemesByNewsCompanyRel.csv?insertDate=%s&insertDate=%s&newsID=%s&beginTime=%s&endTime=%s&field=%s'\nTHEMESINSERTDB = '/api/subject/getThemesInsertDB.csv?beginDate=%s&endDate=%s&themeSource=%s&field=%s'\nTHEMESBYNEWSLF = '/api/subject/getThemesByNewsLF.csv?insertDate=%s&insertDate=%s&newsID=%s&beginTime=%s&endTime=%s&field=%s'\nTHEMESBYNEWSMF = '/api/subject/getThemesByNewsMF.csv?insertDate=%s&insertDate=%s&newsID=%s&beginTime=%s&endTime=%s&field=%s'\nINDUSTRYTICKRTSNAPSHOT = '/api/market/getIndustryTickRTSnapshot.csv?securityID=%s&field=%s'\nNEWSINFOBYINSERTTIME = '/api/subject/getNewsInfoByInsertTime.csv?newsInsertDate=%s&beginTime=%s&endTime=%s&field=%s'\nNEWSCONTENTBYINSERTTIME = '/api/subject/getNewsContentByInsertTime.csv?newsInsertDate=%s&beginTime=%s&endTime=%s&field=%s'\nSECTYPEREGIONREL = '/api/master/getSecTypeRegionRel.csv?secID=%s&ticker=%s&typeID=%s&field=%s'\nSECTYPE = '/api/master/getSecType.csv?field=%s'\nSECTYPEREGION = '/api/master/getSecTypeRegion.csv?field=%s'\nSOCIALDATAGUBA = '/api/subject/getSocialDataGuba.csv?beginDate=%s&endDate=%s&ticker=%s&field=%s'\nSOCIALTHEMEDATAGUBA = '/api/subject/getSocialThemeDataGuba.csv?beginDate=%s&endDate=%s&themeID=%s&field=%s'\nFUNDSHARESCHG = '/api/fund/getFundSharesChg.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nTHEMESBYNEWSTIME = '/api/subject/getThemesByNewsTime.csv?publishBeginTime=%s&publishEndTime=%s&field=%s'\nTHEMESBYNEWSTIMECOMPANYREL = '/api/subject/getThemesByNewsTimeCompanyRel.csv?publishBeginTime=%s&publishEndTime=%s&field=%s'\nTHEMESBYNEWSTIMELF = '/api/subject/getThemesByNewsTimeLF.csv?publishBeginTime=%s&publishEndTime=%s&field=%s'\nTHEMESBYNEWSTIMEMF = '/api/subject/getThemesByNewsTimeMF.csv?publishBeginTime=%s&publishEndTime=%s&field=%s'\nMKTFUNDDADJAF = '/api/market/getMktFunddAdjAf.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nREPORTCONTENTBYID = '/api/subject/getReportContentByID.csv?reportID=%s&field=%s'\nTHEMESBYNEWS2 = '/api/subject/getThemesByNews2.csv?insertBeginTime=%s&insertEndTime=%s&newsID=%s&field=%s'\nTHEMESBYNEWSTIME2 = '/api/subject/getThemesByNewsTime2.csv?publishBeginTime=%s&publishEndTime=%s&field=%s'\nSYSCODE = '/api/master/getSysCode.csv?codeTypeID=%s&valueCD=%s&field=%s'\nFUNDLEVERAGEINFO = '/api/fund/getFundLeverageInfo.csv?exchangeCDLeverage=%s&secID=%s&ticker=%s&field=%s'\nSECST = '/api/equity/getSecST.csv?secID=%s&ticker=%s&beginDate=%s&endDate=%s&field=%s'\nDERIV = '/api/IV/getDerIv.csv?beginDate=%s&endDate=%s&optID=%s&SecID=%s&field=%s'\nDERIVHV = '/api/IV/getDerIvHv.csv?beginDate=%s&endDate=%s&SecID=%s&period=%s&field=%s'\nDERIVINDEX = '/api/IV/getDerIvIndex.csv?beginDate=%s&endDate=%s&SecID=%s&period=%s&field=%s'\nDERIVIVPDELTA = '/api/IV/getDerIvIvpDelta.csv?beginDate=%s&endDate=%s&SecID=%s&delta=%s&period=%s&field=%s'\nDERIVPARAM = '/api/IV/getDerIvParam.csv?beginDate=%s&endDate=%s&SecID=%s&expDate=%s&field=%s'\nDERIVRAWDELTA = '/api/IV/getDerIvRawDelta.csv?beginDate=%s&endDate=%s&SecID=%s&delta=%s&period=%s&field=%s'\nDERIVSURFACE = '/api/IV/getDerIvSurface.csv?beginDate=%s&endDate=%s&SecID=%s&contractType=%s&field=%s'\n"
  },
  {
    "path": "whats_new.md",
    "content": "0.4.5\n-------\n\r\n- get_today_all接口增加实时PE、PB和流通市值等\n- 修改财务数据问题\r\n- get_h_data前复权数据bug修复（白天获取）\n\n0.4.2\n--------\n\n- 新增电影票房数据\r\n- 修复部分bug\n\n0.4.1\n----------\n\n- 新增sina大单数据\n- 修改当日分笔bug\r\n- 深市融资融券数据修复\n\n0.3.9\n---------\n\r\n- 加入通联数据期权隐含波动率数据\r\n\r\n- 修复指数成份股接口\n\n0.3.8\n-------\n\r\n- 完成通联数据SDK v0.2.0开发\r\n- 沪深300成份股和权重接口问题修复\r\n- 其它bug的修复\r\n- 通联数据API文档发布\n\n\n0.3.5\n-------\n\r\n- 部分代码修正\n- 新增通联数据SDK0.1版\n\n\n0.3.4\n-------\n\n- 新增‘龙虎榜’模块\n\t1. 每日龙虎榜列表\n\t1. 个股上榜统计\n\t1. 营业部上榜统计\n\t1. 龙虎榜机构席位追踪\n\t1. 龙虎榜机构席位成交明细\r\n\r\n\r\n- 修改get\\_h\\_data数据类型为float\r\n- 修改get_index接口遗漏的open列\r\n- 合并GitHub上提交的bug修复\n\n\n0.3.1\n-------\n\n- 修复get\\_h\\_data的bug\n- 修改get\\_stock\\_basics数据获取方式\n\n\n0.2.9\n---------\n\n- 新增上海银行间同业拆放利率模块\n\t1. 银行间同业拆放利率（Shibor）\n\t1. Shibor银行报价数据\n\t1. Shibor均值数据\n\t1. 贷款基础利率（LPR）\n\t1. 贷款基础利率均值数据\n- 基本面模块接口优化\n- 历史某一阶段的前复权数据bug修复\n\n0.2.8\n---------\n\n1. 新增大盘指数实时行情列表\n1. 新增大盘指数历史行情数据（全部）\n1. 新增终止上市公司列表（退市）\n1. 新增暂停上市公司列表\n1. 修正融资融券明细无日期的缺陷\n1. 修正get\\_h\\_data部分bug\n\n\n0.2.6\n-----------\n1. 新增沪市融资融券列表\n1. 新增沪市融资融券明细列表\n1. 新增深市融资融券列表\n1. 新增深市融资融券明细列表\n1. 修正复权数据数据源出现null造成异常问题（对大约300个股票有影响）\n\n\n0.2.5\n-----------\n1. 完成python2.x和python3.x兼容性支持\n1. 部分算法优化和代码重构\n1. 新增中证500成份股\n1. 新增当日分笔交易明细\n1. 修正分配预案（高送转）bug\n\n\n\n0.2.3\n-----------\n1. “新浪股吧”消息和热度\n1. 新股数据\n1. 修正“基本面”模块中数据重复的问题\n1. 修正历史数据缺少一列column（数据来源问题）的bug\n1. 新增期货模块（实验）by @ideaplat\n\n\n\n\n0.2.2\n--------\n对前复权数据接口的bug进行了修改（pandas v0.14版本在使用时报错）\n\n0.2.1\n--------\n1、增加‘投资参考’数据模块\n\n- 分配预案\n- 业绩预告\n- 限售股解禁\n- 基金持股\n\n\n2、将“业绩预告”挪到了‘投资参考’模块中\n\n3、对历史复权方法中的代码进行了修改\n\n\n0.2.0\n--------\n1、新增新闻事件模块\n\n- 即时财经新闻\n- 个股信息地雷\n\n2、新增指数成份股和权重分类\n\n- 沪深300成份股和权重\n- 上证50成份股列表\n\n\n3、修改get\\_hist_data()接口\n\n- 修改数值型数据的dtype为float\n\n4、新增历史复权数据接口get\\_h_data\n\n- 前复权（默认）\n- 后复权\n- 不复权\n\n"
  }
]