박스 플롯 형태로 주식 데이터 제시모두들 안녕,
주가 움직임을 설명하는 데이터는 시가/종가 및 최대/최소 가격으로 생성됩니다. 첨부된 그림과 같이 각각 최대(높은) 가격과 최소(낮은) 가격의 값을 갖는 시가 및 종가와 위쪽 및 아래쪽 그림자의 실제 몸체를 갖는 JMP에서 박스 플롯(촛대형 차트)을 만들 수 있는 방법이 있습니까? 더 좋은 방법은? 전통적인 박스 플롯 그러나 요소는 이상치 또는 분위수 상자 그림을 표시하고 값 분포에 대한 간략한 보기를 제공합니다. 여러 타임스탬프와 가격 값(최소, 시가, 종가 및 고가)이 제공되는 예제 데이터 테이블을 첨부했습니다. 힌트와 제안에 감사드립니다.

(출처: 위키피디아)
친애하는
해석학제도법스크립팅Re: 박스 플롯 형태로 주식 데이터를 제시합니다.환자 안내에 대해 Jim에게 감사드립니다. 귀하의 코드는 훌륭합니다!
저도 배웠습니다. 정말 감사합니다!


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를 선택합니다.
- 차트를 마우스 오른쪽 버튼으로 클릭하고 Points=>Change=>Bar를 선택합니다.
- 차트를 마우스 오른쪽 버튼으로 클릭하고 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
);
);
확인을 클릭하십시오
Re: 박스 플롯 형태로 주식 데이터를 제시합니다.이러한 혁신적인 이미지를 만들어준 Jim에게 다시 한 번 감사드립니다.
다이어그램을 수동으로 직접 만들려고 했지만 여전히 만들 수 없었습니다.
다시 Jim의 시간을 가지고 이 다이어그램을 수동으로 만드는 과정을 설명할 수 있는지 물어볼 것입니다. 매우 감사합니다!
주로 이 그래프에 부드러운 이동 평균을 추가하고 싶습니다.
또한 각 박스 다이어그램의 검은색 프레임을 제거할 수 있습니까? 검은색 테두리가 없는 상자가 있는 다른 게시물을 본 적이 있기 때문입니다.

고마워요!
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: 박스 플롯 형태로 주식 데이터를 제시합니다.데이터 요소를 클릭할 때 표시되는 열은 "레이블" 열 속성이 설정된 열입니다.내 원래 코드에서 열기 및 닫기 열에는 레이블 값이 설정되어 있습니다.레이블 열 속성을 추가하려는 각 열에 대한 줄을 추가하기만 하면 됩니다.
Re: 박스 플롯 형태로 주식 데이터를 제시합니다.
Re: 박스 플롯 형태로 주식 데이터를 제시합니다.예, X축은 날짜 이외의 내용을 표시할 수 있습니다.
하지만 마우스가 그래프 위에 있을 때 원래 날짜 레이블을 표시하는 것이 좋습니다.
그게 제가 생각한 것입니다.하지만 코드를 변경하는 방법을 모르겠습니다.
감사해요!
Re: 박스 플롯 형태로 주식 데이터를 제시합니다.대부분의 경우 X축을 공칭으로 변경한 다음 해당 변경 사항을 수용하도록 그래픽 스크립트를 수정해야 할 수 있습니다.
Re: 박스 플롯 형태로 주식 데이터를 제시합니다.Re: 박스 플롯 형태로 주식 데이터를 제시합니다.안녕 @lukasz
"."를 사용하여 소수점에 대해 또는 "," 아마도 아래 그림과 같이 기본 설정에서 수정할 수 있습니다. 그러나 나는 당신이 사용하고 있는 다른 모든 데이터 세트가 잘못 변경될 것이라고 가정합니다...

이 경우 하나의 파일에서 특정 열의 형식을 수정하려면 다음 명령을 사용할 수 있습니다.
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: 박스 플롯 형태로 주식 데이터를 제시합니다.매우 감사합니다! Yahoo Finance 웹사이트의 데이터에 귀하의 코드를 사용하려고 했지만 데이터가 "." 문자로 저장됩니다. 값을 올바른 숫자 값으로 변환할 수 없는 소수점. 아래 스니펫은 열의 값을 변환하고 올바르게 플로팅할 수 있도록 합니다. 감사합니다.
//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(개별 이동 범위 차트)을 고려할 수 있습니다.
inkRe: 박스 플롯 형태로 주식 데이터 제시JMP가 스크립팅 없이 할 수 있는 최선이라고 생각합니다.

그러나 약간의 노력을 기울이면 캔들스틱 플롯을 생성하는 JSL을 쉽게 작성할 수 있습니다.