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路由查看 端口端口是怎样分配的知名端口动态端口 查看…

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

基数排序 基数排序&#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;已经成为…

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

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

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

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

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

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

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;这个过程可以变得简单…

复现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;客户端向服务端发送请…

Vue2 第九节 过滤器

&#xff08;1&#xff09;定义&#xff1a;对要显示的数据进行特定格式化后再显示 &#xff08;2&#xff09;语法&#xff1a; ① 注册过滤器 1&#xff09;Vue.filter(name, callback) 全局过滤器 2&#xff09; new Vue({filters:{}}) 局部过滤器 ② 使用过滤器 1&…

14. Spring AOP 的组成和实现

目录 1. Spring AOP 简介 2. AOP 的组成 2.1 切面&#xff08;Aspect&#xff09; 2.2 连接点&#xff08;Join Point&#xff09; 2.3 切点&#xff08;Pointcut&#xff09; 2.4 通知&#xff08;Advice&#xff09; 3. Spring AOP的实现 3.1 新建项目 3.2 添加 AOP …

Stable Doodle:Stability AI推出的一款零门槛AI绘画神器

Stable Doodle是由Stability AI推出的一款零门槛AI绘画神器&#xff0c;可以将简单的草图转化为精美的图像。它可以将随手的塗鴉草稿转化为高畫質的完成圖&#xff0c;让用户能够以更快的速度将想法转化为精美的艺术作品。Stable Doodle利用最新的Stable Diffusion模型&#xf…

C#实现读写CSV文件的方法详解

目录 CSV文件标准 文件示例RFC 4180简化标准读写CSV文件 使用CsvHelper使用自定义方法总结 项目中经常遇到CSV文件的读写需求&#xff0c;其中的难点主要是CSV文件的解析。本文会介绍CsvHelper、TextFieldParser、正则表达式三种解析CSV文件的方法&#xff0c;顺带也会介绍一…

框架的知识点整理

目录 1、什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; 2 、 使用Spring框架有什么好处&#xff1f; 3、Spring MVC 工作原理 1、什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; Spring框架是一个开源的轻量级的Java应用程序开…

x86架构ubuntu22下运行WILL模拟器dophin

0. 环境 i5实体机ubuntu22 1. 安装依赖 $ sudo apt install build-essential git cmake ffmpeg libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libevdev-dev libusb-1.0-0-dev libxrandr-dev libxi-dev libpangocairo-1.0-0 qt6-base-private-dev libblueto…

腾讯云—自动挂载云盘

腾讯云&#xff0c;稍微麻烦了点。 腾讯云服务器&#xff0c;镜像为opencloudos 8。 ### 1、挂载云盘bash #首先通过以下命令&#xff0c;能够看到新的数据盘&#xff0c;如果不能需要通过腾讯云控制台卸载后&#xff0c;重新挂载&#xff0c;并重启服务器。 fdisk -l#为 /dev…

BES2700 SDK绝对时间获取方法

1 代码 2 实验 log 需要换算下