[ Splunk Project ] Splunk로 주식 분석 | Phase 4. 현재 나의 현황 대시보드 만들기 2
본문 바로가기

Splunk/Splunk Project

[ Splunk Project ] Splunk로 주식 분석 | Phase 4. 현재 나의 현황 대시보드 만들기 2

728x90
반응형

우선 최근 90일간의 삼성전자에 대한 차트를 stats 명령을 사용해서 그려보자.

 

그 전에 나는 최근 7일 정도의 기록을 가지고 있기 때문에

이 프로젝트와는 맞지 않아서 있는 원래 있는 데이터를 지우고 Phase 1.의 방식으로 약 90일의 데이터를 가지고 왔다.

 

stats 은 특정 필드들에 대해서 그룹화 하고 그룹된 값들에 대한 통계값을 구하거나,

이벤트 갯수를 세는 등의 작업을 해주는 명령이다.

index="kospi" earliest=-90d code=005930*
| eval k_code = code
| rex field=code "^(?<code>\d+).KS"
| lookup kospi_200 code OUTPUT name 
| stats avg(Close) as Close by _time

이번에 수집한 데이터는 야후에서 받아온 데이터라서 한국 거래 코드 KS가 붙어있다.

수집 된 데이터는 코드 명 뒤에 한국 거래 코드라는 KS 가 붙어 있기 때문에 "rex" 명령어를 이용해 정규 표현식으로 필드를 새로 추출했다.

timechart 명령을 통해서도 비슷하게 그림을 그릴 수 있다.

timechart 는 _time 필드를 X축으로 해서 시계열에 대한 데이터 쉽게 그룹화 할 수 있도록 해준다. timechart 의 강력한 옵션은 span 인데 span을 통해서 aggregation 할 시간의 단위(1d(1일) , 1m (1분), 1s (1 초) 1mon(1 달) , 1w(1주))를 설정한다.

둘의 차이는 timechart를 이용해서 그릴 경우 주말이나 공휴일에 장이 열리지 않은 경우 데이터가 NULL 로 표시가 된다는 점 때문에, 여기에서는 timechart 보다는 stats 을 이용해서 그렸다.

주식에서 많이 사용되는 이동 평균선을 그려보자.

index="kospi" earliest=-90d code=005930*
| eval k_code = code
| rex field=code "^(?<code>\d+).KS"
| lookup kospi_200 code OUTPUT name 
| sort _time
| streamstats window=7 current=true avg(Close) as ma7
| stats avg(Close) as Close, avg(ma7) as MA7 by _time

streamstats 을 이용하면 이벤트의 순서에 따라서 stream 형태로 이벤트를 모아서 그에 따른 함수를 사용할 수 있다.

여기에서는 "window=7" 로 설정해서 _time 순서대로 7개의 이벤트를 모아서 "avg(Close)" Close 값에 대한 평균을 구한다. 이 때 "current=true" 로 설정해서 현재 값도 계산에 포함하게 해준다.

우선 이렇게 만들어진 차트를 기존에 있던 대시보드에 추가하자.

여기에서 차트에 몇 가지 변화를 줄거다.

1. "Close" 와 "MA7" 이 겹치는 부분도 있고, 어떤 선인지 잘 구별이 되지 않기 때문에 MA7 의 선 스타일을 바꿔주고 싶다.

2. 내 주식별로 개별 차트를 다 그려 줄 수 없기 때문에, "나의 자산 현황" 또는 "현재 주식 가격" 의 각 항목을 누르면 그에 맞는 차트를 보여주고 싶다.

 

자! 이제 일을 시작해 보자.

이제 대시보드를 편집 모드로 들어간다

차트의 ... 클릭 후 드릴다운 편집

 

  • 클릭시 변수를 할당할 수 있도록 한다.
  • 차트가 가지고 있는 값들 중 "trellis"값을 사용한다.
  • 여기서 기대하는 것은 클릭 했을 때 종목명이 변수로 들어오는 것이다.

이번에는 아래 차트에서 똑같이 드릴다운을 편집하도록 한다.

 

... 에서 드릴다운 편집 선택

차트에서 검색 편집을 클릭

검색 문을 다음처럼 편집한다.

앞에서 code 로 검색하는 부분을 지우고, lookup 이후 드릴다운 변수로 들어온 "stock_code" 로 필터링 하도록 수정했다.

대시보드에서는 변수는 변수명에 앞뒤로 "$" 를 추가해서 표현한다.

index="kospi" earliest=-90d 
| eval k_code = code
| rex field=code "^(?<code>\d+).KS"
| lookup kospi_200 code OUTPUT name 
| where name = "$stock_code$"
| sort _time
| streamstats window=7 current=true avg(Close) as ma7
| stats avg(Close) as Close, avg(ma7) as MA7 by _time

이제 대시보드 편집의 소스를 클릭해서 XML을 수정하도록 하자.

"<panel>" 로 되어있는 곳에 "depends" 속성을 추가하고 앞에서 설정한 변수 명으로 설정한다.

그리고 차트 제목에도 주식 종목에 대한 이름을 추가 하도록 하자

...
    <panel depends="$stock_code$">
      <title>$stock_code$  주가 변동 그래프</title>
      <chart>
        <search>
          <query>index="kospi" earliest=-90d 
| eval k_code = code
| rex field=code "^(?&lt;code&gt;\d+).KS"
| lookup kospi_200 code OUTPUT name 
| where name = "$stock_code$"
| sort _time
| streamstats window=7 current=true avg(Close) as ma7
| stats avg(Close) as Close, avg(ma7) as MA7 by _time</query>
          <earliest>0</earliest>
          <latest></latest>
          <sampleRatio>1</sampleRatio>

...

이렇게 하면 2번째 미션은 완료되었다. 소스로 들어온 김에 1번도 후딱 해치우자.

차트에 보면 많은 옵션들이 포함되어 있는데 이중에서 아래 옵션을 추가한다. JSON MAP 형태로 "Close" 필드에는 실선을 "MA7" 에는 점선으로 표현한다.

더 많은 옵션은 스플렁크 메뉴얼을 참조하자

https://docs.splunk.com/Documentation/Splunk/8.1.1/Viz/ChartConfigurationReference

 

Chart configuration reference - Splunk Documentation

This documentation does not apply to the most recent version of Splunk® Enterprise. Click here for the latest version. Download topic as PDF Chart configuration reference Chart overview The <chart> element is a panel visualization that is highly configura

docs.splunk.com

<option name="charting.fieldDashStyles">{"Close":"solid", "MA7":"dash"}</option>

추가한 소스는 아래와 같다.

  <row>
    <panel depends="$stock_code$">
      <title>$stock_code$ 주가 변동 그래프</title>
      <chart>
        <search>
          <query>index="kospi" earliest=-90d 
| eval k_code = code
| rex field=code "^(?&lt;code&gt;\d+).KS"
| lookup kospi_200 code OUTPUT name 
| where name = "$stock_code$"
| sort _time
| streamstats window=7 current=true avg(Close) as ma7
| stats avg(Close) as Close, avg(ma7) as MA7 by _time</query>
          <earliest>0</earliest>
          <latest></latest>
          <sampleRatio>1</sampleRatio>
        </search>
        <option name="charting.axisLabelsX.majorLabelStyle.overflowMode">ellipsisNone</option>
        <option name="charting.axisLabelsX.majorLabelStyle.rotation">0</option>
        <option name="charting.axisTitleX.visibility">visible</option>
        ...
        <option name="charting.fieldDashStyles">{"Close":"solid", "MA7":"dash"}</option>
        <drilldown>
          <unset token="stock_code"></unset>
        </drilldown>
      </chart>
    </panel>
  </row>

이제 저장을 하게 되면 다음 처럼 "주가 변동 그래프"가 보이지 않는다.

 

이 후 "나의 자산 현황"에서 값을 클릭하면 다음처럼 차트가 보이게 된다.

차트 제목에 클릭한 주식의 이름이, 그리고 MA7에 대한 선이 점선으로 바뀐것도 확인 할 수 있다.

 

그런데

이대로 만들면 예상과 다르게 삼성전자만 그래프가 나오고 셀트리온 그래프는 나오지 않는다.

그 이유는 애초에 위의 검색이 참조하는 데이터가 내가 파이썬 코드로 수집한 데이터를 기반으로 하는데

셀트리온 데이터는 애초에 파이썬 코드로 수집한 데이터 안에 없기 때문이다.

 

그래서 나는 원래 있던 데이터를 모두 지우고

파이썬 코드가 참조하는 kospi_200.csv 파일에 셀트리온에 대한 정보를 넣어 수정한 후에

맨 마지막 줄이 삽입한 정보다.

 

python3 stock_monitor.py --start_date 2023-01-01 --end_date 2023-06-21

위의 명령어를 이용하여 데이터를 수집하였다.

 

주의할 점은 이 명령어를 돌리는 환경이 jupyter notebook이 아니고, 그냥 python 환경이라서

조금 변경해야하는 사항이 있다.

args = parser.parse_args('')
위의 코드를 아래의 코드로 변경해서 돌려야한다.
args = parser.parse_args()

 

이렇게 수정을 해서 온전한? 데이터를 받아오면

셀트리온 자산 박스를 클릭하면 원하는 그래프가 짜잔하고 나온다.

 

여기에서 다시 "주가 변동 그래프" 에서 선을 클릭하면 다음처럼 아래 차트가 사라진다.

 

728x90
반응형