金融数据分析全流程实战
·
一、整体架构流程
主程序: 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图表
金融数据分析全流程实战实训一
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐






























所有评论(0)