Spaces:
Sleeping
Sleeping
| import plotly.graph_objects as go | |
| import plotly.express as px | |
| from plotly.subplots import make_subplots | |
| def create_technical_chart(price_data): | |
| """ | |
| Tạo biểu đồ phân tích kỹ thuật với giá, khối lượng và RSI | |
| Args: | |
| price_data: DataFrame chứa dữ liệu giá và các chỉ báo | |
| Returns: | |
| Đối tượng biểu đồ Plotly | |
| """ | |
| # Tạo subplot | |
| fig = make_subplots( | |
| rows=3, cols=1, | |
| shared_xaxes=True, | |
| vertical_spacing=0.05, | |
| subplot_titles=('Giá cổ phiếu', 'Khối lượng', 'RSI'), | |
| row_heights=[0.6, 0.2, 0.2] | |
| ) | |
| # Biểu đồ nến | |
| fig.add_trace( | |
| go.Candlestick( | |
| x=price_data['time'], | |
| open=price_data['open'], | |
| high=price_data['high'], | |
| low=price_data['low'], | |
| close=price_data['close'], | |
| name="Giá" | |
| ), row=1, col=1 | |
| ) | |
| # Thêm SMA | |
| fig.add_trace( | |
| go.Scatter( | |
| x=price_data['time'], | |
| y=price_data['SMA_20'], | |
| mode='lines', | |
| name='SMA 20', | |
| line=dict(color='#4CAF50', width=2) | |
| ), row=1, col=1 | |
| ) | |
| fig.add_trace( | |
| go.Scatter( | |
| x=price_data['time'], | |
| y=price_data['SMA_50'], | |
| mode='lines', | |
| name='SMA 50', | |
| line=dict(color='#8C52FF', width=2) | |
| ), row=1, col=1 | |
| ) | |
| # Biểu đồ khối lượng | |
| colors = ['#4CAF50' if close >= open else '#FF5252' | |
| for close, open in zip(price_data['close'], price_data['open'])] | |
| fig.add_trace( | |
| go.Bar( | |
| x=price_data['time'], | |
| y=price_data['volume'], | |
| name='Khối lượng', | |
| marker_color=colors | |
| ), row=2, col=1 | |
| ) | |
| # RSI | |
| fig.add_trace( | |
| go.Scatter( | |
| x=price_data['time'], | |
| y=price_data['RSI'], | |
| mode='lines', | |
| name='RSI', | |
| line=dict(color='#8C52FF', width=2) | |
| ), row=3, col=1 | |
| ) | |
| # Thêm đường RSI 30 và 70 | |
| fig.add_hline(y=30, line_dash="dash", line_color="red", row=3, col=1) | |
| fig.add_hline(y=70, line_dash="dash", line_color="red", row=3, col=1) | |
| fig.update_layout( | |
| height=800, | |
| xaxis_rangeslider_visible=False, | |
| template="plotly_white" | |
| ) | |
| return fig | |
| def create_revenue_profit_chart(income, year_col, revenue_col, profit_col): | |
| """ | |
| Tạo biểu đồ doanh thu và lợi nhuận | |
| Args: | |
| income: DataFrame chứa dữ liệu báo cáo kết quả kinh doanh | |
| year_col: Tên cột chứa năm | |
| revenue_col: Tên cột chứa doanh thu | |
| profit_col: Tên cột chứa lợi nhuận | |
| Returns: | |
| Đối tượng biểu đồ Plotly | |
| """ | |
| fig = go.Figure() | |
| fig.add_trace(go.Scatter( | |
| x=income[year_col], | |
| y=income[revenue_col], | |
| mode='lines+markers', | |
| name='Doanh thu', | |
| line=dict(color='#4CAF50', width=3) | |
| )) | |
| fig.add_trace(go.Scatter( | |
| x=income[year_col], | |
| y=income[profit_col], | |
| mode='lines+markers', | |
| name='Lợi nhuận', | |
| line=dict(color='#8C52FF', width=3) | |
| )) | |
| fig.update_layout( | |
| title="Doanh thu và Lợi nhuận (Tỷ đồng)", | |
| xaxis_title="Năm", | |
| yaxis_title="Tỷ đồng", | |
| template="plotly_white" | |
| ) | |
| return fig | |
| def create_return_chart(ratio, year_col, roe_col, roa_col): | |
| """ | |
| Tạo biểu đồ ROE và ROA | |
| Args: | |
| ratio: DataFrame chứa dữ liệu chỉ số tài chính | |
| year_col: Tên cột chứa năm | |
| roe_col: Tên cột chứa ROE | |
| roa_col: Tên cột chứa ROA | |
| Returns: | |
| Đối tượng biểu đồ Plotly | |
| """ | |
| fig = go.Figure() | |
| fig.add_trace(go.Scatter( | |
| x=ratio[year_col], | |
| y=ratio[roe_col], | |
| mode='lines+markers', | |
| name='ROE (%)', | |
| line=dict(color='#4CAF50', width=3) | |
| )) | |
| fig.add_trace(go.Scatter( | |
| x=ratio[year_col], | |
| y=ratio[roa_col], | |
| mode='lines+markers', | |
| name='ROA (%)', | |
| line=dict(color='#8C52FF', width=3) | |
| )) | |
| fig.update_layout( | |
| title="Tỷ suất Sinh lời (%)", | |
| xaxis_title="Năm", | |
| yaxis_title="Phần trăm (%)", | |
| template="plotly_white" | |
| ) | |
| return fig |