一、设计背景

在金融市场快速发展且数据量呈指数级增长的当下,传统的金融分析方式已难以满足投资者、研究者对市场洞察的精准化、高效化需求。一方面,普通投资者往往缺乏专业的数据分析能力,难以从海量的股票交易数据、财务数据中挖掘有效信息以支撑投资决策;另一方面,金融机构的专业分析工作也需要高效的工具来整合多维度数据,实现市场趋势研判、行业对比分析及量化策略构建。

基于上述行业痛点,本金融数据挖掘及其应用综合实训系统应运而生。系统以Python为核心开发语言,依托Streamlit框架构建交互式Web界面,整合股票交易数据、行业分类数据、财务数据等多源信息,实现市场总览、行业深度分析、技术指标计算、机器学习预测及AI智能分析等核心功能。其设计目标在于为用户提供一站式的金融数据挖掘工具,降低数据分析门槛,助力用户快速把握市场动态、识别行业机会,同时为金融数据挖掘相关的实训教学提供直观的实践平台(后附视频演示)。

二、代码实现

2.1 技术栈选型

本系统采用Python作为核心开发语言,结合多个成熟的第三方库实现数据处理、可视化、机器学习及Web交互功能,具体技术栈如下:

  • Web框架:Streamlit,用于快速构建交互式Web界面,实现数据可视化展示与用户交互逻辑;

  • 数据处理:Pandas,负责数据的读取、清洗、转换及多维度统计分析;

  • 数值计算:NumPy,支撑数据的高效数值运算,为技术指标计算和模型训练提供基础;

  • 可视化工具:Plotly、Matplotlib,实现折线图、柱状图、热力图、树形图等多种图表的绘制,直观呈现市场趋势与分析结果;

  • 机器学习:Scikit-learn,提供逻辑回归、随机森林、梯度提升树等多种分类模型,用于股票涨跌趋势预测;

  • AI交互:OpenAI API(支持DeepSeek等服务商),实现基于自然语言的智能金融分析报告生成。

2.2 核心模块实现

系统代码采用模块化设计思路,按功能划分为数据加载模块、数据处理模块、界面展示模块、模型训练模块及AI分析模块,各模块职责清晰、协同工作。核心模块实现逻辑如下:

2.2.1 数据加载模块(load_data函数)

该模块为系统的数据入口,负责读取多源金融数据文件(如行业信息、交易数据、财务数据、指数数据等),并将其转换为Pandas DataFrame格式供后续模块调用。通过try-except异常处理机制,确保数据加载失败时能给出明确提示,提升系统稳定性。数据加载完成后,以字典形式整合所有数据,便于后续模块按需提取。

import pandas as pd
import streamlit as st

def load_data():
    """加载多源金融数据,返回整合后的字典"""
    data_dict = {}
    # 定义数据文件路径(实际应用中可通过配置文件设置)
    file_paths = {
        "industry_info": "data/industry_info.csv",
        "stock_trade": "data/stock_trade_data.csv",
        "financial_data": "data/financial_data.csv",
        "index_data": "data/index_data.csv"
    }
    
    for data_name, path in file_paths.items():
        try:
            # 读取CSV文件,处理中文编码问题
            df = pd.read_csv(path, encoding="utf-8-sig")
            # 转换日期字段为datetime格式
            if "date" in df.columns:
                df["date"] = pd.to_datetime(df["date"])
            data_dict[data_name] = df
            st.success(f"{data_name} 数据加载成功,数据量:{len(df)} 条")
        except FileNotFoundError:
            st.error(f"未找到 {data_name} 数据文件,路径:{path}")
            data_dict[data_name] = pd.DataFrame()  # 返回空DataFrame避免后续报错
        except Exception as e:
            st.error(f"{data_name} 数据加载失败:{str(e)}")
            data_dict[data_name] = pd.DataFrame()
    
    return data_dict

2.2.2 数据处理模块

该模块是系统的核心支撑,包含技术指标计算、累计收益率计算、数据筛选与合并等关键功能:

  • 技术指标计算(calculate_technical_indicators函数):基于股票交易数据,计算移动平均线(MA5、MA10、MA20等)、MACD、RSI、KDJ、OBV等常用金融技术指标,为趋势分析和模型训练提供特征数据;

  • def calculate_technical_indicators(df):
        """
        计算常用金融技术指标
        参数:df - 包含股票交易数据的DataFrame,需包含close, open, high, low, volume列
        返回:添加指标后的DataFrame
        """
        # 1. 移动平均线(MA5, MA10, MA20)
        df["MA5"] = df["close"].rolling(window=5).mean()
        df["MA10"] = df["close"].rolling(window=10).mean()
        df["MA20"] = df["close"].rolling(window=20).mean()
        
        # 2. MACD(指数平滑异同平均线)
        df["EMA12"] = df["close"].ewm(span=12, adjust=False).mean()
        df["EMA26"] = df["close"].ewm(span=26, adjust=False).mean()
        df["MACD"] = df["EMA12"] - df["EMA26"]
        df["MACD_Signal"] = df["MACD"].ewm(span=9, adjust=False).mean()
        df["MACD_Hist"] = df["MACD"] - df["MACD_Signal"]
        
        # 3. RSI(相对强弱指数)
        delta = df["close"].diff(1)
        gain = delta.where(delta > 0, 0)
        loss = -delta.where(delta< 0, 0)
        avg_gain = gain.rolling(window=14).mean()
        avg_loss = loss.rolling(window=14).mean()
        rs = avg_gain / avg_loss
        df["RSI"] = 100 - (100 / (1 + rs))
        
        # 4. KDJ(随机指标)
        df["Lowest_Low"] = df["low"].rolling(window=9).min()
        df["Highest_High"] = df["high"].rolling(window=9).max()
        df["K"] = (df["close"] - df["Lowest_Low"]) / (df["Highest_High"] - df["Lowest_Low"]) * 100
        df["D"] = df["K"].rolling(window=3).mean()
        df["J"] = 3 * df["K"] - 2 * df["D"]
        
        # 5. OBV(能量潮指标)
        df["OBV"] = df["volume"].where(df["close"] > df["close"].shift(1), -df["volume"]).cumsum()
        
        # 填充缺失值(滚动计算产生的NaN)
        df = df.fillna(method="bfill").fillna(method="ffill")
        return df

  • 累计收益率计算(calculate_cumulative_returns函数):根据指定的时间范围,计算个股或指数的累计涨跌幅,为投资组合收益分析提供数据支持;

  • 数据预处理(prepare_model_data函数):整合技术指标作为特征变量,构建未来N天涨跌的目标变量,完成数据清洗、缺失值处理、特征标准化及训练集/验证集/测试集的划分,为机器学习模型提供标准化数据。

2.2.3 界面展示模块

基于Streamlit框架实现交互式界面,按功能划分为市场总览页面和行业分析页面,核心函数包括display_market_overview和display_industry_analysis:

  • 市场总览页面:通过标签页区分“主要市场指数行情”和“行业统计分析”,整合日期选择器、数据卡片、趋势图表、龙虎榜统计表格等组件,直观呈现市场整体交易情况、指数走势及行业分布特征;

  • 行业分析页面:针对选定行业,展示行业概览指标、行业指数走势、个股价格对比、上市公司信息、财务数据等内容,同时通过子标签页实现综合评价分析和涨跌趋势分析的切换。

2.2.4 模型训练与量化策略模块

该模块实现机器学习模型的训练、评估及量化交易策略构建:

  • 模型训练(train_model函数):支持逻辑回归、支持向量机、随机森林等多种模型,根据用户选择的模型类型进行训练,并通过验证集计算准确率,评估模型性能;

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

def train_model(X, y, model_type="random_forest", test_size=0.2, random_state=42):
    """
    训练股票涨跌预测模型
    参数:
        X - 特征矩阵(技术指标等)
        y - 目标变量(未来N天涨跌标签:1涨,0跌)
        model_type - 模型类型:logistic_regression/random_forest/svm
        test_size - 测试集比例
        random_state - 随机种子
    返回:训练好的模型、标准化器、测试集准确率
    """
    # 数据划分(训练集+验证集 与 测试集)
    X_train_val, X_test, y_train_val, y_test = train_test_split(
        X, y, test_size=test_size, random_state=random_state, stratify=y
    )
    
    # 数据标准化
    scaler = StandardScaler()
    X_train_val_scaled = scaler.fit_transform(X_train_val)
    X_test_scaled = scaler.transform(X_test)
    
    # 选择模型并训练
    if model_type == "logistic_regression":
        model = LogisticRegression(max_iter=1000, random_state=random_state)
    elif model_type == "svm":
        model = SVC(kernel="rbf", random_state=random_state)
    elif model_type == "random_forest":
        model = RandomForestClassifier(n_estimators=100, random_state=random_state)
    else:
        raise ValueError("不支持的模型类型,可选:logistic_regression/random_forest/svm")
    
    model.fit(X_train_val_scaled, y_train_val)
    
    # 评估测试集准确率
    y_pred = model.predict(X_test_scaled)
    test_accuracy = accuracy_score(y_test, y_pred)
    
    return model, scaler, test_accuracy

  • 量化策略构建(build_trading_strategy函数):基于模型预测的涨跌信号(买入1、卖出-1、震荡0),模拟资金管理与交易操作,计算投资组合的累计收益、最终资产价值等指标,对比买入持有策略,验证策略有效性;

  • 趋势分析(display_trend_analysis函数):整合技术指标可视化、模型参数调节、预测结果展示、混淆矩阵分析及策略收益对比等功能,形成完整的趋势研判与量化分析流程。

2.2.5 AI智能分析模块(generate_ai_analysis函数)

该模块通过调用DeepSeek等AI服务提供商的API,实现智能金融分析报告生成。核心逻辑为:提取个股的价格数据、技术指标等关键信息,构建标准化的分析提示词,发送至AI模型并接收返回结果,最终将分析报告按技术分析、市场环境分析、投资建议、风险提示等维度整理展示,为用户提供专业的决策参考。

2.3 核心流程串联(main函数)

main函数作为系统的入口,负责整合所有模块的工作流程:首先加载金融数据,然后构建侧边栏(包含API密钥设置、行业选择、系统信息等组件),根据用户选择的分析模块(市场总览或特定行业)调用对应的界面展示函数,最后加载页脚信息并提示AI功能状态。通过Streamlit的会话状态(session_state)管理API密钥等用户配置信息,确保交互过程中的数据持久化。

def main():
    # 初始化Streamlit页面配置
    st.set_page_config(page_title="金融数据挖掘综合实训系统", layout="wide")
    
    # 加载数据
    with st.spinner("正在加载金融数据..."):
        data_dict = load_data()
        if all(df.empty for df in data_dict.values()):
            st.error("所有数据加载失败,系统无法正常运行,请检查数据文件!")
            return
    
    # 初始化会话状态(存储API密钥等配置)
    if "api_key" not in st.session_state:
        st.session_state["api_key"] = ""
    if "ai_provider" not in st.session_state:
        st.session_state["ai_provider"] = "DeepSeek"
    
    # 构建侧边栏
    st.sidebar.header("系统配置与导航")
    # 1. AI配置
    st.sidebar.subheader("AI服务配置")
    api_key = st.sidebar.text_input("输入AI服务API密钥", value=st.session_state["api_key"], type="password")
    if st.sidebar.button("保存API密钥"):
        st.session_state["api_key"] = api_key
        st.sidebar.success("API密钥保存成功!")
    ai_provider = st.sidebar.selectbox("选择AI服务提供商", ["DeepSeek", "OpenAI"], index=0)
    st.session_state["ai_provider"] = ai_provider
    
    # 2. 分析模块选择
    st.sidebar.subheader("分析模块")
    analysis_module = st.sidebar.radio(
        "选择要查看的模块",
        ["市场总览", "银行业", "证券业", "保险业", "房地产行业"]
    )
    
    # 3. 系统信息
    st.sidebar.subheader("系统信息")
    st.sidebar.info("""
    金融数据挖掘综合实训系统
    开发语言:Python
    核心框架:Streamlit
    功能:市场分析、行业洞察、模型预测、AI智能分析
    """)
    
    # 主内容区标题
    st.title("金融数据挖掘及其应用综合实训系统")
    st.divider()
    
    # 根据选择的模块展示对应内容
    if analysis_module == "市场总览":
        display_market_overview(data_dict)
    elif analysis_module in ["银行业", "证券业", "保险业", "房地产行业"]:
        display_industry_analysis(data_dict, industry=analysis_module)
    
    # 页脚信息
    st.divider()
    st.caption("© 2025 金融数据挖掘实训项目组 - 仅供教学使用")
    
    # 提示AI功能状态
    if not st.session_state["api_key"]:
        st.warning("未配置AI服务API密钥,AI智能分析功能暂不可用!")

if __name__ == "__main__":
    main()

三、界面展示

本系统界面采用简洁直观的设计风格,以蓝色、灰色为主色调,契合金融行业的专业属性。界面布局分为侧边栏和主内容区,侧边栏负责功能导航与参数设置,主内容区展示核心分析结果,各组件布局合理、交互流畅。以下为主要界面的详细展示。

3.1 系统整体布局与侧边栏

系统启动后,侧边栏为固定导航区域,主内容区展示对应功能页面。侧边栏包含API密钥设置、AI服务提供商选择、分析模块(市场总览/各行业)选择、系统信息及使用帮助等功能模块;主内容区顶部展示系统标题,中部为核心分析内容,底部为系统版权信息。

3.2 市场总览页面

市场总览页面分为“主要市场指数行情”和“行业统计分析”两个标签页:

  • 主要市场指数行情标签页:左侧为日期选择器和市场概览指标卡片(交易股票数、平均涨跌幅、总成交量),右侧为主要指数(沪深300、上证指数)趋势对比图;下方为龙虎榜统计区域,展示累计涨幅/跌幅大于20%的个股列表及Top10柱状图;

  • 行业统计分析标签页:展示行业统计概览指标(统计行业数、平均营收增长率、平均利润增长率),行业详细数据表格,以及营收/利润增长最快行业的柱状图和行业公司数量分布树形图。

主要市场指数行情标签页:

行业统计分析标签页:

3.3 行业分析页面

行业分析页面顶部为行业概览指标卡片(股票数量、近期平均涨跌、代表性公司数、近期成交量),中部为左右分栏的图表区域(左侧行业指数走势及20日均线,右侧前6只个股归一化价格对比),下方为四个数据标签页(行业指数交易数据、上市公司信息、行业股票交易数据、财务数据),底部为综合评价分析和涨跌趋势分析子标签页。

3.4 模型训练与AI分析页面

该页面为行业分析页面的“股票价格涨跌趋势分析”子标签页,包含:

  • 参数设置区域:分析年度、股票数量、预测未来天数、测试集比例等参数调节组件;

  • 技术指标展示区域:技术指标数据表格、价格与均线走势图、MACD指标图、RSI与KDJ指标图;

  • 模型训练与结果区域:模型类型选择、训练按钮,训练完成后展示数据集划分、验证集/测试集准确率、混淆矩阵、策略收益对比图表及交易信号记录;

  • AI分析区域:AI分析报告生成按钮,生成后按技术分析、市场环境分析、投资建议、风险提示等维度展示智能报告。

模型训练与策略收益区域:

AI智能分析报告页面:

视频演示

实训5-考核实训视频-1

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐