python_寻找底部股票

news2024/10/6 8:31:04

目录

写在前面:

下面开始进入正文,正文很长,先概述要点步骤,以防迷路。

先看最终结果(当前价格为2023-07-10收盘价)

 1 下载股票基本信息、股票日数据

step one

 step two

2 从股票日数据中提取股票月数据

 3 从股票基本信息中提起股票代码和股票简称键值对

4 开始计算当前价格与历史最高价的纵向距离和横向距离


写在前面:

1 这里的底部是指距离历史最高价位置较远的股票,不能确定是底部,但可以暂时预设为底部去思考

2 “当前价格与历史最高价位置距离”在技术上怎么体现?我看网上有多种方式判断,本文取两个方法。

方法一:将历史最高价对折,再对折,再对折,。。。直到最靠近当前价格,对折次数越多表示距离越远

方法二:当前价格相当于历史最高价格的几分之几,就是(当前价格/历史最高价格)*100%,值越小表示距离越远

3 上面【2】中提到的“当前价格与历史最高价位置距离”本文定义为纵向距离;两个价格点位之间相隔的月份数文本定义为横向距离

4 本文提供的方法只是缩小寻找范围,并不代表着找出来的结果都有在可能的底部横盘

下面开始进入正文,正文很长,先概述要点步骤,以防迷路。

1 下载股票基本信息、股票日数据

2 从股票日数据中提取股票月数据

3 从股票基本信息中提起股票代码和股票简称键值对

4 开始计算当前价格与历史最高价的纵向距离和横向距离

先看最终结果(当前价格为2023-07-10收盘价)

最终结果字段说明

字段名说明
上市至今月份数股票上市时间越长,存在长时间底部横盘的可能性也比较大
最近一次最高价这里强调“最近”是考虑可能出现多个时间点出现相同最高价的情况,这种情况取距离现在最近的这次最高价
最高价对应的月份计算横向距离的起点位置
几折股票定义看前文“写在前面”。算式:最高价除以当前价格的结果取2的对数
当前价格相对最高价格百分比这个就容易理解了。算式:当前价格除以最高价乘以百分百

取结果中的“神州高铁”在同花顺中看下

 股票月线级别确实在底部横盘了一段时间

 1 下载股票基本信息、股票日数据

1)本文数据来自“优矿”,之所以选择优矿的数据,是优矿给的股票日数据字段很全,包括换手率、滚动PE等,这些字段在做其他研究时可以直接取用。

2)这里建议下载优矿的未复权日数据,如果直接下载前复权,意味着以后每回都得从上市时间下载,如果是未复权数据,后续只要做增量下载就可以。未复权数据中有一个accumAdjFactor字段,这个字段是累积前复权因子,要计算前复权数据只要将未复权数据乘以accumAdjFactor就可以得到前复权数据。

3)优矿使用手机号注册,每天可以免费下载30M的数据。

4)本文使用到的股票数据字段,日期、开盘价、收盘价、最高价、最低价,为前复权数据,大家使用其他来源的数据只要确保有这5个字段就可以。

step one

打开优矿,注册后登录。

点击“研究数据”

点击右侧“展开详情”,然后“复制代码”

进入“开始研究” ,新建Notebook,并进入新建的Notebook

将刚刚复制的代码黏贴进去,做一点小修改,这就是基础的python了,这里不赘述,代码处理好后,点击右上角“运行”,运行完毕后,进入左侧竖条菜单中的“数据” ,就可以看到刚刚运行生成的文件

这个文件玖可以下载了。

 股票日数据用以下这个代码,其余过程与上面获取股票基本数据一致,不再赘述。

注:由于优矿每天只能下载30M,每次生成的股票个数要控制下,超过30M没法下载

 step two

下载后的股票日数据是多个股票集中在一个文件里,为方便后续处理,最好一个股票的日数据单独存储一个文件。

python处理:pandas读入文件生成DataFrame,对secID进行分组,每组单独存储为一个文件

    # 000.csv是从优矿中下载的股票日数据文件
    file_path = r'D:/000.csv'
    # 用于存储单个股票日数据的目录
    save_dir = r'E:/results/'
    df = pd.read_csv(file_path,encoding='utf-8')
    df['tradeDate'] = pd.to_datetime(df['tradeDate'])
    df_group = df.groupby(by='secID')
    for name,group in df_group:
        ticker = name.split('.')[0]
        group.to_csv(save_dir+ticker+'.csv',encoding='utf-8')
        pass

分解完后,就是股票的日数据都存储在单一文件里

2 从股票日数据中提取股票月数据

月数据开盘价  等于 该月第一个交易日的开盘价

月数据收盘价  等于 该月最后一个交易的收盘价

月数据最高价  等于 该月所有交易日中的最高价

月数据最低价  等于 该月所有交易日中的最低价

python处理:pandas逐一读入日数据,逐一对每个股票进行月度抽样,月度抽样后其实就是对日数据按照月份进行分组,取每组最后一行的收盘价即为月数据收盘价,取每组第一行开盘价即为月数据开盘价,取该组最高价字段的最大值即为月数据最高价,取该组最低价字段的最小值即为月数据最低价。

    daily_path = r'E:/daily/'
    month_path = r'E:/month/'
    file_list = os.listdir(daily_path)
    for file_one in file_list:
        ticker = file_one.split('.')[0]
        print(ticker)
        file_path = daily_path + file_one
        df = pd.read_csv(file_path,encoding='utf-8')
        df = df.loc[df['openPrice']>0].copy()
        df['o_date'] = pd.to_datetime(df['tradeDate'])
        df['d_close'] = df['closePrice']*df['accumAdjFactor']
        df['d_open'] = df['openPrice']*df['accumAdjFactor']
        df['d_high'] = df['highestPrice']*df['accumAdjFactor']
        df['d_low'] = df['lowestPrice']*df['accumAdjFactor']
        month_group = df.resample('M',on='o_date')

        month_df = month_group.last()
        month_df['endDate'] = month_df.index.get_level_values('o_date')
        month_df['open'] = month_group.first()['d_open']
        month_df['low'] = month_group.min()['d_low']
        month_df['high'] = month_group.max()['d_high']
        month_df.rename(columns={'endDate':'date','d_close':'close'},inplace=True)

        month_df = month_df.loc[:,['date','close','open','high','low']].copy()
        month_df.to_csv(month_path + ticker + '.csv',encoding='utf-8')
    pass

执行完后,得到月度级别数据

 3 从股票基本信息中提起股票代码和股票简称键值对

这一步主要是为了好识别,毕竟股票代码都是数字没有股票简称直接。

    file_path = r'E:/stock_list.csv'
    df = pd.read_csv(file_path,encoding='utf-8')
    df = df.loc[df['listStatusCD']=='L'].copy()
    ticker_list = df['secID'].values.tolist()
    name_list = df['secShortName'].values.tolist()
    ticker_name_json = {}
    for i,item in enumerate(ticker_list):
        ticker00 = item.split('.')[0]
        name = name_list[i]
        ticker_name_json[ticker00] = name
    with open(r'E:/ticker_name.json','w',encoding='utf-8') as fw:
        json.dump(ticker_name_json,fw)

4 开始计算当前价格与历史最高价的纵向距离和横向距离

逐一对每个股票的月数据进行计算,然后将结果存储到一个excel文件中

    with open(r'E:/ticker_name.json','r',encoding='utf-8') as fr:
        ticker_name_map = json.load(fr)
    pre_dir = r'E:/month/'
    file_list = os.listdir(pre_dir)
    results_list = []
    for file_item in file_list:
        ticker = file_item.split('.')[0]
        if ticker_name_map.get(ticker) is None:
            continue
        print(ticker)
        name = ticker_name_map[ticker]
        df = pd.read_csv(pre_dir + file_item,encoding='utf-8')
        df = df.loc[:,['date','close','open','high','low']].copy()
        df.reset_index(inplace=True)
        df['i_row'] = range(len(df))
        month_number = len(df)
        start_month = df.iloc[0]['date']
        end_month = df.iloc[-1]['date']
        current_price = df.iloc[-1]['close']
        max_price = df['high'].max()
        df00 = df.loc[df['high']==max_price].copy()
        max_date = df00.iloc[-1]['date']
        zhe_number = math.log(max_price/current_price,2)
        zhe_number = round(zhe_number,4)
        baifenbi_number = round(current_price/max_price,4)*100
        max_row = df00.iloc[-1]['i_row']

        results_list.append({
            'ticker':ticker,
            'name':name,
            'month_number':month_number,
            'start_month':start_month,
            'end_month':end_month,
            'max_price':max_price,
            'max_month':max_date,
            'current_price':current_price,
            'zhe_number':zhe_number,
            'baifenbi_number':baifenbi_number,
            'dur_month_number':month_number-max_row
        })
        pass
    df_result = pd.DataFrame(results_list)
    df_result.to_excel(r'E:/zhe_r.xlsx',engine='openpyxl',encoding='utf-8')
    pass

得到的结果就可以根据自己的需要筛选,本文这里做了一个粗浅的筛选,将ST股票剔除,取纵向距离上对折次数大于等于2次的股票列表

    df = pd.read_excel(r'E:/zhe_r.xlsx',engine='openpyxl',converters={'ticker':str})
    df = df.loc[(df['name'].str.contains('ST')==False) & (df['zhe_number']>=2)].copy()
    df.to_excel(r'E:/zhe_r00.xlsx',engine='openpyxl')

这个结果就是前文展示的结果。

本文只是做了粗浅的筛选,如果要更进一步缩小范围,可以在现有基础上再精进,后续得闲再往下继续。

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

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

相关文章

优思学院|如何衡量六西格玛中解决方案的有效性?

当你遇到任何质量问题,不论你使用的PDCA或者是六西格玛DMAIC策略,(1) 你都需要测量当前绩效,(2) 分析其原因,以至其根本原因,(3) 进行方案的试行、假设检验来进行验证,这就是解问题的必须步骤。 除了假设检…

计网笔记--运输层(vital)

1--运输层概述 运输层的任务: 为运行在不同主机上的应用进程提供直接的通信服务; 运输层为应用层提供了两种不同的运输协议: 面向连接的 TCP 和无连接的 UDP 协议; 2--端口号、复用与分用的概念 端口号: 端口号用于区分…

交互式绘图程序(MFC) 绘图例子

交互式绘图程序(MFC) 绘图例子 如需要项目源码,可自行下载 交互式绘图程序(MFC)GandyDraw-MFC项目源码-C#文档类资源-CSDN文库https://download.csdn.net/download/m0_71122770/87982379

Django实现简单的音乐播放器 4

在原有音乐播放器功能基础上,增加上传音乐功能。 效果: 目录 配置上传路径 配置路由 视图处理歌曲 引入类库 保存歌曲文件 模板上传 设置菜单列表 设置菜单列表样式 脚本设置 上传效果 1.显示菜单列表 2.点击上传歌曲 3.上传完成 4.查看保…

Python批量读取csv(xlsx)文件指定表头获取内容(表头可乱序)

程序背景 我们在日常办公中经常会遇到去csv或者excel文件中去剪切自己需要的列,然后重新粘贴在新的文件中,但是这样的工作方式非常的耗时,且效率低下,那么是否有一种方法,只要我提供表头就可以快速将我需要的表头生成一…

刚刚出炉!速看7月编程语言排行榜!

2023年已经过半,最新一期的编程语言排行榜你看了吗?刚刚,全球知名编程语言社区TIOBE公布了7月榜单,和播妞一起来看吧! TIOBE 7 月 TOP 15 编程语言: 详细榜单可参考官网: https://www.tiobe.co…

超越廉价: 制造一种稀缺性,产品/服务本身具有一种不可复制、与众不同的特性。

文章目录 I 超越廉价1.1 培养自己的稀缺性1.2 为核心客户提供一些价值I 超越廉价 制造一种稀缺性,产品/服务本身具有一种不可复制、与众不同的特性。 时效性:具有时效性的东西天然具有不可复制的特性直播的时效性是重播不可替代的地方人的技能也是有时效性的,当满大街都是某…

最大正方形(力扣)暴力 + 动态规划 JAVA

在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。 示例 1: 输入:matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“…

陆航组训VR虚拟交互教学软件提高团队协作水平

出于陆航独特的空中环境,难以确保航空兵连队接受高质量的空中飞行训练,造成陆航连队无法保持良好的战备状态,随着VR虚拟现实技术越来越成熟,VR公司深圳华锐视点充分了解陆航训练教学的重点和难点,制作陆航训练VR教学课…

大模型技术发展概述 - (一)

文本内容参考论文《A Survey of Large Language Models》 论文标题:A Survey of Large Language Models 论文链接:https://arxiv.org/pdf/2303.18223v10.pdf 因为这个论文内容太多了,所以我的文章分成几篇来展示!目录如下&#x…

每日一练 | 华为认证真题练习Day76

1、标准STP模式下,下列非根交换机中的哪个端口会转发由根交换机产生的TC置位BPDU? A. 根端口 B. 备份端口 C. 预备端口 D. 指定端口 2、STP协议中根桥发出的配置BPDU报文中的Message Age为0。 A. 对 B. 错 3、STP中选举根端口时需要考虑以下哪些参…

若依官方前端手册 小笔记

提供确认窗体信息 this.$modal.confirm(确认信息).then(function() {... }).then(() > {... }).catch(() > {}); 提供遮罩层信息 // 打开遮罩层 this.$modal.loading("正在导出数据,请稍后...");// 关闭遮罩层 this.$modal.closeLoading(); 验证…

Android 进程与进程之间的通讯 详解及实现步骤 -- 两个app实现

详情如下: 一、Intent二、Messenger三、AIDL四、广播五、文件 分两个app -- 客户端为:jinc1application、服务端为:jinc2application 一、Intent 这是 Android 中最常用的通讯方式,主要用于启动 Activity、Service 等 jinc1applic…

校园网免认证/校园网pojie

我们的目标是xiao yuan wang pojie 我们使用一个简单的python脚本,用于jiechu /pojie校园网只能登录一台手机和一台电脑的限制,仅供学习。 原理 我们利用已有可正常上网的校园网账户作为跳板,连上网后在后台下线账号所登录的设备&#xff0…

CNVnator软件的安装

1. 下载CNVvator CNVvator软件比较难安装,其依赖root软件等 下载地址 点击其release,下载最新版本v0.4.1(CNVnator_v0.4.1.zip) 2. 安装依赖 root 软件 root 的下载地址 root , 选择下列Ubuntu 20版本 解压root压缩包: ##解压 tar -zxv…

pdf转图片操作方法是什么?分享两个简单的方法!

PDF转图片是一个常见的需求,无论是为了方便编辑、共享,还是为了其他用途,我们需要简单而有效的方法来实现这个目标。本文将介绍两种简单的PDF转图片方法:记灵在线工具和截图方法。 记灵在线工具是一个强大而易于使用的在线工具&a…

如何结合云原生和低代码

前言 云原生和低代码是当今IT领域最流行的两个概念。云原生是一种应用架构设计、应用部署乃至应用开发过程的方式,而低代码是一种快速开发应用的方法。这两者有什么关系?如何结合呢? 先思考一个问题——一个杯子和一个苹果如何结合&#xf…

七牛云的使用(图片超详讲解)

一、为什么要使用七牛云的OSS(对象存储服务)? 二、七牛云使用: 登录七牛云官网,注册并认证 (初次认证有30天免费使用权限)新建存储空间 点击创建的空间名字,进入 空间概括如下: 阅读帮助文档,在自己的…

JavaCV实现byte[]转RTMP流

需求:通过私有的api我可以不断收到byte[]形式的视频数据,现在我需要处理这些数据,最终推送出RTMP流。 实现:通过管道流将不断收到的byte[]视频数据转化为输入流然后提供给JavaCV的FFmpegFrameGrabber使用,然后通过FFmp…

两种传输层协议TCP和UDP【图解TCP/IP(笔记十二)】

文章目录 两种传输层协议TCP和UDPTCP与UDP区分UDP的特点及其目的TCP的特点及其目的 两种传输层协议TCP和UDP 在TCP/IP中能够实现传输层功能的、具有代表性的协议是TCP和UDP。 ■ TCP TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构,你可以把它想象成排…