반응형
주가 데이터 와 이동평균을 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
반응형