1. RSI에 '돈의 무게'를 더하다: MFI의 탄생
앞서 다룬 RSI가 종가($C$)의 변화율만을 측정하는 지수라면, MFI는 그 변화에 실린 거래량($V$)이라는 자금의 크기를 수식에 직접 대입한 지표입니다.
시장에서 가격이 오르는 것보다 더 중요한 것은 '얼마나 많은 돈이 들어오면서 오르는가'입니다. 적은 자금으로 인위적으로 만든 상승은 신뢰도가 낮지만, 막대한 거래량을 동반한 상승은 세력의 강력한 의지를 반영합니다. MFI는 이러한 '돈의 무게'를 0에서 100 사이의 숫자로 계량화하여, 진짜 스마트 머니가 유입되는지 혹은 소리 없이 빠져나가는지를 감별하기 위해 탄생했습니다.
2. 수리적 원리와 계산 구조
MFI는 매일의 고가($H$), 저가($L$), 종가($C$), 거래량($V$)을 모두 사용하여 자금의 유출입을 계산합니다.
Step 1. 대표 가격($TP$, Typical Price) 산출
하루 동안의 평균적인 가격 수준을 구하기 위해 고가, 저가, 종가의 산술 평균을 구합니다.
Step 2. 현금 흐름($RMF$, Raw Money Flow) 계산
$TP$에 당일 거래량($V$)을 곱하여 시장에서 실제로 회전된 자금의 절대 규모를 수치화합니다.
Step 3. 현금 흐름 비율($MFR$) 및 MFI 산출
14일 동안 $TP$가 전일보다 상승한 날의 $RMF$ 합계($PMF$)를 하락한 날의 $RMF$ 합계($NMF$)로 나눈 뒤, 이를 백분율 지수로 정규화합니다.
3. 차트에서 나타나는 수리적 특성: SIMPAC(A009160) 분석 사례
가격과 거래량의 시너지를 극명하게 보여주는 SIMPAC의 실제 차트를 통해 MFI의 신뢰도를 검증해 보겠습니다.

- 과매도(Oversold) 구간의 탈출: 2026년 1월 하순, 주가가 급격한 조정을 받으며 전저점 부근까지 하락할 때 하단 패널의 진한 녹색 MFI 선이 파란색 20선(과매도)을 터치합니다. 대중의 투매 속에서 자금 이탈이 정점에 달했음을 수리적으로 증명하며, 이후 MFI가 20선을 회복할 때 강력한 기술적 반등이 시작되었습니다.
- 과매수(Overbought) 고착과 추세 강화: 2025년 12월 중순, 주가가 단기 고점을 형성할 때 MFI는 80선 위인 붉은색 영역에 머물며 자금 유입이 극에 달했음을 보여줍니다. 단순히 가격만 오르는 것이 아니라 막대한 거래량(V)이 뒷받침되고 있음을 MFI가 보증하며 추세의 강도를 확인시켜 줍니다.
4. 장점 및 한계
- 장점: 가격 변동에 거래량의 에너지를 결합하므로 RSI보다 '돈의 흐름'을 훨씬 정밀하게 추적합니다. 특히 가격은 고점을 높이는데 MFI는 낮아지는 '다이버전스' 발생 시, 세력의 자금이 소리 없이 빠져나가고 있다는 결정적인 매도 신호를 포착할 수 있습니다.
- 한계: 거래량이 일회성 악재나 블록딜 등으로 인해 비정상적으로 튀는 종목의 경우 지표 수치가 급격히 왜곡될 수 있습니다. 또한, 강력한 추세장에서는 과열 혹은 침체 영역에 장기간 머무는 경향이 있어 주의가 필요합니다.
5. 파이썬 구현 (자금 유출입 분리 연산)
numpy의 조건부 연산과 판다스의 rolling().sum()을 활용하여 자금의 유입량과 유출량을 정밀하게 분리하고 MFI를 도출하는 로직입니다.
import sqlite3
import pandas as pd
import numpy as np
# 1. 데이터 로딩 및 계산 로직
def calculate_mfi(df, window=14):
# 대표 가격(TP) 및 현금 흐름(RMF) 계산
df['TP'] = (df['high'] + df['low'] + df['close']) / 3
df['RMF'] = df['TP'] * df['volume']
# 전일 대비 TP 변화량 확인
tp_diff = df['TP'].diff()
# 자금 유입(Positive MF)과 유출(Negative MF) 분리
pos_mf = np.where(tp_diff > 0, df['RMF'], 0)
neg_mf = np.where(tp_diff < 0, df['RMF'], 0)
# 14일 동안의 합계 산출
pmf_sum = pd.Series(pos_mf, index=df.index).rolling(window=window).sum()
nmf_sum = pd.Series(neg_mf, index=df.index).rolling(window=window).sum()
# 현금 흐름 비율(MFR) 및 MFI 도출
mfr = pmf_sum / nmf_sum.replace(0, np.nan)
df['MFI'] = 100 - (100 / (1 + mfr))
return df
6. 실전 Tip 및 요약
MFI는 80과 20을 기준으로 과열과 침체를 판단하지만, 가장 날카로운 타점은 MFI가 80 위에서 머물다가 다시 80 아래로 꺾여 내려오는 순간입니다. 이는 자금 유입의 가속도가 멈추고 실제 매도 압력이 우위를 점하기 시작했음을 알리는 강력한 매도 시그널입니다. 거래량이 실린 모멘텀의 변화는 가격보다 훨씬 무거운 메시지를 던진다는 점을 명심하십시오.
'기술지표' 카테고리의 다른 글
| CCI 지표 우물 파기 기법 및 과매도 구간 탈출 타점 잡기 [지표 백과 027] (0) | 2026.03.01 |
|---|---|
| 슈퍼트렌드(SuperTrend) 지표: 소음 없는 직관적 추세 추종 매매 [지표 백과 026] (0) | 2026.02.28 |
| ATR 지표 파이썬 구현 및 변동성 기반의 과학적인 손절매 가격 설정 [지표 백과 024] (0) | 2026.02.28 |
| MACD 오실레이터 수렴과 발산(히스토그램) 실전 매매 타점 [지표 백과 023] (0) | 2026.02.28 |
| 피보나치 확장(Fibonacci Extension) 목표가 산정 및 익절 구간 설정 [지표 백과 022] (0) | 2026.02.27 |