python_在K线找出波段_01_找出所有转折点

目录

写在前面:

需要考虑的几种K线图情况:

 寻找所有转折点逻辑:

代码:

寻找转折点方法:找到第一个转折点就返回

循环寻找峰谷方法

主方法

调用计算:

返回:

在【PyQt5开发验证K线视觉想法工具V1.0】中查看效果


写在前面:

我们一般看K线图时通过视觉判断波段具有很强的主观性,所以通过代码找到的波段并不能满足所有人的需求。大家有自己特定波段述求的,可以自行修改代码。

寻找波段分两大步骤,本篇文章是第一步骤——寻找所有的转折点,即所有的峰值和谷值,也可以理解为所有的高点和低点。

需要考虑的几种K线图情况:

1 巨大宽幅波动

2 窄幅波动

3 极窄幅横盘

4 缓慢下跌

5 缓慢上升

PS:下面找了大致的K线图

 

 

 

 

 寻找所有转折点逻辑:

1 时间区间取今年年内的日K线

2 从最近的时间往前寻找,从K线图看就是从最右端向左边开始寻找

3 从右到左,遇到凸起点记录为峰(高点),遇到凹点记录为谷(低点),直到K线走完

4 代码逻辑上,使用pandas的cummax()寻找峰,cummin()寻找谷

5 循环交替寻找,找峰后找谷,再找峰再找谷。。。,每找到第一个峰或谷就返回,下回从上一次返回的点开始寻找

代码:

寻找转折点方法:找到第一个转折点就返回

def caculate_turning_point(pre_df,start_x,y_col,x_col,mark):'''计算转折点:param pre_df: 要计算的数据:param start_x: 起点:param y_col: y的列名:param x_col: x的列名:param mark:True=峰 False=谷:return: 第一个转折点 [x_val,y_val,mark]'''df = pre_df.loc[pre_df[x_col]<start_x].copy()if mark:# 峰值df['p0'] = df[y_col].cummax()df['p1'] = df['p0'] - df['p0'].shift(1)df['p2'] = 1df.loc[df['p1'] != 0, 'p2'] = 0df['p3'] = 0df.loc[(df['p2'] == 0) & (df['p2'].shift(-1) == 1), 'p3'] = 1df_p = df.loc[df['p3']==1].copy()if len(df_p)<=0:return [None,None,mark]else:p_i = df_p.iloc[0][x_col]p_y = df_p.iloc[0][y_col]return [p_i,p_y,mark]passelse:# 谷值df['l0'] = df[y_col].cummin()df['l1'] = df['l0'] - df['l0'].shift(1)df['l2'] = 1df.loc[df['l1'] != 0, 'l2'] = 0df['l3'] = 0df.loc[(df['l2'] == 0) & (df['l2'].shift(-1) == 1), 'l3'] = 1df_l = df.loc[df['l3'] == 1].copy()if len(df_l) <= 0:return [None, None, mark]else:l_i = df_l.iloc[0][x_col]l_y = df_l.iloc[0][y_col]return [l_i, l_y, mark]passpass

循环寻找峰谷方法

def circle_find(start_mark,i_start,pre_df,py_col,ly_col,x_col)->List:res_list = []i = i_startwhile True:if i<=0:breakif start_mark:# 峰值res_one = caculate_turning_point(pre_df,i,py_col,x_col,start_mark)else:# 谷值res_one = caculate_turning_point(pre_df,i,ly_col,x_col,start_mark)if not res_one[0]:breakres_list.append(res_one)i = res_one[0]start_mark = not start_markpassreturn res_list

主方法

def enter_main(daily_file_path,start_date,end_date):# 1 截取要计算的时间区间对应的日数据df = pd.read_csv(daily_file_path,encoding='utf-8')df['o_date'] = pd.to_datetime(df['tradeDate'])df = df.loc[(df['o_date']>=start_date) & (df['o_date']<=end_date)].copy()df = df.loc[df['openPrice']>0].copy()df['o'] = df['openPrice'] * df['accumAdjFactor']df['c'] = df['closePrice'] * df['accumAdjFactor']df['h'] = df['highestPrice'] * df['accumAdjFactor']df['l'] = df['lowestPrice'] * df['accumAdjFactor']df = df.loc[:,['tradeDate','o','c','h','l']].copy()# 2 逆序,并设置索引字段df['i_row'] = [i for i in range(len(df))]i_row_list = df['i_row'].values.tolist()i_row_list.reverse()df['i_row_r'] = i_row_listh_list = df['h'].values.tolist()h_list.reverse()df['hr'] = h_listl_list = df['l'].values.tolist()l_list.reverse()df['lr'] = l_list# 3 从最新日期往前寻找所有转折点,即所有的峰谷值res_list = []i_len = len(i_row_list)p_first = caculate_turning_point(df,i_len,'hr','i_row_r',True)l_first = caculate_turning_point(df,i_len,'lr','i_row_r',False)if p_first[0]<l_first[0]:# 第一个res_list.append(l_first)res_list.append(p_first)# 谷开始res_list00 = circle_find(False, p_first[0], df, 'hr', 'lr', 'i_row_r')passelse:# 第一个res_list.append(p_first)res_list.append(l_first)# 峰开始res_list00 = circle_find(True, l_first[0], df, 'hr', 'lr', 'i_row_r')passres_list.extend(res_list00)df_pv = pd.DataFrame(columns=['x','y','mark'],data=res_list)return df_pv.loc[:,['x','y']].values.tolist()

调用计算:

if __name__ == '__main__':file_path = r'D:/600959.csv'res = enter_main(file_path,'2023-01-01','2023-07-31')print(res)

返回:

[[132.0, 3.43], [132.0, 3.36], [131.0, 3.43], [130.0, 3.34], [127.0, 3.41], [126.0, 3.28], [124.0, 3.39], [122.0, 3.24], [118.0, 3.4], [115.0, 3.26], [107.0, 3.85], [106.0, 3.68], [105.0, 3.76], [102.0, 3.59], [100.0, 3.75], [96.0, 3.35], [95.0, 3.46], [94.0, 3.34], [93.0, 3.45], [92.0, 3.36], [88.0, 3.72], [87.0, 3.6], [81.0, 4.37], [76.0, 3.45], [73.0, 3.73], [72.0, 3.39], [71.0, 3.53], [69.0, 3.38], [66.0, 3.59], [64.0, 3.32], [63.0, 3.4], [62.0, 3.31], [60.0, 3.51], [58.0, 3.28], [55.0, 3.41], [53.0, 3.31], [51.0, 3.37], [50.0, 3.25], [49.0, 3.31], [47.0, 3.19], [45.0, 3.27], [44.0, 3.15], [42.0, 3.25], [41.0, 3.16], [39.0, 3.27], [34.0, 3.06], [32.0, 3.13], [31.0, 3.1], [30.0, 3.16], [28.0, 3.07], [27.0, 3.2], [26.0, 3.08], [25.0, 3.14], [24.0, 3.09], [23.0, 3.15], [22.0, 3.06], [21.0, 3.12], [19.0, 3.04], [18.0, 3.08], [15.0, 2.99], [14.0, 3.04], [12.0, 2.94], [11.0, 2.98], [10.0, 2.93], [9.0, 3.0], [7.0, 2.91], [5.0, 3.01], [4.0, 2.95], [2.0, 3.05]]

在【PyQt5开发验证K线视觉想法工具V1.0】中查看效果

 

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

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

相关文章

数字图像处理(番外)图像增强

图像增强 图像增强的方法是通过一定手段对原图像附加一些信息或变换数据&#xff0c;有选择地突出图像中感兴趣的特征或者抑制(掩盖)图像中某些不需要的特征&#xff0c;使图像与视觉响应特性相匹配。 图像对比度 图像对比度计算方式如下&#xff1a; C ∑ δ δ ( i , j …

7 网络通信(上)

文章目录 网络通信概述ip地址ip的作用ip地址的分类私有ip 掩码和广播地址 linux 命令&#xff08;ping ifconfig&#xff09;查看或配置网卡信息&#xff1a;ifconfig(widows 用ipconfig)测试远程主机连通性&#xff1a;ping路由查看 端口端口是怎样分配的知名端口动态端口 查看…

合宙Air724UG LuatOS-Air script lib API--log

Table of Contents log _log(level, tag, …) (local函数 无法被外部调用) log.trace(tag, …) log.debug(tag, …) log.info(tag, …) log.warn(tag, …) log.error(tag, …) log.fatal(tag, …) log.openTrace(v, uartid, baudrate) log 模块功能&#xff1a;系统日志记录,分…

【数据结构与算法】基数排序

基数排序 基数排序&#xff08;Radix Sort&#xff09;属于“分配式排序”&#xff0c;又称“桶子法”或 bin sort&#xff0c;顾名思义&#xff0c;它是通过键值的各个位的值&#xff0c;将要排序的元素分配至某些“桶”中&#xff0c;达到排序的作用。基数排序法是属于稳定性…

【C++】开源:Boost网络库Asio配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Asio网络库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次…

信息安全战线左移!智能网联汽车安全亟需“治未病”

当汽车由典型的工业机械产品逐步发展成为全新的智能移动终端&#xff0c;汽车的安全边界发生了根本性改变&#xff0c;信息安全风险和挑战不断增加。 面对复杂的异构网络、异构系统及车规级特异性要求&#xff0c;智能智能网联汽车信息安全到底要如何防护&#xff0c;已经成为…

qml中,在ListView中添加滚轮无法展现最后几行数据的问题解决

这个是我困扰我数几个小时的问题&#xff0c;好不容易知道了如何在LIstView中添加滚轮&#xff0c;然而&#xff0c;当我鼠标滚轮到最后的时候&#xff0c;展现的总不是最后那几行数据&#xff0c;这真的很让人头大&#xff0c;还好有了这次经历&#xff0c;把这个问题记录下来…

八大排序算法--选择排序(动图理解)

选择排序 算法思路 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 选择排序的步骤&#xff1a; 1>首先在未排序序列中找到最小&#xff08;大&#xff09;元素…

Redis五大基础类型解析

1.String类型 特征&#xff1a;即存储字符串的类型&#xff0c;单个字符串存储量最大不超过512MB 常用业务场景&#xff1a;⽤来存储JSON序列化之后对象 底层编码&#xff1a; int编码 数据结构特点&#xff1a;ptr指针直接指向字符串常量池中对应字符串地址&#xff0c;而…

基于vue+uniapp微信小程序公司企业后勤服务(设备)系统

本系统分为用户和管理员两个角色&#xff0c;其中用户可以注册登陆系统&#xff0c;查看公司公告&#xff0c;查看设备&#xff0c;设备入库&#xff0c;查看通讯录&#xff0c;会议室预约&#xff0c;申请出入&#xff0c;申请请假等功能。管理员可以对员工信息&#xff0c;会…

从 0 到 1!得物如何打造通用大模型训练和推理平台

1.背景 近期&#xff0c;GPT 大模型的发布给自然语言处理&#xff08;NLP&#xff09;领域带来了令人震撼的体验。随着这一事件的发生&#xff0c;一系列开源大模型也迅速崛起。依据一些评估机构的评估&#xff0c;这些开源模型大模型的表现也相当不错。一些大模型的评测情况可…

std vector 用法

使用vector&#xff0c;需添加头文件#include&#xff0c;要使用sort或find&#xff0c;则需要添加头文件#include。函数封装在命名空间std中&#xff0c;使用&#xff1a;using namespace std; 1、vector的初始化 std::vector<int> nVec;    // 空对象 std::vecto…

【Eigen 1】Eigen中的norm、normalize、normalized三者对比

一、norm() 1. 对于Vector&#xff0c;norm返回的是向量的二范数 即: ∣ ∣ x ∣ ∣ 2 ∑ i 1 N x i 2 ||x||_2 \sqrt{\sum_{i1}^{N} {x}^{2}_{i} } ∣∣x∣∣2​i1∑N​xi2​ ​ Vector2d vec(3.0,4.0); cout << vec.norm() << endl; /输出52. 对于Matrix&…

redis常见面试汇总

目录 Redis 适合的场景 Redis 不适合的场景 3、Redis 有哪些常见的功能&#xff1f; 什么是缓存穿透&#xff1f;怎么解决&#xff1f; 什么是缓存雪崩&#xff1f;该如何解决&#xff1f; 参考文献&#xff1a; Redis 适合的场景 缓存&#xff1a;减轻 MySQL 的查询压力…

matlab多线程,parfor循环进度,matlab互斥锁

一. 内容简介 matlab多线程&#xff0c;parfor循环进度&#xff0c;matlab互斥锁 二. 软件环境 2.1 matlab 2022b 2.2代码链接 https://gitee.com/JJW_1601897441/csdn 三.主要流程 3.1 matlab多线程 有好几种&#xff0c;最简单的&#xff0c;最好理解的就是parfor&am…

不可错过的家装服务预约小程序商城开发指南

在当今社会&#xff0c;家装行业发展迅速&#xff0c;越来越多的人开始寻求专业的家装预约和咨询服务。对于不懂技术的新手来说&#xff0c;创建一个自己的家装预约咨询平台可能听起来很困难&#xff0c;但实际上通过一些第三方制作平台和工具&#xff0c;这个过程可以变得简单…

ARM 循环阻塞延迟函数

串行驱动的关键是双方能够按照既定的时序进行检测、设置相关引脚上的电平&#xff0c;比如单总线、I2c这样基本的可以用GPIO模拟的时序协议&#xff0c;需要主从双方&#xff0c;必须在链路接口内严格按照微妙级的延迟单位进行时序同步。 所以&#xff0c;在这种对时间要求很敏…

C++引用

1 引用的基本使用 作用&#xff1a; 给变量起别名 语法&#xff1a; 数据类型 &别名 原名 示例&#xff1a; int main() {int a 10;int &b a;cout << "a " << a << endl;cout << "b " << b << endl;…

复现YOLOv5改进最新MPDIoU:有效和准确的边界盒回归的损失,打败G/E/CIoU,效果明显!!!

MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression 论文简介MPDIoU核心设计思路论文方法实验部分加入YOLOv5代码论文地址:https://arxiv.org/pdf/2307.07662.pdf 论文简介 边界盒回归(Bounding box regression, BBR)广泛应用于目标检测和实例分割,是目标…

Django使用WebSocket

1、websocket 相关 实现一个系统&#xff0c;20 个用户同时打开网站&#xff0c;呈现出来一个群聊界面 解决方案 轮询&#xff1a;让浏览器每隔2s向后台发送一次请求&#xff0c;缺点&#xff1a;延迟&#xff0c;请求太多网站压力大 长轮询&#xff1a;客户端向服务端发送请…