网站用户体验设计/南昌seo招聘信息
用`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')
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=[])
生成的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文档
相关文章:

Python量化投资——金融数据最佳实践: 使用qteasy+tushare搭建本地金融数据仓库并定期批量更新【附源码】
用qteasytushare实现金融数据本地化存储及访问 目的什么是qteasy什么是tushare为什么要本地化使用qteasy创建本地数据仓库qteasy支持的几种本地化仓库类型配置本地数据仓库配置tushare 的API token 配置本地数据源 —— 用MySQL数据库作为本地数据源下载金融历史数据 数据的定期…...

【投稿】北海 - Rust与面向对象(二)
模板方法 Rust提供了trait,类似于面向对象的接口,不同的是,将传统面向对象的虚函数表从对象中分离出来,trait仍然是一个函数表,只不过是独立的,它的参数self指针可以指向任何实现了该trait的结构。 从对象中…...

HarmonyOS构建第一个ArkTS应用(FA模型)
构建第一个ArkTS应用(FA模型) 创建ArkTS工程 若首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&a…...

阿里云 ARMS 应用监控重磅支持 Java 21
作者:牧思 & 山猎 前言 今年的 9 月 19 日,作为最新的 LTS (Long Term Support) Java 版本,Java 21 正式 GA,带来了不少重量级的更新,详情请参考 The Arrival of Java 21 [ 1] 。虽然目前 Java 11 和 Java 17 都…...

C++ 类的析构函数和构造函数
构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。主要用来在创建对象时初始化对象即为对象成员变量赋初始值。 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用…...

STM32——CAN协议
文章目录 一.CAN协议的基本特点1.1 特点1.2 电平标准1.3 基本的五个帧1.4 数据帧 二.数据帧解析2.1 帧起始和仲裁段2.2 控制段2.3 数据段和CRC段2.4 ACK段和帧结束 三.总线仲裁四.位时序五.STM32CAN控制器原理与配置5.1 STM32CAN控制器介绍5.2 CAN的模式5.3 CAN框图 六 手册寄存…...

数据结构-如何巧妙实现一个栈?逐步解析与代码示例
文章目录 引言1.栈的基本概念2.选择数组还是链表?3. 定义栈结构4.初始化栈5.压栈操作6.弹栈操作7.查看栈顶和判断栈空9.销毁栈操作10.测试并且打印栈内容栈的实际应用结论 引言 栈是一种基本但强大的数据结构,它在许多算法和系统功能中扮演着关键角色。…...

web前端之拖拽API、vue3实现图片上传拖拽排序、拖放、投掷、复制、若依、vuedraggable
MENU vue2html5原生dom原生JavaScript实现跨区域拖放vue2实现跨区域拖放vue2mousedown实现全屏拖动,全屏投掷vue3element-plusvuedraggable实现图片上传拖拽排序vue2transition-group实现拖动排序原生拖拽排序 vue2html5原生dom原生JavaScript实现跨区域拖放 关键代…...

第11章 GUI Page403~405 步骤三 设置滚动范围
运行效果: 源代码: /**************************************************************** Name: wxMyPainterApp.h* Purpose: Defines Application Class* Author: yanzhenxi (3065598272qq.com)* Created: 2023-12-21* Copyright: yanzhen…...

【Spring Security】打造安全无忧的Web应用--使用篇
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Spring Security的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Spring Security中的授权是…...

体验一下 CodeGPT 插件
体验一下 CodeGPT 插件 0. 背景1. CodeGPT 插件安装2. CodeGPT 插件基本配置3. (可选)CodeGPT 插件预制提示词原始配置(英文)4. CodeGPT 插件预制提示词配置(中文)5. 简单验证一下 0. 背景 看到B站Up主 “wwwzhouhui” 一个关于 CodeGPT 的视频,感觉挺有意思&#…...

深度学习 | 基础卷积神经网络
卷积神经网络是人脸识别、自动驾驶汽车等大多数计算机视觉应用的支柱。可以认为是一种特殊的神经网络架构,其中基本的矩阵乘法运算被卷积运算取代,专门处理具有网格状拓扑结构的数据。 1、全连接层的问题 1.1、全连接层的问题 “全连接层”的特点是每个…...

[字符编码]windwos下使用libiconv转换编码格式(二)
在http://t.csdnimg.cn/PLUuz笔记中实现了常用编码格式转换的功能,但这还是一个demo。因为代码中向libiconv库函数传递的字符串是存放在堆空间中的(我也是从网上找例子测试,是否一定要开辟堆空间存放还有待考证),如果一次性转换的字节数很巨大的话,就会导致内存空间不足,进而引…...

textile 语法
1、文字修饰 修饰行内文字 字体样式textile 语法对应的 XHTML 语法实际显示效果加强*strong*<strong>strong</strong>strong强调_emphasis_<em>emphasis</em>emphasis加粗**bold**<b>bold</b>bold斜体__italics__<i>italics</i…...

【快速开发】使用SvelteKit
自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…...

【docker笔记】docker常用命令
1、帮助启动类命令 1.1 启动、重启、查询当前状态、停止 systemctl start docker systemctl stop docker systemctl restart docker systemctl status docker1.2 设置开机启动 systemctl enable docker1.3 查看docker概要信息 docker info1.4 查看docker帮助文档 docker -…...

API 接口怎样设计才安全?
设计安全的API接口是确保应用程序和数据安全的重要方面之一。下面是一些设计安全的API接口的常见实践: 1. 身份验证和授权: 使用适当的身份验证机制,如OAuth、JWT或基本身份验证,以确保只有经过身份验证的用户可以访问API。实施…...

网站被CC攻击了怎么办?CC攻击有什么危害
网络爆炸性地发展,网络环境也日益复杂和开放,同时各种各样的恶意威胁和攻击日益增多,其中网站被CC也是常见的情况。 CC攻击有什么危害呢? 被CC会导致: 1.访问速度变慢:网站遭受CC攻击后,由于…...

Docker - 镜像 | 容器 日常开发常用指令 + 演示(一文通关)
目录 Docker 开发常用指令汇总 辅助命令 docker version docker info docker --help 镜像命令 查看镜像信息 下载镜像 搜索镜像 删除镜像 容器命令 查看运行中的容器 运行容器 停止、启动、重启、暂停、恢复容器 杀死容器 删除容器 查看容器日志 进入容器内部…...

要参加微软官方 Copilot 智能编程训练营了
GitHub Copilot 是由 GitHub、OpenAI 和 Microsoft 联合开发的生成式 AI 模型驱动的。 GitHub Copilot 分析用户正在编辑的文件及相关文件的上下文,并在编写代码时提供自动补全式的建议。 刚好下周要参加微软官方组织的 GitHub Copilot 工作坊-智能编程训练营&…...

Python入门学习篇(五)——列表字典
1 列表 1.1 定义 ①有序可重复的元素集合 ②可以存放不同类型的数据 ③个人理解:类似于java中的数组1.2 相关方法 1.2.1 获取列表长度 a 语法 len(列表名)b 示例代码 list2 [1, 2, "hello", 4] print(len(list2))c 运行结果 1.2.2 获取列表值 a 语法 列表名…...

React尝鲜
组件 React的组件就是一个js函数,函数内部return一个由jsx语法创建的html代码片段。 //MyComp.js export default function MyComp(){return (<h1>我是新组件MyComp</h1>) } 在需要引入组件的地方import导入组件,并放在相应位置 //App.js…...

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

HarmonyOS和OpenHarmony的区别
1.概要 众所周知,鸿蒙是华为开发的一款分布式操作系统。因为开发系统,最重要的是集思广益,大家共同维护。为了在IOS和Android之间生存,鸿蒙的茁壮成长一定是需要开源,各方助力才能实现。 在这种思想上,…...

Redis Stream消息队列之基本语法与使用方式
前言 本文的主角是Redis Stream,它是Redis5.0版本新增加的数据结构,主要用于消息队列,提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证…...

制造行业定制软件解决方案——工业信息采集平台
摘要:针对目前企业在线检测数据信号种类繁多,缺乏统一监控人员和及时处置措施等问题。蓝鹏测控开发针对企业工业生产的在线数据的集中采集分析平台,通过该工业信息采集平台可将企业日常各种仪表设备能够得到数据进行集中分析处理存储…...

[python]用python实现对arxml文件的操作
目录 关键词平台说明一、背景二、方法2.1 库2.2 code 关键词 python、excel、DBC、openpyxl 平台说明 项目Valuepython版本3.6 一、背景 有时候需要批量处理arxml文件(ARXML 文件符合 AUTOSAR 4.0 标准),但是工作量太大,阔以考虑用python。 二、方…...

pdf 在线编辑
https://smallpdf.com/edit-pdf#rapp 参考 https://zh.wikihow.com/%E5%B0%86%E5%9B%BE%E5%83%8F%E6%8F%92%E5%85%A5PDF...

自然语言处理(NLP):理解语言,赋能未来
目录 前言1 什么是NLP2 NLP的用途3 发展历史4 NLP的基本任务4.1 词性标注(Part-of-Speech Tagging)4.2 命名实体识别(Named Entity Recognition)4.3 共指消解(Co-reference Resolution)4.4 依存关系分析&am…...

FastAPI使用loguru时,出现重复日志打印的解决方案
首先看图,发现每个日志都被打印了3条。其实这个和uvicorn日志打印的设计有关,在uvicorn中有多个logger,分别是uvicorn、uvicorn.error、uvicorn.access 而LOGGING默认有一个属性propagate,这个属性为True时,子日志记录…...