Presentazione dei dati azionari sotto forma di box plotCiao a tutti,
i dati che descrivono i movimenti del prezzo delle azioni sono creati dal prezzo di apertura/chiusura e dal prezzo massimo/minimo. C'è un modo per creare un grafico a scatola (grafico a candela) in JMP con un corpo reale dal prezzo di apertura e chiusura e ombra superiore e inferiore con valori rispettivamente nei prezzi massimo (alto) e minimo (basso), come nell'immagine allegata o c'è modo migliore per farlo? Il tradizionale Trama a scatola L'elemento, tuttavia, mostra i box plot outlier o quantili e fornisce una visualizzazione compatta di una distribuzione di valori. Ho allegato una tabella di dati di esempio in cui sono forniti diversi timestamp e valori di prezzo (minimo, apertura, chiusura e massimo). Gradirei consigli e suggerimenti.

(fonte: Wikipedia)
Distinti saluti
AnaliticaGraficaScriptingRe: Presentazione dei dati di borsa sotto forma di box plotGrazie Jim per la tua paziente guida. Il tuo codice è fantastico!
L'ho imparato anch'io. Grazie mille!


Re: Presentazione dei dati di borsa sotto forma di box plotEcco una modifica che gestisce l'eliminazione del contorno nero

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 );
);
);
Per quanto riguarda come manualmente/interattivamente
- Trascina le colonne alta e bassa nell'area di rilascio dell'asse Y
- Trascina la nuova colonna nell'area di rilascio dell'asse X
- Fare clic con il tasto destro sul grafico e selezionare Smoother=>Remove
- Fare clic con il tasto destro sul grafico e selezionare Punti=>Cambia=>Barra
- Fare clic con il tasto destro sul grafico e selezionare Barra=>Stile barra=>Intervallo
- Trascina la colonna Direzione nell'area di rilascio Colore
- Nella legenda, fai clic con il pulsante destro del mouse sulla casella del colore per Crescente e seleziona Colore riempimento=>seleziona un colore verde chiaro
- Nella legenda fare clic con il tasto destro sulla casella del colore per diminuire e selezionare Colore riempimento=>selezionare un colore rosso chiaro
- Ora è necessario aggiungere le caselle per ogni alto e basso.Questo viene fatto aggiungendo uno script grafico a Graph Builder
- Fare clic con il tasto destro sul grafico e selezionare Personalizza
- Fare clic sulla casella + per aggiungere un nuovo script
- Nell'area dell'editor di script, aggiungi il seguente script (lo script è sviluppato dal singolo utente.In questo caso, ho scritto la sceneggiatura)
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
);
);
Fare clic su OK
Re: Presentazione dei dati di borsa sotto forma di box plotGrazie ancora Jim per aver creato un'immagine così innovativa.
Ho provato a creare il diagramma manualmente da solo, ma ancora non ci sono riuscito.
Prenderò di nuovo il tempo di Jim e chiederò se posso spiegare il processo di creazione manuale di questo diagramma. Grazie mille!
Voglio principalmente aggiungere una media mobile uniforme a questo grafico.
Inoltre, è possibile rimuovere la cornice nera di ogni diagramma a scatola? Perché ho visto altri post che hanno caselle senza bordi neri.

Grazie Jim!
Re: Presentazione dei dati di borsa sotto forma di box plotGrazie Jim!
Voglio rafforzare le funzioni di base e lo studio della grammatica. Ora è subito la risposta.
Re: Presentazione dei dati di borsa sotto forma di box plotQuando sei passato dall'utilizzo della colonna Data, che è una colonna data JMP (il numero di secondi dal 1 gennaio 1904), alla colonna Nuovo, che è solo un numero intero in cui ogni riga è solo 1 in più rispetto al valore precedente, avevi bisogno per modificare il calcolo delle variabili "days" e "halfDayincr".Il numero di giorni è solo il numero di righe e halfDayincr, che è la metà della larghezza del rettangolo da disegnare, è semplicemente 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 );
);
);
Consiglio vivamente di iniziare a studiare il codice fornito dalla Community, in modo da non limitarsi a poterlo solo copiare e incollare.Per favore, prenditi il tempo per leggere la Guida allo Scripting, e anche per studiare il codice fornito dalla community, finché non capisci come funziona.
Re: Presentazione dei dati di borsa sotto forma di box plotHo provato a non utilizzare i dati delle specifiche della data, ma ho finito per non modificare JSL. Non ha funzionato.
Come in JSL di seguito, come disegnare un diagramma a scatola con nuovi dati? Grazie mille!

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: Presentazione dei dati di borsa sotto forma di box plotLe colonne visualizzate quando si fa clic su un punto dati sono colonne in cui è impostata la proprietà della colonna "Etichetta".Nel mio codice originale, le colonne di apertura e chiusura hanno i loro valori di etichetta impostati.Tutto quello che dovresti fare è aggiungere una riga per ciascuna delle colonne a cui vuoi aggiungere la proprietà della colonna Etichetta.
Re: Presentazione dei dati di borsa sotto forma di box plot
Re: Presentazione dei dati di borsa sotto forma di box plotSì, l'asse X può visualizzare contenuti diversi dalla data.
Ma è meglio mostrare l'etichetta della data originale quando il mouse punta sul grafico.
E' quello che stavo pensando. Ma non so come cambiare il codice.
Grazie!
Re: Presentazione dei dati di borsa sotto forma di box plotMolto probabilmente dovrai modificare l'asse X in nominale e quindi eventualmente modificare lo script grafico per adattarsi a tale modifica.
Re: Presentazione dei dati di borsa sotto forma di box plotRe: Presentazione dei dati di borsa sotto forma di box plotCIAO @lukasz
rispetto ai punti decimali utilizzando "." o "," forse puoi risolvere questo problema dalle preferenze come nell'immagine qui sotto. Tuttavia, presumo che tutti gli altri set di dati che stai utilizzando cambieranno per il torto ...

In questo caso, per modificare solo il formato di una colonna specifica in un file è possibile utilizzare il seguente comando:
Format( x, "Currency", 20, <<Use Locale(0) );
Descrizione completa a questo link:
https://www.jmp.com/support/help/zh-cn/15.2/index.shtml#page/jmp/formatting-numbers.shtml
facci sapere se funziona.
Ron
Re: Presentazione dei dati di borsa sotto forma di box plotOK, grazie, lo noterò. Distinti saluti
Re: Presentazione dei dati di borsa sotto forma di box plotCiò che hai trovato con i dati restituiti dai dati di Yahoo Finance deve essere specifico per le impostazioni del Paese. I dati che mi sono stati restituiti negli Stati Uniti non hanno dovuto essere convertiti.Re: Presentazione dei dati di borsa sotto forma di box plotGrazie mille! Ho provato a utilizzare il tuo codice sui dati dal sito web di yahoo finance, tuttavia, i dati da lì vengono salvati come caratteri con "." punti decimali che non permettevano di convertire i valori in valori numerici corretti. Lo snippet seguente converte i valori in colonne e consente di tracciarli correttamente. Grazie e cordiali saluti.
//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: Presentazione dei dati di borsa sotto forma di box plotHo avuto un po' più di tempo per esaminare la questione e penso che la semplice soluzione di seguito potrebbe essere una soluzione praticabile per te.

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: Presentazione dei dati di borsa sotto forma di box plotSì, come sottolinea Jim, Graph Builder può farlo facilmente. Man mano che ottieni più dati, tuttavia, potresti prendere in considerazione l'IR (individual moving range charts) poiché questi forniranno informazioni sulla coerenza/stabilità delle metriche nel tempo.
inkRe: Presentazione dei dati azionari sotto forma di box plotPenso che questo sia il meglio che JMP possa fare senza script

Ma con un piccolo sforzo, si potrebbe facilmente scrivere qualche JSL che creerebbe i grafici Candlestick.