52Charon/A-Share-Intelligent-Analysis
1
1import streamlit as st2import pandas as pd3import akshare as ak4import plotly.graph_objects as go5import datetime6import os7 8# 屏蔽系统代理,防止抓取数据时撞墙 (云端环境保留此项也完全无影响)9os.environ['http_proxy'] = ''10os.environ['https_proxy'] = ''11os.environ['HTTP_PROXY'] = ''12os.environ['HTTPS_PROXY'] = ''13 14# 1. 页面全屏配置15st.set_page_config(page_title="自动化量化分析主页", layout="wide")16 17# 标题与侧边栏控制台18st.title("⚡ 自动化股票可视化分析主页")19st.sidebar.header("🔍 股票查询控制台")20 21# 用户输入股票代码 (默认填入中国天楹)22stock_input = st.sidebar.text_input("请输入6位股票代码 (如 000035):", "000035")23analyze_button = st.sidebar.button("生成自动化分析报告")24 25# --- 核心抓取与分析逻辑 ---26if analyze_button:27 if len(stock_input) != 6:28 st.error("⚠️ 请输入正确的6位股票代码!")29 else:30 with st.spinner("正在启动爬虫抓取最新数据并进行计算..."):31 try:32 # 抓取历史日线数据 (过去半年)33 end_date = datetime.datetime.now().strftime("%Y%m%d")34 start_date = (datetime.datetime.now() - datetime.timedelta(days=180)).strftime("%Y%m%d")35 36 # Akshare 抓取接口37 df = ak.stock_zh_a_hist(symbol=stock_input, period="daily", start_date=start_date, end_date=end_date, adjust="qfq")38 39 if df.empty:40 st.warning("未找到该股票数据,请检查代码是否正确或是否停牌。")41 else:42 # 获取最新一天的基础信息43 latest_data = df.iloc[-1]44 current_price = latest_data['收盘']45 price_change = latest_data['涨跌幅']46 47 st.markdown("### 📊 核心数据看板")48 # 第一排:指标卡片49 col1, col2, col3, col4 = st.columns(4)50 col1.metric("当前收盘价", f"{current_price} 元", f"{price_change}%")51 col2.metric("今日成交量", f"{latest_data['成交量']} 手")52 col3.metric("换手率", f"{latest_data['换手率']}%")53 col4.metric("最高价/最低价", f"{latest_data['最高']} / {latest_data['最低']}")54 55 st.markdown("---")56 57 # 第二排:交互式可视化图表 (Plotly)58 st.markdown("### 📈 走势与技术指标可视化")59 60 # 计算 20 日均线61 df['MA20'] = df['收盘'].rolling(window=20).mean()62 63 # 绘制 K 线图64 fig = go.Figure()65 fig.add_trace(go.Candlestick(x=df['日期'],66 open=df['开盘'], high=df['最高'],67 low=df['最低'], close=df['收盘'],68 name='K线'))69 fig.add_trace(go.Scatter(x=df['日期'], y=df['MA20'], 70 line=dict(color='orange', width=1.5), 71 name='20日均线 (MA20)'))72 73 fig.update_layout(height=500, margin=dict(l=0, r=0, t=30, b=0), xaxis_rangeslider_visible=False)74 st.plotly_chart(fig, use_container_width=True)75 76 # 第三排:自动化诊断结论77 st.markdown("### 🤖 算法量化诊断")78 ma20_current = df['MA20'].iloc[-1]79 support_20d = df['最低'].tail(20).min()80 81 if current_price > ma20_current:82 st.success(f"**趋势诊断**:当前价格站上 20 日均线 ({ma20_current:.2f}),走势偏多头。")83 else:84 st.error(f"**趋势诊断**:当前价格位于 20 日均线 ({ma20_current:.2f}) 之下,走势偏空头。")85 86 st.info(f"**支撑位监控**:近20个交易日最低支撑位在 **{support_20d:.2f}** 附近。距离当前价格约 {((current_price-support_20d)/support_20d*100):.2f}%。")87 88 except Exception as e:89 st.error(f"抓取或处理数据时发生错误: {e}")