ボックス プロットの形式で株式データを提示するみなさん、こんにちは。
株価の動きを表すデータは、始値/終値と最大値/最小値によって作成されます。 添付の写真のように、JMP でボックス プロット (ローソク足チャート) を作成する方法はありますか?それを行うより良い方法は? 伝統的な箱ひげ図ただし、要素は外れ値または分位ボックス プロットを示し、値の分布のコンパクトなビューを提供します。 いくつかのタイムスタンプと価格値 (最低、始値、終値、高値) が提供されているデータ テーブルの例を添付しました。 ヒントや提案をいただければ幸いです。

(出典:ウィキペディア)
よろしくお願いします
分析グラフィックスクリプティングRe: 株式データをボックス プロット形式で提示する辛抱強く指導してくれたジムに感謝します。あなたのコードは素晴らしいです!
私も勉強になりました、ありがとうございました!


Re: 株式データをボックス プロット形式で提示するこれは、黒い輪郭の除去を処理する変更です

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 );
);
);
手動/インタラクティブに行う方法について
- 高い列と低い列を Y 軸のドロップ領域にドラッグします
- 新しい列を X 軸のドロップ領域にドラッグします
- チャートを右クリックし、Smoother=>Remove を選択します。
- チャートを右クリックし、ポイント=>変更=>バーを選択します
- チャートを右クリックし、Bar=>Bar Style=>Interval を選択します。
- [方向] 列を [色] ドロップ領域にドラッグします
- 凡例で、[増加] のカラー ボックスを右クリックし、[塗りつぶしの色] を選択します => 薄緑色を選択します
- 凡例で、減少するカラーボックスを右クリックし、[塗りつぶしの色] を選択します => 明るい赤色を選択します
- ここで、それぞれの高値と安値のボックスを追加する必要があります。これは、Graph Builder にグラフィック スクリプトを追加することによって行われます。
- グラフを右クリックし、[カスタマイズ] を選択します
- + ボックスをクリックして、新しいスクリプトを追加します。
- スクリプト エディター領域で、次のスクリプトを追加します (スクリプトは個々のユーザーによって開発されます。この場合、私はスクリプトを書きました)
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
);
);
[OK] をクリックします。
Re: 株式データをボックス プロット形式で提示するこのような革新的なイメージを作成してくれたジムにもう一度感謝します。
自分で図を手動で作成しようとしましたが、それでもできませんでした。
もう一度ジムに時間を割いて、この図を手動で作成するプロセスを説明できるかどうか尋ねます.どうもありがとうございます!
私は主に、このグラフに滑らかな移動平均を追加したいと考えています。
また、各ボックス図の黒枠は外せますか?黒い枠のないボックスがある他の投稿を見たからです。

ありがとうジム!
Re: 株式データをボックス プロット形式で提示するありがとうジム!
基本機能や文法の勉強を強化したい。これで答えは一直線。
Re: 株式データをボックス プロット形式で提示するJMP の日付列 (1904 年 1 月 1 日からの秒数) である Date 列の使用から、各行が以前の値よりも 1 だけ大きい整数である New 列に変更した場合、変数「days」と「halfDayincr」の計算を変更します。日数は単なる行数であり、描画する四角形の幅の半分である halfDayincr は単純に .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 );
);
);
コミュニティが提供するコードの学習を開始することを強くお勧めします。そのため、カット アンド ペーストだけに制限されることはありません。時間をかけてスクリプト ガイドを読み、コミュニティが提供するコードを学習して、その仕組みを理解してください。
Re: 株式データをボックス プロット形式で提示するdate-spec データを使用しないようにしましたが、結局 JSL を変更しませんでした。うまくいきませんでした。
以下の JSL のように、新しいデータでボックス ダイアグラムを描画する方法は?どうもありがとうございました!

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: 株式データをボックス プロット形式で提示するデータ ポイントをクリックしたときに表示される列は、「ラベル」列プロパティが設定された列です。元のコードでは、open 列と close 列に Label 値が設定されています。必要なのは、ラベル列プロパティを追加する列ごとに行を追加することだけです。
Re: 株式データをボックス プロット形式で提示する
Re: 株式データをボックス プロット形式で提示するはい、X 軸には日付以外のコンテンツを表示できます。
ただし、マウスがグラフの上にあるときに、元の日付ラベルを表示する方が適切です。
と思っていたのですが、コードの変更方法がわかりません。
ありがとう!
Re: 株式データをボックス プロット形式で提示するほとんどの場合、X 軸を公称に変更してから、その変更に対応するようにグラフィックス スクリプトを変更する必要があります。
Re: 株式データをボックス プロット形式で提示するRe: 株式データをボックス プロット形式で提示するやあ@lukasz
小数点に関しては「.」を使用します。または "," おそらく、下の図のように設定からこれを修正できます。 それでも、使用している他のすべてのデータセットが間違って変更されると思います...

この場合、1 つのファイル内の特定の列の形式を修正するには、次のコマンドを使用できます。
Format( x, "Currency", 20, <<Use Locale(0) );
このリンクの完全な説明:
https://www.jmp.com/support/help/zh-cn/15.2/index.shtml#page/jmp/formatting-numbers.shtml
動作するかどうかお知らせください。
ロン
Re: 株式データをボックス プロット形式で提示するわかりました、ありがとう、私はそれに気づきます。 よろしくお願いします
Re: 株式データをボックス プロット形式で提示するYahoo Finance データから返されたデータで見つけたものは、国設定固有のものである必要があります。 米国で返されたデータは、変換する必要がありませんでした。Re: 株式データをボックス プロット形式で提示するどうもありがとうございます! ヤフーファイナンスサイトのデータにあなたのコードを使用しようとしましたが、そこからのデータは「.」付きの文字として保存されます。値を正しい数値に変換できなかった小数点。 以下のスニペットは、列の値を変換し、正しくプロットできるようにします。 ありがとうございます。よろしくお願いします。
//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: 株式データをボックス プロット形式で提示するこれを調べる時間がもう少しありましたが、以下の簡単な解決策が実行可能な解決策になると思います。

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: 株式データをボックス プロット形式で提示するはい、Jim が指摘するように、Graph Builder はこれを簡単に行うことができます。 ただし、より多くのデータを取得するにつれて、IR (個々の移動範囲チャート) を検討することをお勧めします。IR (個々の移動範囲チャート) は、時間の経過に伴うメトリックの一貫性/安定性に関する洞察を提供します。
inkRe: ボックス プロットの形式で株式データを提示するこれは、JMP がスクリプトなしで実行できる最善の方法だと思います。

しかし、少し努力すれば、ローソク足プロットを作成する JSL を簡単に作成できます。