Python量化投资——金融数据最佳实践: 使用qteasy+tushare搭建本地金融数据仓库并定期批量更新【附源码】

用`qteasy`+`tushare`实现金融数据本地化存储及访问

    • 目的
    • 什么是`qteasy`
    • 什么是`tushare`
    • 为什么要本地化
    • 使用qteasy创建本地数据仓库
      • qteasy支持的几种本地化仓库类型
      • 配置本地数据仓库
        • 配置`tushare` 的API token
      • 配置本地数据源 —— 用MySQL数据库作为本地数据源
      • 下载金融历史数据
    • 数据的定期下载
    • 更多用法请参见文档

目的

做量化投资或者对量化交易感兴趣的朋友应该都需要用到大量的金融数据,例如股票价格,基金净值、上市公司技术指标和财务指标等等。但是,如何有效、可靠地获取金融数据,并且有效地使用,却是一个令人头疼的问题。在这篇文章中,我想跟大家交流我的使用心得,分享我的最佳实践——建立一个本地数据仓库、定期拉取数据;按照这个最佳实践,可以实现以下功能:

  • 数据本地化存储,实现数据高速查询,没有数量限制
  • 定期下载数据,实现去重和清洗,保持本地数据最新

以上的功能通过qteasy+tushare来实现,可以比较容易地整合到量化投资系统里去。

什么是qteasy

qteasy是本人正在开发的一个快速量化交易工具包,完全免费使用。利用这个工具包,可以快速灵活地生成各种量化交易策略,生成历史数据并回测策略的表现,有针对性地优化策略的性能;还能模拟实盘自动化交易;不仅如此,qteasy还内嵌了tushare,可以快速建立一个本地数据仓库,实现大量金融数据的快速下载、清洗、存储和快速调用。qteasy目前最新版本为v1.0.14,并且正在不断迭代中,最新版本可以通过pip安装。

python -m pip install qteasy

qteasy的Github项目地址在这里
请访问qteasy文档获取更多信息

什么是tushare

tushare是一个立足于国内的金融数据包。通过它可以相当容易地获取包括股票、基金、期货在内的大量金融数据,使用非常简便而且基础功能免费。
tushare的早期版本是完全免费的,不过功能也相对单一,后来升级到了tushare pro之后,支持的数据种类大大扩展,同时也开启了积分的功能,部分高级数据获取功能是需要一定积分的,积分通常需要付费而且每年都需要支付。不过,平心而论,相比早期版本,升级到pro版本后,数据的丰富程度、数据提取速度和稳定性、可靠性都大大提升,相比获得的提升,支付一点点费用完全可以说是物超所值的。
这里是tushare的 文档链接。使用pip安装qteasy时,会自动安装tushare

为什么要本地化

现在有一些金融数据包提供了在线实时读取金融数据的功能,但是,如果每次都使用在线下载的方式获取金融数据,会有不少问题:

  • 网络连接不够可靠:不管网络速度有多快,从服务器上获取数据的速度总归是一个大问题,尤其是需要获取大量数据的时候,还容易出现连接失败的问题。
  • 单次下载信息量受限tushare有一些特殊的下载限制要求,比如某些数据单次下载最多不能超过5000行数据,或者某些数据单次下载限定了股票的数量等等,为了获取完整的数据,比如所有指数的指标,就必须分批下载,进一步降低速度。
  • 增加服务器负载:当然,这是从tushare的角度来考虑的,如果所有人都依赖于从服务器上下载数据,tushare的服务器很快就会超负荷

因此,最佳实践是使用qteasy建立一个本地数据仓库,并创建一个定期拉取程序,需要数据的时候从本地数据仓库中获取,同时定期运行数据拉取程序,将最新的数据下载并合并到本地数据仓库中,确保数据仓库中的数据时时最新。

使用qteasy创建本地数据仓库

安装好qteasy后,只需要简单的配置,就可以快速建立数据仓库了。qteasy数据仓库内置了相当完整的数据类型清单,涵盖股票、指数、基金、期货、期权等投资品种,数据类型除量价、K线数据以外,还内置了几乎所有常见的股票技术指标、宏观经济数据、上市公司基本信息,以及完整的财务报表数据等等信息。

部分支持的数据如下表:

所有上面提到的这些信息,qteasy都给它们赋予了一个唯一的数据类型标识,通过这个数据类型标识,用户可以用一行代码就从网上下载相应的历史数据,并将它们存储到本地。在下载的过程中,qteasy会自动完成数据清洗、归类、去重,并将数据分门别类存储到多张不同的数据表中。

在需要数据的时候,同样只要通过数据类型标识,也仅仅通过一行代码,即可从数据仓库中读取相应的数据,同时还具备自动的数据频率调整、插值功能,也具备较完善的数据可视化功能,以方便用户使用。

qteasy支持的几种本地化仓库类型

金融数据的量是非常大的,尤其是高频数据。比如,仅沪深股市所有上市股票的分钟级K线数据量就超过200GB,其余期货、期权、基金、指数等数据量也在几十到数百GB的量级。不过如果是日频数据,例如过去20年所有A股股票的日K线数据,全部加起来也不过只有10G不到。

因此,建议大家根据自己的数据使用频率来规划相应的磁盘空间,如果需要使用高频数据,建议使用NAS系统,或者至少需要有一个足够大的硬盘。首先规划好至少1TB的磁盘空间准备用来存储所需的数据是必要的。如果只需要短期内的低频数据,本地文件存储也就足够了。

使用qteasy,可以选择采用不同的文件形式来存储本地数据仓库:

  • 本地文件存储 (默认文件格式为csv,除此以外还可以选择hdf5和feather文件类型)
  • mysql数据库存储

两种方法各自有优缺点。默认的csv文件优点在于上手简单,不需要特殊配置,而且文件内容可以直接使用Excel等软件查看,支持超大的文件(但是文件太大用Excel就不容易打开了),但是读取速度慢,安全性和稳定性差,mysql正好相反,上手稍微复杂一些,需要配置数据库,需要有一些数据库基础,但是速度快、稳定性好。

还是那句话,各人需要根据自己的实际需要选择合适的存储方式,如果需要用到大量高频数据,首选mysql作为数据仓库存储介质,如果数据量不是特别大的话,csv文件系统也可以胜任工作。

配置本地数据仓库

qteasy通过tushare金融数据包来获取大量的金融数据,用户需要自行申请tushare的API Token,获取相应的权限和积分。详情请参考这里。

因此,在使用qteasy之前需要对本地数据源和tushare进行必要的配置。在QT_ROOT_PATH/qteasy/路径下打开配置文件qteasy.cfg,可以看到下面内容:

# qteasy configuration file
# following configurations will be loaded when initialize qteasy# example:
# local_data_source = database
配置tushare 的API token

将你获得的tushare API token添加到配置文件中,如下所示:

tushare_token = <你的tushare API Token> 

配置本地数据源 —— 用MySQL数据库作为本地数据源

默认情况下qteasy使用存储在data/路径下的.csv文件作为数据源,不需要特殊设置。
如果设置使用mysql数据库作为本地数据源,在配置文件中添加以下配置:

local_data_source = database  local_db_host = <host name>
local_db_port = <port number>
local_db_user = <user name>
local_db_password = <password>
local_db_name = <database name>

关闭并保存好配置文件后,重新导入qteasy,就完成了数据源的配置,可以开始下载数据到本地了。

下载金融历史数据

要下载金融价格数据,使用qt.refill_data_source()函数。下面的代码下载2021及2022两年内所有股票、所有指数的日K线数据,同时下载所有的股票和基金的基本信息数据。
(根据网络速度,下载数据可能需要十分钟左右的时间,如果存储为csv文件,将占用大约200MB的磁盘空间):

import qteasy as qt
qt.refill_data_source(tables=['stock_daily',   # 股票的日线价格'index_daily',   # 指数的日线价格'basics'],       # 股票和基金的基本信息start_date='20210101',   # 下载数据的开始时间end_date='20221231',     # 下载数据的截止时间
)

数据下载到本地后,可以使用qt.get_history_data()来获取数据,如果同时获取多个股票的历史数据,每个股票的历史数据会被分别保存到一个dict中。

import qteasy as qt
qt.get_history_data(htypes='open, high, low, close',  # 获取的数据类型shares='000001.SZ, 000300.SH',    # 股票代码start='20210101',                 # 开始日期end='20210115')					  # 结束日期

运行上述代码会得到一个Dict对象,包含两个股票"000001.SZ"以及"000005.SZ"的K线数据(数据存储为DataFrame):

{'000001.SZ':open   high    low  close2021-01-04  19.10  19.10  18.44  18.602021-01-05  18.40  18.48  17.80  18.172021-01-06  18.08  19.56  18.00  19.56... 2021-01-13  21.00  21.01  20.40  20.702021-01-14  20.68  20.89  19.95  20.172021-01-15  21.00  21.95  20.82  21.00,'000300.SH':open       high        low      close2021-01-04  5212.9313  5284.4343  5190.9372  5267.71812021-01-05  5245.8355  5368.5049  5234.3775  5368.50492021-01-06  5386.5144  5433.4694  5341.4304  5417.6677...2021-01-13  5609.2637  5644.7195  5535.1435  5577.97112021-01-14  5556.2125  5568.0179  5458.6818  5470.45632021-01-15  5471.3910  5500.6348  5390.2737  5458.0812}

除了价格数据以外,qteasy还可以下载并管理包括财务报表、技术指标、基本面数据等在内的大量金融数据,详情请参见qteasy文档

股票的数据下载后,使用qt.candle()可以显示股票数据K线图。

data = qt.candle('000300.SH', start='2021-06-01', end='2021-8-01', asset_type='IDX')

png

qteasy的K线图函数candle支持通过六位数股票/指数代码查询准确的证券代码,也支持通过股票、指数名称显示K线图
qt.candle()支持功能如下:

  • 显示股票、基金、期货的K线
  • 显示复权价格
  • 显示分钟、 周或月K线
  • 显示不同移动均线以及MACD/KDJ等指标

详细的用法请参考qteasy文档,示例如下(请先使用qt.refill_data_source()下载相应的历史数据):

# 场内基金的小时K线图
qt.candle('159601', start = '20220121', freq='h')
# 沪深300指数的日K线图
qt.candle('000300', start = '20200121')
# 股票的30分钟K线,复权价格
qt.candle('中国电信', start = '20211021', freq='30min', adj='b')
# 期货K线,三条移动均线分别为9天、12天、26天
qt.candle('沪铜主力', start = '20211021', mav=[9, 12, 26])
# 场外基金净值曲线图,复权净值,不显示移动均线
qt.candle('000001.OF', start='20200101', asset_type='FD', adj='b', mav=[])

png

png

png

png

png

生成的K线图可以是一个交互式动态K线图(请注意,K线图基于matplotlib绘制,在使用不同的终端时,显示功能有所区别,某些终端并不支持
动态图表,详情请参阅 matplotlib文档

在使用动态K线图时,用户可以用鼠标和键盘控制K线图的显示范围:

  • 鼠标在图表上左右拖动:可以移动K线图显示更早或更晚的K线
  • 鼠标滚轮在图表上滚动,可以缩小或放大K线图的显示范围
  • 通过键盘左右方向键,可以移动K线图的显示范围显示更早或更晚的K线
  • 通过键盘上下键,可以缩小或放大K线图的显示范围
  • 在K线图上双击鼠标,可以切换不同的均线类型
  • 在K线图的指标区域双击,可以切换不同的指标类型:MACD,RSI,DEMA

在这里插入图片描述

数据的定期下载

复制下面的源码,定期运行,即可定期下载相应数据到数据仓库中,供量化交易研究或实盘运行使用,源码如下:

import qteasy as qt
import pandas as pd# 下载低频data和event数据,下载周期较长以cover所有的季度月度周度数据 (每月下载)
tables = 'stock_weekly, stock_monthly, index_weekly, index_monthly, '
tables += 'income, balance, cashflow, financial, forecast, express, comp, report, events'
today = pd.to_datetime('today')  # 结束日期为今天
begin = pd.to_datetime(today - pd.Time_delta(30, unit='d')  # 开始日期为30天以前
qt.refill_data_source(tables=tables, start_date=begin.strftime('%Y%m%d'), end_date=today.strftime('%Y%m%d'), parallel=True, merge_type='update',reversed_par_seq=True)# 分批下载中频数据,下载周期较短以减少下载负载 (每周下载)
tables = 'adj, stock_daily, fund_daily, fund_nav, future_daily, options_daily, stock_indicator, stock_indicator2, index_indicator, shibor, libor, hibor, index_daily'
today = pd.to_datetime('today')  # 结束日期为今天
begin = pd.to_datetime(today - pd.Time_delta(7, unit='d')  # 开始日期为7天以前
qt.refill_data_source(tables=tables, start_date=begin.strftime('%Y%m%d'), end_date=today.strftime('%Y%m%d'), parallel= True, merge_type='update',reversed_par_seq=True)# 分批下载高频数据,下载周期最短以减少下载负载 (每天下载)
tables = 'adj, stock_1min, stock_5min, stock_15min, stock_30min, stock_hourly'
# tables = 'adj, index_1min, index_5min, index_15min, index_30min, index_hourly'
# tables = 'fund_1min, fund_5min, fund_15min, fund_30min, fund_hourly'
# tables = 'adj, future_daily, options_daily'
today = pd.to_datetime('today')  # 结束日期为今天
begin = pd.to_datetime(today - pd.Time_delta(1, unit='d')  # 开始日期为1天以前
qt.refill_data_source(tables=tables, start_date=begin.strftime('%Y%m%d'), end_date=today.strftime('%Y%m%d'), parallel= True, merge_type='update',reversed_par_seq=True)

更多用法请参见文档

关于DataSource对象的更多详细介绍,请参见qteasy文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/223456.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超维空间S2无人机使用说明书——31、使用yolov8进行目标识别

引言&#xff1a;为了提高yolo识别的质量&#xff0c;提高了yolo的版本&#xff0c;改用yolov8进行物体识别&#xff0c;同时系统兼容了低版本的yolo&#xff0c;包括基于C的yolov3和yolov4&#xff0c;以及yolov7。 简介&#xff0c;为了提高识别速度&#xff0c;系统采用了G…

c语言的练习---BCD解密

#继续源于c语言翁恺先生 一.分析 初看这道题的时候&#xff0c;可能很多人就想选择放弃&#xff0c;但这道题实在不是考察我们对于编码的能力&#xff1b;而是我们的数学能力。 就拿它的输入样例---18&#xff0c;来举例。 我们来看---在十进制中&#xff0c;是18D&#xf…

锯齿云服务器租赁使用教程

首先登陆锯齿云账号 网盘上传数据集与代码 随后我们需要做的是将所需要的数据集与代码上传到网盘&#xff08;也可以直接在租用服务器后将数据集与代码传到服务器的硬盘上&#xff0c;但这样做会消耗大量时间&#xff0c;造成资源浪费&#xff09; 点击工作空间&#xff1a;…

移除石子使总数最小(LeetCode日记)

LeetCode-1962-移除石子使总数最小 题目信息: 给你一个整数数组 p i l e s piles piles &#xff0c;数组 下标从 0 0 0 开始 &#xff0c;其中 p i l e s [ i ] piles[i] piles[i] 表示第 i i i 堆石子中的石子数量。另给你一个整数 k k k &#xff0c;请你执行下述操作…

无需改动现有网络,企业高速远程访问内网Linux服务器

某企业为数据治理工具盒厂商&#xff0c;帮助客户摆脱数据问题困扰、轻松使用数据&#xff0c;使得客户可以把更多精力投入至数据应用及业务赋能&#xff0c;让数据充分发挥其作为生产要素的作用。 目前&#xff0c;该企业在北京、南京、西安、武汉等地均设有产研中心&#xff…

docker构建镜像及项目部署

文章目录 练习资料下载一、docker基础1. 基本概念2. docker常见命令3. 命令别名4. 数据卷 二、docker自定义镜像1. 了解镜像结构2. 了解Dockerfile3. 构建Dockerfile文件&#xff0c;完成自定义镜像 三、网络1. docker常见网络命令2. docker自带虚拟网络3. 自定义网络 四、dock…

运维大模型探索之 Text2PromQL 问答机器人

作者&#xff1a;陈昆仪&#xff08;图杨&#xff09; 大家下午好&#xff0c;我是来自阿里云可观测团队的算法工程师陈昆仪。今天分享的主题是“和我交谈并获得您想要的PromQL”。今天我跟大家分享在将AIGC技术运用到可观测领域的探索。 今天分享主要包括5个部分&#xff1a;…

【Python】基于flaskMVT架构与session实现博客前台登录登出功能

目录 一、MVT说明 1.Model层 2.View层 3.Template层 二、功能说明 三、代码框架展示 四、具体代码实现 models.py 登录界面前端代码 博客界面前端代码&#xff08;profile.html&#xff09; main.py 一、MVT说明 MVT架构是Model-View-Template的缩写&#xff0c;是…

HarmonyOS构建第一个JS应用(FA模型)

构建第一个JS应用&#xff08;FA模型&#xff09; 创建JS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&#xf…

SpringBoot3-基础特性

文章目录 自定义 banner自定义 SpringApplicationFluentBuilder APIProfiles指定环境环境激活环境包含Profile 分组Profile 配置文件 外部化配置配置优先级 外部配置导入配置属性占位符 单元测试-JUnit5测试组件测试注解断言嵌套测试参数化测试 自定义 banner banner 就是启动…

计算机毕业设计 基于SpringBoot的房屋租赁管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

嵌入式开发中利用strstr()对部分模块回传数据进行解析的问题(坑)

受到以下博文的启发&#xff1a; https://www.cnblogs.com/yup1983/p/11337837.html 验证&#xff1a; 最近通过ESP8266远程控制小车&#xff0c;在wifi回传的数据解析过程中遇到标题所述的烦恼 如上截图所示&#xff0c;数据回传过程中会接受到‘\0’字节对应的ASCII码为0x0…

初识QT(上篇):What Qt

初识QT&#xff08;上篇&#xff09;&#xff1a;What Qt 前言 & 说明前言说明 初识QT1.1 QT的what1. 介绍2. 发展历程3. QT架构的主要内容4.QT的常用模块 1.2 QT的 why1. QT的核心机制 下篇笔记链接 前言 & 说明 前言 前言&#xff1a; 之前说要share的qt相关知识&am…

7种常见的网络安全设备及其功能

网络安全设备在现代网络环境中起着至关重要的作用&#xff0c;帮助保护个人和组织免受恶意攻击。本文将介绍7种常见的网络安全设备&#xff0c;包括防火墙、入侵检测系统、反病毒软件、数据加密设备、虚拟私人网络、安全信息和事件管理系统以及网络访问控制设备&#xff0c;并详…

Guava的TypeToken在泛型编程中的应用

第1章&#xff1a;引言 在Java世界里&#xff0c;泛型是个相当棒的概念&#xff0c;能让代码更加灵活和类型安全。但是&#xff0c;泛型也带来了一些挑战&#xff0c;特别是当涉及到类型擦除时。这就是TypeToken大显身手的时候&#xff01; 作为Java程序员的咱们&#xff0c;…

Flink 数据序列化

为 Flink 量身定制的序列化框架 大家都知道现在大数据生态非常火&#xff0c;大多数技术组件都是运行在JVM上的&#xff0c;Flink也是运行在JVM上&#xff0c;基于JVM的数据分析引擎都需要将大量的数据存储在内存中&#xff0c;这就不得不面临JVM的一些问题&#xff0c;比如Ja…

Python算法例27 对称数

1. 问题描述 对称数是一个旋转180后&#xff08;倒过来&#xff09;看起来与原数相同的数&#xff0c;找到所有长度为n的对称数。 2. 问题示例 给出n2&#xff0c;返回[&#xff02;11&#xff02;&#xff0c;&#xff02;69&#xff02;&#xff0c;&#xff02;88&#x…

【JAVA】分布式链路追踪技术概论

目录 1.概述 2.基于日志的实现 2.1.实现思想 2.2.sleuth 2.2.可视化 3.基于agent的实现 4.联系作者 1.概述 当采用分布式架构后&#xff0c;一次请求会在多个服务之间流转&#xff0c;组成单次调用链的服务往往都分散在不同的服务器上。这就会带来一个问题&#xff1a;…

计算机网络 运输层下 | TCP概述 可靠传输 流量控制 拥塞控制 连接管理

文章目录 3 运输层主要协议 TCP 概述3.1 TCP概述 特点3.2 TCP连接RSVP资源预留协议 4 TCP可靠传输4.1 可靠传输工作原理4.1.1 停止等待协议4.1.2 连续ARQ协议 4.2 TCP可靠通信的具体实现4.2.1 以字节为单位的滑动窗口4.2.2 超时重传时间的选择4.2.3 选择确认SACK 5 TCP的流量控…

mac m1芯片 pytorch安装及gpu性能测试

pytorch 使用mac的m1芯片进行模型训练。 #小结&#xff1a;在数据量小和模型参数少&#xff0c;batch_size小时&#xff0c;cpu训练更快&#xff08;原因&#xff1a;每次训练时数据需要放入GPU中&#xff0c;由于batch_size小。数据放入gpu比模型计算时间还长&#xff09; 在…