반응형

주가 데이터 와 이동평균을 Grafana의 차트에 표시해주기위환 MySQL 쿼리 입니다.

일 배치로 이동평균을 계산해 놓을수 도 있지만 좁은 기간의 데이터 조회가 빈번할 때는

쿼리에서 이동평균을 계산해도 괜찮을 것 같아 쿼리를 제작하였습니다.

이동평균을 주가 뿐만 아니라 DAU등에 접목해도 좋을 것 같습니다.

 

✅ 데이터 구조

event_date symbol_code tradePrice
2025-04-18 35420    187,500
2025-04-21 35420    187,500
2025-04-22 35420    193,700
2025-04-23 35420    192,900
2025-04-24 35420    191,500
2025-04-25 35420    193,500
2025-04-28 35420    195,500
2025-04-29 35420    196,500
2025-04-30 35420    200,500
2025-05-02 35420    197,400

 

 

✅ 쿼리

set @symbol_code = '035420';    -- 종목 코드
set @interval_day = 100;        -- 현재일 기준 조회 기간
with sub as (
    select event_date, tradePrice, day_5_moving_avg, day_10_moving_avg, day_20_moving_avg, day_60_moving_avg
    from (
        SELECT event_date, symbol_code, tradePrice
            , ROUND(AVG(tradePrice)OVER (ORDER BY event_date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW), 2) AS day_5_moving_avg  -- 5일 이동 평균
            , ROUND(AVG(tradePrice)OVER (ORDER BY event_date ROWS BETWEEN 9 PRECEDING AND CURRENT ROW), 2) AS day_10_moving_avg  -- 10일 이동 평균
            , ROUND(AVG(tradePrice)OVER (ORDER BY event_date ROWS BETWEEN 19 PRECEDING AND CURRENT ROW), 2) AS day_20_moving_avg  -- 20일 이동 평균
            , ROUND(AVG(tradePrice)OVER (ORDER BY event_date ROWS BETWEEN 59 PRECEDING AND CURRENT ROW), 2) AS day_60_moving_avg  -- 60일 이동 평균
        FROM tbl_stock_list_kor
        WHERE event_date >= date_add(current_date, interval (abs(@interval_day) + 100) * -1 day)
            and event_date <= current_date
            and symbol_code = @symbol_code
    ) as ta
    where event_date >= date_add(current_date, interval abs(@interval_day) * -1 day) and event_date <= current_date
)
select cast(ta.event_date as char(10)) as event_date
    , (case tb.rno when 1 then '주가'
                when 2 then '5일선'
                when 3 then '10일선'
                when 4 then '20일선'
                when 5 then '60일선'
                end) as legend
, (case tb.rno when 1 then ta.tradePrice
                when 2 then ta.day_5_moving_avg
                when 3 then ta.day_10_moving_avg
                when 4 then ta.day_20_moving_avg
                when 5 then ta.day_60_moving_avg
                end) as price
from sub as ta
cross join (select 1 rno union select 2 union select 3 union select 4 union select 5) as tb
order by event_date asc, legend asc;

 

✅ 쿼리 실행 결과

event_date legend price
2025-04-29 10일선   190,660
2025-04-29 20일선   189,630
2025-04-29 5일선   193,980
2025-04-29 60일선   206,630
2025-04-29 주가   196,500
2025-04-30 10일선   192,270
2025-04-30 20일선   189,875
2025-04-30 5일선   195,500
2025-04-30 60일선   206,330
2025-04-30 주가   200,500

 

✅ Chart

반응형

+ Recent posts