系统概述
申万行业分析系统是一个基于Streamlit构建的交互式金融数据分析平台,专门用于对申万行业分类中的“家用电器”行业股票进行多维度分析。该系统集成了股票筛选、财务分析、交易数据处理和指数计算等多种功能,为金融数据分析提供了完整的解决方案。
核心功能模块介绍
1. 股票代码获取
系统首先读取“申万行业分类.xlsx”文件,从全行业数据中筛选出“家用电器”行业的股票。通过建立股票代码与股票名称的对应关系,为用户提供清晰的家电行业股票清单。这一模块为后续分析奠定了基础。
with open('temp1.py','r',encoding='utf-8') as f:temp_code1=f.read()A=pd.read_excel('申万行业分类.xlsx')# 筛选"家用电器"行业的数据a1 = A[A['行业名称'] == '家用电器']Fs = pd.Series(a1['股票名称'].values,index=a1['股票代码'].values)print(Fs)A=pd.read_excel('申万行业分类.xlsx')if nm=='1股票代码获取':left,right=st.columns(2)with left:st.subheader('原始数据')st.dataframe(A)st.subheader('代码')st.code(temp_code1,language='python')st.subheader('申万家用电器数据集')st.dataframe(Fs)
2. 股票财务指标数据获取
基于筛选出的家电行业股票代码,系统从“上市公司财务与指标数据2013-2017.xlsx”中提取2016年12月31日的财务数据。这一过程确保了数据的时效性和针对性,为财务分析提供准确的数据源。
with open('temp2.py','r',encoding='utf-8') as f:temp_code2=f.read()r=temp1.return_values()stkcd_list=list(r.index)A=pd.read_excel('上市公司财务与指标数据2013-2017.xlsx')A=A.iloc[A.iloc[:,1].values=='2016-12-31',:]data1 = A[A.iloc[:, 0].isin(stkcd_list)]if nm=='2股票财务指标数据获取':left,right=st.columns(2)with left:st.subheader('原始数据')st.dataframe(Fs)st.markdown('代码')st.code(temp_code2,language='python')st.subheader('股票财务指标数据获取')st.dataframe(data1)
3. 股票财务指标数据处理
对获取的财务数据进行预处理,包括缺失值处理和数据标准化。系统采用Z-score标准化方法,消除不同财务指标之间的量纲影响,使数据更适合后续的统计分析。
with open('temp3.py','r',encoding='utf-8') as f:temp_code3=f.read()from temp3 import return_valuesdata_clean = data.dropna()code = data_clean.iloc[:, 0].tolist()financial_data = data.iloc[:, 2:]x_array = financial_data.valuesmean_vals = np.mean(x_array, axis=0)std_vals = np.std(x_array, axis=0)std_vals[std_vals == 0] = 1x = (x_array - mean_vals) / std_valsif nm=='3股票财务指标数据处理':left,right=st.columns(2)with left:st.subheader('原始数据')st.dataframe(data1)st.markdown('代码')st.code(temp_code3,language='python')st.subheader('股票财务指标数据处理')st.dataframe(x)st.dataframe(data)
4. 财务指标数据主成分分析
通过主成分分析(PCA)对标准化后的财务数据进行降维处理。系统自动计算协方差矩阵、特征值和特征向量,并选择累积方差贡献率达到95%以上的主成分。这一功能帮助用户识别影响股票表现的关键财务因素。
with open('temp4.py','r',encoding='utf-8') as f:temp_code4=f.read()from temp4 import return_valuesr=temp3.return_values()x=r[0]cov_matrix = np.cov(x.T)eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)sorted_indices = np.argsort(eigenvalues)[::-1]sorted_eigenvalues = eigenvalues[sorted_indices]sorted_eigenvectors = eigenvectors[:, sorted_indices]total_variance = np.sum(sorted_eigenvalues)cumulative_variance_ratio = np.cumsum(sorted_eigenvalues) / total_variancen_components = np.argmax(cumulative_variance_ratio >= 0.95) + 1z= sorted_eigenvectors[:, :n_components]Y = np.dot(x,z)if nm=='4财务指标数据主成分分析':left,right=st.columns(2)with left:st.subheader('原始数据')st.dataframe(x)st.subheader('代码')st.code(temp_code4,language='python')st.subheader('财务指标数据主成分分析')st.dataframe(Y)
5. 股票日交易数据获取
结合家电行业股票代码,从“股票交易数据.xlsx”中提取相应的日交易数据。这一模块为用户提供了股票的市场表现数据,为交易分析和指数构建做准备。
with open('temp5.py','r',encoding='utf-8') as f:temp_code5=f.read()r=temp1.return_values()stkcd_list=list(r.index)A=pd.read_excel('股票交易数据.xlsx')data5=A[A['Stkcd'].isin(stkcd_list)]if nm=='5股票日交易数据获取':left,right=st.columns(2)with left:st.subheader('原始数据')st.dataframe(Y)st.subheader('代码')st.code(temp_code5,language='python')st.subheader('股票日交易数据获取')st.dataframe(data5)
6. 股票交易指数的构造
基于交易数据,系统构建家电行业交易指数。以首日的交易金额为基期,计算每日的相对指数值,直观反映家电行业整体的交易活跃度变化趋势。
with open('temp6.py','r',encoding='utf-8') as f:temp_code6=f.read()data=temp5.return_values()dt = data.groupby('Trddt')['Dnvaltrd'].sum().reset_index()dt = dt.sort_values('Trddt')base_date = dt.iloc[0]['Trddt']base_amount = dt.iloc[0]['Dnvaltrd']dt['index_val'] = dt['Dnvaltrd'] / base_amount * 100index_val = dt['index_val']if nm=='6股票交易指数的构造':left,right=st.columns(2)with left:st.subheader('原始数据')st.dataframe(data5)st.subheader('代码')st.code(temp_code6,language='python')st.subheader('股票交易指数的构造')st.dataframe(index_val)
7. 沪深300指数年涨跌幅计算
虽然系统主要关注家电行业,但也提供了沪深300指数的分析功能。计算2014-2017年间的年涨跌幅指标,为用户提供市场基准的参考数据。
with open('temp7.py','r',encoding='utf-8') as f:temp_code7=f.read()data=temp5.return_values()dt = data.groupby('Trddt')['Dnvaltrd'].sum().reset_index()dt = dt.sort_values('Trddt')base_date = dt.iloc[0]['Trddt']base_amount = dt.iloc[0]['Dnvaltrd']dt['index_val'] = dt['Dnvaltrd'] / base_amount * 100index_val2 = dt['index_val']if nm=='7计算深圳300指数2014-2017年的年涨跌幅指标':left,right=st.columns(2)with left:st.subheader('原始数据')st.dataframe(index_val)st.subheader('代码')st.code(temp_code7,language='python')st.subheader('计算深圳300指数2014-2017年的年涨跌幅指标')st.dataframe(index_val2)
8. 关键转折点识别
对沪深300指数2016年的收盘价进行分析,识别关键转折点。通过计算价格与相邻两点均值的偏差,找出波动最大的18个关键点,帮助用户把握市场的重要变化时刻。
with open('temp8.py','r',encoding='utf-8') as f:temp_code8=f.read()if nm=='8计算获得深圳300指数2016年收盘指数的关键转折点':left,right=st.columns(2)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'])data = data.reset_index(drop=True)prices = data['Idxtrd05'].valuestd = np.abs(prices[1:-1] - (prices[:-2] + prices[2:]) / 2)top_indices = np.argsort(td)[-18:][::-1] + 1ki = np.concatenate([[0], top_indices, [len(data)-1]])key_values = prices[ki]keydata = pd.Series(key_values, index=ki)with left:st.subheader('原始数据')st.dataframe(index_val2)st.subheader('代码')st.code(temp_code8,language='python')st.subheader('计算获得深圳300指数2016年收盘指数的关键转折点')st.dataframe(keydata)
9. 移动平均线计算
计算沪深300指数2016年的10日、20日、30日和60日移动平均值。这些技术指标为趋势分析和交易策略制定提供了重要参考。
with open('temp9.py','r',encoding='utf-8') as f:temp_code9=f.read()A=pd.read_excel('深圳300指数交易数据表.xlsx')I1=A.iloc[:,1].values>='2016-01-01'I2=A.iloc[:,1].values<='2016-12-31'rdata=A.iloc[I1&I2,:].sort_values(['Idxtrd01'])rdata = rdata.reset_index(drop=True)cp = rdata['Idxtrd05']x10 = cp.rolling(window=10, min_periods=1).mean()x20 = cp.rolling(window=20, min_periods=1).mean()x30 = cp.rolling(window=30, min_periods=1).mean()x60 = cp.rolling(window=60, min_periods=1).mean()if nm=='9计算深圳300指数2016年10、20、30、60日收盘指数移动平均值':left,right=st.columns(2)with left:st.subheader('原始数据')st.dataframe(keydata)st.subheader('代码')st.code(temp_code9,language='python')st.subheader('计算深圳300指数2016年10、20、30、60日收盘指数移动平均值')st.datafrmae(x10,x20,x30,x60)
10. 现价指标计算
基于10日移动平均线,计算现价相对指标(现价/MA10)。这一指标反映了当前价格相对于短期趋势的位置,是判断超买超卖状态的重要工具。
with open('temp10.py','r',encoding='utf-8') as f:temp_code10=f.read()A=pd.read_excel('深圳300指数交易数据表.xlsx')I1=A.iloc[:,1].values>='2016-01-01'I2=A.iloc[:,1].values<='2016-12-31'rdata=A.iloc[I1&I2,:].sort_values(['Idxtrd01'])rdata = rdata.reset_index(drop=True)cp = rdata['Idxtrd05']ma10 = cp.rolling(window=10, min_periods=1).mean()p10 = cp / ma10if nm=='10计算深圳300指数2016年现价指标':left,right=st.columns(2)with left:st.subheader('原始数据')st.dataframe(x10,x20,x30,x60)st.subheader('代码')st.code(temp_code10,language='python')st.subheader('计算深圳300指数2016年现价指标')st.dataframe(p10)
技术特点
1. 模块化设计:每个功能都有独立的temp模块,便于维护和扩展


2. 交互式界面:通过Streamlit侧边栏实现功能切换,用户体验友好
st.set_page_config(page_title="33", # 页面标题layout='wide',)with st.sidebar:st.subheader('请选择申万行业执行功能')List=['1股票代码获取','2股票财务指标数据获取','3股票财务指标数据处理','4财务指标数据主成分分析','5股票日交易数据获取','6股票交易指数的构造','7计算沪深300指数2014-2017年的年涨跌幅指标','8计算获得沪深300指数2016年收盘指数的关键转折点','9计算沪深300指数2016年10、20、30、60日收盘指数移动平均值','10计算沪深300指数2016年现价指标']nm=st.selectbox(" ",List)

3. 数据可视化:虽然当前主要展示数据表格,但预留了matplotlib接口便于后续图表扩展

应用价值
系统能够实现以下功能:
(1)快速筛选特定行业的股票
(2)进行深入的财务指标分析
(3)构建行业交易指数
(4)识别市场关键转折点
(5)计算多种技术指标
通过集成化的分析和直观的展示,帮助用户更好地理解家电行业的表现特征,为投资决策提供数据支持的同时,也为用户从数据获取、预处理、分析到结果展示,为用户提供了专业性的分析体验。


