EOM(Ease of Movement)
주가와 거래량 간의 관계를 분석하여 주가 변동에 거래량의 영향 정도를 나타내는 기술적 지표입니다.
$$\begin{align}\text{중간점} &= \frac{\text{당일고가} + \text{당일저가}}{2} \\ \text{중간점변화} & = \text{당일 중간점} - \text{전일 중간점}\\ \text{박스비율} & = \frac{\text{거래량}}{(\text{당일고가} - \text{당일저가})\cdot \text{조정계수}}\\EOM &= \frac{\text{중간점변화}}{\text{박스비율}}\\& \text{sma(EOM, n) 사용} \end{align}$$조정계수는 일반적으로 100000 또는 1000000과 같은 큰 숫자를 사용하여 EOM 값이 지나치게 작아지는 것을 방지하고 일반적으로 EOM 값보다는 14일 이동평균값을 사용합니다.
EOM이 높을수록 적은 거래량으로 가격 변화가 쉽게 일어남을 나타냅니다.
- > 0
- 매수세 우세로 가격 상승이 쉬움을 나타냄
- EOM ↑ → 작은 거래량에 주가의 상승이 쉽게 일어남
- < 0
- 매도세 우세로 가격 하락이 쉬움을 나타냄
- EOM ↓ → 작은 거래량에 주가의 하락이 쉽게 일어남
- 0선 교차
- 상향돌파 : 매수신호로 상승추세로의 전환가능성을 시사
- 하향돌파: 매도신호로 하락추세로 전환 가능성 시사
- 디버전스
- 강세 디버전스: 가격 하락, EOM 상승의 경우로 매수신호로 해석 가능
- 하락 디버전스: 가격 상승, EOM 하락의 경우로 매도신호로 해석 가능
- EOM은 거래량을 고려하는 지표이지만, 거래량 자체의 절대적인 크기보다는 가격 변동과의 상대적인 관계를 나타냅니다.
- EOM은 추세 추종 지표로 분류될 수 있지만, 횡보장에서는 잦은 거짓 신호가 발생할 수 있습니다. 따라서 추세가 명확한 시장에서 사용하는 것이 효과적입니다.
- EOM은 다른 기술적 지표와 마찬가지로 후행성 지표이므로, 미래의 가격 움직임을 정확하게 예측하는 데 한계가 있습니다.
- EOM을 단독으로 사용하기보다는 다른 지표(예: 이동평균선, MACD, RSI)와 함께 분석하여 신호의 신뢰도를 높이는 것이 중요합니다.
- 분석 기간(n 값) 설정에 따라 EOM의 민감도가 달라질 수 있으므로, 자신이 분석하는 대상과 투자 전략에 맞는 최적의 기간을 설정하는 것이 중요합니다.
EOM을 계산하기 위한 UDF입니다.
def calculate_eom(data, period=14, adjust_factor=100000): midpoint=(data["High"]+data["Low"])/2 midpoint_change = midpoint.diff() box_ratio = (data['Volume'] / ((data["High"]-data["Low"]) * adjust_factor)).replace([np.inf, -np.inf], 0) # ZeroDivisionError 처리 eom = midpoint_change / box_ratio if period>1: eom_ma=eom.rolling(window=period).mean() return eom_ma else: return eom #그래프 작성 def eom_plot(data, period=14, adjust_factor=100000): eom=calculate_eom(data, period=period, adjust_factor=adjust_factor) plt.plot(eom, label="EOM") plt.axhline(0, color="gray") plt.legend(loc="upper left") plt.grid(True)
특정한 기간의 주가자료에 대해 봉차트와 MACD 그리고 EOM을 비교합니다.
import numpy as np import pandas as pd import yfinance as yf import matplotlib.pyplot as plt import matplotlib.dates as mpl_dates plt.rcParams['font.family'] = 'Malgun Gothic' plt.rcParams['axes.unicode_minus'] = False st=pd.Timestamp(2024,1, 1) et=pd.Timestamp(2025, 4,21) trgnme="000660.KS" trg=yf.download(trgnme, st, et) trg.columns=[i[0] for i in trg.columns] eom=calculate_eom(trg) eom.tail(3)
Date 2025-04-16 -301902.222680 2025-04-17 -205286.876123 2025-04-18 -129046.263410 dtype: float64
starDay=pd.to_datetime("2025-01-01") endDay=pd.to_datetime("2025-04-21") plt.figure(figsize=(10, 4)) plt.subplots_adjust(hspace=0) plt.subplot(311) candleChart(trg) plt.plot(trg["Close"].rolling(window=5).mean(), color="g", label="sma5") plt.plot(trg["Close"].rolling(window=25).mean(), color="brown", label="sma20") xaxis_form(n=5, ax=False) plt.legend(loc="upper left") plt.xlim(starDay, endDay) plt.subplot(312) macd_plot(trg, 5, 20, 10) xaxis_form(n=5, ax=False) plt.xlim(starDay, endDay) plt.subplot(313) eom_plot(trg, 5) xaxis_form(n=5, ax=True) plt.xlim(starDay, endDay) plt.show()
댓글
댓글 쓰기