本项目是一个基于Streamlit框架开发的金融数据分析与可视化平台,旨在实现对A股市场数据的多维度分析。系统整合了行业分类、个股行情、财务数据、指数走势等多源数据,为投资者提供全面的市场洞察和投资决策支持。

一、  核心价值

  • 数据集成:整合8个关键金融数据源,实现一站式数据分析

  • 智能分析:内置多因子评估模型和增长分析算法

  • 可视化交互:提供丰富的交互式图表和实时数据展示

  • 用户友好:采用现代化UI设计,操作简便直观

二、流程分析

三、数据准备

数据来源:Tushare数据

  fin_data.csv文件字段:

index_trdata.csv文件字段:

stk_trdata.csv文件字段:

复权交易数据2023.csv、复权交易数据2024.csv、复权交易数据2025.csv文件字段:

股票基本信息表.xlsx文件字段:

国防军工复权交易数据.xlsx文件字段:

沪深300指数交易数据.xlsx文件字段:

交易数据2024.csv、交易数据2025.csv文件字段:

上市公司基本信息.xlsx文件字段:

最新个股申万行业分类(完整版-截至7月末).xlsx文件字段:

四、技术栈

  • 前端框架: Streamlit 1.28+

  • 数据处理: Pandas, NumPy

  • 可视化: Plotly, Plotly Express

  • 部署: 本地/云端Streamlit部署

from datetime import datetime, date, timedelta
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.graph_objects as go
import plotly.express as px
from plotly.subplots import make_subplots
import streamlit as st
import warnings
warnings.filterwarnings('ignore')

五、核心功能实现

1.页面配置与样式设计

系统首先进行页面配置和样式设计,确保界面美观且具有良好的用户体验:

# 设置页面的标题、图标和布局
st.set_page_config(
    page_title="金融数据挖掘及其应用综合实训_xxx",
    layout='wide',
    initial_sidebar_state='expanded'
)

# 自定义CSS样式
st.markdown("""
<style>
    /* 主背景 - 紫白渐变色 */
    .stApp {
        background: linear-gradient(135deg, #f9f0ff 0%, #f5f0ff 25%, #f0f0ff 50%, #ebf0ff 75%, #e6f0ff 100%);
    }
    
    /* 侧边栏样式 */
    section[data-testid="stSidebar"] {
        background: linear-gradient(180deg, #8a2be2 0%, #9370db 50%, #ba55d3 100%);
    }
    /* 更多样式定义... */
</style>
""", unsafe_allow_html=True)

2.数据加载模块

系统设计了load_all_data()函数,负责加载和预处理各类金融数据,包括指数数据、个股行情数据、财务数据等:

@st.cache_data(ttl=3600, show_spinner="正在加载数据,请稍候...")
def load_all_data():
    """加载所有数据文件"""
    data_dict = {}
    
    # 1. 读取行业指数数据
    try:
        index_data = pd.read_csv('index_trdata.csv')
        # 数据处理与转换...
        data_dict['index_data'] = index_data
    except Exception as e:
        data_dict['index_data'] = pd.DataFrame()
    
    # 2. 读取个股行情数据 
    try:
        stk_data = pd.read_csv('stk_trdata.csv')
        # 数据处理与转换...
        data_dict['stk_data'] = stk_data
    except Exception as e:
        data_dict['stk_data'] = pd.DataFrame()
    
    # 更多数据加载...
    
    return data_dict

使用@st.cache_data装饰器可以缓存数据,提高应用性能,避免重复加载。

3.财务增长率计算功能

实现了calculate_growth_rates()函数,用于计算指定股票的营业收入增长率和净利润增长率:

def calculate_growth_rates(fin_data, stock_code, year):
    """计算指定股票的财务增长率"""
    if fin_data.empty or '股票代码' not in fin_data.columns:
        return None, None
    
    # 获取指定股票的财务数据
    stock_fin_data = fin_data[fin_data['股票代码'] == stock_code].copy()
    
    if stock_fin_data.empty:
        return None, None
    
    # 按年度排序
    stock_fin_data = stock_fin_data.sort_values('年度')
    
    # 获取当前年度和前一年的数据并计算增长率...
    
    return revenue_growth, profit_growth

 4.市场总览功能

市场总览页面提供主要市场指数行情展示和行业统计分析功能,通过标签页组织不同内容:

# 市场总览页面
if nm == '市场总览':
    # 使用渐变标题
    st.markdown("""
    <div style="background: linear-gradient(90deg, #9370db, #8a2be2); 
                padding: 20px; 
                border-radius: 15px;
                margin-bottom: 30px;
                text-align: center;
                box-shadow: 0 4px 12px rgba(138, 43, 226, 0.3);">
        <h1 style="color: white; margin: 0; font-size: 2.5em;">📈 市场总览</h1>
    </div>
    """, unsafe_allow_html=True)
    
    t1, t2 = st.tabs(["📊 主要市场指数行情", "📈 行业统计分析"])
    
    with t1:
        # 主要市场指数行情内容...
    with t2:
        # 行业统计分析内容...

5.数据可视化实现

使用 Plotly 创建多种金融图表,如指数走势图、涨跌幅对比图等:

# 创建子图
n_indices = min(3, len(indices_data))
fig = make_subplots(
    rows=1, cols=n_indices,
    subplot_titles=list(indices_data.keys())[:n_indices],
    shared_xaxes=False
)

# 使用紫色系颜色
colors = ['#9370db', '#8a2be2', '#ba55d3']
for i, (idx_name, idx_data) in enumerate(list(indices_data.items())[:n_indices]):
    if not idx_data.empty and '收盘价' in idx_data.columns:
        fig.add_trace(
            go.Scatter(x=idx_data['日期'], y=idx_data['收盘价'],
                      mode='lines', name=idx_name,
                      line=dict(color=colors[i], width=3),
                      fill='tozeroy',
                      fillcolor=f'rgba({int(colors[i][1:3], 16)}, {int(colors[i][3:5], 16)}, {int(colors[i][5:], 16)}, 0.1)'),
            row=1, col=i+1
        )

# 更新图表布局
fig.update_layout(
    height=400,
    showlegend=False,
    title_text="主要市场指数走势对比",
    title_x=0.5,
    template='plotly_white',
    plot_bgcolor='rgba(240, 230, 255, 0.1)'
)

st.plotly_chart(fig, use_container_width=True)

六、系统功能与使用说明

1.行业选择功能

系统左侧侧边栏提供行业选择功能,用户可以选择 "市场总览" 查看整体市场情况,或选择特定行业查看该行业的详细分析:

# 准备行业列表
nm_L = ['市场总览']
if '新版一级行业' in info.columns:
    nm_L1 = list(info['新版一级行业'].unique())
    nm_L.extend(sorted(nm_L1))
else:
    nm_L.extend(['国防军工', '电子', '医药生物', '计算机', '食品饮料', '石油石化'])

st.subheader('🏢 行业选择')
nm = st.selectbox("请选择要分析的行业", nm_L, key='industry_select')

2.主要市场指数行情

在市场总览页面的 "主要市场指数行情" 标签中,用户可以:

(1)通过日期选择器设置数据时间范围

(2) 查看主要股票价格指数走势图(上证指数、深证指数、沪深 300 等)

(3) 对比上证 A 股、深证 A 股与沪深 300 指数走势

(4) 查看龙虎榜统计,了解涨幅较大的股票

3. 数据缓存与性能优化

系统使用 Streamlit 的缓存功能,将数据加载结果缓存,避免重复加载,提高应用响应速度:

@st.cache_data(ttl=3600, show_spinner="正在加载数据,请稍候...")
def load_all_data():
    # 数据加载代码...

ttl=3600参数表示缓存有效期为 3600 秒(1 小时),超过此时长后会重新加载数据。

七、项目启动与执行流程

# 运行应用 
if __name__ == "__main__":
     main()

八、Streamlit简单页面展示

九、演示视频

考核实训视频

十、总结与体会

1. 主要收获

(1)数据处理能力:掌握了使用 Pandas 处理金融时间序列数据的方法,包括数据读取、清洗、9转换和分析。

(2)可视化技能:学会了使用 Plotly 创建交互式金融图表,能够直观展示股票价格走势、涨跌幅等关键指标。  

(3) Web 应用开发:熟悉了 Streamlit 框架的使用,能够快速将数据分析代码转换为交互式 Web 应用。

(4) 金融知识应用:将金融理论知识与实践结合,理解了行业分类、指数计算、财务比率等概念在实际分析中的应用。

2.遇到的问题与解决方案

(1)数据格式不一致:不同来源的金融数据格式存在差异,通过统一列名和数据转换解决了这一问题。  

(2)数据加载缓慢:使用 Streamlit 的缓存功能,显著提高了数据加载速度。  

(3)图表展示效果:通过自定义颜色方案和布局,使金融图表更加专业和易读。  

(4)异常值处理:对数据中的缺失值和异常值进行了处理,确保分析结果的准确性。

3.未来改进方向

(1)增加更多的技术指标分析,如移动平均线、相对强弱指数 (RSI) 等

(2)实现股票组合回测功能,允许用户测试不同的投资策略

(3)添加数据预测模块,使用机器学习算法预测股票价格走势

(4)优化大数据量下的性能,提高系统响应速度

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐