前言

上次我们介绍了一下vnpy量化框架的搭建,今天我们来说说TuShare数据源的接入。因为公司之前一直是从一些金融网站或者证券服务商获取的,公司最近决定改变策略通过TuShare获取。其实在VeighNa开源网站上官方也提供了一些数据服务商。本着能白嫖绝不花钱的准则,就试着接入下。接下来我们开始进入正题吧

账号注册

  1. 通过TuShare官网进入,注册并登陆个人账户,进入个人主页

    )

  2. 积分查询与获取

    新用户的积分是100,通过更新个人资料,可以增加20的积分

  3. 积分其他获取方式

    • 分享

      通过分享推荐链接,成功注册一个有效用户(指真正会使用tushare数据的用户)可获得50积分,虚假用户带来的积分会被定期回收!

    • 捐助(付费)

      通过捐助社区捐助一定的金额可提高个人的积分。捐助积分与频次关系图如下:

      积分数 每分钟频次 每天总量上限 可以访问的接口 捐助(元)
      120 50 8000次 股票基础信息、股票非复权日线行情,其他接口无法调取 0
      2000以上 200 100000次/个API tushare.pro 60%的API可以调取,可参考每个接口的积分要求 200
      5000以上 500 常规数据无上限 tushare.pro 90%的API可以调取,可参考每个接口的积分要求 500
      10000以上 1000 常规数据无上限,特色数据300次每分钟 特色数据权限,包括盈利预测数据、每日筹码和胜率、筹码分布、券商每月金股等数据 1000
      15000以上 1000 特色数据无总量限制 特色数据专属权限 1500

      10000积分以上可以有更高的API频次和权限,比如股票特色数据

      此外,分钟和港美股数据权限不在积分范畴内,各类分钟单独开权限

      类型 包含数据 历史起始 捐助(元) 频次
      沪深A股 1、5、15、30、60分钟 2009年 1000 每分钟500次,每次8000行数据,总量不限制
      期货 同上 2010年 1000 同上
      期权 同上 2010年 2000,包含股指和商品期权 同上
      港股 日线 全历史 1000 每分钟500次,每次3000行,总量不限制
      美股 日线,包含估值指标、换手率等 全股票全历史 1000 每分钟500次,每次6000行,总量不限制
      数字货币 1~60分钟 2020年开始 1000 每分钟500次,每次8000行,总量不限制
      新闻资讯 快讯、长篇新闻、新闻联播、公司公告 3年以上 1000 每分钟400次,总量不限制
    • 高校师生,确认身份后,可以免费获得2000积分(根据实际情况可以调整)

    • 参与社区贡献,比如提交数据问题、参与数据贡献、编写文章发给群主或积分管理员

  4. 接口调用与测试

    在本地编写Python测试脚本

    import tushare as ts
    ts.set_token('你的token')
    pro = ts.pro_api()
    df = pro.fut_daily(ts_code='CU1811.SHF', start_date='20180101', end_date='20181113')
    print(df)
    

  5. 接入vnpy

    • 安装

      pip install vnpy_tushare
      
    • vnpy项目根目录下创建vnpy_tushare\__init__.py

    import importlib_metadatafrom .tushare_datafeed import TushareDatafeed as Datafeedtry:__version__ = importlib_metadata.version("vnpy_tushare")
    except importlib_metadata.PackageNotFoundError:__version__ = "dev"
    
    • vnpy_tushare\tushare_datafeed.py
    from datetime import timedelta, datetime
    from typing import Dict, List, Optional
    from copy import deepcopyimport pandas as pd
    from pandas import DataFrame
    import tushare as ts
    from tushare.pro.client import DataApifrom vnpy.trader.setting import SETTINGS
    from vnpy.trader.datafeed import BaseDatafeed
    from vnpy.trader.constant import Exchange, Interval
    from vnpy.trader.object import BarData, HistoryRequest
    from vnpy.trader.utility import round_to, ZoneInfo# 数据频率映射
    INTERVAL_VT2TS: Dict[Interval, str] = {Interval.MINUTE: "1min",Interval.HOUR: "60min",Interval.DAILY: "D",
    }# 股票支持列表
    STOCK_LIST: List[Exchange] = [Exchange.SSE,Exchange.SZSE,Exchange.BSE,
    ]# 期货支持列表
    FUTURE_LIST: List[Exchange] = [Exchange.CFFEX,Exchange.SHFE,Exchange.CZCE,Exchange.DCE,Exchange.INE,
    ]# 交易所映射
    EXCHANGE_VT2TS: Dict[Exchange, str] = {Exchange.CFFEX: "CFX",Exchange.SHFE: "SHF",Exchange.CZCE: "ZCE",Exchange.DCE: "DCE",Exchange.INE: "INE",Exchange.SSE: "SH",Exchange.SZSE: "SZ",
    }# 时间调整映射
    INTERVAL_ADJUSTMENT_MAP: Dict[Interval, timedelta] = {Interval.MINUTE: timedelta(minutes=1),Interval.HOUR: timedelta(hours=1),Interval.DAILY: timedelta()
    }# 中国上海时区
    CHINA_TZ = ZoneInfo("Asia/Shanghai")def to_ts_symbol(symbol, exchange) -> Optional[str]:"""将交易所代码转换为tushare代码"""# 股票if exchange in STOCK_LIST:ts_symbol: str = f"{symbol}.{EXCHANGE_VT2TS[exchange]}"# 期货elif exchange in FUTURE_LIST:if exchange is not Exchange.CZCE:ts_symbol: str = f"{symbol}.{EXCHANGE_VT2TS[exchange]}".upper()else:for count, word in enumerate(symbol):if word.isdigit():breakyear: str = symbol[count]month: str = symbol[count + 1:]if year == "9":year = "1" + yearelse:year = "2" + yearproduct: str = symbol[:count]ts_symbol: str = f"{product}{year}{month}.ZCE".upper()else:return Nonereturn ts_symboldef to_ts_asset(symbol, exchange) -> Optional[str]:"""生成tushare资产类别"""# 股票if exchange in STOCK_LIST:if exchange is Exchange.SSE and symbol[0] == "6":asset: str = "E"elif exchange is Exchange.SZSE and symbol[0] == "0" or symbol[0] == "3":asset: str = "E"else:asset: str = "I"# 期货elif exchange in FUTURE_LIST:asset: str = "FT"else:return Nonereturn assetclass TushareDatafeed(BaseDatafeed):"""TuShare数据服务接口"""def __init__(self):""""""self.username: str = SETTINGS["datafeed.username"]self.password: str = SETTINGS["datafeed.password"]self.inited: bool = Falsedef init(self) -> bool:"""初始化"""if self.inited:return Truets.set_token(self.password)self.pro: Optional[DataApi] = ts.pro_api()self.inited = Truereturn Truedef query_bar_history(self, req: HistoryRequest) -> Optional[List[BarData]]:"""查询k线数据"""if not self.inited:self.init()symbol: str = req.symbolexchange: Exchange = req.exchangeinterval: Interval = req.intervalstart: datetime = req.start.strftime("%Y-%m-%d %H:%M:%S")end: datetime = req.end.strftime("%Y-%m-%d %H:%M:%S")ts_symbol: str = to_ts_symbol(symbol, exchange)if not ts_symbol:return Noneasset: str = to_ts_asset(symbol, exchange)if not asset:return Nonets_interval: str = INTERVAL_VT2TS.get(interval)if not ts_interval:return Noneadjustment: timedelta = INTERVAL_ADJUSTMENT_MAP[interval]try:d1: DataFrame = ts.pro_bar(ts_code=ts_symbol,start_date=start,end_date=end,asset=asset,freq=ts_interval)except IOError:return []df: DataFrame = deepcopy(d1)while True:if len(d1) != 8000:breaktmp_end: str = d1["trade_time"].values[-1]d1 = ts.pro_bar(ts_code=ts_symbol,start_date=start,end_date=tmp_end,asset=asset,freq=ts_interval)df = pd.concat([df[:-1], d1])bar_keys: List[datetime] = []bar_dict: Dict[datetime, BarData] = {}data: List[BarData] = []# 处理原始数据中的NaN值df.fillna(0, inplace=True)if df is not None:for ix, row in df.iterrows():if row["open"] is None:continueif interval.value == "d":dt: str = row["trade_date"]dt: datetime = datetime.strptime(dt, "%Y%m%d")else:dt: str = row["trade_time"]dt: datetime = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S") - adjustmentdt = dt.replace(tzinfo=CHINA_TZ)turnover = row.get("amount", 0)if turnover is None:turnover = 0open_interest = row.get("oi", 0)if open_interest is None:open_interest = 0bar: BarData = BarData(symbol=symbol,exchange=exchange,interval=interval,datetime=dt,open_price=round_to(row["open"], 0.000001),high_price=round_to(row["high"], 0.000001),low_price=round_to(row["low"], 0.000001),close_price=round_to(row["close"], 0.000001),volume=row["vol"],turnover=turnover,open_interest=open_interest,gateway_name="TS")bar_dict[dt] = barbar_keys: list = bar_dict.keys()bar_keys = sorted(bar_keys, reverse=False)for i in bar_keys:data.append(bar_dict[i])return data
    
    • 使用

      在VeighNa中使用TuShare时,需要在全局配置中填写以下字段信息:

      名称 含义 必填 举例
      datafeed.name 名称 tushare
      datafeed.username 用户名 token
      datafeed.password 密码 c3a110417f08f26d2c221edc0c50d4a8a5001502eea89cf5
  6. 测试

    • 查看配置项

      这里的数据库选择默认的sqlite

    • 填写参数

      周期没有tick级的

    • 下载数据

      数据库查询

    • 开始回测

VeighNa进阶EP01:TuShare数据源接入相关推荐

  1. springboot学习进阶(二)----配置数据源

    做Java开发的都知道,后台就是要跟数据库进行打交道的,什么增删改查什么排序分组索引,也不是本文的重点,就不详细述说了,但是怎么连接数据库这个在配置数据库的时候,是必须要清楚的.传统的数据库链接方式就 ...

  2. spark编程mysql数据源_Spark - 直接操作数据源 MySQL

    如果我们的Mysql服务器性能不咋滴,但是硬盘很够,如何才能做各种复杂的聚合操作?答案就是使用spark的计算能力的,我们可以将mysql数据源接入到spark中. 读取 val mysqlDF = ...

  3. spark mysql 交互_Spark - 直接操作数据源 MySQL

    如果我们的Mysql服务器性能不咋滴,但是硬盘很够,如何才能做各种复杂的聚合操作?答案就是使用spark的计算能力的,我们可以将mysql数据源接入到spark中. 读取 val mysqlDF = ...

  4. 5分钟搞定Loki告警多渠道接入

    简介: Loki是受Prometheus启发的水平可扩展.高可用.多租户日志聚合系统.用户既可以将Loki告警直接接入SLS开放告警,也可以先将Loki接入Grafana或Alert Manager, ...

  5. python金融数据缺失处理_顺利迈过Tushare+python3+mySql读取金融数据的坑

    许久没有写了,上线发现后台界面变了,感觉不错.给凤凰点个赞,找个时间写个关于大风号的评论,蹭下平台的热度. 今天,主要讲一下最近在学习Tushare中遇到的一个坑.本人折腾python也快大半年了,p ...

  6. Python --相似K线匹配--实现股票走势预测 Tushare

    Python --相似K线匹配–实现股票走势预测 Tushare 前言 同花顺和东方财富都提供了一个免费的功能可以查找相似走势的K线,提供参考.差不多,东方财富可以选择分析的周期,同花顺是固定120日 ...

  7. Tushare平台使用经验分享

    Tushare大数据平台链接:Tushare大数据社区 Tushare用户ID:477986 分享内容:东方财富北向数据与Tushare中数据源对比 北向资金数据自己在收集.使用时对比东方财富和tus ...

  8. prometheus:原理和部署

    目录 引言 一.Prometheus 概述 1.什么是Prometheus 2.Zabbix和Prometheus区别 3.Prometheus的特点 二.运维监控平台设计思路 三.Prometheu ...

  9. 量化免费行情源最强对比分析--看这篇就够了

    序言 很多想做量化的用户一直苦于没有稳定的行情源,我也是一个,但是其实市面上有很多免费好用的行情源,在这边给大家推荐几个我用过的,给大家做个参考 先做一下对比: INSIGHT Tushare 聚宽 ...

最新文章

  1. 前端学习之html——基本结构
  2. 创建Socket【Socket编程4】
  3. Simpsons’ Hidden Talents(HDU-2594)
  4. 【今日CS 视觉论文速览】Fri, 1 Feb 2019
  5. 欠拟合和过拟合以及如何选择模型
  6. JSP技术模型(五)JSP隐含变量
  7. 多个pdf合并成一个pdf_手机里多个PDF合并成一个PDF的免费方法
  8. [C] 从文件读取数据
  9. 双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计
  10. css 各浏览器里的不同
  11. Futter基础第9篇: 实现页面跳转、跳转传值(命名路由、命名路由传值)
  12. 编译器——指令的汇编
  13. Excel(XLS,XLSX)和CSV相互转换 - C#简单实现方案
  14. centos 6.4 安装java_CentOS6.4 64位系统安装jdk 转载
  15. 3dmax渲染计算机内存不足怎么办,3DMax渲染 提示内存不足怎么办
  16. 大龄程序员的一些出路
  17. iOS 系统视频播放器简单介绍
  18. 人、机客户服务质量 - 实时透视分析
  19. 例题(8.3) 求一元二次方程的根 (1051)
  20. linux命令v---vi

热门文章

  1. 常用的正则表达式(手机号,身份证号,姓名)
  2. Flutter App显示Github Readme文档
  3. java string 查找大写字母_java实现统计字符串中大写字母,小写字母及数字出现次数的方法示例...
  4. linux定时播放音乐,Linux:在录制/播放声音期间的定时
  5. 转载:YOLOv3: 训练自己的数据
  6. 修改redis数据库的端口号和密码
  7. win7修复计算机无鼠标,Win7鼠标右键没反应如何修复?右键点击桌面图标没反应怎么处理?...
  8. php数组指定位置后加,PHP 数组合并、增加元素、插入指定位置
  9. 再穷也要出去旅行,再累也要有自己的生活
  10. 以下内容仅对你可见个性签名_日系小清新文案