【Python技术】同花顺wencai涨停分析基础上增加连板分析

周末,有读者加我, 说 之前的涨停分析 是否可以增加连板分析。 这个可以加上。

先看效果

这里附上完整代码:

import streamlit as st
import pywencai
import pandas as pd
from datetime import datetime, timedelta
import plotly.graph_objects as go
from chinese_calendar import is_workday, is_holiday# Setting up pandas display options
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.expand_frame_repr', False)
pd.set_option('display.max_colwidth', 100)def get_previous_trading_day(date):previous_date = date - timedelta(days=1)while not is_workday(previous_date) or is_holiday(previous_date):previous_date -= timedelta(days=1)return previous_datedef get_limit_up_data(date):param = f"{date.strftime('%Y%m%d')}涨停,成交金额排序"df = pywencai.get(query=param, sort_key='成交金额', sort_order='desc', loop=True)return dfdef analyze_continuous_limit_up(df, date):# 提取连续涨停天数列和涨停原因类别列continuous_days_col = f'连续涨停天数[{date.strftime("%Y%m%d")}]'reason_col = f'涨停原因类别[{date.strftime("%Y%m%d")}]'# 确保涨停原因类别列存在if reason_col not in df.columns:df[reason_col] = '未知'# 按连续涨停天数降序排序,然后按涨停原因类别排序df_sorted = df.sort_values([continuous_days_col, reason_col], ascending=[False, True])# 创建结果DataFrameresult = pd.DataFrame(columns=['连续涨停天数', '股票代码', '股票简称', '涨停原因类别'])# 遍历排序后的DataFrame,为每只股票创建一行for _, row in df_sorted.iterrows():new_row = pd.DataFrame({'连续涨停天数': [row[continuous_days_col]],'股票代码': [row['股票代码']],'股票简称': [row['股票简称']],'涨停原因类别': [row[reason_col]]})result = pd.concat([result, new_row], ignore_index=True)return resultdef get_concept_counts(df, date):concepts = df[f'涨停原因类别[{date.strftime("%Y%m%d")}]'].str.split('+').explode().reset_index(drop=True)concept_counts = concepts.value_counts().reset_index()concept_counts.columns = ['概念', '出现次数']return concept_countsdef calculate_promotion_rates(current_df, previous_df, current_date, previous_date):"""Calculate promotion rates between consecutive days"""current_days_col = f'连续涨停天数[{current_date.strftime("%Y%m%d")}]'previous_days_col = f'连续涨停天数[{previous_date.strftime("%Y%m%d")}]'promotion_data = []# Calculate for each level (from 1 to max consecutive days)max_days = max(current_df[current_days_col].max(), previous_df[previous_days_col].max())for days in range(1, int(max_days)):# Previous day count for current levelprev_count = len(previous_df[previous_df[previous_days_col] == days])# Current day count for next levelcurr_count = len(current_df[current_df[current_days_col] == days + 1])if prev_count > 0:promotion_rate = f"{curr_count}/{prev_count}={round(curr_count / prev_count * 100 if prev_count > 0 else 0)}%"else:promotion_rate = "N/A"# Get stocks that promotedpromoted_stocks = current_df[current_df[current_days_col] == days + 1][['股票简称', f'涨停原因类别[{current_date.strftime("%Y%m%d")}]']]promotion_data.append({'连板数': f"{days}板{days + 1}",'晋级率': promotion_rate,'股票列表': promoted_stocks})return pd.DataFrame(promotion_data)def app():st.title("A股涨停概念分析")# Date selectionmax_date = datetime.now().date()selected_date = st.date_input("选择分析日期", max_value=max_date, value=max_date)if not is_workday(selected_date) or is_holiday(selected_date):st.write("所选日期不是A股交易日,请选择其他日期。")returnprevious_date = get_previous_trading_day(selected_date)st.write(f"分析日期: {selected_date} 和 {previous_date} (前一交易日)")# Fetch data for both daysselected_df = get_limit_up_data(selected_date)previous_df = get_limit_up_data(previous_date)# Analyze continuous limit-up for both daysselected_continuous = analyze_continuous_limit_up(selected_df, selected_date)previous_continuous = analyze_continuous_limit_up(previous_df, previous_date)# Get concept counts for both daysselected_concepts = get_concept_counts(selected_df, selected_date)previous_concepts = get_concept_counts(previous_df, previous_date)# Merge concept countsmerged_concepts = pd.merge(selected_concepts, previous_concepts, on='概念', how='outer',suffixes=('_selected', '_previous'))merged_concepts = merged_concepts.fillna(0)# Calculate changemerged_concepts['变化'] = merged_concepts['出现次数_selected'] - merged_concepts['出现次数_previous']# Sort by '出现次数_selected' in descending ordersorted_concepts = merged_concepts.sort_values('出现次数_selected', ascending=False)# Display total limit-up stocks for both daysst.subheader("涨停股票数量变化")selected_total = len(selected_continuous)previous_total = len(previous_continuous)change = selected_total - previous_totalcol1, col2, col3 = st.columns(3)col1.metric("前一交易日涨停数", previous_total)col2.metric("选定日期涨停数", selected_total)col3.metric("变化", change, f"{change:+d}")# Display concept changesst.subheader("涨停概念变化")st.dataframe(sorted_concepts)# Create a bar chart for top 10 conceptstop_10_concepts = sorted_concepts.head(10)fig = go.Figure(data=[go.Bar(name='选定日期', x=top_10_concepts['概念'], y=top_10_concepts['出现次数_selected']),go.Bar(name='前一交易日', x=top_10_concepts['概念'], y=top_10_concepts['出现次数_previous'])])fig.update_layout(barmode='group', title='Top 10 涨停概念对比')st.plotly_chart(fig)# Display continuous limit-up analysisst.subheader("连续涨停天数分析")st.dataframe(selected_continuous)# Create a bar chart for continuous limit-up days distributioncontinuous_days_count = selected_continuous['连续涨停天数'].value_counts().sort_index()fig_continuous = go.Figure(data=[go.Bar(x=continuous_days_count.index, y=continuous_days_count.values)])fig_continuous.update_layout(title='连续涨停天数分布',xaxis_title='连续涨停天数',yaxis_title='股票数量',xaxis=dict(tickmode='linear'))st.plotly_chart(fig_continuous)# Display raw datast.subheader("选定日期涨停股票详情")st.dataframe(selected_df)st.subheader("连板晋级率分析")promotion_rates = calculate_promotion_rates(selected_df, previous_df, selected_date, previous_date)# Display promotion rates in a custom formatfor _, row in promotion_rates.iterrows():col1, col2 = st.columns([1, 3])with col1:st.write(f"**{row['连板数']}**")st.write(f"晋级率: {row['晋级率']}")with col2:if not row['股票列表'].empty:for _, stock in row['股票列表'].iterrows():concept = stock[f'涨停原因类别[{selected_date.strftime("%Y%m%d")}]']st.write(f"{stock['股票简称']} ({concept})")st.markdown("---")# Create visualization for promotion ratespromotion_rates_fig = go.Figure()# Extract numeric values from promotion ratesrates = []labels = []for _, row in promotion_rates.iterrows():if row['晋级率'] != 'N/A':rate = int(row['晋级率'].split('=')[1].replace('%', ''))rates.append(rate)labels.append(row['连板数'])promotion_rates_fig.add_trace(go.Bar(x=labels,y=rates,text=[f"{rate}%" for rate in rates],textposition='auto',))promotion_rates_fig.update_layout(title='连板晋级率分布',xaxis_title='连板数',yaxis_title='晋级率 (%)',yaxis_range=[0, 100])st.plotly_chart(promotion_rates_fig)if __name__ == "__main__":app()

在原来代码基础上增加了 根据连板天数排序, 每支个股的涨停原因分析。 这个我之前没加, 是因为我很少关注连续涨停股, 毕竟我不是龙头选手。
另外增加了连板晋级率, 比如1进2,2进3 可以分析涨停板晋级概率。对于龙头选手有一定的辅助效果。
另外交易日判断,我之前肤浅了,主要是脑子短路了。根据读者提醒,改为引入日历控件chinese_calendar的is_workday, is_holiday 判断工作日、节假日。

原文链接:

【Python技术】同花顺wencai涨停分析基础上增加连板分析

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

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

相关文章

小程序子组件调用父组件方法、父组件调用子组件方法

1、子组件调用父组件方法 子组件this.triggerEvent(finish); startShare(e) {let url config.apiUrl "/business/lzShare/edit";let data this.data.currentData;util.httpPut(url, data).then((res) > {this.triggerEvent(finish);console.log(res.result);})…

怎样使用Eclipse创建Maven的Java WEB 项目

文章目录 1、第一种方式(选择 archetype 方式) 1.1、第一步:创建项目1.2、第二步:配置jre1.3、第三步:配置tomcat1.4、第四步:设置为WEB3.11.5、第五步:配置Maven的编译级别 1.5.1、第一种方法…

C语言刷题

1. 题目描述 根据给出的三角形3条边a:b.c(a.b,c<100.000)&#xff0c;计算三角形的周长和面积。 输入描述: 一行&#xff0c;三角形3条边(能构成三角形)&#xff0c;中间用一个空格隔开. 输出描述: 一行&#xff0c;三角形周长和面积保留两位小数&#xff0c;中问用一个空…

C语言动态内存管理【进阶--5--】

文章目录 [toc] 动态内存管理一、作用即意义二、动态内存函数的介绍Ⅰ、malloc()函数、free()函数Ⅱ、calloc()函数Ⅲ、realloc()函数 三、常见的动态内存错误Ⅰ、对NULL指针的解引用操作Ⅱ、对动态开辟空间的越界访问Ⅲ、对非动态开辟的内存使用free释放Ⅳ、使用free释放动态开…

Python学习(三)—— 基础语法(下)

目录 一&#xff0c;函数 二&#xff0c;列表和元组 2.1 列表基础操作 2.2 切片 2.3 列表的增删查改 2.4 连接链表 2.5 元组 三&#xff0c;字典 3.1 关于字典 3.2 字典的增删查改操作 3.3 遍历字典元素 3.4 合法的key类型 四&#xff0c;文件操作 4.1 打开关闭…

【数据分享】2014-2024年我国POI兴趣点数据(免费获取/来源于OSM地图)

POI是Point of Interest的简称&#xff0c;意为“兴趣点”&#xff0c;是互联网电子地图中用于表示特定位置的地理实体的核心数据类型。POI通常用于标注具体地点&#xff0c;例如餐厅、商场、学校、医院、景点等。这些数据以点的形式呈现&#xff0c;并附带详细属性信息&#x…

执行python时报错SyntaxError: Non-UTF-8 code

执行python时报错SyntaxError: Non-UTF-8 code starting with ‘\xb4’ in file sqlite_insert.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details 通过对文件增加编码格式进行解决。 codingutf-8 codingutf-8 import sqlite…

三、前端学习——HTML表格创建与编辑

1 先看一段代码 css代码如下所示&#xff1a; /* 定义表格整体的宽度、边框样式和间距 */ table {width: 100%; /* 设置表格占据100%宽度 */border-collapse: collapse; /* 合并表格边框 */margin-top: 30px; /* 设置表格与上方元素的间距 */ }/* 定…

电子应用设计方案-52:智能电子相框系统方案设计

智能电子相框系统方案设计 一、引言 智能电子相框作为一种能够展示数字照片和多媒体内容的设备&#xff0c;为用户提供了便捷、个性化的照片展示方式。本方案旨在设计一款功能丰富、用户体验良好的智能电子相框系统。 二、系统概述 1. 系统目标 - 高质量显示照片和视频&#…

tomcat优化和动静分离

tomcat的优化和动静分离 tomcat的优化&#xff1a; 默认的安装情况下&#xff0c;tomcat经常会假死的情况 tomcat需要进行优化 优化的三个方面&#xff1a; 1、tomcat的配置优化2、操作系统的内核优化3、jvm调优 tomcat自身的优化&#xff1a; 8080&#xff1a;tomcat对外提供…

360quake导出工具

360Quake 查询工具 一个基于 PyQt6 开发的 360 Quake 网络空间测绘引擎查询工具&#xff0c;提供了简单直观的图形界面&#xff0c;支持多种数据导出格式。 功能特点 现代化的图形用户界面支持大规模数据查询&#xff08;最多100,000条结果&#xff09;实时查询进度显示多种…

东方通TongWeb替换Tomcat的踩坑记录

一、背景 由于信创需要&#xff0c;原来项目的用到的一些中间件、软件都要逐步替换为国产品牌&#xff0c;决定先从web容器入手&#xff0c;将Tomcat替换掉。在网上搜了一些资料&#xff0c;结合项目当前情况&#xff0c;考虑在金蝶AAS和东方通TongWeb里面选择&#xff0c;后又…

UE5中实现Billboard公告板渲染

公告板&#xff08;Billboard&#xff09;通常指永远面向摄像机的面片&#xff0c;游戏中许多技术都基于公告板&#xff0c;例如提示拾取图标、敌人血槽信息等&#xff0c;本文将使用UE5和材质节点制作一个公告板。 Gif效果&#xff1a; 网格效果&#xff1a; 1.思路 通过…

Cisco Packet Tarcer配置计网实验笔记

文章目录 概要整体架构流程网络设备互连基础拓扑图拓扑说明配置步骤 RIP/OSPF混合路由拓扑图拓扑说明配置步骤 BGP协议拓扑图拓扑说明配置步骤 ACL访问控制拓扑图拓扑说明配置步骤 HSRP冗余网关拓扑图拓扑说明配置步骤 小结 概要 一些环境配置笔记 整体架构流程 网络设备互连…

QTreeView 与 QTreeWidget 例子

1. 先举个例子 1班有3个学生&#xff1a;张三、李四、王五 4个学生属性&#xff1a;语文 数学 英语 性别。 语文 数学 英语使用QDoubleSpinBox* 编辑&#xff0c;范围为0到100,1位小数 性别使用QComboBox* 编辑&#xff0c;选项为&#xff1a;男、女 实现效果&#xff1a; 2…

渗透测试---wireshark(1)基本介绍与安装

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人与泷羽sec团队一律不承担一切后果 视频地址&#xff1a;泷羽---wiresh…

AI开发 - 用GPT写一个GPT应用的真实案例

就在昨天&#xff0c;我的同事推荐给我了一个第三方的公共大模型API&#xff0c;这个API集合了国际上上几乎所有知名的大模型&#xff0c;只需要很少的费用&#xff0c;就可以接入到这些大模型中并使用它们。成本之低&#xff0c;令人乍舌&#xff01;包括我们现在无法试用的 G…

搭建Tomcat(一)---SocketServerSocket

目录 引入1 引入2--socket 流程 Socket&#xff08;应用程序之间的通讯保障&#xff09; 网卡(计算机之间的通讯保障) 端口 端口号 实例 client端 解析 server端 解析 相关方法 问题1&#xff1a;ServerSocket和Socket有什么关系&#xff1f; ServerSocket Soc…

epoll反应堆模型

epoll反应堆模型 基于该视频所做笔记&#xff0c;视频里面讲的也挺难的&#xff0c;最好先让chat给你梳理一遍整体的代码再去看视频吧 15-epoll反应堆模型总述_bilibili_哔哩哔哩_bilibili 文章目录 epoll反应堆模型1.epoll反应堆模型概述2.具体讲解1.myevent_s结构体2.超时检…

探索自我成长的心理疗愈——读《蛤蟆先生去看心理医生》

《蛤蟆先生去看心理医生》以其强烈的代入感&#xff0c;让读者仿佛置身于故事之中&#xff0c;深刻体会到心理学的魅力。 读完此书后&#xff0c;我最大的收获是&#xff1a;“过去的种种磨难使你的人生体验更加丰富和深刻&#xff0c;因此新生活不会显得乏味。通过清晰地认识…