当前位置: 首页 > news >正文

【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涨停分析基础上增加连板分析

相关文章:

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

周末,有读者加我, 说 之前的涨停分析 是否可以增加连板分析。 这个可以加上。 先看效果 这里附上完整代码: import streamlit as st import pywencai import pandas as pd from datetime import datetime, timedelta import plotly.graph_o…...

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(五)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(五) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…...

【LeetCode】3356、零数组变换 II

【LeetCode】3356、零数组变换 II 文章目录 一、数据结构-差分-一维差分、二分1.1 数据结构-差分-一维差分、二分1.1.1 题意复述1.1.2 思路1.1.3 手写二分1.1.4 sort.Search() 二分1.1.5 sort.Find() 二分 二、多语言解法 一、数据结构-差分-一维差分、二分 1.1 数据结构-差分…...

Vue 子组件修改父组件传过来的值的三种方式

方式1&#xff1a;子组件发送emit&#xff0c;触发父组件修改 父组件 <template><div><son :count"count" updateCount"updateCount" /></div> </template><script> import son from "./son"; export def…...

4.Python 数字类型

Python 数字类型总结 文章目录 Python 数字类型总结1. 数字类型概述特点 2. 数字类型的创建与赋值3. 数字类型转换4. 数学运算与函数math 模块cmath 模块 5. 随机数生成6. 三角函数7. 数学常量 总结 Python 提供了多种数字类型来存储和操作数值数据。这些类型包括整数、浮点数、…...

MacOs 日常故障排除troubleshooting

1. 关闭开机自启动 app X macOs 15.1 System settings -> General -> Login Items & Extensions->Open at Login -> Select app X and click -...

(补)算法刷题Day19:BM55 没有重复项数字的全排列

题目链接 给出一组数字&#xff0c;返回该组数字的所有排列 例如&#xff1a; [1,2,3]的所有排列如下 [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1]. &#xff08;以数字在数组中的位置靠前为优先级&#xff0c;按字典序排列输出。&#xff09; 思路&#xff1a; 使用回…...

golang中的值传递与引用传递,如何理解结构体的方法?

先从一个例子说起 type Counter struct {count int }func (c Counter) Inc() {c.count }func test1() {c : Counter{}do : func() {for i : 0; i < 10; i {c.count}fmt.Println("done")}go do()go do()time.Sleep(3 * time.Second)fmt.Println(c.count) }func te…...

linux部署ansible自动化运维

ansible自动化运维 1&#xff0c;编写ansible的仓库&#xff08;比赛已经安装&#xff0c;无需关注&#xff09; 1、虚拟机右击---设置---添加---CD/DVD驱动器---完成---确定 2、将ansible.iso的光盘连接上&#xff08;右下角呈绿色状态&#xff09; 3、查看光盘挂载信息 df -h…...

docker—私有仓库搭建

docker—私有仓库搭建 HTTP 部署 docker run -d \-p 5000:5000 \--restartalways \--name registry \-v /opt/data/registry:/var/lib/registry \registry:2使用官方的 registry​ 镜像来启动私有仓库。默认情况下&#xff0c;仓库会被创建在容器的 /var/lib/registry​ 目录…...

【SpringAOP】深入浅出SpringAOP从原理到源码

AOP对象是如何创建的 对于熟悉Spring IOC流程源码的同学来说&#xff0c;一定了解bean的整个生命周期&#xff0c;也就是从实例化、属性填充、初始化三个过程。那么对于Bean 工厂来说&#xff0c;是如何保证需要创建代理的对象创建代理的呢。 从图中可以看到&#xff0c;本质…...

Java 从查询超时到性能提升 (实战讲解)

目录 1. 问题所示2. 原理分析3. 解决方法3.1 代码优化3.2 索引优化3.3 删数据 1. 问题所示 查询返回速度慢&#xff0c;导致前端页面无数据显示 前端和后端均未报错&#xff0c;但后端未能在合理时间内返回结果到前端 后端没有报错日志 2. 原理分析 单独分析代码中的对算法…...

《C 语言携手 PaddlePaddle C++ API:开启深度学习开发新征程》

在深度学习领域&#xff0c;PaddlePaddle 作为一款强大的深度学习框架&#xff0c;为开发者提供了丰富的功能和高效的计算能力。而 C 语言&#xff0c;凭借其高效性和广泛的应用场景&#xff0c;与 PaddlePaddle 的 C API 相结合&#xff0c;能够为深度学习开发带来独特的优势。…...

Mysql之存储过程

MySQL 存储过程&#xff08;Stored Procedure&#xff09; 1. 概念 存储过程是一组预编译的 SQL 语句集合&#xff0c;可以通过调用名称来执行。存储过程可以接收参数&#xff0c;并支持复杂的业务逻辑&#xff08;如条件语句、循环、异常处理等&#xff09;。它们可以提高代…...

XV6 开发环境搭建

Step 1 搭建ubuntu 20.04 虚拟机 注意&#xff1a;一定要使用ubuntu 20.04&#xff0c;该版本可以直接通过deb安装gnu编译工具链。 安装完虚拟机后&#xff0c;换apt源。 ubuntu20.04镜像下载链接 设置root账户密码: sudo passwd root Step 2 下载解压qemu 5.1.0 wget ht…...

Windows 系统下 Python 环境安装

一、引言 Python 作为一种广泛应用的编程语言&#xff0c;在数据分析、人工智能等领域发挥着重要作用。本文将详细介绍在 Windows 系统上安装 Python 环境的步骤。 二、安装前准备 系统要求 Windows 7 及以上版本一般都能支持 Python。硬件方面&#xff0c;通常 2GB 内存、几…...

VMware Workstation的有线连接消失了

进入/var/lib目录下 cd /var/lib 查看是否存在NetworkManager 文件 ls 将其删除&#xff0c;然后虚拟机reboot一下。 sudo rm -r NetworkManager reboot 解决了&#xff0c;可以联网...

73页车企大数据平台规划与数据价值挖掘应用咨询项目方案解读

该项目旨在帮助乘用车公司规划大数据平台并提高数据挖掘应用水平&#xff0c;以满足业务部门对数据的需求&#xff0c;同时保证数据完整性和真实性。数据应用体系现状存在数据孤岛和数据关注维度不统一的问题&#xff0c;导致业务部门无法便捷使用数据并无法进行业务预测。大数…...

MIF格式详解,javascript加载导出 MIF文件示例

MIF 格式详解 MIF&#xff08;MapInfo Interchange Format&#xff09;是由Pitney Bowes Software开发的一种文本格式&#xff0c;用于存储地理空间数据。它通常与地图可视化和地理信息系统&#xff08;GIS&#xff09;相关联。MIF文件通常成对出现&#xff0c;一个.mif文件用…...

若依实现图片上传时自动添加水印

文章目录 总体思路1. 修改通用上传方法2. 去除文件路径前两级目录3. 添加水印方法运行效果总结 为了解决图盗用&#xff0c;并有效保护图片版权&#xff0c;若依项目需要实现一个功能&#xff1a;上传图片时&#xff0c;自动在图片上添加水印。这不仅可以有效防止盗用&#xff…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...