Find file History
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
..
Failed to load latest commit information.
config 通联历史数据模块。 Aug 14, 2015
fun 通联历史数据模块。 Aug 14, 2015
names
static
README.md
__init__.py 通联历史数据模块。 Aug 14, 2015
api.py 初步完成了vn.trader,包含CTP、LTS、WIND的接口,以及CTA策略模块,策略模块的测试尚未全部完成 Oct 16, 2015
download.sh 通联历史数据模块。 Aug 14, 2015
errors.py 通联历史数据模块。 Aug 14, 2015
prepare.sh 通联历史数据模块。 Aug 14, 2015
storage.py 通联历史数据模块。 Aug 14, 2015
tests.py
update.sh 通联历史数据模块。 Aug 14, 2015

README.md

VN.DATAYES - Welcome!

0. Tutorial - ipythonNotebook

http://nbviewer.ipython.org/github/zedyang/vn.past-demo/blob/master/static/tutorial.ipynb

1. Preface

1.1

vn.datayes是一个从属于vnpy的开源历史数据模块;使用通联数据API以及MongoDB进行数据的下载和存储管理。项目目前与将来主要解决\准备解决以下问题:

  • 从通联数据等API高效地爬取、更新、清洗历史数据。
  • 基于MongoDB的数据库管理、快速查询、转换输出格式;支持自定义符合需求的行情历史数据库。
  • 基于Python.Matplotlib或R.ggplot2,快速绘制K线图等可视化对象。

项目目前主要包括了通联API开发者试用方案中大部分的市场行情日线数据(股票、期货、期权、指数、基金等),以及部分基本面数据。数据下载与更新主要采用多线程设计,测试效率如下:

数据集举例 数据集容量 下载时间估计
股票日线数据,2800个交易代码,2013年1月1日至2015年8月1日 2800个collection,约500条/each 7-10分钟
股票分钟线数据,2个交易代码,2013年1月1日至2015年8月1日 2个collection,约20万条/each 1-2分钟
股票日线数据更新任务,2800个交易代码,2015年8月1日至2015年8月15日 2800个collection,约10条/each 1-2分钟

vn.datayes基于MongoDB数据库,通过一个json配置文件简化数据库的初始化、设置、动态更新过程。较为精细的数据库操作仍需编写脚本进行。若对MongoDB与pymongo不熟悉,推荐使用Robomongo等窗口化查看工具作为辅助。

1.2 主要依赖:

pymongo, pandas, requests, json

1.3 开发测试环境:

Mac OS X 10.10; Windows 7 || Anaconda.Python 2.7

2. Get Started

2.1 准备

fig1

  • 更新pymongo至3.0以上版本; 更新requests等包。
~$ pip install pymongo --upgrade
~$ pip install requests --upgrade
  • [ ! 注意,本模块需要pymongo3.0新加入的部分方法,使用vnpy本体所用的2.7版本对应方法将无法正常插入数据。依赖冲突的问题会尽快被解决,目前推荐制作一个virtual environment来单独运行这个模块;或者暴力切换pymongo的版本:]
~$ pip install pymongo==3.0.3  # this module.
~$ pip install pymongo==2.7.2  # pymongo 2.7.
  • 启动MongoDB
~$ mongod

2.2 数据库初始化与下载

  • api.Config 对象包含了向API进行数据请求所需的信息,我们需要一个用户token来初始化这个对象。
    from storage import *

    myConfig = Config(head="Zed's Config", 
                      token='7c2e59e212dbff90ffd6b382c7afb57bc987a99307d382b058af6748f591d723')
    myConfig.body
    {'domain': 'api.wmcloud.com/data',
     'header': {'Authorization': 'Bearer 7c2e59e212dbff90ffd6b382c7afb57bc987a99307d382b058af6748f591d723',
      'Connection': 'keep-alive'},
     'ssl': False,
     'version': 'v1'}
  • storage.DBConfig 对象包含了数据库配置。我们需要自己编写一个json字典来填充这个对象。举例来说,我们希望下载股票日线数据和指数日线数据,数据库名称为DATAYES_EQUITY_D1和DATAYES_INDEX_D1,index为日期“date”。那么json字典是这样的:
    client = pymongo.MongoClient() # pymongo.connection object.

    body = {
        'client': client, # connection object.
        'dbs': {
            'EQU_D1': {                              # in-python alias: 'EQU_D1'
                'self': client['DATAYES_EQUITY_D1'], # pymongo.database[name] object.
                'index': 'date',                     # index name.
                'collNames': 'equTicker'             # what are collection names consist of.
            },
            'IDX_D1': {                              # Another database
                'self': client['DATAYES_INDEX_D1'],
                'index': 'date',
                'collNames': 'idxTicker'
            }
        },
        'dbNames': ['EQU_D1','IDX_D1']               # List of alias.
    }

    myDbConfig_ = DBConfig(body=body)

    # 这看上去有些麻烦;不想这么做的话可以直接使用DBConfig的默认构造函数。

    myDbConfig = DBConfig()

    myDbConfig.body
    {'client': MongoClient('localhost', 27017),
     'dbNames': ['EQU_M1', 'EQU_D1', 'FUT_D1', 'OPT_D1', 'FUD_D1', 'IDX_D1'],
     'dbs': {'EQU_D1': {'collNames': 'equTicker',
       'index': 'date',
       'self': Database(MongoClient('localhost', 27017), u'DATAYES_EQUITY_D1')},
      'EQU_M1': {'collNames': 'secID',
       'index': 'dateTime',
       'self': Database(MongoClient('localhost', 27017), u'DATAYES_EQUITY_M1')},
      'FUD_D1': {'collNames': 'fudTicker',
       'index': 'date',
       'self': Database(MongoClient('localhost', 27017), u'DATAYES_FUND_D1')},
      'FUT_D1': {'collNames': 'futTicker',
       'index': 'date',
       'self': Database(MongoClient('localhost', 27017), u'DATAYES_FUTURE_D1')},
      'IDX_D1': {'collNames': 'idxTicker',
       'index': 'date',
       'self': Database(MongoClient('localhost', 27017), u'DATAYES_INDEX_D1')},
      'OPT_D1': {'collNames': 'optTicker',
       'index': 'date',
       'self': Database(MongoClient('localhost', 27017), u'DATAYES_OPTION_D1')}}}
  • api.PyApi是向网络数据源进行请求的主要对象。storage.MongodController是进行数据库管理的对象。当我们完成了配置对象的构造,即可初始化PyApi与MongodController。MongodController._get_coll_names()MongodController._ensure_index() 是数据库初始化所调用的方法,为了模块开发的方便,它们暂时没有被放进构造函数中自动执行。
    myApi = PyApi(myConfig) # construct PyApi object.
    mc = MongodController(api=myApi, config=myDbConfig) # construct MongodController object, 
                                                        # on the top of PyApi.
    mc._get_coll_names()    # get names of collections.
    mc._ensure_index()      # ensure collection indices.
    [MONGOD]: Collection names gotten.
    [MONGOD]: MongoDB index set.

fig2

  • 使用MongodController.download#()方法进行下载。

    mc.download_index_D1('20150101','20150801')

fig3

2.3 数据库更新

  • 使用MongodController.update#()方法进行更新。脚本会自动寻找数据库中的最后一日并更新至最新交易日。
    from datetime import datetime
    datetime.now()
    datetime.datetime(2015, 8, 17, 10, 49, 21, 37758)
    mc.update_index_D1()

fig4

2.4 Mac OS或Linux下的下载与更新

模块中包含了一些shell脚本,方面在linux-like os下的数据下载、更新。

~$ cd path/of/vn/datayes
~$ chmod +x prepare.sh
~$ ./prepare.sh

fig5 fig6