Wall Street

Jornada negativa y de cautela, con foco en bonos, petróleo y geopolítica. El mercado sigue en niveles altos históricamente (S&P cerca de máximos recientes), pero con corrección técnica en curso.

Cierres principales:

  • Dow Jones: 49,363.88 (-322.24 / -0.65%)
  • S&P 500: 7,353.61 (-49.44 / -0.67%)
  • Nasdaq Composite: 25,870.71 (-220.02 / -0.84%)
  • Russell 2000 (small caps): ≈2,747 (-1.01%)

Los tres índices principales cerraron a la baja por segundo día consecutivo, con el Nasdaq liderando las pérdidas debido a la debilidad en tecnología y semiconductores.

Principales razones del movimiento

  • Subida de rendimientos de bonos: El Treasury a 10 años subió a su nivel más alto en más de un año (alrededor de 4.66-4.67%), por preocupaciones inflacionarias persistentes.
  • Precios del petróleo elevados: El WTI se mantuvo cerca de $104 y el Brent en $111, por tensiones geopolíticas. Esto alimenta temores de inflación.
  • Presión en tech: Continuó la consolidación en semiconductores y tecnología (anticipando earnings de Nvidia mañana). Sectores defensivos como energía, staples y financieros resistieron mejor.

MERVAL y BYMA

El Merval hoy ha retrocedido un -1,47%, en una jornada cercana a los 500 mil millones de pesos negociados sumando los ADRs, en nuestro índice unos 53 millones de BigMacs o el 14,3% del Día después de Santilli.

El rally de ayer de YPF fue rápidamente absorbido y también volvió a ser los más negociado por cerca de 37 mil millones de $ en el BYMA. La suba de GGAL y BBAR de ayer hoy retrocedió de igual modo y magnitud. En el Panel General la moda de volumen ha estado en torno a los 8 millones de $, pauperrimo excepto por A3 mercados que negocio cerca de 800 millones. BHIP y BPAT usualmente tiene negociado en torno a algo menos que un cero kilómetro. Ese panel tiene 20 papales negociando por menos de 10 millones de $.

En el programa CEDEAR el dinero Argentino se oriento a MU que subió un 2% tras perder 16% en pocos días, negocio casi 13 mil millones de $. Otros números fuertes han estado en NVDA, VIST, MELI y MSFT. Entre los ETF fuerte movimiento de volumen en EWZ (BRASIL) con 500% más volumen del habitual, cerca de unos 19 mil millones de $, el ruido político y el rally reciente ha indicado la toma de ganancias de manos grandes.

Ahora un par de desarrollos:

44*BATS:GGAL+17*BATS:BMA+70*BATS:BBAR+37*BATS:YPF+13*BATS:PAM+23*BATS:TGS+96*BATS:CEPU+47*BATS:EDN

En el gráfico vemos esta formula para TradingView que se asemeja al Merval en proporción de cada sector y de activos. Desde su máximo en enero 2025 hasta hoy ha bajado un 30%.

También hemos desarrollado un indicador para TradingView que toma el dato de inflación argentina para el índice Merval y activos Argentinos que cotizan en el país. El indicador abarca entreel presente y cualquier día posterior al 1/1/24, aquello que entre en el gráfico será calculado en pocos segundos:

Aquí el código:

//@version=6
indicator("Brecha de Inflación Argentina vs Activo", 
     shorttitle="Brecha IPC AR", 
     overlay=false, 
     precision=2)

// ============================================================
//  INPUTS
// ============================================================
src          = input.source(close, "Fuente del activo")
ipc_simbolo  = input.symbol("ECONOMICS:ARCPI", "Símbolo del IPC", 
     tooltip="IPC argentino (INDEC) provisto por el feed de TradingView Economics. " +
             "Pine Script no puede consultar directamente la API del BCRA, pero este " +
             "feed refleja el mismo dato oficial mensual del INDEC.")

mostrar_activo    = input.bool(true,  "Mostrar variación nominal del activo", group="Series")
mostrar_ipc       = input.bool(true,  "Mostrar variación del IPC",             group="Series")
mostrar_brecha    = input.bool(true,  "Mostrar brecha (activo − IPC)",         group="Series")
mostrar_real      = input.bool(false, "Mostrar retorno real (activo / IPC)",   group="Series")

col_activo  = input.color(#2962FF, "Activo",            group="Colores")
col_ipc     = input.color(#FF6D00, "IPC",               group="Colores")
col_brecha_p= input.color(#26A69A, "Brecha positiva",   group="Colores")
col_brecha_n= input.color(#EF5350, "Brecha negativa",   group="Colores")
col_real    = input.color(#AB47BC, "Retorno real",      group="Colores")

mostrar_tabla = input.bool(true, "Mostrar tabla resumen", group="Tabla")
pos_tabla     = input.string("Arriba derecha", "Posición de la tabla", 
     options=["Arriba derecha","Arriba izquierda","Abajo derecha","Abajo izquierda"], group="Tabla")

// ============================================================
//  DATOS DEL IPC
// ============================================================
// El IPC es mensual: pedimos en diario y dejamos que el último valor se sostenga
// entre publicaciones. lookahead_off evita sesgo a futuro.
ipc = request.security(ipc_simbolo, "D", close, 
     ignore_invalid_symbol=true, 
     lookahead=barmerge.lookahead_off)

// ============================================================
//  ANCLA EN EL INICIO DEL RANGO VISIBLE
// ============================================================
// chart.left_visible_bar_time devuelve el timestamp de la barra más a la izquierda
// visible en pantalla. Cuando el usuario hace zoom/pan, Pine re-ejecuta el script
// completo, así que el ancla se reposiciona automáticamente.
inicio_visible = chart.left_visible_bar_time

var float precio_ref = na
var float ipc_ref    = na
var int   bar_ref    = na
var int   time_ref   = na

if na(precio_ref) and not na(inicio_visible) and time >= inicio_visible
    precio_ref := src
    ipc_ref    := ipc
    bar_ref    := bar_index
    time_ref   := time

// ============================================================
//  CÁLCULOS  (valores en %)
// ============================================================
var_activo = na(precio_ref) or precio_ref == 0 ? na : (src - precio_ref) / precio_ref * 100
var_ipc    = na(ipc_ref)    or ipc_ref    == 0 ? na : (ipc - ipc_ref)    / ipc_ref    * 100
brecha     = na(var_activo) or na(var_ipc) ? na : var_activo - var_ipc
ret_real   = na(var_activo) or na(var_ipc) or (1 + var_ipc/100) == 0 ? na : 
                 ((1 + var_activo/100) / (1 + var_ipc/100) - 1) * 100

// ============================================================
//  PLOTS
// ============================================================
plot(mostrar_activo ? var_activo : na, "Activo nominal (%)", 
     color=col_activo,  linewidth=2)

plot(mostrar_ipc    ? var_ipc    : na, "IPC acumulado (%)", 
     color=col_ipc,     linewidth=2)

col_b = brecha >= 0 ? col_brecha_p : col_brecha_n
plot(mostrar_brecha ? brecha : na, "Brecha (pp)", 
     color=col_b,       linewidth=2, style=plot.style_areabr)

plot(mostrar_real   ? ret_real : na, "Retorno real (%)", 
     color=col_real,    linewidth=2)

hline(0, "Cero", color=color.new(color.gray, 50), linestyle=hline.style_dashed)

// Marca visual en la barra de inicio
if not na(bar_ref) and bar_index == bar_ref
    label.new(bar_index, 0, "▲ Inicio rango", 
         color=color.new(color.gray, 70), 
         style=label.style_label_up, 
         textcolor=color.white, 
         size=size.small)

// ============================================================
//  TABLA RESUMEN
// ============================================================
pos = pos_tabla == "Arriba izquierda" ? position.top_left :
      pos_tabla == "Abajo derecha"    ? position.bottom_right :
      pos_tabla == "Abajo izquierda"  ? position.bottom_left :
                                         position.top_right

var table info = table.new(pos, 2, 6, 
     bgcolor=color.new(color.black, 75), 
     border_width=1, 
     border_color=color.new(color.gray, 60))

if mostrar_tabla and barstate.islast
    fecha_inicio = na(time_ref) ? "—" : str.format_time(time_ref, "yyyy-MM-dd", syminfo.timezone)
    
    table.cell(info, 0, 0, "Brecha IPC Argentina", 
         text_color=color.white, bgcolor=color.new(color.blue, 50), 
         text_size=size.small, text_halign=text.align_center)
    table.cell(info, 1, 0, "desde " + fecha_inicio, 
         text_color=color.white, bgcolor=color.new(color.blue, 50), 
         text_size=size.small, text_halign=text.align_center)
    
    table.cell(info, 0, 1, "Activo (nominal)", text_color=color.white, text_size=size.small)
    table.cell(info, 1, 1, na(var_activo) ? "—" : str.tostring(var_activo, "#.##") + " %", 
         text_color=col_activo, text_size=size.small, text_halign=text.align_right)
    
    table.cell(info, 0, 2, "IPC acumulado",   text_color=color.white, text_size=size.small)
    table.cell(info, 1, 2, na(var_ipc) ? "—" : str.tostring(var_ipc, "#.##") + " %", 
         text_color=col_ipc, text_size=size.small, text_halign=text.align_right)
    
    table.cell(info, 0, 3, "Brecha (pp)",     text_color=color.white, text_size=size.small)
    table.cell(info, 1, 3, na(brecha) ? "—" : str.tostring(brecha, "+#.##;-#.##") + " pp", 
         text_color=brecha >= 0 ? col_brecha_p : col_brecha_n, 
         text_size=size.small, text_halign=text.align_right)
    
    table.cell(info, 0, 4, "Retorno real",    text_color=color.white, text_size=size.small)
    table.cell(info, 1, 4, na(ret_real) ? "—" : str.tostring(ret_real, "+#.##;-#.##") + " %", 
         text_color=col_real, text_size=size.small, text_halign=text.align_right)
    
    veredicto = na(brecha) ? "—" : brecha >= 0 ? "Le gana a la inflación" : "Pierde vs inflación"
    table.cell(info, 0, 5, "Veredicto", text_color=color.white, text_size=size.small)
    table.cell(info, 1, 5, veredicto, 
         text_color=brecha >= 0 ? col_brecha_p : col_brecha_n, 
         text_size=size.small, text_halign=text.align_right)

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuarlo!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?