4S选股指标自定义修改工具,可视化调整营收,ROE筛选阀值。

📅 2026/6/21 21:52:12
4S选股指标自定义修改工具,可视化调整营收,ROE筛选阀值。
实际应用场景描述在量化投资研究中策略的有效性高度依赖于参数的选取。以“4S选股法”或任何基于基本面的选股策略为例研究员或投资者通常需要通过历史数据回测来找到最优的筛选阈值如“营业收入同比增长率 15%”或“ROE 10%”。传统的做法是硬编码阈值每次调整都需要修改代码并重新运行效率低下且缺乏直观性。本工具旨在解决这一问题提供一个可视化的、交互式的参数调优界面让用户可以通过拖动滑块实时调整筛选条件并立即查看符合条件的股票数量变化从而快速锁定合理的参数区间。引入痛点1. 代码门槛高非专业程序员如金融分析师难以通过修改代码行来调整复杂的SQL或Pandas筛选条件。2. 调试效率低修改一个阈值如将ROE从10%调到12%需要修改代码、保存、重新运行脚本、等待结果循环往复耗时耗力。3. 缺乏直观反馈无法实时感知参数微调对“幸存者数量”的影响难以判断筛选条件是过严还是过宽。核心逻辑讲解本工具的核心逻辑基于 Streamlit 的交互式组件 与 Pandas 的数据过滤 能力1. 数据层使用pandas 加载包含股票基本面数据的 CSV 文件如营业收入、ROE、市盈率等。2. 交互层利用streamlit 的slider滑块组件将原本硬编码的阈值如roe_threshold 0.1暴露给用户。3. 响应层一旦用户拖动滑块Streamlit 会重新运行脚本此时筛选逻辑会使用最新的滑块数值通过df.query() 或布尔索引过滤数据。4. 可视化利用matplotlib 或streamlit 自带的图表功能展示筛选后的结果分布如直方图或直接在表格中展示明细。代码模块化实现1. 环境准备 (requirements.txt)streamlit1.20.0pandas1.5.0matplotlib3.7.0numpy1.24.02. 核心应用代码 (app.py)import streamlit as stimport pandas as pdimport matplotlib.pyplot as pltimport numpy as np# # 模块 1数据加载与预处理# st.cache_data # 缓存数据避免每次交互都重新读取大文件def load_data(file_pathstock_data.csv):加载股票基本面数据。模拟数据包含代码、名称、营收同比增长率(rev_growth)、ROE、市盈率(PE)、行业。try:df pd.read_csv(file_path)# 数据清洗确保关键列为数值类型numeric_cols [rev_growth, roe, pe]for col in numeric_cols:df[col] pd.to_numeric(df[col], errorscoerce)return df.dropna(subsetnumeric_cols)except FileNotFoundError:st.error(f错误未找到数据文件 {file_path})return Nonedef generate_mock_data():生成模拟数据以供演示np.random.seed(42)codes [fSH60{str(i).zfill(4)} for i in range(100, 200)]names [f公司_{i} for i in range(100)]data {code: codes,name: names,rev_growth: np.random.uniform(-0.5, 1.0, len(codes)), # -50% 到 100%roe: np.random.uniform(-0.2, 0.4, len(codes)), # -20% 到 40%pe: np.random.uniform(5, 100, len(codes)),industry: np.random.choice([科技, 金融, 消费, 医药, 制造], len(codes))}return pd.DataFrame(data)# # 模块 2侧边栏 - 参数控制面板# def render_sidebar(df):渲染侧边栏包含所有的筛选阈值滑块st.sidebar.header( 4S 选股指标调整)# 营收增长阈值rev_min float(df[rev_growth].min())rev_max float(df[rev_growth].max())rev_threshold st.sidebar.slider(营收同比增长率下限 (%),min_valuerev_min * 100,max_valuerev_max * 100,value10.0, # 默认值 10%step1.0,help仅保留营收增长高于此值的股票)# ROE 阈值roe_min float(df[roe].min())roe_max float(df[roe].max())roe_threshold st.sidebar.slider(ROE (净资产收益率) 下限 (%),min_valueroe_min * 100,max_valueroe_max * 100,value8.0, # 默认值 8%step0.5,help仅保留ROE高于此值的股票)# 市盈率范围pe_threshold st.sidebar.slider(市盈率 (PE) 上限,min_valuefloat(df[pe].min()),max_valuefloat(df[pe].max()),value50.0,step1.0,help排除估值过高的股票)return rev_threshold, roe_threshold, pe_threshold# # 模块 3核心筛选逻辑# def filter_stocks(df, rev_thresh, roe_thresh, pe_thresh):根据阈值筛选股票。业务逻辑营收增长 X% AND ROE Y% AND PE Z# 注意滑块返回的是百分比数值需转为小数进行比较query_str (frev_growth {rev_thresh / 100} and froe {roe_thresh / 100} and fpe {pe_thresh})filtered_df df.query(query_str)return filtered_df# # 模块 4可视化展示# def display_results(filtered_df, total_count):展示筛选结果及统计图表count len(filtered_df)# 关键指标展示col1, col2, col3 st.columns(3)col1.metric(符合条件的股票数, f{count} 只, f{count/total_count*100:.1f}%)if count 0:col2.metric(平均 ROE, f{filtered_df[roe].mean()*100:.2f}%)col3.metric(平均营收增长, f{filtered_df[rev_growth].mean()*100:.2f}%)st.divider()# 行业分布图if count 0:st.subheader(行业分布)fig, ax plt.subplots(figsize(10, 4))# 为了中文显示正常plt.rcParams[font.family] WenQuanYi Micro Heiindustry_counts filtered_df[industry].value_counts()ax.barh(industry_counts.index, industry_counts.values, color#4C72B0)ax.set_xlabel(数量)ax.invert_yaxis() # 让数量最多的在上面st.pyplot(fig)# 数据明细表st.subheader(筛选明细)# 格式化显示display_df filtered_df.copy()display_df[[rev_growth, roe]] display_df[[rev_growth, roe]].applymap(lambda x: f{x*100:.2f}%)display_df[pe] display_df[pe].map(lambda x: f{x:.2f})st.dataframe(display_df[[code, name, industry, rev_growth, roe, pe]])else:st.warning(当前参数组合下无符合条件的股票请放宽筛选条件。)# # 模块 5主程序入口# def main():st.set_page_config(page_title4S 选股指标可视化工具, layoutwide)st.title( 4S 选股指标自定义修改工具)st.caption(拖动滑块实时调整筛选阈值观察选股池变化)# 加载数据df load_data()if df is None:# 如果文件不存在使用模拟数据df generate_mock_data()st.info( 当前使用模拟数据进行演示。如需使用实盘数据请将 stock_data.csv 放入同目录。)total_count len(df)# 渲染控制面板rev_thresh, roe_thresh, pe_thresh render_sidebar(df)# 执行筛选filtered_df filter_stocks(df, rev_thresh, roe_thresh, pe_thresh)# 展示结果display_results(filtered_df, total_count)if __name__ __main__:main()README 文件 (README.md)# 4S 选股指标可视化调整工具[![Python Version](https://img.shields.io/badge/Python-3.9-blue.svg)](https://www.python.org/)[![Streamlit](https://img.shields.io/badge/Streamlit-1.20-red.svg)](https://streamlit.io/)## 项目简介一个基于 Python 和 Streamlit 构建的交互式股票筛选工具。用户可以通过可视化滑块实时调整“4S选股法”中的核心指标阈值营收增长率、ROE、PE并即时查看筛选结果的变化。## ✨ 功能特性- **营收增长率筛选**剔除增长停滞或衰退的企业。- **ROE 筛选**锁定盈利能力强的公司。- **PE 估值筛选**排除估值泡沫过大的标的。- **实时统计**显示符合条件的股票数量、占比及行业分布。## 快速开始### 1. 环境安装bashpip install -r requirements.txt### 2. 准备数据在项目根目录创建 stock_data.csv需包含以下列- code (代码), name (名称), industry (行业)- rev_growth (营收同比增长率, 小数形式, 如 0.15 代表 15%)- roe (净资产收益率, 小数形式)- pe (市盈率)若无数据文件应用将自动加载内置的模拟数据进行演示。### 3. 运行应用bashstreamlit run app.py## ⚙️ 技术架构- **UI 框架**: Streamlit- **数据处理**: Pandas- **可视化**: Matplotlib## ⚠️ 免责声明本工具仅供技术研究与学习使用不构成任何投资建议。股市有风险投资需谨慎。核心知识点卡片1. 交互式数据应用架构* 概念将数据分析逻辑与前端展示分离通过 UI 组件如滑块、输入框接收用户输入实时更新后端计算结果。* 实现Streamlit 的st.slider 绑定变量一旦变量变化脚本重新执行驱动数据刷新。2. 基本面选股逻辑 (4S 简化版)* 营收增长 (Sales Growth)反映企业市场份额的扩张能力。rev_growth 10% 通常被视为成长型公司的门槛。* ROE (Return on Equity)反映股东投入资本的回报率。长期来看股价表现与 ROE 高度相关。* PE (Price-to-Earnings)反映市场对公司未来增长的预期。低 PE 可能意味着低估但也可能是价值陷阱。3. 数据可视化反馈* 原理人类大脑处理图像的速度远快于数字。通过柱状图展示行业分布比看表格更能快速发现“哪个行业在当前策略下更占优势”。免责声明与风险提示免责声明本工具为开源技术演示项目旨在展示 Python 在数据科学领域的应用能力。1. 工具中涉及的选股指标如营收、ROE仅为常见基本面分析维度不代表任何投资价值判断。2. 若使用真实市场数据数据来源的准确性、完整性由数据提供方负责本工具不承担任何数据相关责任。3. 模拟数据仅为展示算法逻辑不代表真实市场情况。风险提示1. 回测不代表未来基于历史财务数据的筛选无法预测未来股价走势。2. 幸存者偏差筛选出的“好公司”不代表就是“好股票”还需考虑买入时机、市场情绪等因素。3. 参数过拟合过度优化参数以适应历史数据可能导致策略在未来失效。总结本文介绍了如何利用 Python Streamlit 构建一个“4S选股指标可视化调整工具”。通过 模块化 的设计数据层、控制层、逻辑层、展示层我们将枯燥的代码逻辑转化为直观的 滑块交互。这不仅降低了量化策略调试的门槛也极大地提升了研究效率。核心收获1. Streamlit 是将 Python 脚本转化为 Web 应用的利器特别适合数据科学类 Demo。2. Pandas 的query 方法结合字符串格式化可以优雅地实现动态筛选逻辑。3. 在量化研究中工具化思维将重复劳动自动化、可视化是提升生产力的关键。本文代码仅供学习与技术交流不构成任何投资建议股市有风险入市需谨慎利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛