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

news2024/12/30 3:38:15

目录

写在前面:

需要考虑的几种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'] = 1
        df.loc[df['p1'] != 0, 'p2'] = 0
        df['p3'] = 0
        df.loc[(df['p2'] == 0) & (df['p2'].shift(-1) == 1), 'p3'] = 1

        df_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]
        pass
    else:
        # 谷值
        df['l0'] = df[y_col].cummin()
        df['l1'] = df['l0'] - df['l0'].shift(1)
        df['l2'] = 1
        df.loc[df['l1'] != 0, 'l2'] = 0
        df['l3'] = 0
        df.loc[(df['l2'] == 0) & (df['l2'].shift(-1) == 1), 'l3'] = 1

        df_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]
        pass
    pass

循环寻找峰谷方法

def circle_find(start_mark,i_start,pre_df,py_col,ly_col,x_col)->List:
    res_list = []
    i = i_start
    while True:
        if i<=0:
            break
        if 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]:
            break
        res_list.append(res_one)
        i = res_one[0]
        start_mark = not start_mark
        pass
    return 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_list
    h_list = df['h'].values.tolist()
    h_list.reverse()
    df['hr'] = h_list
    l_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')
        pass
    else:
        # 第一个
        res_list.append(p_first)
        res_list.append(l_first)
        # 峰开始
        res_list00 = circle_find(True, l_first[0], df, 'hr', 'lr', 'i_row_r')
        pass

    res_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.coloradmin.cn/o/817049.html

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

相关文章

C++继承特性(1)——含义与继承方式的讲解

目录 1.继承的含义 2.继承的定义&#xff1a; 3.继承方式 例子1&#xff1a;基类的访问限定符为public&#xff0c;两个派生类的继承方式分别为public、protected时&#xff1a; 例子2&#xff1a; 基类的访问限定符为protected&#xff0c;两个派生类的继承方式分别为pub…

软件测试工程师的职业规划,你都做好了吗?

第一阶段&#xff1a;初级测试工程师 一般刚刚入门&#xff0c;熟悉基本的测试流程&#xff0c;此时已打基础为主。入门薪资一般在6000-8000元之间。 具体工作是&#xff1a; &#xff08;1&#xff09; 按照测试方案和流程对产品进行功能测试&#xff0c;检查产品是否有缺陷…

Java读取及生成pb文件并转换jsonString

Java读取及生成pb文件并转换jsonString 1. 效果图2. 原理2.1 Protocol Buffers是什么2.2 支持的语言2.3 根据.proto生成.java2.4 初始化及构建pb&#xff0c;读取&#xff0c;转jsonString 3. 源码3.1 address.proto3.2 PbParseUtil.java 参考 读取pb及生成pb文件pb文件转换jso…

vue-cli4升级到vue-cli5的踩坑记录

前言 最近对部分项目升级了vue-cli脚手架&#xff0c;记录一下 问题一&#xff1a; scss/less/css中无法引入public下的静态资源 问题描述 在样式文件中使用静态资源路径导致编译无法通过 错误信息如下&#xff1a; Module not found: Error: Cant resolve /img/login/lo…

框架的知识点整理

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

MySQL主从复制及读写分离(三十四)

目录 MySQL主从复制 一、概述 1、MySQL Replication优点&#xff1a; 二、MySQL复制类型 1、异步复制&#xff08;Asynchronous repication&#xff09; 2、全同步复制&#xff08;Fully synchronous replication&#xff09; 3、半同步复制&#xff08;Semisynchronous…

【构造】CF1758 C

Problem - 1758C - Codeforces 题意&#xff1a; 思路&#xff1a; 思路&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn2e510; const int mxe2e510;int N,x; int ans[mxn];void solve(){cin>>N>>x;if(N%x!0)…

1999-2021年30省平均受教育年限(含原始数据和具体计算过程)

1999-2021年30省平均受教育年限&#xff08;含原始数据和具体计算过程&#xff09; 1、时间&#xff1a;1999-2021年 2、范围&#xff1a;30省&#xff08;剔除西藏&#xff09; 3、计算方式&#xff1a;平均受教育年限&#xff08;未上学人数*0小学人数*6初中人数*9高中人数…

2023年7月第4周大模型荟萃

2023年7月第4周大模型荟萃 2023.7.31版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、Cerebras推出全球最强AI超算 AI芯片初创公司Cerebras Systems和总部位于阿联酋的技术控股集团G42于7月20日宣布&#xff0c;携手打造一个由互联的超…

pytorch学习——正则化技术——权重衰减

一、概念介绍 权重衰减&#xff08;Weight Decay&#xff09;是一种常用的正则化技术&#xff0c;它通过在损失函数中添加一个惩罚项来限制模型的复杂度&#xff0c;从而防止过拟合。 在训练参数化机器学习模型时&#xff0c; 权重衰减&#xff08;weight decay&#xff09;是…

【JavaEE初阶】Servlet(四) Cookie Session

文章目录 1. Cookie && Session1.1 Cookie && Session1.2 Servlet会话管理操作 1. Cookie && Session 1.1 Cookie && Session Cookie是什么? Cookie是浏览器提供的持久化存储数据的机制.Cookie从哪里来? Cookie从服务器返回给浏览器. 服务…

生产中出现CPU或者内存飙升如何进行解决

文章目录 定位CPU标高内存问题JVM参数工具 定位CPU标高 方法1&#xff1a; 1-启动&#xff1a;java -jar 2_cpu-0.0.1-SNAPSHOT.jar 8 > log.file 2>&1 & 2-一般来说&#xff0c;应用服务器通常只部署了java应用&#xff0c;可以top一下先确认&#xff0c;是否是…

Java 错误异常介绍(Exceptions)

1、异常介绍 异常是程序执行期间发生的意外事件。它影响程序指令流&#xff0c;从而导致程序异常终止。 发生异常的原因有很多。其中包括&#xff1a; 无效的用户输入 设备故障 网络连接丢失 物理限制&#xff08;磁盘内存不足&#xff09; 代码错误 打开一个不可用的文…

第四章:C语言的条件分支控制结构

文章目录 1、分支控制if..else...2、分支控制if..else if...else...(嵌套)3、Switch4、goto 1、分支控制if…else… 标准格式&#xff1a;if{}else{} {}里面的语句表示条件是否成立再决定是否执行 2、分支控制if…else if…else…(嵌套) 标准格式&#xff1a;if{}else if{}…

无人机调试笔记——常见参数

无人机的PID调试以及速度相关参数 1、Multicopter Position Control主要是用来设置无人机的各种速度和位置参数。调试顺序是先调试内环PID&#xff0c;也就是无人机的速度闭环控制&#xff0c;确认没有问题后再进行外环位置控制&#xff0c;也就是定点模式控制。 2、调试的时…

CentOS7.3 安装 docker

亲测、截图 阿里云服务器 文章目录 更新源2345 启动开机自启 更新源 sudo yum update -y2 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo4 sudo yum …

一款介于无代码和低代码之间的数据可视化平台

一、前言 随着企业数字化拉开序幕&#xff0c;低代码( Low Code Development)开发的概念开始火起来&#xff0c;即用少量的代码就能开发复杂的业务系统。然后更进一步&#xff0c;由此又催生出一个新的概念&#xff1a;无代码开发( No Code Development)。 低代码和无代码开发平…

【C++从0到王者】第十四站:list基本使用及其介绍

文章目录 一、list基本介绍二、list基本使用1.尾插头插接口使用2.insert接口使用3.查找某个值所在的位置4.erase接口使用以及迭代器失效5.reverse6.sort7.merge8.unique9.remove11.splice 三、list基本使用完整代码 一、list基本介绍 如下所示&#xff0c;是库里面对list的基本…

自然语言处理学习笔记(一)————概论

目录 1.自然语言处理概念 2.自然语言与编程语言的比较 &#xff08;1&#xff09;词汇量&#xff1a; &#xff08;2&#xff09;结构化&#xff1a; &#xff08;3&#xff09;歧义性&#xff1a; &#xff08;4&#xff09;容错性&#xff1a; &#xff08;5&#xff0…

【143. 重排链表】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不…