基于 Streamlit 构建的股票筛选分析工具,整合了 Tushare 接口获取股票数据,并通过交互式界面实现股票筛选、信息展示和 K 线图分析。以下是深度解读:


一、代码结构概览

  1. 依赖库导入

    import streamlit as st
    import tushare as ts
    import pandas as pd
    import plotly.graph_objects as go
    • Streamlit:用于构建 Web 应用界面。
    • Tushare:提供股票市场数据接口。
    • Pandas:数据处理和分析。
    • Plotly:生成交互式图表(如 K 线图)。
  2. Tushare API 配置

    ts.set_token("Your_API_Token_Here")
    pro = ts.pro_api()
    • 需替换为实际的 Tushare Token,否则无法获取数据。

二、核心功能模块分析

1. 获取股票基础信息(get_stock_list
@st.cache_data
def get_stock_list():# 获取股票基本信息(如代码、名称、行业、市值等)df = pro.stock_basic(list_status="L", fields="ts_code,symbol,name,area,industry,list_date")# 填充缺失值df["area"] = df["area"].fillna("Unknown")df["industry"] = df["industry"].fillna("Unknown")# 获取并处理市值数据market_cap_data = pro.daily_basic()market_cap_data["total_mv"] = market_cap_data["total_mv"] / 10000  # 转换为亿元# 合并数据集df = pd.merge(df, market_cap_data[["ts_code", "total_mv"]], on="ts_code", how="left")df = df.rename(columns={"total_mv": "market_cap"})return df
  • 功能:获取股票基础信息并合并市值数据。
  • 优化点
    • list_status="L" 表示只获取上市股票(非停牌)。
    • @st.cache_data 缓存数据,避免重复请求。
    • 市值数据转换为亿元(/10000)提高可读性。

2. 获取股票日线数据(get_daily_data
@st.cache_data
def get_daily_data(ts_code):data = pro.daily(ts_code=ts_code)data["trade_date"] = pd.to_datetime(data["trade_date"])return data.sort_values("trade_date")
  • 功能:根据股票代码获取日线数据(如开盘价、收盘价等)。
  • 优化点
    • @st.cache_data 缓存数据,提升性能。
    • 日期格式转换为 datetime 类型,便于后续筛选。

3. 主界面逻辑(main()
def main():st.title("股票筛选分析工具")# 侧边栏筛选min_market_cap = st.sidebar.number_input("最小市值(亿)", value=100)max_market_cap = st.sidebar.number_input("最大市值(亿)", value=1000)selected_industry = st.sidebar.multiselect("选择行业", stocks["industry"].unique())selected_area = st.sidebar.multiselect("选择地域", stocks["area"].unique())# 应用筛选条件filtered_stocks = stocks[(stocks["market_cap"] >= min_market_cap) & (stocks["market_cap"] <= max_market_cap)]if selected_industry: filtered_stocks = filtered_stocks[filtered_stocks["industry"].isin(selected_industry)]if selected_area: filtered_stocks = filtered_stocks[filtered_stocks["area"].isin(selected_area)]# 展示结果st.dataframe(filtered_stocks.sort_values(by="market_cap", ascending=False))
  • 功能:通过侧边栏提供筛选选项(市值、行业、地域),并展示符合条件的股票列表。
  • 交互亮点
    • 动态筛选:实时响应用户输入(无需刷新页面)。
    • 数据排序:按市值从高到低展示,便于用户快速定位。

4. 个股详情分析
if not filtered_stocks.empty:selected_stock = st.selectbox("选择股票查看详情", filtered_stocks["name"])start_date = st.date_input("开始日期", value=today - pd.Timedelta(days=365))end_date = st.date_input("结束日期", value=today)# 获取日线数据并绘制K线图stock_code = filtered_stocks[filtered_stocks["name"] == selected_stock]["ts_code"].values[0]daily_data = get_daily_data(stock_code)daily_data = daily_data[(daily_data["trade_date"] >= start_date) &(daily_data["trade_date"] <= end_date)]# 绘制K线图fig = go.Figure(data=[go.Candlestick(x=daily_data["trade_date"],open=daily_data["open"],high=daily_data["high"],low=daily_data["low"],close=daily_data["close"],increasing_line_color="green",decreasing_line_color="red",)])st.plotly_chart(fig, use_container_width=True)
  • 功能:选择某只股票后,展示其历史 K 线图。
  • 图表设计
    • 使用 Plotly 的 Candlestick 组件生成交互式 K 线图。
    • 颜色区分涨跌(涨:绿色,跌:红色)。
    • 用户可缩放/平移查看历史数据。

三、代码特征

  1. 交互式筛选与可视化

    • 通过 Streamlit 的组件(如 number_inputmultiselectselectbox)实现动态交互。
    • 实时响应:用户操作后,界面立即更新,无需手动刷新。
  2. 数据缓存优化

    • 使用 @st.cache_data 缓存股票列表和日线数据,减少 API 请求次数。
    • 适用于频繁访问的场景(如股票筛选)。
  3. 异常处理与用户体验

    • 缺失值处理:填充 area 和 industry 的缺失值为 "Unknown"。
    • 数据缺失提示:若 K 线数据缺失,提示用户并使用前值填充。
    • 空结果提示:若筛选条件不匹配,显示警告信息。

四、完整代码

import streamlit as st
import tushare as ts
import pandas as pd
import plotly.graph_objects as go
import sys
import os# 设置Tushare API(需替换为您的实际Token)
ts.set_token("Your_API_Token_Here")
pro = ts.pro_api()# 缓存股票基础数据
@st.cache_data
def get_stock_list():# 获取股票基本信息df = pro.stock_basic(exchange="", list_status="L", fields="ts_code,symbol,name,area,industry,list_date")# 处理缺失值df["area"] = df["area"].fillna("Unknown")df["industry"] = df["industry"].fillna("Unknown")# 获取并处理市值数据market_cap_data = pro.daily_basic()market_cap_data["total_mv"] = market_cap_data["total_mv"] / 10000  # 转换为亿元# 合并数据集df = pd.merge(df, market_cap_data[["ts_code", "total_mv"]], on="ts_code", how="left")df = df.rename(columns={"total_mv": "market_cap"})return df# 缓存股票日线数据
@st.cache_data
def get_daily_data(ts_code):data = pro.daily(ts_code=ts_code)data["trade_date"] = pd.to_datetime(data["trade_date"])return data.sort_values("trade_date")# 主应用界面
def main():st.title("股票筛选分析工具")# 侧边栏筛选选项st.sidebar.header("筛选条件")# 获取股票数据stocks = get_stock_list()# 市值范围筛选min_market_cap = st.sidebar.number_input("最小市值(亿)", min_value=0, value=100)max_market_cap = st.sidebar.number_input("最大市值(亿)", min_value=0, value=1000)# 行业筛选industry_list = stocks["industry"].unique().tolist()selected_industry = st.sidebar.multiselect("选择行业", industry_list)# 地域筛选area_list = stocks["area"].unique().tolist()selected_area = st.sidebar.multiselect("选择地域", area_list)# 应用筛选条件filtered_stocks = stocks[(stocks["market_cap"] >= min_market_cap) & (stocks["market_cap"] <= max_market_cap)]if selected_industry:filtered_stocks = filtered_stocks[filtered_stocks["industry"].isin(selected_industry)]if selected_area:filtered_stocks = filtered_stocks[filtered_stocks["area"].isin(selected_area)]# 格式化并展示结果display_df = filtered_stocks.copy()display_df["market_cap"] = display_df["market_cap"].round(2)st.dataframe(display_df.sort_values(by="market_cap", ascending=False))# 个股详情部分if not filtered_stocks.empty:st.subheader("个股详情分析")# 股票选择器selected_stock = st.selectbox("选择股票查看详情", filtered_stocks["name"])# 日期范围选择today = pd.Timestamp.today()col1, col2 = st.columns(2)with col1:start_date = st.date_input("开始日期", value=today - pd.Timedelta(days=365), max_value=today)with col2:end_date = st.date_input("结束日期", value=today, min_value=start_date, max_value=today)# 获取选定股票的日线数据stock_code = filtered_stocks[filtered_stocks["name"] == selected_stock]["ts_code"].values[0]daily_data = get_daily_data(stock_code)# 按日期范围筛选daily_data = daily_data[(daily_data["trade_date"] >= pd.Timestamp(start_date)) &(daily_data["trade_date"] <= pd.Timestamp(end_date))]# 处理缺失值if daily_data[["open", "high", "low", "close"]].isnull().values.any():st.warning("部分价格数据缺失 - 使用前值填充")daily_data[["open", "high", "low", "close"]] = daily_data[["open", "high", "low", "close"]].ffill()# 绘制K线图if not daily_data.empty:fig = go.Figure(data=[go.Candlestick(x=daily_data["trade_date"],open=daily_data["open"],high=daily_data["high"],low=daily_data["low"],close=daily_data["close"],increasing_line_color="green",decreasing_line_color="red",)])fig.update_layout(title=f"{selected_stock} K线图",xaxis_title="日期",yaxis_title="价格")st.plotly_chart(fig, use_container_width=True)else:st.warning("所选日期范围内无可用数据")else:st.warning("没有符合筛选条件的股票")if __name__ == "__main__":# 检查依赖是否安装try:import streamlitimport tushareimport pandasimport plotlymain()except ImportError as e:print(f"缺少依赖库: {e}")print("请执行以下命令安装依赖:")print("pip install streamlit tushare pandas plotly")

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

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

相关文章

网络安全威胁和防御措施

网络安全基础概念网络安全指保护网络系统及其数据免受未经授权的访问、破坏或泄露。涵盖硬件、软件、数据及服务的安全防护&#xff0c;涉及技术、管理和法律等多层面措施。常见网络安全威胁恶意软件&#xff1a;病毒、蠕虫、勒索软件等通过漏洞感染系统。网络钓鱼&#xff1a;…

Spring DeferredResult 实现长轮询

1、背景 在项目开发中&#xff0c;有一个流程性的方法执行&#xff0c;这个方法会调用各种方法&#xff0c;可能会导致时间比较长 &#xff0c;如果一直等待响应结果的话&#xff0c;可能会造成超时&#xff0c;如果直接使用异步的方式的话&#xff0c;前端无法知道整体流程什…

Python设计模式 - 桥接模式

定义 桥接模式是一种结构型设计模式&#xff0c;它的核心思想是将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。 结构抽象类&#xff08;Abstraction&#xff09;&#xff1a;定义抽象接口&#xff0c;持有实现部分的引用。具体抽象类&#xff08;Refined Abstracti…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 用户注册实现

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解用户注册实现 视频在线地址&#xff1a; …

华为7月23日机考真题

&#x1f4cc; 点击直达笔试专栏 &#x1f449;《大厂笔试突围》 &#x1f4bb; 春秋招笔试突围在线OJ 笔试突围OJ](bishipass.com) 03. 山峰观测站数据分析 问题描述 LYA是一名地理数据分析师&#xff0c;负责分析山峰观测站收集的海拔高度数据。观测站在一条直线上设置了…

图像分析学习笔记(4):机器学习图像特征与描述

图像分析学习笔记&#xff08;4&#xff09;&#xff1a;机器学习图像特征与描述深度学习基础深度学习技巧深度模型构建深度学习基础 深度学习概念&#xff1a;深度学习是机器学习的一个分支&#xff0c;它基于一系列算法&#xff0c;试图通过使用多个处理层建立数据的高级抽象…

锁付机器人,如何精准锁附革新新能源锂电装配效率

其实呢&#xff0c;随着科技的不断发展&#xff0c;新能源电池、智能制造、精密装配、工艺升级以及工业自动化这些领域都在飞速前进。新能源行业如今可是炙手可热&#xff0c;中国新能源行业进入快速发展阶段&#xff0c;就像一列高速行驶的火车&#xff0c;势不可挡。在这个过…

Vue项目开发注意事项(包含node/npm/cnpm等)

事项一&#xff1a;项目代码放在本地怎么运行起来 1、首先确定项目对应的node和npm版本 node下载地址 Index of /dist/https://nodejs.org/dist/ node 与 npm版本对应关系 Node.js — Node.js Releases 2、node卸载的时候&#xff0c;会自动把对应的npm卸载掉 情况1&…

GitHub:只支持 Git 作为唯一的版本库格式进行托管

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

秋招Day17 - Spring - MVC

Spring MVC有哪些核心组件&#xff1f;DispatcherServlet&#xff1a;前端控制器&#xff0c;所有HTTP请求首先经过它&#xff0c;分发请求到正确的处理器&#xff0c;并与其他组件协调。HandlerMapping&#xff1a;维护URL和处理器的映射关系Handler&#xff1a;处理器&#x…

使用mybatis实现模糊查询和精准查询切换的功能

1、首先在前端页面添加勾选框&#xff08;name设置为check&#xff09;2、mybatis代码当check勾选时&#xff0c;check不为null&#xff0c;走模糊查询like当check未勾选时&#xff0c;check为null&#xff0c;走精准查询 <if test"check ! null and check ! "&g…

Android模块化实现方案深度分析

模块化是现代 Android 开发应对项目复杂度激增、团队协作效率、编译速度瓶颈、功能复用与动态化等挑战的核心架构思想。其核心目标是高内聚、低耦合、可插拔、易维护。 一、模块化的核心价值与目标 降低复杂度&#xff1a; 将庞大单体应用拆分为独立、职责清晰的模块。加速编译…

网络基础16--VRRP技术

一、VRRP核心概念定义虚拟路由器冗余协议&#xff08;VRRP&#xff0c;Virtual Router Redundancy Protocol&#xff09;&#xff0c;可以将多个路由器加入到备份组中&#xff0c;形成一台虚拟路由器&#xff0c;承担网关功能。RFC 3768标准定义的VRRP是一种容错协议&#xff0…

最长公共前缀-leetcode

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1&#xff1a; 输入&#xff1a;strs [“flower”,“flow”,“flight”] 输出&#xff1a;“fl” 示例 2&#xff1a; 输入&#xff1a;strs [“dog”,“racecar”,…

vs2022:C++安装opencv

vs2022:C安装opencv https://opencv.org/releases/ 1.配置包含目录 2.配置库目录 3.配置连接器 4.配置环境变量 5.重新启动VS2015/VS2017 6.测试 1.配置包含目录 (头文件) 2.配置库目录&#xff08;dll存放的库目录&#xff09; 3.配置连接器(库) 4.配置环境变量 5.重新启动VS…

智联智造:国内新能源汽车品牌AGV小车无线控制系统创新实践

行业背景&#xff1a;智能制造浪潮下的通信刚需 在全球制造业智能化转型浪潮中&#xff0c;工业4.0技术已成为提升生产效率与产品质量的核心驱动力。国内某新能源汽车品牌作为智能制造的标杆企业&#xff0c;积极投身自动化设备与智能生产系统的革新。其中&#xff0c;无线控制…

QT6 源,七章对话框与多窗体(8) 消息对话框 QMessageBox :属性,信号函数,成员函数,以及静态成员函数,源代码带注释

&#xff08;1&#xff09;消息对话框里&#xff0c;分为通知消息&#xff0c;询问消息&#xff0c;提醒消息&#xff0c;错误消息。可以直接使用本类的静态函数&#xff0c;简单。但 QT 的官方说明里&#xff0c;建议使用动态成员函数组件的消息框&#xff0c;而非使用静态函数…

DAY 7|算法篇——栈与队列(及重温数组篇章有感)

今天本来应该写两道题把这一章节结束掉&#xff0c;奈何第二题前k个高频元素需要用的二叉树相关代码实在不会写&#xff08;倒是能看懂&#xff09;等我学完二叉树再把这道题亲自写一遍吧 今天工作量比较小&#xff0c;准备从第一天的任务开始把题目重新再做一遍 239. 滑动窗…

go语言基础与进阶

&#x1f680; Go语言终极高手之路&#xff1a;从基础到架构的终极指南 Go语言&#xff0c;以其简洁的语法、卓越的性能和原生的并发模型&#xff0c;席卷了云原生和后端开发领域。然而&#xff0c;要真正驾驭Go&#xff0c;仅仅停留在会写if-else和for循环是远远不够的。真正的…

Oracle数据恢复—Oracle数据库所在分区被删除后报错的数据恢复案例

Oracle数据库数据恢复环境&故障&#xff1a; 一台服务器上一个分区存放Oracle数据库数据。由于管理员误操作不小心删除了该分区&#xff0c;数据库报错&#xff0c;无法使用。 北亚企安数据恢复工程师到达现场后&#xff0c;将故障服务器中所有硬盘以只读方式进行完整镜像。…