Crear una app donde ingrese el ticket de un etf, accion, índice o bono, y se genere un informe en pdf con un gráfico de area
To upload files, please first save the app
import streamlit as st
import yfinance as yf
import plotly.graph_objects as go
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
import pandas as pd
import io
import base64
from datetime import datetime, timedelta
st.title("Generador de Informes de Instrumentos Financieros")
# Input para el símbolo
symbol = st.text_input("Ingrese el símbolo del instrumento (ejemplo: AAPL, SPY, ^GSPC):")
if symbol:
try:
# Obtener datos
end_date = datetime.now()
start_date = end_date - timedelta(days=365)
ticker = yf.Ticker(symbol)
df = ticker.history(start=start_date, end=end_date)
if df.empty:
st.error("No se encontraron datos para el símbolo ingresado.")
else:
# Crear gráfico de área con Plotly
fig = go.Figure()
fig.add_trace(go.Scatter(
x=df.index,
y=df['Close'],
fill='tozeroy',
name='Precio de Cierre'
))
fig.update_layout(
title=f'Precio histórico de {symbol}',
xaxis_title='Fecha',
yaxis_title='Precio',
showlegend=True
)
# Mostrar gráfico en Streamlit
st.plotly_chart(fig)
# Crear PDF
buffer = io.BytesIO()
c = canvas.Canvas(buffer, pagesize=letter)
# Título
c.setFont("Helvetica-Bold", 16)
c.drawString(50, 750, f"Informe de {symbol}")
# Información básica
c.setFont("Helvetica", 12)
info = ticker.info
y_position = 700
# Agregar información básica al PDF
basic_info = [
f"Nombre: {info.get('longName', 'No disponible')}",
f"Sector: {info.get('sector', 'No disponible')}",
f"Industria: {info.get('industry', 'No disponible')}",
f"Precio actual: ${df['Close'][-1]:.2f}",
f"Volumen promedio: {info.get('averageVolume', 'No disponible'):,}",
]
for line in basic_info:
c.drawString(50, y_position, line)
y_position -= 20
# Guardar el PDF
c.save()
# Ofrecer el PDF para descarga
buffer.seek(0)
b64 = base64.b64encode(buffer.read()).decode()
href = f'<a href="data:application/pdf;base64,{b64}" download="{symbol}_informe.pdf">Descargar informe PDF</a>'
st.markdown(href, unsafe_allow_html=True)
except Exception as e:
st.error(f"Error al procesar los datos: {str(e)}")
st.markdown("---")
st.markdown("""
### Instrucciones:
1. Ingrese el símbolo del instrumento financiero (ETF, acción, índice o bono)
2. El sistema generará un gráfico de área con el precio histórico
3. Se creará un informe PDF con información básica y el gráfico
4. Use el botón de descarga para obtener el PDF
""")
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?