Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import numpy as np | |
| from src.utils.visualization import create_technical_chart | |
| def display_technical_analysis(price_data, symbol): | |
| """ | |
| Hiển thị tab phân tích kỹ thuật | |
| Args: | |
| price_data: DataFrame chứa dữ liệu giá và các chỉ báo | |
| symbol: Mã cổ phiếu | |
| """ | |
| st.markdown('<div class="tab-content">', unsafe_allow_html=True) | |
| # Metrics hiện tại | |
| latest_data = price_data.iloc[-1] | |
| prev_data = price_data.iloc[-2] if len(price_data) > 1 else latest_data | |
| col1, col2, col3, col4 = st.columns(4) | |
| with col1: | |
| price_change = latest_data['close'] - prev_data['close'] | |
| price_change_pct = (price_change / prev_data['close']) * 100 | |
| st.metric( | |
| "Giá hiện tại", | |
| f"{latest_data['close']:,.0f} VND", | |
| f"{price_change:+,.0f} ({price_change_pct:+.2f}%)" | |
| ) | |
| with col2: | |
| st.metric("Khối lượng", f"{latest_data['volume']:,.0f}") | |
| with col3: | |
| high_52w = price_data['high'].max() | |
| low_52w = price_data['low'].min() | |
| st.metric("Cao nhất 52W", f"{high_52w:,.0f}") | |
| with col4: | |
| st.metric("Thấp nhất 52W", f"{low_52w:,.0f}") | |
| # Biểu đồ giá | |
| st.subheader("📈 Biểu đồ Giá và Khối lượng") | |
| # Tạo biểu đồ kỹ thuật | |
| fig = create_technical_chart(price_data) | |
| fig.update_layout(title=f"Phân tích kỹ thuật {symbol}") | |
| st.plotly_chart(fig, use_container_width=True) | |
| # Phân tích kỹ thuật | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| st.subheader("📊 Chỉ báo Kỹ thuật") | |
| latest_rsi = price_data['RSI'].iloc[-1] | |
| rsi_signal = "Quá mua" if latest_rsi > 70 else "Quá bán" if latest_rsi < 30 else "Trung tính" | |
| st.write(f"**RSI (14):** {latest_rsi:.2f} - {rsi_signal}") | |
| # So sánh SMA | |
| current_price = latest_data['close'] | |
| sma_20 = price_data['SMA_20'].iloc[-1] | |
| sma_50 = price_data['SMA_50'].iloc[-1] | |
| sma_trend = "Tăng" if current_price > sma_20 > sma_50 else "Giảm" if current_price < sma_20 < sma_50 else "Sideway" | |
| st.write(f"**Xu hướng SMA:** {sma_trend}") | |
| st.write(f"**SMA 20:** {sma_20:.0f}") | |
| st.write(f"**SMA 50:** {sma_50:.0f}") | |
| with col2: | |
| st.subheader("📈 Thống kê Giá") | |
| volatility = (price_data['close'].pct_change().std() * np.sqrt(252) * 100) | |
| st.write(f"**Độ biến động (năm):** {volatility:.2f}%") | |
| avg_volume = price_data['volume'].mean() | |
| st.write(f"**KL trung bình:** {avg_volume:,.0f}") | |
| price_range = ((high_52w - low_52w) / low_52w) * 100 | |
| st.write(f"**Biên độ 52W:** {price_range:.2f}%") | |
| current_vs_high = ((current_price - high_52w) / high_52w) * 100 | |
| st.write(f"**So với đỉnh 52W:** {current_vs_high:.2f}%") | |
| st.markdown('</div>', unsafe_allow_html=True) |