一、整体架构流程

  • 主程序: 44_蒋嘉洋.py
  • 依赖的模块:step1.py 到 step10.py(每个步骤对应一个独立的分析模块)
  • 数据文件:

二、代码功能分析

1. 初始化设置

2. 模块代码读取

(动态读取10个step模块的源代码,用于在应用中显示代码内容)

3. Streamlit应用配置

(设置页面标题和宽屏布局)

4.侧边栏导航

三、各页面显示代码详解

页面1:股票代码获取

代码:

if nm=='1申万家用电器行业股票代码获取':
   st.subheader('代码')
   st.code(step1_code,language='python')
   st.subheader('结果')
   re=step1.return_values()
   st.dataframe(pd.DataFrame({'股票代码':re[0].index,'股票名称':re[0].values}))
   st.subheader('原始数据预览')
   st.dataframe(re[1].head(10))

展示页面:

             

页面2:财务指标数据获取

代码:

if nm=='2申万家用电器行业股票财务指标数据获取':
   st.subheader('代码')
   st.code(step2_code,language='python')
   st.subheader('结果')
   re=step2.return_values()
   st.dataframe(re)
   st.subheader('原始数据统计信息')
   st.dataframe(re.describe())

展示页面:

页面3:财务指标数据处理

代码:

if nm=='3申万家用电器行业股票财务指标数据处理':
    st.subheader('代码')
    st.code(step3_code,language='python')
    st.subheader('结果')
    re=step3.return_values()
    st.write("标准化数据形状:", re[0].shape)
    st.write("股票代码数量:", len(re[1]))
    st.write("股票代码:", re[1])
    st.subheader('标准化数据预览(前10行)')
    st.dataframe(pd.DataFrame(re[0][:10]))

展示页面:

页面4:主成分分析

代码:

if nm=='4申万家用电器行业股票财务指标数据主成分分析':
    st.subheader('代码')
    st.code(step4_code,language='python')
    st.subheader('结果')
    re=step4.return_values()
    st.write("主成分数据形状:", re.shape)
    st.write("主成分数量:", re.shape[1])
    st.subheader('主成分数据预览(前10行)')
    st.dataframe(pd.DataFrame(re[:10]))

展示页面:

页面5:股票日交易数据获取(最具交互性)

代码:

if nm=='5申万家用电器行业股票日交易数据获取':
    st.subheader('代码')
    st.code(step5_code,language='python')
    st.subheader('结果')
    re=step5.return_values()
    
    # 显示原始数据
    st.subheader('原始交易数据(前10行)')
    st.dataframe(re.head(10))
    st.write("总交易记录数:", len(re))
    st.write("包含股票数量:", re['Stkcd'].nunique())
    
    # 可视化
    st.subheader('交易数据可视化')
    
    # 选择要分析的股票
    unique_stocks = re['Stkcd'].unique()
    if len(unique_stocks) > 0:
        selected_stock = st.selectbox('选择股票代码进行分析', unique_stocks)
        
        # 筛选选定股票的数据
        stock_data = re[re['Stkcd'] == selected_stock].sort_values('Trddt')
        
        col1, col2 = st.columns(2)
        
        with col1:
            # 绘制收盘价走势
            fig1, ax1 = plt.subplots(figsize=(10, 6))
            ax1.plot(stock_data['Trddt'], stock_data['Clsprc'], marker='o', linewidth=2, markersize=4)
            ax1.set_title(f'股票 {selected_stock} 收盘价走势')
            ax1.set_xlabel('交易日期')
            ax1.set_ylabel('收盘价')
            ax1.grid(True, alpha=0.3)
            plt.xticks(rotation=45)
            st.pyplot(fig1)
        
        with col2:
            # 绘制成交额柱状图
            fig2, ax2 = plt.subplots(figsize=(10, 6))
            ax2.bar(range(len(stock_data)), stock_data['Dnvaltrd'], alpha=0.7)
            ax2.set_title(f'股票 {selected_stock} 成交额分布')
            ax2.set_xlabel('交易天数')
            ax2.set_ylabel('成交额')
            ax2.grid(True, alpha=0.3)
            st.pyplot(fig2)

展示页面:

页面6:交易指数构造

代码:

if nm=='6申万家用电器行业股票交易指数的构造':
    st.subheader('代码')
    st.code(step6_code,language='python')
    st.subheader('结果')
    re=step6.return_values()
    
    # 显示数据
    st.dataframe(pd.DataFrame({'交易日期':re.index,'指数值':re.values}).head(10))
    st.write("指数数据点数:", len(re))
    st.write("基准日:", re.index.min())
    st.write("最终指数值:", f"{re.iloc[-1]:.2f}")
    
    # 可视化
    st.subheader('家用电器行业交易指数走势图')
    fig, ax = plt.subplots(figsize=(12, 6))
    ax.plot(re.index, re.values, linewidth=2, color='blue')
    ax.set_title('家用电器行业交易指数走势 (2017年)')
    ax.set_xlabel('交易日期')
    ax.set_ylabel('指数值')
    ax.grid(True, alpha=0.3)
    plt.xticks(rotation=45)
    st.pyplot(fig)
    
    # 显示指数统计信息
    st.subheader('指数统计信息')
    col1, col2, col3, col4 = st.columns(4)
    with col1:
        st.metric("起始指数", "100.00")
    with col2:
        st.metric("最高指数", f"{re.max():.2f}")
    with col3:
        st.metric("最低指数", f"{re.min():.2f}")
    with col4:
        st.metric("最终指数", f"{re.iloc[-1]:.2f}")

展示页面:

页面7:年涨跌幅计算(信息最丰富)

代码:

if nm=='7计算沪深300指数2014-2017年的年涨跌幅指标':
    st.subheader('代码')
    st.code(step7_code,language='python')
    st.subheader('结果')
    re=step7.return_values()
    years = ['2014年','2015年','2016年','2017年']
    col1, col2, col3, col4 = st.columns(4)
    with col1:
        st.metric(years[0], f"{re[0]:.2%}")
    with col2:
        st.metric(years[1], f"{re[1]:.2%}")
    with col3:
        st.metric(years[2], f"{re[2]:.2%}")
    with col4:
        st.metric(years[3], f"{re[3]:.2%}")
    
    # 添加原始数据展示
    st.subheader('原始数据')
    
    # 读取沪深300指数原始数据
    import pandas as pd
    A = pd.read_excel('沪深300指数交易数据表.xlsx')
    
    # 确保日期列是datetime格式
    A['Idxtrd01'] = pd.to_datetime(A['Idxtrd01'], errors='coerce')
    
    # 显示原始数据基本信息
    st.write("沪深300指数原始数据基本信息:")
    st.write(f"数据总行数: {len(A)}")
    st.write(f"数据时间范围: {A['Idxtrd01'].min()} 至 {A['Idxtrd01'].max()}")
    
    # 显示原始数据预览
    st.subheader('原始数据预览(前10行)')
    st.dataframe(A.head(10))
    
    # 显示数据列信息
    st.subheader('数据列信息')
    st.write("字段说明:")
    st.write("- Indexcd: 指数代码")
    st.write("- Idxtrd01: 交易日期") 
    st.write("- Idxtrd05: 收盘指数")
    
    # 显示各年份数据统计
    st.subheader('各年份数据统计')
    
    # 提取各年份数据
    years_data = {}
    for year in [2014, 2015, 2016, 2017]:
        year_data = A[A['Idxtrd01'].dt.year == year]
        years_data[year] = year_data
        if len(year_data) > 0:
            st.write(f"**{year}年数据:**")
            sorted_data = year_data.sort_values('Idxtrd01')
            col1, col2, col3, col4 = st.columns(4)
            with col1:
                st.write(f"交易天数: {len(year_data)}")
            with col2:
                st.write(f"年初收盘: {sorted_data['Idxtrd05'].iloc[0]:.2f}")
            with col3:
                st.write(f"年末收盘: {sorted_data['Idxtrd05'].iloc[-1]:.2f}")
            with col4:
                change = (sorted_data['Idxtrd05'].iloc[-1] - sorted_data['Idxtrd05'].iloc[0]) / sorted_data['Idxtrd05'].iloc[0]
                st.write(f"实际涨跌幅: {change:.2%}")
        else:
            st.write(f"{year}年: 无数据")
    
    # 显示数据统计摘要
    st.subheader('数据统计摘要')
    st.dataframe(A[['Idxtrd05']].describe())

页面显示:

页面8:关键转折点识别

代码:

if nm=='8计算获得沪深300指数2016年收盘指数的关键转折点':
    st.subheader('代码')
    st.code(step8_code,language='python')
    st.subheader('结果')
    re=step8.return_values()
    st.dataframe(pd.DataFrame({'交易日序号':re.index,'收盘指数':re.values}))
    st.write("关键转折点数量:", len(re))
    
    # 可视化
    st.subheader('沪深300指数2016年关键转折点')
    
    # 获取原始数据用于绘图
    import pandas as pd
    A = pd.read_excel('沪深300指数交易数据表.xlsx')
    I1 = A.iloc[:,1].values >= '2016-01-01'
    I2 = A.iloc[:,1].values <= '2016-12-31'
    data = A.iloc[I1&I2,:].sort_values(['Idxtrd01'])
    
    fig, ax = plt.subplots(figsize=(12, 6))
    
    # 绘制完整的收盘指数曲线
    ax.plot(range(len(data)), data['Idxtrd05'], linewidth=1, color='lightblue', alpha=0.7, label='收盘指数')
    
    # 标记关键转折点
    ax.scatter(re.index, re.values, color='red', s=50, zorder=5, label='关键转折点')
    
    # 在转折点上添加标注
    for i, (idx, value) in enumerate(zip(re.index, re.values)):
        ax.annotate(f'{i+1}', (idx, value), xytext=(5, 5), textcoords='offset points', 
                   fontsize=8, color='red')
    
    ax.set_title('沪深300指数2016年关键转折点')
    ax.set_xlabel('交易日序号')
    ax.set_ylabel('收盘指数')
    ax.legend()
    ax.grid(True, alpha=0.3)
    st.pyplot(fig)

展示页面:

页面9:移动平均值计算

代码:

if nm=='9计算沪深300指数2016年10、20、30、60日收盘指数移动平均值':
    st.subheader('代码')
    st.code(step9_code,language='python')
    st.subheader('结果')
    re=step9.return_values()
    x10, x20, x30, x60 = re
    
    st.write("各移动平均序列信息:")
    st.write(f"10日移动平均: {len(x10)}个数据点")
    st.write(f"20日移动平均: {len(x20)}个数据点")
    st.write(f"30日移动平均: {len(x30)}个数据点")
    st.write(f"60日移动平均: {len(x60)}个数据点")
    
    col1, col2 = st.columns(2)
    with col1:
        st.subheader("10日移动平均(前10个值)")
        st.dataframe(pd.DataFrame({'10日移动平均': x10[:10]}))
        st.subheader("20日移动平均(前10个值)")
        st.dataframe(pd.DataFrame({'20日移动平均': x20[:10]}))
    with col2:
        st.subheader("30日移动平均(前10个值)")
        st.dataframe(pd.DataFrame({'30日移动平均': x30[:10]}))
        st.subheader("60日移动平均(前10个值)")
        st.dataframe(pd.DataFrame({'60日移动平均': x60[:10]}))
    
    # 可视化
    st.subheader('沪深300指数移动平均线')
    
    # 获取原始收盘价数据
    import pandas as pd
    A = pd.read_excel('沪深300指数交易数据表.xlsx')
    I1 = A.iloc[:,1].values >= '2016-01-01'
    I2 = A.iloc[:,1].values <= '2016-12-31'
    data = A.iloc[I1&I2,:].sort_values(['Idxtrd01'])
    close_prices = data['Idxtrd05'].values
    
    fig, ax = plt.subplots(figsize=(12, 6))
    
    # 绘制收盘价
    ax.plot(range(len(close_prices)), close_prices, label='收盘指数', linewidth=2, color='black')
    
    # 绘制各移动平均线
    ax.plot(range(len(x10)), x10, label='10日移动平均', linewidth=1)
    ax.plot(range(len(x20)), x20, label='20日移动平均', linewidth=1)
    ax.plot(range(len(x30)), x30, label='30日移动平均', linewidth=1)
    ax.plot(range(len(x60)), x60, label='60日移动平均', linewidth=1)
    
    ax.set_title('沪深300指数2016年移动平均线')
    ax.set_xlabel('交易日序号')
    ax.set_ylabel('指数值')
    ax.legend()
    ax.grid(True, alpha=0.3)
    st.pyplot(fig)

展示页面:

页面10:现价指标计算

代码:

if nm=='10计算沪深300指数2016年现价指标':
    st.subheader('代码')
    st.code(step10_code,language='python')
    st.subheader('结果')
    re=step10.return_values()
    st.dataframe(pd.DataFrame({'交易日序号':re.index,'现价指标':re.values}).head(10))
    st.write("现价指标数据点数:", len(re))
    st.write("现价指标范围:", f"{re.min():.3f} - {re.max():.3f}")

展示页面:

四、Streamlit组件使用总结

1. 布局组件

  •  st.columns() : 创建多列布局
  •  st.sidebar : 创建侧边栏
  •  st.container() : 隐式使用,组织内容

2. 内容显示组件

  • st.subheader() : 次级标题  
  • st.write() : 通用文本显示
  • st.dataframe() : 显示数据框
  • st.metric() : 显示指标卡片  
  • st.code() : 显示代码块

3. 交互组件

  • st.selectbox() : 下拉选择框

4. 可视化组件

  • st.pyplot() : 显示Matplotlib图表

金融数据分析全流程实战实训一

Logo

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

更多推荐