Darstellung von Bestandsdaten in Form eines BoxplotsHallo zusammen,
Die Daten, die Aktienkursbewegungen beschreiben, werden durch Eröffnungs-/Schlusskurs und Höchst-/Mindestkurs erstellt. Gibt es eine Möglichkeit, in JMP einen Boxplot (Candlestick-Chart) zu erstellen, der einen echten Körper aus Eröffnungs- und Schlusskurs und oberem und unterem Schatten mit Werten in maximalen (hohen) bzw. minimalen (niedrigen) Preisen hat, wie im beigefügten Bild oder ist da besserer Weg, das zu tun? Das traditionelle Box-Plot -Element hingegen zeigt Ausreißer- oder Quantil-Boxplots und bietet eine kompakte Ansicht einer Verteilung von Werten. Ich habe eine Beispieldatentabelle angehängt, in der mehrere Zeitstempel und Preiswerte (Min, Eröffnung, Schluss und Hoch) bereitgestellt werden. Für Hinweise und Anregungen wäre ich dankbar.

(Quelle: Wikipedia)
Mit freundlichen Grüßen
AnalytikGrafikSkripterstellungBetreff: Aktiendaten in Form von Boxplots darstellenDanke Jim für deine geduldige Anleitung. Dein Code ist großartig!
Ich habe es auch gelernt. Vielen Dank!


Betreff: Aktiendaten in Form von Boxplots darstellenHier ist eine Modifikation, die die Beseitigung der schwarzen Umrandung handhabt

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 );
);
);
In Bezug auf die manuelle/interaktive Vorgehensweise
- Ziehen Sie die oberen und unteren Spalten in den Ablagebereich der Y-Achse
- Ziehen Sie die neue Spalte in den Ablagebereich der X-Achse
- Klicken Sie mit der rechten Maustaste auf das Diagramm und wählen Sie Smoother => Remove
- Klicken Sie mit der rechten Maustaste auf das Diagramm und wählen Sie Punkte=>Ändern=>Balken
- Klicken Sie mit der rechten Maustaste auf das Diagramm und wählen Sie Balken=>Balkenstil=>Intervall
- Ziehen Sie die Spalte Richtung in den Drop-Bereich Farbe
- Klicken Sie in der Legende mit der rechten Maustaste auf das Farbfeld für Increasing und wählen Sie Fill Color => wählen Sie eine hellgrüne Farbe aus
- Klicken Sie in der Legende mit der rechten Maustaste auf das Farbfeld zum Verringern und wählen Sie Füllfarbe => wählen Sie eine hellrote Farbe
- Jetzt müssen die Felder für jedes Hoch und Tief hinzugefügt werden.Dies erfolgt durch Hinzufügen eines Grafikskripts zu Graph Builder
- Klicken Sie mit der rechten Maustaste auf das Diagramm und wählen Sie Anpassen
- Klicken Sie auf das Feld +, um ein neues Skript hinzuzufügen
- Fügen Sie im Skripteditorbereich das folgende Skript hinzu (das Skript wird vom einzelnen Benutzer entwickelt.In diesem Fall habe ich das Skript geschrieben)
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
);
);
Klicken Sie auf OK
Betreff: Aktiendaten in Form von Boxplots darstellenNochmals vielen Dank an Jim für die Erstellung eines so innovativen Bildes.
Ich habe versucht, das Diagramm selbst manuell zu erstellen, konnte es aber immer noch nicht.
Ich nehme mir noch einmal Jims Zeit und frage, ob ich den Prozess der manuellen Erstellung dieses Diagramms erklären kann. Vielen Dank!
Ich möchte diesem Diagramm hauptsächlich einen glatten gleitenden Durchschnitt hinzufügen.
Kann außerdem der schwarze Rahmen jedes Kästchendiagramms entfernt werden? Weil ich andere Beiträge gesehen habe, die Kästchen ohne schwarze Ränder haben.

Danke Jim!
Betreff: Aktiendaten in Form von Boxplots darstellenDanke Jim!
Ich möchte die Grundfunktionen stärken und Grammatik studieren. Jetzt geht es direkt zur Antwort.
Betreff: Aktiendaten in Form von Boxplots darstellenAls Sie von der Verwendung der Spalte Date, die eine JMP-Datumsspalte (die Anzahl der Sekunden seit dem 1. Januar 1904) ist, zur Spalte New gewechselt haben, die nur eine Ganzzahl ist, bei der jede Zeile nur 1 mehr als der vorherige Wert ist, mussten Sie um die Berechnung der Variablen "days" und "halfDayincr" zu ändern.Die Anzahl der Tage ist einfach die Anzahl der Zeilen, und der halbe Tagincr, der halb so breit ist wie das zu zeichnende Rechteck, ist einfach 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 );
);
);
Ich empfehle dringend, dass Sie anfangen, den von der Community bereitgestellten Code zu studieren, damit Sie nicht darauf beschränkt sind, ihn nur auszuschneiden und einzufügen.Bitte nehmen Sie sich die Zeit, den Skriptleitfaden zu lesen, und nehmen Sie sich auch die Zeit, den von der Community bereitgestellten Code zu studieren, bis Sie verstehen, wie er funktioniert.
Betreff: Aktiendaten in Form von Boxplots darstellenIch habe versucht, keine Datumsangaben zu verwenden, habe JSL aber nicht geändert. Es hat nicht funktioniert.
Wie zeichnet man wie in JSL unten ein Boxdiagramm mit neuen Daten? Vielen Dank!

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 );
);
);Betreff: Aktiendaten in Form von Boxplots darstellenDie Spalten, die angezeigt werden, wenn Sie auf einen Datenpunkt klicken, sind Spalten, für die die Spalteneigenschaft „Label“ festgelegt ist.In meinem ursprünglichen Code haben die Open- und Close-Spalten ihre Label-Werte festgelegt.Alles, was Sie tun müssen, ist, eine Zeile für jede der Spalten hinzuzufügen, denen Sie die Spalteneigenschaft "Beschriftung" hinzufügen möchten.
Betreff: Aktiendaten in Form von Boxplots darstellen
Betreff: Aktiendaten in Form von Boxplots darstellenJa, die X-Achse kann andere Inhalte als das Datum anzeigen.
Es ist jedoch besser, die ursprüngliche Datumsbeschriftung anzuzeigen, wenn die Maus über die Grafik zeigt.
Das habe ich mir gedacht. Aber ich weiß nicht, wie ich den Code ändern soll.
Danke!
Betreff: Aktiendaten in Form von Boxplots darstellenSie müssen höchstwahrscheinlich die X-Achse auf nominal ändern und dann möglicherweise das Grafikskript ändern, um diese Änderung zu berücksichtigen.
Betreff: Aktiendaten in Form von Boxplots darstellenBetreff: Aktiendaten in Form von Boxplots darstellenHallo @lukasz
in Bezug auf Dezimalpunkte mit "." oder "," vielleicht können Sie dies in den Einstellungen wie im Bild unten beheben. Ich würde jedoch davon ausgehen, dass alle anderen Datensätze, die Sie verwenden, sich für das falsche ändern werden ...

In diesem Fall können Sie den folgenden Befehl verwenden, um nur das Format einer bestimmten Spalte in einer Datei zu ändern:
Format( x, "Currency", 20, <<Use Locale(0) );
Vollständige Beschreibung unter diesem Link:
https://www.jmp.com/support/help/zh-cn/15.2/index.shtml#page/jmp/formatting-numbers.shtml
lass uns wissen, ob es funktioniert.
Ron
Betreff: Aktiendaten in Form von Boxplots darstellenOkay, danke, das werde ich mir merken. Mit freundlichen Grüßen
Betreff: Aktiendaten in Form von Boxplots darstellenWas Sie mit den von den Yahoo Finance-Daten zurückgegebenen Daten gefunden haben, muss länderspezifisch sein. Die Daten, die mir in den USA zurückgeschickt wurden, mussten nicht konvertiert werden.Betreff: Aktiendaten in Form von Boxplots darstellenVielen Dank! Ich habe versucht, Ihren Code für die Daten von der Yahoo Finance-Website zu verwenden, aber die Daten von dort werden als Zeichen mit "." Dezimalpunkte, die es nicht erlaubten, Werte in korrekte numerische Werte umzuwandeln. Das folgende Snippet konvertiert Werte in Spalten und ermöglicht es, sie korrekt zu zeichnen. Vielen Dank und beste Grüße.
//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 );Betreff: Aktiendaten in Form von Boxplots darstellenIch hatte etwas mehr Zeit, um mir das anzusehen, und ich denke, die einfache Lösung unten könnte eine praktikable Lösung für Sie sein.

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 );
);
);
Betreff: Aktiendaten in Form von Boxplots darstellenJa, wie Jim betont, kann Graph Builder dies ganz einfach tun. Wenn Sie jedoch mehr Daten erhalten, sollten Sie IR (Individual Moving Range Charts) in Betracht ziehen, da diese einen Einblick in die Konsistenz/Stabilität der Metriken im Laufe der Zeit geben.
inkRe: Darstellung von Bestandsdaten in Form eines BoxplotsIch denke, das ist das Beste, was JMP ohne Skripting tun kann

Aber mit ein wenig Mühe könnte man leicht eine JSL schreiben, die die Candlestick-Plots erstellen würde.