Presentación de datos de existencias en forma de diagrama de cajaHola todos,
los datos que describen los movimientos del precio de las acciones se crean mediante el precio de apertura/cierre y el precio máximo/mínimo. ¿Hay alguna forma de crear un diagrama de caja (gráfico de velas) en JMP que tenga un cuerpo real desde el precio de apertura y cierre y una sombra superior e inferior que tenga valores en los precios máximo (alto) y mínimo (bajo) respectivamente, como en la imagen adjunta o está ahí? mejor manera de hacer eso? Lo tradicional diagrama de caja Sin embargo, el elemento muestra diagramas de caja de valores atípicos o cuantiles y proporciona una vista compacta de una distribución de valores. Adjunté una tabla de datos de ejemplo en la que se proporcionan varias marcas de tiempo y valores de precio (mínimo, apertura, cierre y máximo). Agradecería sugerencias y sugerencias.

(fuente: Wikipedia)
Atentamente
AnalíticaGráficossecuencias de comandosRe: Presentación de datos de existencias en forma de diagrama de cajaGracias Jim por tu orientación al paciente. ¡Tu código es genial!
Yo también lo aprendí. ¡Muchas gracias!


Re: Presentación de datos de existencias en forma de diagrama de cajaAquí hay una modificación que maneja la eliminación del contorno negro.

Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Stock Prices.jmp" );
dt << New Column( "tip", formula( Format( :Date, "yyyymmdd" ) ) );
dt << delete columns( "Date" );
dt << New Column( "new", set each value( Row() ) );
dt << New Column( "Direction", character, set each value( If( :Open <= :Close, "Increasing", "Decreasing" ) ) );
dt << run formulas;
Column( "tip" ) << deleteFormula;
dt:open << label;
dt:close << label;
gb = dt << Graph Builder(
Size( 1289, 456 ),
Show Control Panel( 0 ),
Variables( X( :new ), Y( :High ), Y( :Low, Position( 1 ) ), Color( :Direction ) ),
Elements( Bar( X, Y( 1 ), Y( 2 ), Legend( 10 ), Bar Style( "Interval" ) ) ),
SendToReport(
Dispatch( {}, "new", ScaleBox, {Interval( "new" ), Inc( 1 ), Minor Ticks( 0 )} ),
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
10,
Properties( 0, {Fill Color( light red )}, Item ID( "Decreasing", 1 ) ),
Properties( 1, {Fill Color( light green )}, Item ID( "Increasing", 1 ) ),
Properties( 0, {Line Color( 19 ), Line Width( 2 )}, Item ID( "High..Low", 1 ) )
)}
)
)
);
// Add the boxes to the chart
Report( gb )[framebox( 1 )] << add graphics script(
//halfDayincr = In Days( 1 ) / 2 * .8;
//days = (Col Max( :Date ) - Col Min( :Date )) / In Days( 1 );
halfDayincr = .4;
days = Col Max( :new ) - Col Min( :new );
Pen Size( 1 );
For( i = 1, i <= N Rows( dt ), i++,
If( :Open[i] <= :close[i],
Pen Color( light green );
Fill Color( light green );
,
Pen Color( light red );
Fill Color( light red );
);
Rect( :new[i] - halfDayincr, Max( :open[i], :close[i] ), :new[i] + halfDayincr, Min( :open[i], :close[i] ), 1 );
Rect( :new[i] - halfDayincr, Max( :open[i], :close[i] ), :new[i] + halfDayincr, Min( :open[i], :close[i] ), 0 );
);
);
Con respecto a cómo manualmente/interactivamente
- Arrastre las columnas alta y baja al área de colocación del eje Y
- Arrastre la nueva columna al área de colocación del eje X
- Haga clic con el botón derecho en el gráfico y seleccione Smoother=>Remove
- Haga clic con el botón derecho en el gráfico y seleccione Puntos=>Cambiar=>Barra
- Haga clic con el botón derecho en el gráfico y seleccione Barra=>Estilo de barra=>Intervalo
- Arrastre la columna Dirección al área de colocación de Color
- En la leyenda, haga clic derecho en el cuadro de color para Aumentar y seleccione Color de relleno => seleccione un color verde claro
- En la leyenda, haga clic derecho en el cuadro de color para disminuir y seleccione Color de relleno => seleccione un color rojo claro
- Ahora se deben agregar las casillas para cada alto y bajo.Esto se hace agregando un script gráfico a Graph Builder
- Haga clic derecho en el gráfico y seleccione Personalizar
- Haga clic en el cuadro + para agregar un nuevo script
- En el área del editor de secuencias de comandos, agregue la siguiente secuencia de comandos (la secuencia de comandos la desarrolla el usuario individual.En este caso, yo escribí el guión)
halfDayincr = 0.4;
days = Col Max( :new ) - Col Min( :new );
Pen Size( 1 );
For( i = 1, i <= N Rows( dt ), i++,
If( :Open[i] <= :Close[i],
Pen Color( light green );
Fill Color( light green );
,
Pen Color( light red );
Fill Color( light red );
);
Rect(
:new[i] - halfDayincr,
Max( :Open[i], :Close[i] ),
:new[i] + halfDayincr,
Min( :Open[i], :Close[i] ),
1
);
Rect(
:new[i] - halfDayincr,
Max( :Open[i], :Close[i] ),
:new[i] + halfDayincr,
Min( :Open[i], :Close[i] ),
0
);
);
Haga clic en Aceptar
Re: Presentación de datos de existencias en forma de diagrama de cajaGracias de nuevo Jim por crear una imagen tan innovadora.
Traté de crear el diagrama manualmente yo mismo, pero aún no pude.
Voy a tomarme el tiempo de Jim nuevamente y preguntarle si puedo explicar el proceso de hacer este diagrama manualmente. ¡Muchas gracias!
Principalmente quiero agregar un promedio móvil suave a este gráfico.
Además, ¿se puede quitar el marco negro de cada diagrama de caja? Porque he visto otras publicaciones que tienen recuadros sin bordes negros.

¡Gracias Jim!
Re: Presentación de datos de existencias en forma de diagrama de caja¡Gracias Jim!
Quiero fortalecer las funciones básicas y el estudio de la gramática. Ahora es directo a la respuesta.
Re: Presentación de datos de existencias en forma de diagrama de cajaCuando cambió de usar la columna Fecha, que es una columna de fecha JMP (la cantidad de segundos desde el 1 de enero de 1904), a la columna Nuevo, que es solo un número entero donde cada fila es solo 1 más que su valor anterior, necesitaba para cambiar el cálculo de las variables, "days" y "halfDayincr".El número de días es solo el número de filas, y el halfDayincr, que es la mitad del ancho del rectángulo a dibujar, es simplemente 0,4.

gb = dt << Graph Builder(
Size( 1289, 456 ),
Show Control Panel( 0 ),
Variables( X( :new ), Y( :High ), Y( :Low, Position( 1 ) ) ),
Elements( Bar( X, Y( 1 ), Y( 2 ), Legend( 10 ), Bar Style( "Interval" ) ) ),
SendToReport(
Dispatch(
{},
"new",
ScaleBox,
{ Interval( "new" ), Inc( 1 ),
Minor Ticks( 0 )}
),
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
10,
Properties( 0, {Line Width( 2 )}, Item ID( "High..Low", 1 ) )
)}
)
)
);
// Add the boxes to the chart
Report( gb )[framebox( 1 )] << add graphics script(
//halfDayincr = In Days( 1 ) / 2 * .8;
//days = (Col Max( :Date ) - Col Min( :Date )) / In Days( 1 );
halfDayincr = .4;
days = Col Max( :new ) - Col Min( :new );
Pen Color( black );
Pen Size( 2 );
For( i = 1, i <= N Rows( dt ), i++,
If( :Open[i] <= :close[i],
Fill Color( light green );
,
Fill Color( light red );
);
Rect( :new[i] - halfDayincr, Max( :open[i], :close[i] ), :new[i] + halfDayincr, Min( :open[i], :close[i] ), 1 );
Rect( :new[i] - halfDayincr, Max( :open[i], :close[i] ), :new[i] + halfDayincr, Min( :open[i], :close[i] ), 0 );
);
);
Es mi fuerte sugerencia que comience a estudiar el código proporcionado por la Comunidad, para que no se limite a solo poder cortarlo y pegarlo.Tómese el tiempo para leer la Guía de secuencias de comandos y también tómese el tiempo para estudiar el código proporcionado por la comunidad, hasta que comprenda cómo funciona.
Re: Presentación de datos de existencias en forma de diagrama de cajaTraté de no usar datos de especificaciones de fecha, pero terminé sin modificar JSL. No funcionó.
Como en JSL a continuación, ¿cómo dibujar un diagrama de caja con nuevos datos? ¡Muchas gracias!

dt = Open( "$SAMPLE_DATA/Stock Prices.jmp" );
dt << New Column( "tip", formula( Format( :Date, "yyyymmdd" ) ) );
dt << run formulas;
Column( "tip" ) << deleteFormula;
dt << delete columns( "Date" );
dt << New Column( "new", set each value( Row() ) );
dt:open << label;
dt:close << label;
gb = dt << Graph Builder(
Size( 1289, 456 ),
Show Control Panel( 0 ),
Variables( X( :new ), Y( :High ), Y( :Low, Position( 1 ) ) ),
Elements( Bar( X, Y( 1 ), Y( 2 ), Legend( 10 ), Bar Style( "Interval" ) ) ),
SendToReport(
Dispatch( {}, "new", ScaleBox, {Interval( "Day" ), Inc( 1 ), Minor Ticks( 0 )} ),
Dispatch( {}, "400", ScaleBox, {Legend Model( 10, Properties( 0, {Line Width( 2 )}, Item ID( "High..Low", 1 ) ) )} )
)
);
Report( gb )[framebox( 1 )] << add graphics script(
halfDayincr = In Days( 1 ) / 2 * .8;
days = (Col Max( :new ) - Col Min( :new )) / In Days( 1 );
Pen Color( black );
Pen Size( 2 );
For( i = 1, i <= N Rows( dt ), i++,
If( :Open[i] <= :close[i],
Fill Color( light green ),
Fill Color( light red )
);
Rect( :new[i] - halfDayincr, Max( :open[i], :close[i] ), :new[i] + halfDayincr, Min( :open[i], :close[i] ), 1 );
Rect( :new[i] - halfDayincr, Max( :open[i], :close[i] ), :new[i] + halfDayincr, Min( :open[i], :close[i] ), 0 );
);
);Re: Presentación de datos de existencias en forma de diagrama de cajaLas columnas que se muestran al hacer clic en un punto de datos son columnas que tienen establecida la propiedad de columna "Etiqueta".En mi código original, las columnas de apertura y cierre tienen sus valores de etiqueta establecidos.Todo lo que debe hacer es agregar una línea para cada una de las columnas a las que desea agregar la propiedad de columna Etiqueta.
Re: Presentación de datos de existencias en forma de diagrama de caja
Re: Presentación de datos de existencias en forma de diagrama de cajaSí, el eje X puede mostrar contenido que no sea la fecha.
Pero es mejor mostrar la etiqueta de fecha original cuando el mouse apunta sobre el gráfico.
Eso es lo que estaba pensando. Pero no sé cómo cambiar el código.
¡Gracias!
Re: Presentación de datos de existencias en forma de diagrama de cajaLo más probable es que tenga que cambiar el eje X a nominal y luego posiblemente modificar la secuencia de comandos de gráficos para adaptarse a ese cambio.
Re: Presentación de datos de existencias en forma de diagrama de cajaRe: Presentación de datos de existencias en forma de diagrama de cajaHola @lukasz
con respecto a los puntos decimales usando "." o "," tal vez puedas arreglar esto desde las preferencias como en la imagen de abajo. Sin embargo, supongo que todos los demás conjuntos de datos que está utilizando cambiarán por el mal...

En este caso, para modificar el formato de una columna específica en un archivo, puede usar el siguiente comando:
Format( x, "Currency", 20, <<Use Locale(0) );
Descripción completa en este enlace:
https://www.jmp.com/support/help/zh-cn/15.2/index.shtml#page/jmp/formatting-numbers.shtml
Permítanos saber si funciona.
Ron
Re: Presentación de datos de existencias en forma de diagrama de cajaOK, gracias, me daré cuenta de eso. Atentamente
Re: Presentación de datos de existencias en forma de diagrama de cajaLo que encontró con los datos devueltos por los datos de Yahoo Finance debe ser específico de la configuración del país. Los datos que me fueron devueltos en los EE. UU. no tuvieron que ser convertidos.Re: Presentación de datos de existencias en forma de diagrama de caja¡Muchas gracias! Traté de usar su código en los datos del sitio web de finanzas de yahoo, sin embargo, los datos de allí se guardan como caracteres con "." puntos decimales que no permitían convertir valores a valores numéricos correctos. El siguiente fragmento convierte valores en columnas y permite trazarlos correctamente. Gracias y saludos.
//open data
dt = open( "https://query1.finance.yahoo.com/v7/finance/download/URA?period1=1571303176&period2=1602925576&interval=1d&events=history&includeAdjustedClose=true" );
//change decimal point from "." to ",", otherwise later conversion to numeric format produces wrong results
nr = nrows(dt);
for (k = 1, k <= nr, k++,
dt:Open[k] = substitute(dt:Open[k], ".", ",");
dt:Close[k] = substitute(dt:Close[k], ".", ",");
dt:High[k] = substitute(dt:High[k], ".", ",");
dt:Low[k] = substitute(dt:Low[k], ".", ",");
dt:name("Adj Close")[k] = substitute(dt:name("Adj Close")[k], ".", ",");
);
//change format to numeric
dt:Open << Data Type( numeric ) << Modeling Type( continuous );
dt:Close << Data Type( numeric ) << Modeling Type( continuous );
dt:High << Data Type( numeric ) << Modeling Type( continuous );
dt:Low << Data Type( numeric ) << Modeling Type( continuous );
dt:name("Adj Close") << Data Type( numeric ) << Modeling Type( continuous );Re: Presentación de datos de existencias en forma de diagrama de cajaTuve un poco más de tiempo para investigar esto, y creo que la solución fácil a continuación podría ser una solución viable para usted.

Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Stock Prices.jmp" );
dt:open << label;
dt:close << label;
gb = dt << Graph Builder(
Size( 1289, 456 ),
Show Control Panel( 0 ),
Variables( X( :Date ), Y( :High ), Y( :Low, Position( 1 ) ) ),
Elements( Bar( X, Y( 1 ), Y( 2 ), Legend( 10 ), Bar Style( "Interval" ) ) ),
SendToReport(
Dispatch(
{},
"Date",
ScaleBox,
{ Interval( "Day" ), Inc( 1 ),
Minor Ticks( 0 )}
),
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
10,
Properties( 0, {Line Width( 2 )}, Item ID( "High..Low", 1 ) )
)}
)
)
);
// Add the boxes to the chart
Report( gb )[framebox( 1 )] << add graphics script(
halfDayincr = In Days( 1 ) / 2 * .8;
days = (Col Max( :Date ) - Col Min( :Date )) / In Days( 1 );
Pen Color( black );
Pen Size( 2 );
For( i = 1, i <= N Rows( dt ), i++,
If( :Open[i] <= :close[i],
Fill Color( light green );
,
Fill Color( light red );
);
Rect( :date[i] - halfDayincr, Max( :open[i], :close[i] ), :date[i] + halfDayincr, Min( :open[i], :close[i] ), 1 );
Rect( :date[i] - halfDayincr, Max( :open[i], :close[i] ), :date[i] + halfDayincr, Min( :open[i], :close[i] ), 0 );
);
);
Re: Presentación de datos de existencias en forma de diagrama de cajaSí, como señala Jim, Graph Builder puede hacer esto fácilmente. Sin embargo, a medida que obtenga más datos, es posible que desee considerar IR (gráficos de rango móvil individual), ya que estos le proporcionarán información sobre la coherencia/estabilidad de las métricas a lo largo del tiempo.
inkRe: presentación de datos bursátiles en forma de diagrama de cajaCreo que esto es lo mejor que JMP puede hacer sin secuencias de comandos.

Pero con un poco de esfuerzo, se podría escribir fácilmente un JSL que crearía los diagramas de velas japonesas.