cs

지난번에 MFI를 간단히 정리했는데 파이썬으로 구현해보자. 

https://simbbo-blog.tistory.com/113?category=996009 

 

MFI

MFI(Money Flow Index) Money Flow Index로 해석하면 현금 흐름 지표이다. 일단 먼저 MFI를 통해서 현금 흐름 추세를 쉽게 볼 수 있고, MFI의 다이버전스(Divergence)를 추세전환 파악에 활용할 수 있다. 주가는..

simbbo-blog.tistory.com

하도 오랜만에 해서 기초 셋업부터 책 뒤적뒤적.. 

setup

# 기본 import 
import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import FinanceDataReader as fdr

#네이버
df = fdr.DataReader("035420", "2021", "2023")
df.shape
df.tail()

 

이전까지 거의 예제는 삼전이랑 카카오로 했는데, 그지 같은 카카오... 버리고 가장 최근까지의 네이버 주가로 예제를 가지고 왔다.

MFI 기본 수식

수식을 기초로 하나씩 만들어보자

 

기본 공식 정리 

#typical price 먼저
df['TP'] = (df['High']+df['Low']+df['Close'])/3

공식을 보면 먼저 TP(Typical Price)먼저 정리해줘야 저 위의 수식까지 도달할 수 있다. 

 

#positive, native money flow설정 
df['Positive_MF']=0
df['Nagative_MF']=0

#조건문 설정
#아주 사소하지만드디어 내가 공부한게 보이기 시작했다...

# for 조건문 써주고 range를 통해서 범위 설정을 해준다
for i in range(len(df.Close)-1):
    if df.TP.values[i] < df.TP.values[i+1]: #i번째의 가격이 i+1일보다 높으면, i+1일째의 중심가격이랑 i+1일의 거래량 곱이 Positive MF로 가게 된다. 
        df.Positive_MF.values[i+1] = df.TP.values[i+1] * df.Volume.values[i+1]
        df.Nagative_MF.values[i+1]= 0
    else: #반대의 경우는 Nagative MF로 가게되고
        df.Nagative_MF.values[i+1] =df.TP.values[i+1] * df.Volume.values[i+1]
        df.Positive_MF.values[i+1] = 0

혼공파를 통해서 공부함 range가 보이기 시작했고, 반복문도 슬슬 눈에 들어온다..!!

 

조건을 통해서 i번째와 i+1의 가격을 비교하고, positive or nagative money flow를 설정해야 한다. 

if 조건문을 통해서 positive 만들어주고 else를 통해서 nagative. 

 

 

마지막으로 10일동안의 흐름의 합을 통해서 MFI를 지정해준다. 

# 10일동안 긍정 현금 흐름의 합을 10일동안의 부정 현금 흐름의 합으로 나는 결과는 MFR(money flow ratio)로 저장한다.
df['MFR']= df.Positive_MF.rolling(window=10).sum()/df.Nagative_MF.rolling(window=10).sum()

# 10일 기준으로 계산한 결과
df['MFI10']=100-100/(1+df['MFR'])

 

 

그래프 그리기 

#MFI 그래프 
df[["MFI10"]].plot()

네이버의 MFI 그래프

너무 간단히 그려버린 느낌이고 날짜도 지정하기가 쉽지 않다. 

 

그래서 요즘 회사에서 잘 쓰고 있는 plotly를 사용해서 깔끔하게 다시 그래프를 그려보기로 했다. 

 

#더 깔끔한 그래프를 만들어보자 plotly로 
import plotly.express as px


fig = px.line(df, x='Date', y='MFI10', title='네이버 MFI그래프')

fig.update_xaxes(rangeslider_visible=True)
fig.show()

바로 애러가 나버렸다 ㅋㅋㅋ 

Date가 object가 아닌 인덱스로 벌써 설정이 되어있었기 때문에 x 축에 넣을 수가 없다는 이유였다. 

 

그럼 그냥 인덱스를 설정해버리 넣어버리면 된다. 

df.index.name = 'Date'

 

설정한 뒤에 x축에 Date가 아닌 인덱스 값을 넣어주면,,

#인덱스 날짜 
fig = px.line(df, x=df.index, y='MFI10', title='네이버 MFI그래프')

fig.update_xaxes(rangeslider_visible=True)
fig.show()

원래 plotly가 액티브하게 표시가 되고 조절이 되는 형식으로 그래프를 그려주는데,, jupyter에서는 잘 보이는데 이걸 포스트 해보려니까 그냥 다운이 안되고 다른 방식이 있나 보다.. 

이런식으로 날짜를 구체적으로 조절하고싶었음. 

암튼 완성하긴 했는데, 담번에 plotly그래프를 블로그에 잘 가지고 와봐야겠다. 

 

그리고 MFI그래프 하나만 보고 분석을 하지 않기 때문에, 이전에 볼린저 밴드와 함께 구현해보겠다..

+ Recent posts