【迅投qmt系列】4、获取数据的方式

获取数据是进行策略回测、实时执行的前提,不同的场景下,有相对合适的数据获取方式。

1、只取历史数据

这个场景的内容一般是将历史数据下载下来后,再将数据用于其他用途。因为对效率没有多少要求,代码最简单,它将qmt接口连接、数据下载、数据输出保存都在一个 .py 文件中实现。
在 miniqmt 版中的使用顺序是:

1、运行 miniqmt 并登陆
2、python 中导入 xtdata
3、使用 download_history_data/download_history_data2 将需要的数据下载到本地缓存
4、使用 gmd 系列函数从缓存中读取数据,并转存成本地 .csv 文件,或者保存到指定数据库中

show the code

from xtquant import xtdatacode_list = ['000001.SH', '300750.SZ']
period = '1h'
start_time = '20230101093000'
end_time = '20230201093000'def on_data(datas):print(datas)xtdata.download_history_data2(code_list, period, start_time, end_time, on_data)for code in code_list:data = xtdata.get_market_data_ex([], [code], period, start_time, end_time)print(f'{code}数据保存到本地')data[code].to_csv(f'd:/data/{equity_name}.csv')

在 投研版 中的使用顺序是:

1、python 中导入 xtdata、xtdatacenter 
2、载入账户 token
3、使用 download_history_data/download_history_data 将需要的数据下载到本地缓存
4、使用 gmd 系列函数从缓存中读取数据,并转存成本地 .csv 文件,或者保存到指定数据库中

show the code

from xtquant import xtdata
from xtquant import xtdatacenter as xtdc
from const import xt_data_tokenxtdc.set_token(xt_data_token)
xtdc.init()code_list = ['000001.SH', '300750.SZ']
period = '1h'
start_time = '20230101093000'
end_time = '20230201093000'def on_data(datas):print(datas)xtdata.download_history_data2(code_list, period, start_time, end_time, on_data)for code in code_list:data = xtdata.get_market_data_ex([], [code], period, start_time, end_time)print(f'{code}数据保存到本地')data[code].to_csv(f'd:/data/{equity_name}.csv')

2、只取实时数据

这个场景的内容一般是将日内行情实时落地,或者用于实时的监控、日内(实盘或者模拟)交易。对数据的实时性、代码的执行效率有一定要求。

2.1、资产的数量较少

如果想获取实时数据的资产数量不多,可以将所有内容都在一个 .py 文件中实现。

2.1.1、miniqmt 版

a、运行miniqmt,并登陆。
b、订阅想取实时行情数据的资产,并让代码一直运行,等待所订阅资产最新数据。
c、资产数据有更新时,会被推送过来,立即调用回调函数进行处理。

from xtquant import xtdatacode = '600000.SH'
period = '1m'
start_time = '20240429093000'
end_time = ''
count = -1def callback_func(data):print('回调触发', data[code])stock_data = xtdata.get_market_data_ex(field_list=[], code_list=[code], start_time=start_time,end_time=end_time,count=count)# 后接各种指标计算xtdata.subscribe_quote(stock_code=code, period=period, start_time=start_time, end_time=end_time, count=count, callback=callback_func
)
xtdata.run()
2.1.2、投研版

直接在原生 python 中执行以下代码

from xtquant import xtdata
from xtquant import xtdatacenter as xtdc
from const import xt_data_tokenxtdc.set_token(xt_data_token)
xtdc.init()code = '600000.SH'
period = '1m'
start_time = '20240429093000'
end_time = ''
count = -1def callback_func(data):print('回调触发', data[code])stock_data = xtdata.get_market_data_ex(field_list=[], code_list=[code], start_time=start_time,end_time=end_time,count=count)# 后接各种指标计算xtdata.subscribe_quote(stock_code=code, period=period, start_time=start_time, end_time=end_time, count=count, callback=callback_func
)
xtdata.run()

注意事项:
a、即使 subscribe_quote 里入参填了起止时间,count 的值也指定取所有数据,但是在回调函数中,也只会推送最新的那条行情,想取起止时间之间完整的数据,必须使用 gmd 函数从本地缓存中取。

2.2、资产数量较多或者多个策略各自有自己的数量要求

如果想获取实时数据的资产数量较大,或者是多个策略各自要获取一些资产的实时数据(不同策略的资产可以有交集,也可以没有),考虑到:
a、迅投qmt是单点登录,对每个用户,在服务器端只允许使用一个进程。
b、对不同的进程,相同资产相同周期的订阅可以合并计算。

因此最好:
a、让数据源在与策略隔离的独立进程中。
b、每个策略单独一个 .py 文件,通过指定端口与本地数据源连接,获取实时数据。
c、实时数据最好全推,不管是tick数据还是分钟数据。

2.2.1、miniqmt 版

a、执行 miniqmt 并登陆(此时就是一个实时数据源),因此没有额外的动作。
b、具体订阅与处理数据的代码,见 2.1.1,可以有多个 .py 文件,每个文件各自取不同股票的实时行情。

2.1.2、投研版

a、新建一个独立的 .py 文件,联通投研版的数据服务器,并开启指定端口向本机内其他 .py 文件提供实时数据的服务。
b、其他 .py 文件通过对接该端口,从本地服务端获取所需的实时数据。
c、show me the code

# 联通投研版数据服务器,提供本地实时数据源的 xtdata_data_center_main.py
from xtquant import xtdatacenter as xtdc
from xtquant import xtdata
from const import xt_data_token, data_center_portxtdc.set_token(xt_data_token)
xtdc.set_data_home_dir(f'd:/data_tmp/qmt')         # 本地数据缓存地址
xtdc.set_kline_mirror_enabled(True)         # 开启K线全推
xtdc.init(start_local_service=False)        # 连接并启动数据服务。设为 False 使 xtdc 监听的端口为我们自己指定的端口
xtdc.listen(port=data_center_port)          # 开通指定的端口
print(f"服务启动,开放端口:{data_center_port}")xtdata.run()# 取数据 xtdata_get_data_sub_01.py
from xtquant import xtdata
from core.const import data_center_portxtdata.connect(port=data_center_port)   # 链接到主程序获取数据,链接的端口需要一致# 订阅股票实时行情
code = '600000.SH'
start_time = '20240429093000'
end_time = ''
period = '1m'# 订阅最新行情
def callback_func(data):print('回调触发', data[code])def thread_function():xtdata.subscribe_quote(stock_code=code,period=period,start_time=start_time,end_time=end_time,count=-1,callback=callback_func)xtdata.run()

3、既取历史数据,又取实时数据

这个场景与第2点有相似之处,想实时落地日内行情,或者用于实时监控,或者日内实时交易,同时使用者也想得到一些历史数据,用来计算各类指标。
这类场景的处理方法第2点差不多,只是多了一个历史数据的下载,以及与最新数据的拼接。
具体实现的方法,本帖子看到这里的小伙伴都是有心人了,一定能从本系列帖子内容找到线索,之后实现出来的,加油!

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

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

相关文章

【数学】高斯-约旦消元

前置知识 高斯消元 高斯-约旦消元 和高斯消元一样,高斯-约旦消元也是通过加减消元来化简方程。两者之间的不同在于,高斯-约旦消元会将系数矩阵消成形如 A ′ [ a 1 , 1 ′ b 1 ′ a 2 , 2 ′ b 2 ′ ⋱ ⋮ a n , n ′ b n ′ ] A\begin{bmatrix}a_{1…

题目:吃奶酪

问题描述: 解题思路: 枚举每种吃奶酪顺序,并计算其距离,选择最小的距离即答案。v数组:记录顺序。 注意点:1. 每次用于min的s需要重置为0。 2. 实数包括小数,所以结构体内x,y为double类型。 3. 第…

周期交易,交易周期

越来越体会到周期的力量和内涵。周期蕴涵着循环、蕴涵着正反力量的此消彼长、蕴涵着趋势演进的规律。只要是在一个相对自由的市场或者领域中,周期就是一种天道,其背后的经济学原理就是简单的趋利性和供需关系,这是自然界的一种属性&#xff0…

Python | Leetcode Python题解之第65题有效数字

题目: 题解: from enum import Enumclass Solution:def isNumber(self, s: str) -> bool:State Enum("State", ["STATE_INITIAL","STATE_INT_SIGN","STATE_INTEGER","STATE_POINT","STATE_…

TreeMap的底层源码分析

TreeMap是红黑二叉树的典型实现。我们打开TreeMap的源码&#xff0c;发现里面有一行核心代码&#xff1a; private transient Entry<K,V> root null; root用来存储整个树的根节点。我们继续跟踪Entry&#xff08;是TreeMap的内部类&#xff09;的代码&#xff1a; st…

Go怎么实现map并发安全的三种方式

1. 加锁 对整个map加上读写锁sync.RWMutex 优点&#xff1a;解决了问题。 缺点&#xff1a;锁粒度大。 2. 分片加锁 一个操作会导致整个map被锁住&#xff0c;导致性能降低。所以提出了分片思想&#xff0c;将一个map分成几个片&#xff0c;按片加锁。 第三方包实现&#x…

【Leetcode】63- 不同路径II

问题简述 一个机器人位于一个 m x n 网格的左上角 。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径&#xff1f; 网格中的障碍物和空位置分别用 1 和 0 来表示。 示例 1&#xff1…

Vue基础:为什么要学Vue3,Vue3相较于Vue2有那些优势?

为什么要学Vue3&#xff1f; 1.框架层面 1.响应式底层API的变化 Proxy 数组下标的修改 对象动态添加属性 解释说明&#xff1a;1.vue2采用的是Object.definePrototype&#xff0c;它每次只能对单个对象中的单个数据进行劫持&#xff0c;所以在Vue2中data()中的数据一多就要进行…

基础IO认识

回顾文件 我们之前认识文件只是在语言程度上理解&#xff0c;但是我们理解的不够彻底&#xff0c;要想真正理解文件要在os上理解。 简单代码认识 1 #include<stdio.h>2 int main(){3 FILE* fpfopen("log.txt","w");4 if(fpNULL){5 p…

leetcode_43.字符串相乘

43. 字符串相乘 题目描述&#xff1a;给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 &q…

蓝桥杯练习系统(算法训练)ALGO-951 预备爷的悲剧

资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 英语预备爷gzp是个逗(tu)比(hao)&#xff0c;为了在即将到来的英语的quiz中不挂科&#xff0c;gzp废寝忘食复习英语附录单词…

SpringBoot 基础简介

目录 1. SpringBoot 概述 1.1. 为什么会有springboot 1.1.1. 传统Spring 的两个缺点 1.1.2. Springboot 功能 2. SpringBoot 快速搭建 2.1. 创建Maven项目​编辑​编辑​编辑 2.2. 导入SpringBoot起步依赖 2.3. 定义controller 2.4. 添加引导类 2.5. 启动访问 3. Sprin…

Hardened Ubuntu 24.04 LTS发布

Ubuntu 24.04 有了LTS 版本&#xff0c;就是长期稳定支持版 侧重安全的增强加固版本Hardened Ubuntu 24.04 LTS也随之到来。 hardened Linux 自 2022 年推出以来&#xff0c;支持 amd64/x86_64 和 arm64 硬件架构&#xff0c;并提供 AWS 版本和 on-premise 版本&#xff0c;获…

使用node调用chrome(基于selenium-webdriver包)

下载测试版chrome和chromedriver https://googlechromelabs.github.io/chrome-for-testing/ 把chromedriver复制到chrome的文件里 设置环境变量 编写代码 const { Builder, Browser, By, Key, until } require(selenium-webdriver) const puppeteer require(puppeteer)//查…

Spring 如何解决 Bean 循环依赖

循环依赖解释 bean A 属性注入时依赖bean B &#xff0c;并且bean B属性注入时也依赖bean A &#xff0c;造成 bean A 和bean B 都无法完成初始化问题&#xff0c;形成了闭环。 注意 项目中存在Bean的循环依赖&#xff0c;是Bean对象职责划分不明确、代码质量不高的表现&#…

2024/5/2 英语每日一段

Enablers’ fate is inherently linked to adopters, which are their ultimate customers, after all. That dynamic won’t flip overnight, but adopters able to demonstrate progress on AI initiatives will increasingly get credit from investors in the form of high…

基于SSM的“一汽租车辆共享平台”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“一汽租车辆共享平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 租车界面 订单管理界面 财务报表界面 理赔界面 …

I/O体系结构和设备驱动程序

I/O体系结构 为了确保计算机能够正常工作&#xff0c;必须提供数据通路&#xff0c;让信息在连接到个人计算机的CPU、RAM和I/O设备之间流动。这些数据通路总称为总线&#xff0c;担当计算机内部主通信通道的作用。 所有计算机都拥有一条系统总线&#xff0c;它连接大部分内部…

Java | Leetcode Java题解之第63题不同路径II

题目&#xff1a; 题解&#xff1a; class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int n obstacleGrid.length, m obstacleGrid[0].length;int[] f new int[m];f[0] obstacleGrid[0][0] 0 ? 1 : 0;for (int i 0; i < n; i) {for (i…

二叉树的递归详解:以例题计算二叉树第k层为例

1.代码速览 1.1节点的构建 #include<iostream> using namespace std; class ListNode { public:friend void fun();friend int TreeKLevel(ListNode* root, int k);ListNode(int val):_val(val),leftnext(nullptr),rightnext(nullptr){} private:int _val 0;class Lis…