
Money Flow Index의 수식, 엑셀과 트레이딩뷰로 구현해보기
*2022-03-14 글
MFI는 Money Flow Index의 약자로, 상승폭 대비 하락폭에 거래량을 반영해 상대적인 위치를 확인하는 지표입니다.
상대적인 지표로는 RSI가 유명한데요,
MFI 또한 RSI와 같이 일정 구간 아래로 내려가면 과매도, 위로 올라가면 과매수로 판단합니다.
MFI의 경우 20과 80이 통상적인 기준
MFI가 변동폭이 더 크기에 RSI의 기준(30, 70)보다 넓은 기준이 사용되는 모습입니다.
정확히 어떤 부분이 어떻게 다른지 비교해보도록 하겠습니다.
먼저, MFI의 수식은 다음과 같습니다.
avg = 고,저,종가의 평균
MF = avg * 거래량
PM = 만약 전일 MF보다 금일 MF가 높다면 금일 MF의 값, 아니라면 0
NM = 만약 전일 MF보다 금일 MF가 낮다면 금일 MF의 값, 아니라면 0
SPM = PM의 N일간 합
SNM = NM의 N일간 합
MR = SPM/SNM
MFI = 100-(100/(1+MR))
RSI와 마지막 수식, 즉 100-(100/(1+MR))을 해준다는 부분에서는 동일합니다.
이는 수치가 0에서 100사이의 수치로 나오게 만들기 위한 수식이며, 이 부분 만으로는 비슷하다고 하기가 어렵습니다.
그러나 하락폭 대비 상승폭을 가늠한다는 부분이 동일합니다.
그렇기에 메인 아이디어는 같다고 할 수 있는 것입니다. 다만 RSI는 종가를 기준으로 사용했다면,
MFI는 고저종가의 평균과 거래량을 반영한 모습입니다.
"거래량을 확인하는 것이 중요하다"는 말, 들어보신 적 있으신가요?
그렇다면 거래량을 반영한 MFI는 그렇지 않은 RSI의 상위호환일까요? 유사한 조건의 백테스팅으로 확인해보겠습니다.
Backtest
카카오를 대상으로, 2000년 1월부터 2022년 1월까지 MFI를 사용한 "Long Only" 백테스팅 결과입니다.
모든 백테스트는 리스크 관리를 따로 하지 않았으며, 조건에 따라 자산의 100%를 전부 운용했을 때의 결과입니다.
MFI 설정 값은 14 입니다.
1.
매수 조건: MFI가 20 이하일 때
매도 조건: MFI가 80 이상일 때
Sharpe Ratio = -0.01
Sortino Ratio = -0.013
첫번째 조건의 경우 RSI보다 안좋은 결과를 보입니다.
MFI가 80을 넘긴 경우가 적었기 때문에, 수익 실현을 하지 못한 모습이 손실을 늘린 가장 치명적인 이유로 작용하였습니다.
2.
매수 조건: MFI가 20 이하일 때
매도 조건: MFI가 20 이상일 때
Sharpe Ratio = 0.002
Sortino Ratio = 0.003
첫번째 조건보다 상황은 나아졌으나, RSI에 비해서는 아직 부족한 모습을 보입니다.
3.
매수 조건: 종가(close)가 20일 평균선을 돌파하였을 때
매도 조건: MFI가 80 이상일 때
Sharpe Ratio = 0.066
Sortino Ratio = 0.092
RSI백테스팅 결과와 같이,
MFI도 추세를 진입 기준으로 잡고 MFI를 실현기준만으로 활용하였을 때 그 성과가 가장 좋게 나옵니다.
그러나 아쉽게도 이번 또한 RSI보다 미비한 성과를 보여줍니다.
거래량이 "무조건" 중요하다고 판단하는 것은 섣부른 판단이라고 생각할 수도,,
그리고 지표 자체의 변동성이 더 크기 때문에 필연적으로 도출되는 결과라고 생각할 수도 있습니다.
확실히 시세의 변동성이 낮지만 거래량에서 차이를 보이는 경우에 한해서는,
RSI보다 MFI가 더 기준으로서의 역할을 잘 해낼 수도 있다고 생각합니다.
Excel
1.hlc3
먼저 고저종가의 평균을 구해줍니다.
=AVERAGE(B2:D2)
2. 거래량 반영
그 다음으로는 거래량을 반영해주어야 합니다.
=F2*E2
3. PM(Positive Money flow)
금일 MF값이 전일보다 높아야 MF값을 불러옵니다. 아니라면 0
=IF(G3>G2,G3,0)
4. NM(Negative Money flow)
이번에는 정반대입니다.
금일 MF값이 전일보다 낮아야 MF값을 불러옵니다. 아니라면 0
=IF(G3<G2,G3,0)
5. SPM, SNM (Sum of PM, Sum of NM)
PM과 NM의 합계를 구합니다. 통상적으로 사용되는 설정값인 14일을 기준으로 잡았습니다.
SPM
=SUM(H3:H16)
SNM
=SUM(I3:I16)
6. MR(SPM/SNM)
이제 이 둘을 나누어주시면 됩니다.
=J16/K16
7. MFI
100-(100/(1+MR))
수식 기억나시죠?
수치를 0에서 100 사이의 숫자로 도출시키기 위한 식입니다.
=100-(100/(1+L16))
TradingView
MFI는 mfi(source, length) 함수가 존재합니다.
고저종가의 평균을 사용하기에, source에는 이전에 말씀드렸던 hlc3를 사용할 기회가 되겠네요.
참고:난 내가 코딩해서 투자해: 응용 범위가 넓은 필수 함수들
//@version=4 study(title="MFI") length = input(title="Length", defval=14) src = hlc3 mfi = mfi(hlc3, length) plot(mfi, color=color.black) overbought=hline(80, color=color.red) oversold=hline(20, color=color.red)