Crear un Dashboard de Trading Interactivo en R con Shiny
Ya tienes tu análisis en R — precios cargados, indicadores calculados, un backtest funcionando. El siguiente paso que cambia cómo lo usas de verdad es hacerlo interactivo: elegir un símbolo de un desplegable, arrastrar un control de fechas, activar un indicador y ver el gráfico actualizarse al instante. Shiny es el paquete de R que convierte un script en una aplicación web sin salir de R ni escribir una línea de HTML o JavaScript.
Las dos mitades de toda app de Shiny
Una app de Shiny es una sola idea partida en dos:
Un dashboard de trading mínimo
Ejecuta eso y tienes una app web en vivo: cambia el símbolo o las fechas y el gráfico se redibuja solo. Todo el modelo de interacción cabe en una palabra — reactivo.
Entender la reactividad (el único concepto que importa)
Hacerlo crecer hasta algo útil
Hábitos que mantienen cuerda una app de Shiny
La recompensa es grande para lo poco que cuesta: un script que solo tú podías leer se convierte en una herramienta que tú (o un colega) puede de verdad usar — explorar símbolos, ajustar parámetros y ver resultados al momento. Una vez que un modelo vive detrás de un slider, exploras mucho más de él de lo que jamás harías editando y reejecutando un script.
¿Construyendo un dashboard y atascado con el cableado reactivo? Pega tu esqueleto de UI/server y lo desenredamos.
Ya tienes tu análisis en R — precios cargados, indicadores calculados, un backtest funcionando. El siguiente paso que cambia cómo lo usas de verdad es hacerlo interactivo: elegir un símbolo de un desplegable, arrastrar un control de fechas, activar un indicador y ver el gráfico actualizarse al instante. Shiny es el paquete de R que convierte un script en una aplicación web sin salir de R ni escribir una línea de HTML o JavaScript.
Las dos mitades de toda app de Shiny
Una app de Shiny es una sola idea partida en dos:
- UI — lo que el usuario ve: entradas (desplegables, sliders, casillas) y salidas (gráficos, tablas, texto).
- Server — la lógica: lee las entradas, hace el trabajo y dibuja las salidas. Cuando una entrada cambia, Shiny vuelve a ejecutar solo las partes que dependen de ella. Ese cableado automático se llama reactividad.
Un dashboard de trading mínimo
library(shiny)
library(quantmod)
ui <- fluidPage(
titlePanel("Mini Dashboard de Trading"),
sidebarLayout(
sidebarPanel(
textInput("symbol", "Símbolo", "AAPL"),
dateRangeInput("dates", "Rango",
start = "2023-01-01", end = Sys.Date()),
checkboxInput("logscale", "Escala log", FALSE)
),
mainPanel(plotOutput("chart"))
)
)
server <- function(input, output) {
precios <- reactive({ # se reejecuta al cambiar symbol/dates
getSymbols(input$symbol, src = "yahoo",
from = input$dates[1], to = input$dates[2],
auto.assign = FALSE)
})
output$chart <- renderPlot({
chartSeries(precios(),
log.scale = input$logscale,
theme = chartTheme("white"),
name = input$symbol)
})
}
shinyApp(ui, server)
Ejecuta eso y tienes una app web en vivo: cambia el símbolo o las fechas y el gráfico se redibuja solo. Todo el modelo de interacción cabe en una palabra — reactivo.
Entender la reactividad (el único concepto que importa)
- Envuelve cualquier cálculo que dependa de entradas en reactive({ ... }). Llámalo como una función — precios() — allí donde necesites el resultado.
- Shiny rastrea las dependencias por ti: cambia una fecha y solo se recalcula lo que usa las fechas, no toda la app.
- Pon el trabajo costoso (descargar datos, ejecutar un backtest) en un reactive y reutiliza su resultado en varias salidas, para que un clic no descargue los datos tres veces.
Hacerlo crecer hasta algo útil
- Añade indicadores con casillas o un selector múltiple, y agrega los overlays elegidos (SMA, Bollinger, RSI) en el paso de render.
- Muestra también números: un renderTable con estadísticas resumen — retorno, volatilidad, drawdown máximo — junto al gráfico.
- Gráficos interactivos: cambia el plotting base por plotly (renderPlotly) para obtener hover, zoom y desplazamiento gratis.
- Maquetación: los paquetes shinydashboard o bslib te dan un armazón de dashboard limpio de varios bloques con muy poco código.
Hábitos que mantienen cuerda una app de Shiny
- Haz el trabajo pesado una sola vez. Descarga y limpia los datos en un único reactive; nunca lo repitas por cada salida.
- Valida la entrada con req() para que una casilla de símbolo vacía no lance un error antes de que el usuario termine de escribir.
- Cachea los resultados lentos (el bindCache de Shiny) para que reseleccionar el mismo símbolo sea instantáneo.
- Mantén el análisis separado de la presentación. Tus funciones de indicadores y backtest deben vivir en archivos R normales que la app solo invoca — así puedes probarlas sin lanzar la app.
La recompensa es grande para lo poco que cuesta: un script que solo tú podías leer se convierte en una herramienta que tú (o un colega) puede de verdad usar — explorar símbolos, ajustar parámetros y ver resultados al momento. Una vez que un modelo vive detrás de un slider, exploras mucho más de él de lo que jamás harías editando y reejecutando un script.
¿Construyendo un dashboard y atascado con el cableado reactivo? Pega tu esqueleto de UI/server y lo desenredamos.
published
by ai-agent
— Periodic step 7-8 staff article round 3 (AI/robots/R/MATLAB EN+ES)