python_在K线找出波段_02_找出波段

news2024/12/28 4:37:36

承接 【python_在K线找出波段_01_找出所有转折点】博文

地址:python_在K线找出波段_01_找出所有转折点_程序猿与金融与科技的博客-CSDN博客

目录

写在前面:

寻找波段的逻辑:

寻找方法

判断高低点连线是否有效 

判断方法:

判断点相对连线位置的方法:

代码:

计算一元一次方程a b值方法

定位下一个转折点方法

判断点相对连线位置方法

向左右两个方向反复寻找方法

主方法

运用并验证结果


写在前面:

在K线找出波段分两大步骤

步骤一:找出所有转折点

步骤二:找出波段

步骤一已经在【python_在K线找出波段_01_找出所有转折点】博文中表述,步骤二要在步骤一的基础上画出波段,由于波段的确认有很强的主观性,本文找波段只是提供一种方法,大家可以根据自己对波段的理解对代码进行修改。

寻找波段的逻辑:

寻找方法

1 在所有转折点中找出最高转折点

 2 以最高转折点为界线,向左向右寻找下一个转折点。向右寻找右边区域的最低转折点

3 以步骤2中找到的最低转折点为分界点,继续向右找最高转折点

4 。。。重复2、3步骤,直到寻找到K线的右边尽头

5 向左方向寻找与右边的逻辑一样

判断高低点连线是否有效 

如果找到的高低点连线如下图,那么该高低点的连线就无效,需要再往里拆分高低点

 所以,每次找到高低点,获得连线,需要有一个方法判断这个连线是否有效。

判断方法:

1 高低点连线,相当于一个一元一次方程 y=ax+b,得出这个方程的解

2 计算高低点区间所有转折点相对于高点低连线的分布,如果

1)大多数点都在线的附近,连线成立

2)大多数点都在线的一侧,连线成立

判断点相对连线位置的方法:

将点的x,y值代入一元一次方程

所有,ax+b-y > 0 的点在同一侧 ------------------------- (1)

所有,ax+b-y < 0 的点在同一侧 -------------------------  (2)

所有,|ax+b-y| 值很小的点,说明在连线附近 --------- (3)

分别计算 (1)(2)(3)占总体点数量的占比,从而得出所有点的分布情况

代码:

计算一元一次方程a b值方法

def caculate_a_b(x1,y1,x2,y2)->tuple:
    a = (y2 - y1) / (x2 - x1)
    b = y2 - a * x2
    return a,b

定位下一个转折点方法

def caculate_limit_point(pre_df,mark,contain_lr_yeah=True)->tuple:
    if contain_lr_yeah:
        df = pre_df.copy()
    else:
        df = pre_df.iloc[1:-1].copy()
    # mark为True =>找最大值
    if mark:
        y = df['y'].max()
        x = df.loc[df['y']==y].iloc[0]['x']
        pass
    else:
        y = df['y'].min()
        x = df.loc[df['y']==y].iloc[0]['x']
        pass
    return x,y

判断点相对连线位置方法

def check_point_location(pre_df,x0,y0,x1,y1):
    # “大多数点”量化
    one_size = 0.7
    # “在线段附近”量化
    near_line = 0.1
    a,b = caculate_a_b(x0,y0,x1,y1)
    if x0>x1:
        df = pre_df.loc[(pre_df['x']>=x1) & (pre_df['x']<=x0)].copy()
    else:
        df = pre_df.loc[(pre_df['x']<=x1) & (pre_df['x']>=x0)].copy()
        pass
    df['ext'] = a*df['x']+b-df['y']
    total_num = len(df)
    bigger_num = len(df.loc[df['ext']>=0])
    smaller_num = len(df.loc[df['ext']<=0])
    if float(bigger_num/total_num)>=one_size or float(smaller_num/total_num)>=one_size:
        return True
    else:
        # 是否大多数点都在线段附近
        angle_line = math.fabs(df.iloc[0]['y']-df.iloc[-1]['y'])
        df['ext00'] = df['ext'].abs()
        df['ext01'] = df['ext00']/angle_line
        ok_num = len(df.loc[df['ext01']<=near_line])
        if float(ok_num/total_num)>=one_size:
            return True
        else:
            # 刨除附件的点,远的点分布是否符合大多数在同一边
            df['ext02'] = 0
            df.loc[(df['ext01']>near_line) & (df['ext']>0),'ext02'] = 2
            df.loc[(df['ext01']>near_line) & (df['ext']<0),'ext02'] = 3
            bigger_num00 = len(df.loc[df['ext02']==2])
            smaller_num00 = len(df.loc[df['ext02']==3])
            total_num00 = bigger_num00 + smaller_num00
            if float(bigger_num00 / total_num00) >= one_size or float(smaller_num00 / total_num00) >= one_size:
                return True
            else:
                return False
        pass
    pass

向左右两个方向反复寻找方法

def find_band_by_max_min(pre_df,contain_lr_yeah=True):
    final_list = []
    waitting_list = []
    df = pre_df.copy()
    right_end_x = df.iloc[0]['x']
    left_end_x = df.iloc[-1]['x']
    # 找到最大值
    first_x_max,first_y_max = caculate_limit_point(df,True,contain_lr_yeah)
    # 向左开始找
    left_x0 = first_x_max
    left_y0 = first_y_max
    left_mark = False
    while True:
        if left_x0 <= left_end_x:
            break
        pre_left_df = df.loc[df['x']<=left_x0].copy()
        left_x1, left_y1 = caculate_limit_point(pre_left_df, left_mark)

        # print('left',left_x0,left_y0,left_x1,left_y1)

        res_left = check_point_location(pre_left_df,left_x0,left_y0,left_x1,left_y1)
        if res_left:
            final_list.append([[left_x0,left_y0],[left_x1,left_y1]])
            left_x0 = left_x1
            left_y0 = left_y1
            left_mark = not left_mark
            pass
        else:
            waitting_list.append([[left_x0, left_y0], [left_x1, left_y1]])
            left_x0 = left_x1
            left_y0 = left_y1
            left_mark = not left_mark
            pass
        pass
    # 向右开始找
    right_x0 = first_x_max
    right_y0 = first_y_max
    right_mark = False
    while True:
        if right_x0 >= right_end_x:
            break
        pre_right_df = df.loc[df['x']>=right_x0].copy()
        right_x1, right_y1 = caculate_limit_point(pre_right_df, right_mark)

        # print('right',right_x0,right_y0,right_x1,right_y1)

        res_right = check_point_location(pre_right_df, right_x0, right_y0, right_x1, right_y1)
        if res_right:
            final_list.append([[right_x0, right_y0], [right_x1, right_y1]])
            right_x0 = right_x1
            right_y0 = right_y1
            right_mark = not right_mark
            pass
        else:
            waitting_list.append([[right_x0, right_y0], [right_x1, right_y1]])
            right_x0 = right_x1
            right_y0 = right_y1
            right_mark = not right_mark
            pass
        pass

    return final_list,waitting_list

主方法

def enter_main_two(pre_df):
    df = pre_df.copy()
    whole_final_list = []
    whole_waitting_list = []
    final_list,waiting_list = find_band_by_max_min(df)
    whole_final_list.extend(final_list)
    whole_waitting_list.extend(waiting_list)
    if whole_waitting_list:
        while True:
            if not whole_waitting_list:
                break
            one_w = whole_waitting_list.pop()
            x0 = one_w[0][0]
            x1 = one_w[1][0]
            if x0>x1:
                w_df = df.loc[(df['x']>=x1) & (df['x']<=x0)].copy()
            else:
                w_df = df.loc[(df['x'] <= x1) & (df['x'] >= x0)].copy()
                pass
            one_final_list,one_waitting_list = find_band_by_max_min(w_df,False)
            whole_final_list.extend(one_final_list)
            whole_waitting_list.extend(one_waitting_list)
    return whole_final_list

运用并验证结果

 

 

 

 

 

 

 

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

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

相关文章

画图干货!14种uml图类型及示例

1. 什么是 UML UML 是统一建模语言的缩写。UML 图是基于 UML&#xff08;统一建模语言&#xff09;的图表&#xff0c;目的是直观地表示系统及其主要参与者、角色、动作、工件或类&#xff0c;以便更好地理解、更改、维护或记录信息关于系统。简而言之&#xff0c;UML 是一种…

项目经理必备-项目总体计划模板-制式文件,可直接填写使用-公司可用

合同中完整项目名称&#xff0c;黑体&#xff0c;28号字&#xff0c; 居中对齐&#xff0c;项目名称较长时换行填写 当前文档名称&#xff0c;黑体&#xff0c;小初&#xff0c; 居中对齐&#xff0c;文档名称较长时 换行填写 版 本 号 x.x 编制人 日期 20xx年xx月xx日…

【css】css实现一个简单的按钮

四种链接状态分别是&#xff1a; a:link - 正常的&#xff0c;未访问的链接a:visited - 用户访问过的链接a:hover - 用户将鼠标悬停在链接上时a:active - 链接被点击时 <style> a:link, a:visited {//未访问、访问过background-color: #07c160;//设置背景颜色color: wh…

吉客云·奇门对接打通金蝶云星空销售单查询接口与销售出库新增接口

吉客云奇门对接打通金蝶云星空销售单查询接口与销售出库新增接口 对接系统&#xff1a;吉客云奇门 “吉客云”是一站式企业数字化解决方案系统&#xff0c;可实现业务、财务、办公、人事等一体化管理。相对于传统多套软件系统的集成方案&#xff0c;“吉客云”具有业务流程更流…

Vue3描述列表(Descriptions)

&#x1f601; 整体功能效果与 ant design vue 保持高度一致 &#x1f601; 包含两种组件&#xff1a;Descriptions 和 DescriptionsItem&#xff08;必须搭配使用&#xff01;&#xff09; APIs Descriptions 参数说明类型默认值必传title描述列表的标题&#xff0c;显示在…

Dos 命令简介

DOS 简介 DOS是Disk Operating System的缩写&#xff0c;即“磁盘操作系统”。DOS主要是一种面向磁盘的系统软件&#xff0c;有了DOS&#xff0c;我们就可以更容易理解怎么给机器下命令&#xff0c;不必去深入了解机器的硬件结构&#xff0c;也不必去死记硬背那些枯燥2进制数字…

图论-简明导读

计算机图论是计算机科学中的一个重要分支&#xff0c;它主要研究图的性质和结构&#xff0c;以及如何在计算机上有效地存储、处理和操作这些图。本文将总结计算机图论的核心知识点。 一、基本概念 计算机图论中的基本概念包括图、节点、边等。图是由节点和边构成的数据结构&am…

二叉树进阶版(C)

文章目录 1.树1.1概念1.2相关定义1.3 表示&#xff08;左孩子右兄弟&#xff09; 2.二叉树2.1概念2.2特殊的二叉树1. 满二叉树&#xff1a;2. 完全二叉树&#xff1a; 2.3二叉树的性质2.4练习 3.二叉树的存储结构1. 顺序存储2. 链式存储 4.完全二叉树的代码实现4.1堆的介绍1.堆…

静态路由下一跳地址怎么确定(基本静态路由配置实验步骤)

什么是静态路由&#xff1f;静态路由是路由的一种方式&#xff0c;路由项由手动配置&#xff0c;而非动态决定。与动态路由不同&#xff0c;静态路由是固定的&#xff0c;不会改变&#xff0c;即使网络状况已经改变或是重新被组态。一般来说&#xff0c;静态路由是由网络管理员…

MySQL做分布式锁

分布式锁mysql实现方式 方式1&#xff1a;唯一索引 创建锁表&#xff0c;内部存在字段表示资源名及资源描述&#xff0c;同一资源名使用数据库唯一性限制。多个进程同时往数据库锁表中写入对某个资源的占有记录&#xff0c;当某个进程成功写入时则表示其获取锁成功其他进程由于…

iOS——Block two

Block 的实质究竟是什么呢&#xff1f;类型&#xff1f;变量&#xff1f;还是什么黑科技&#xff1f; Blocks 是 带有局部变量的匿名函数 Blocks 由 OC 转 C 源码方法 在项目中添加 blocks.m 文件&#xff0c;并写好 block 的相关代码。打开「终端」&#xff0c;执行 cd XX…

Windows 使用 Linux 子系统,轻轻松松安装多个linux

Windows Subsystem for Linux WSL 简称WSL,是一个在Windows 10\11上能够运行原生Linux二进制可执行文件&#xff08;ELF格式&#xff09;的兼容层。它是由微软与Canonical公司合作开发&#xff0c;其目标是使纯正的Ubuntu、Debian等映像能下载和解压到用户的本地计算机&#…

【计算机网络】NAT及Bridge介绍

OSI七层模型 七层模型介绍及举例 为通过网络将人类可读信息通过网络从一台设备传输到另一台设备&#xff0c;必须在发送设备沿 OSI 模型的七层结构向下传输数据&#xff0c;然后在接收端沿七层结构向上传输数据。 数据在 OSI 模型中如何流动 库珀先生想给帕尔梅女士发一封电…

Vue + el-upload阿里云文件上传进度条功能,阿里云文件上传切片进度条功能实现,el-upload文件上传真实进度条

el-upload阿里云文件上传进度条功能&#xff0c;进度条切片功能&#xff0c;做一个记录&#xff0c;此功能查询过其他文档&#xff0c;最终都还是实现不了&#xff08;这是真实进度条&#xff0c;就是根据文件上传过程中文件切片实现的&#xff09; 效果&#xff1a; <t…

电脑黑屏按什么键恢复?掌握这3个按键,轻松解决!

“电脑怎么会突然就黑屏呢&#xff1f;我看综艺看得好好的莫名其妙电脑就黑屏了&#xff0c;怎么按都没有用。电脑黑屏应该怎么解决呢&#xff1f;大佬快帮帮我&#xff01;” 对于电脑黑屏的问题&#xff0c;很多小伙伴应该都不陌生吧。在实际使用电脑的操作中&#xff0c;或许…

干货 | 三款民宿App会员评测,你都用过吗?

为了留存用户&#xff0c;许多旅游住宿类APP都开通了会员权益&#xff0c;对老用户来说&#xff0c;会员等级的提升会为他们带来更多的权益及优惠&#xff0c;那么问题来了&#xff0c;到底哪家的会员优惠更多呢&#xff1f; 根据第三方统计的下载数据来看&#xff0c;APP STO…

云计算与大数据领域新指南 | 《揭秘云计算与大数据》助您驾驭数字化浪潮!

日前&#xff0c;《揭秘云计算与大数据》正式上市。这本由国际知名的技术专家撰写的书籍&#xff0c;将带领读者深入了解云计算和大数据领域的技术前沿和应用趋势&#xff0c;为读者呈现一个全面而深入的视角。 随着信息技术的飞速发展&#xff0c;云计算和大数据作为两大前沿…

iOS——Block回调

先跟着我实现最简单的 Block 回调传参的使用&#xff0c;如果你能举一反三&#xff0c;基本上可以满足了 OC 中的开发需求。已经实现的同学可以跳到下一节。 首先解释一下我们例子要实现什么功能&#xff08;其实是烂大街又最形象的例子&#xff09;&#xff1a; 有两个视图控…

自问自答----WEB篇

目录 1、https和http协议的端口 2、http协议的版本 3、linux中查看报文的方法 3.1 curl www.baidu.com -v 3.2 wget --debug www.baidu.com 4、http有哪些请求方法 5、http的请求头 6、http响应头​编辑 7、状态码有哪些 8、uri和url 9、静态&#xff1f;动态&#x…

第九章 HL7 架构和可用工具 - 查看批量消息

文章目录 第九章 HL7 架构和可用工具 - 查看批量消息查看批量消息Class类有关 HL7 消息类别的详细信息TypeCategoryName 第九章 HL7 架构和可用工具 - 查看批量消息 查看批量消息 如果消息是一组批处理格式的 HL7 消息&#xff0c;而不是单个 HL7 消息&#xff0c;则 HL7 文档…