tick数据合成k线的完整过程(含源代码)

news2024/11/25 8:22:27

tick数据合成k线的完整过程(含源代码)

      • 写在前面
      • tick 数据的选择
        • 行情结构体字段
        • tick 行情示例
      • 批量合成1分钟k线方式
      • 增量合成1分钟k线方式
      • k线分钟级别扩展
      • 源码获取方式

写在前面

码上君量化互助社群已建立,所有源码免费对社群成员开放,如有需要请查看社群介绍文章,里面有加入社群的方式。

社群介绍:码上君量化互助社群介绍

公众号-码上助君(可跳转)
感兴趣的关注下公众号,优先发布,接收后续的更新内容会更及时奥


本文主要分享 tick 数据合成 k线 的完整过程,这样我们的策略就可以在此 k 线的基础上,计算各种技术指标(如ema、atr、kdj、macd等等)。

tick 数据的选择

国内股票行情是3秒一个切片,期货是1秒推送两个切片,由于期货行情是免费且无需登录验证,方便获取,所以选择期货行情数据进行k线合成。

在前面的文章中分享过期货行情订阅的代码,主要是以下回调函数:
在这里插入图片描述

相关链接:CTP-API开发系列之九:行情登录及订阅代码

行情结构体字段

在这里插入图片描述

行情结构体里面的字段比较多,大部分是没有用的,在行情回调函数中我们仅保存部分需要用到的字段,最主要的就是合约代码InstrumentID、更新时间UpdateTime、最新价LastPrice、累计成交量Volume、累计成交额Turnover

def OnRtnDepthMarketData(self, pDepthMarketData: 'CThostFtdcDepthMarketDataField') -> "void":
	# Volume 成交量
	if pDepthMarketData.Volume == 0:
		return
	md = f"{pDepthMarketData.TradingDay},{pDepthMarketData.UpdateTime},{pDepthMarketData.UpdateMillisec},{pDepthMarketData.InstrumentID}," \
         f"{pDepthMarketData.LastPrice},{pDepthMarketData.BidPrice1},{pDepthMarketData.BidVolume1},{pDepthMarketData.AskPrice1}," \
         f"{pDepthMarketData.AskVolume1},{pDepthMarketData.Volume},{pDepthMarketData.Turnover}"
	log_md.info(md)
tick 行情示例

先以读取文件的方式,将所有的tick数据保存到 DataFrame 中

f = open('./logs/md_20240925085557.csv')

titles = ['date', 'time', 'mill', 'id', 'last_price', 'bid_price1', 'bid_volume1', 'ask_price1', 'ask_volume1', 'volume', 'turnover']
datas = []

for one in f.readlines():
    d = one.replace(' ', '').split('INFO:')[1].split('[')[0].split(',')
    datas.append(d)
    result = dict(zip(titles, d))

df = pd.DataFrame(datas, columns=titles)
print(df)

这里面有部分数据是非交易时间的,期货的交易日是从夜盘开始的,所以也会看到部分夜盘的最后一笔行情,需要在合成的时候进行特殊处理。

这里订阅的期货全是市场的主力合约,为了展示方便,后面仅以螺纹钢rb2501合约为例进行合成:

data = df.loc[df['id'] == 'rb2501']
print(data)

在这里插入图片描述

批量合成1分钟k线方式

time的格式 HH:MM:SS,合成1分钟k线,我们先按照time字段取 HH:MM,将相同时分内的数据,第一条记录的last_price记为open,最后一条记录的last_price记为close,最大一条记录的last_price记为high,最小一条记录的last_price记为low

每一条记录的成交量增量、成交额增量都是减去上一条记录对应的数值,相同时分内的增量进行累加记为volume、turnover

data['last_price'] = data['last_price'].astype(float)
data['volume'] = data['volume'].astype(float)
data['turnover'] = data['turnover'].astype(float)

data['volume_change'] = data['volume'] - data['volume'].shift(1)
data['turnover_change'] = data['turnover'] - data['turnover'].shift(1)
data['minute'] = data['time'].str[0:5]

minute_grouped = data.groupby('minute')

df = pd.DataFrame()
df['open'] = minute_grouped.first()['last_price']
df['high'] = minute_grouped.max()['last_price']
df['low'] = minute_grouped.min()['last_price']
df['close'] = minute_grouped.last()['last_price']
df['volume'] = minute_grouped.agg({'volume_change': 'sum'})
df['turnover'] = minute_grouped.agg({'turnover_change': 'sum'})
print(df)

在这里插入图片描述

下图是某商业软件的截图,我们取09:02的k线进行对比,可以发现与我们合成的数据09:01这条数据是一致的,也就是说09:01这一分钟内的数据,最终形成的k线时间是下一分钟的时间
在这里插入图片描述

df['tmp_minute'] = df.index.tolist()
df['new_minute'] = df['tmp_minute'].shift(-1)
df = df.drop('tmp_minute', axis=1)
df.dropna(inplace=True)
df.rename(columns={'new_minute': 'minute'}, inplace=True)
df.set_index('minute', inplace=True)

df = df[1:-1]
print(df)

我们继续优化后,可以发现跟上图是一致的
在这里插入图片描述

在这里插入图片描述

增量合成1分钟k线方式

上面的合成k线的方式,是批量处理的,在实际的策略中,我们更需要的是一种增量合成的方式

来一条tick数据,进行一次合成,当1根k线完全合成后(HH:MM发生改变),再将合成的k线推送给相应的策略使用。

我们用一个函数实现该功能:
在这里插入图片描述

同时,我们还可以非常方便的进行各类指标的计算
在这里插入图片描述

添加到1min线队列的末尾 的位置的时候,就代表一根新的k线已经合成,此时可以推送需要的策略模块。

k线分钟级别扩展

以 rb2501 数据为例,我们从 27002 条tick数据,最终合成了 227 条1分钟级别的数据。

1分钟级别的数据对于绝大多数策略已经足够使用了,有了1分钟数据作为基础,在进行5分钟、10分钟、30分钟、1小时等级别的数据就更简单了,大家可以自行扩展。

源码获取方式

码上君量化互助社群已建立,所有源码免费对社群成员开放,包括文章的示例tick数据文件,如有需要请查看社群介绍文章,里面有加入社群的方式。

社群介绍:码上君量化互助社群介绍

公众号-码上助君(可跳转)
感兴趣的关注下公众号,优先发布,接收后续的更新内容会更及时奥

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

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

相关文章

鹏哥C语言自定义笔记重点(79-)

79.动态内存管理 80.使用动态内存管理的常见问题 对5的问题修改: 内存泄露的第一种可能: 第二种可能: 81.下面程序可能出现的问题 解决问题的两种方法: 82. 都是会造成野指针 83.p里面的内容不能进入Test 84.内存泄露问题 85.野指针问题:malloc创建的空间销毁了,但…

关于ad 的焊盘自动排序功能说明

你是不是想,不想手动一个一个改焊盘的号数,真的很累,对吧 那么下来看看,关于这个的用法的说明 比如我要改这个红色框中的焊盘的序号,那么我们就先框选好,来到右边的栏目,看到红色圈出的地方&am…

算法工程师重生之第二十二天(递增子序列 全排列 全排列 II 重新安排行程 N皇后 解数独 总结 )

参考文献 代码随想录 一、非递减子序列 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素,如出现两个整数相等,也可以视作…

数据结构(7.4_3)——B+树

B树的定义: B树的查找: 查找成功时: 查找失败时: B树和B树的比较 总结:

AI写作工具大比拼:揭秘Claude的神秘魅力以及如何订阅Claude

AI写作困境与Claude的惊喜表现 最近有很多朋友在吐槽AI写的文章不太行,我一看他的要求写的很清楚,已经把提示词都用到位了,例如:写作背景、写作要求等,都有具体写出来。但文章阅读起来就是欠缺点啥。 你们有没有遇到…

基于LORA的一主多从监测系统_前言

第一章、前言 最近想用手头的东西做一个小项目,也算是一个共用框架,这个框架可以做很多东西,比如基于lora的智慧农场,基于lora的智慧牧场,基于lora的智慧城市,智慧矿井等。 这个项目我对他的定位是可以用…

用java编写飞机大战

游戏界面使用JFrame和JPanel构建。背景图通过BG类绘制。英雄机和敌机在界面上显示并移动。子弹从英雄机发射并在屏幕上移动。游戏有四种状态:READY、RUNNING、PAUSE、GAMEOVER。状态通过鼠标点击进行切换:点击开始游戏(从READY变为RUNNING&am…

RL_足球教练

文章目录 前言什么是 Agent?定义Agent的组成部分Agent的目标 什么是 End-to-End Approach?定义特点优势与挑战示例 Fuzzy Bayesian Reinforcement Learning (RB-RL)系统组成部分系统工作原理 贝叶斯方法基础_条件概率定义 贝叶斯定理示例敏感性 Q-learning强化学习算法Q-lear…

java代理模式(动态代理、静态代理、需要实现类的JDK代理、不需要实现类的JDK动态代理、CGLIB代理)

静态代理简单使用 静态代理是代理模式的一种实现方式,它在编译时就已经确定了被代理对象和代理对象的关系。在静态代理中,需要手动创建一个代理类,该代理类与被代理对象实现相同的接口或继承相同的父类,并在代理类的方法中调用被…

什么是 JavaScript 的数组空槽

JavaScript 中的数组空槽一直是一个非常有趣且颇具争议的话题。我们可能对它的实际意义、历史以及现今的新版本中对它的处理方式有所疑问。数组空槽的存在最早可以追溯到 JavaScript 的诞生之初,当时的设计决定让它成为了现代 JavaScript 开发中的一种特别的现象。 …

Linux网络编程 -- 网络基础

本文主要介绍网络的一些基础概念,不涉及具体的操作原理,旨在构建对网络的基础认识。 1、网络的早期发展历程 20世纪50年代 在这一时期,计算机主机非常昂贵,而通信线路和设备相对便宜。为了共享计算机主机资源和进行信息的综合处…

[运维]6.github 本地powershell登录及设置ssh连接

当我在本地的git hub 进行修改后,需要推送到远程github仓库。 当我运行了git add . git commit -m "ingress-controller image" 以后,运行git push origin main,发现由于网络原因无法连接到远程github仓库。 此时开始设置ssh连…

【IC验证】基于systemverilog(UVM)断言

断言 0.注意1.作用2.分类3.断言的语法4.基本组成5.实现断言6.常见断言方法7.APB的断言7.1APB的时序7.2 断言的检查7.4 断言覆盖率的统计...未完待续 0.注意 在sequence序列、property属性和断言语句中都可以触发事件,但是建议在property中定义; 1.作用…

机器学习西瓜书笔记(十四) 第十四章概率图模型

第十四章 概率图模型14.1 隐马尔可夫模型14.1.1 小结 14.2 马尔可夫随机场小结 14.3 条件随机场14.3.1 小结 14.4 学习与推断14.4.1 变量消去14.4.2 信念传播小结 14.5 近似推断14.5.1 MCMC采样14.5.2 变分推断小结 14.6 话题模型14.6.1 小结 总结 概率图模型 14.1 隐马尔可夫…

模型漫谈:图神经网络(GNN)是什么样的存在

文章大纲: 从生活中的例子谈图与图神经网络 什么是图神经网络?它如何起源? 图神经网络的基本原理和原则 图神经网络的应用方向:以环境科学为例 公众号推荐 在现代科技迅速发展的今天,许多看似复杂的概念其实都有…

安全运营中心 (SOC) 团队对其安全工具感到失望

Vectra AI 表示,安全运营中心 (SOC) 从业人员认为,由于太多孤立的工具和缺乏准确的攻击信号,他们在检测和确定真实威胁的优先级方面正在失败。 人们对供应商的不信任感日益加深,认为供应商的工具在发现真正的攻击方面起的阻碍作用…

基于Rational Rose 做的UML图

因为要写软件工程的实验报告,但是老师讲的完全听不懂。so 看的b站上面的 UML视频(古董),记个笔记,完全图一乐。 目录 用例图: 类图 类和类之间的关系: 继承(泛化 Generalization) 实现(Interface&…

随机链表的复制OJ

目录 前言1.随机链表的复制1.1 思路1.2 代码 总结 前言 这道题可谓是链表的试金石,涉及到链表的插入、删除,对代码能力是很大的考验。而且思路也很巧妙,很有价值的一道题。 1.随机链表的复制 138.随机链表的复制 1.1 思路 这个题目很难整…

哈希闭散列的实现与机制

目录 哈希的介绍 哈希冲突 原因 影响 解决方法 实例 哈希函数 哈希函数设计原则: 常见哈希函数 闭散列 线性探测的实现 代码解读 1. 命名空间和枚举定义 2. 哈希表节点结构体 3. 哈希函数模板 4. 哈希表类 5. 插入、查找和删除逻辑 二次探测 哈希的…

头歌 | 获取最多金币

题目描述 有一个 N x N 的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。 输入输出格式 输入格式 第一行有一个整数 N。 之后 N 行有 N 个整数&…