init
This commit is contained in:
110
stockpredictor/analysis/MACD.py
Normal file
110
stockpredictor/analysis/MACD.py
Normal file
@@ -0,0 +1,110 @@
|
||||
import pandas as pd
|
||||
from stockpredictor.analysis.Common import Common
|
||||
from plotly import tools, subplots
|
||||
import plotly.offline as offline
|
||||
import plotly.graph_objs as go
|
||||
import plotly.io as po
|
||||
|
||||
# [청송촌놈] 파생을 알아야 시장이 보인다. 청송이 종목 고르는법! https://www.youtube.com/watch?v=weABtgZDeGg
|
||||
# 6. Pandas와 Plotly를 이용한 MACD 차트 그리기 https://excelsior-cjh.tistory.com/110
|
||||
# 첫번째. MACD 지표를 이용한 차트분석: https://post.naver.com/viewer/postView.nhn?volumeNo=7435935&memberNo=32471429
|
||||
|
||||
# MACD (Moving Average Conver gence Divergence)
|
||||
# 빨간 네모박스권으로 MACD가 MACD-Sign 을 골든크로스하며, 상승하였을때, 주가는 상승추세를 유지하며, MACD가 MACD-Sign(분홍색)을 데드크로스 할때 주가는 하락의 추세를 보이게 됩니다.
|
||||
# 즉, MSCD가 0이상에서 MACD-Sign 위에서 상승하는 그림이어야
|
||||
class MACD:
|
||||
|
||||
common = None
|
||||
|
||||
def __init__(self):
|
||||
self.common = Common()
|
||||
return
|
||||
|
||||
def draw(self, stock):
|
||||
item_name = stock["NAME"]
|
||||
item_code = stock["CODE"]
|
||||
|
||||
df = pd.DataFrame(stock["PRICE"])
|
||||
macd = go.Scatter(x=df.DATE, y=df['macd'], name="MACD")
|
||||
signal = go.Scatter(x=df.DATE, y=df['macds'], name="Signal")
|
||||
oscillator = go.Bar(x=df.DATE, y=df['macdo'], name="oscillator")
|
||||
trade_volume = go.Bar(x=df.DATE, y=df['volume'], name="volume")
|
||||
data = [macd, signal, oscillator]
|
||||
|
||||
layout = go.Layout(title='{} MACD 그래프'.format(item_name))
|
||||
fig = subplots.make_subplots(rows=2, cols=1, shared_xaxes=True)
|
||||
|
||||
for trace in data:
|
||||
fig.append_trace(trace, 1,1)
|
||||
|
||||
fig.append_trace(trade_volume, 2,1)
|
||||
fig = go.Figure(data=data, layout=layout)
|
||||
|
||||
path = "/Users/dsyoon/workspace/StockPredictor/resources/analysis/html"
|
||||
po.write_html(fig, file=path + "/macd_" + item_code+'.html', auto_open=False)
|
||||
return fig
|
||||
|
||||
|
||||
# macd 0선 위에서 매수를 한다. 0이하는 절대 처다보지 않는다.
|
||||
def apply(self, df, short=12, long=26, t=9):
|
||||
# 입력받은 값이 dataframe이라는 것을 정의해줌
|
||||
df = pd.DataFrame(df)
|
||||
|
||||
# MACD 관련 수식
|
||||
ma_12 = df.close.ewm(span=short).mean() # 단기(12) EMA(지수이동평균)
|
||||
ma_26 = df.close.ewm(span=long).mean() # 장기(26) EMA
|
||||
macd = ma_12 - ma_26 # MACD
|
||||
macds = macd.ewm(span=t).mean() # Signal
|
||||
macdo = macd - macds # Oscillator
|
||||
|
||||
#df = df.assign(macd=macd, macds=macds, macdo=macdo).dropna()
|
||||
df = df.assign(macd=macd, macds=macds, macdo=macdo)
|
||||
|
||||
return df
|
||||
|
||||
"""
|
||||
# 기존 stock에 삽입
|
||||
# macd 0선 위에서 매수를 한다. 0이하는 절대 처다보지 않는다.
|
||||
def analyze(self, stock):
|
||||
df = pd.DataFrame()
|
||||
df = df.from_dict(stock['PRICE'])
|
||||
df = self.apply(df)
|
||||
|
||||
for i in range(len(df.macd)):
|
||||
stock['PRICE'][i]['macd_buy'] = 0
|
||||
|
||||
stock['PRICE'][i]['macd'] = df.macd.values[i]
|
||||
stock['PRICE'][i]['macds'] = df.macds.values[i]
|
||||
stock['PRICE'][i]['macdo'] = df.macdo.values[i]
|
||||
if df.macd.values[i] > 0 and self.common.checkUpward('close', stock['PRICE'][i - 4: i + 1]):
|
||||
stock['PRICE'][i]['macd_buy'] = df.macd.values[i]
|
||||
return
|
||||
"""
|
||||
|
||||
def analyze(self, stock):
|
||||
results = []
|
||||
df = pd.DataFrame()
|
||||
df = df.from_dict(stock['PRICE'])
|
||||
df = self.apply(df)
|
||||
|
||||
for i in range(len(df.macd)):
|
||||
result = {'DATE':stock['PRICE'][i]['DATE'],
|
||||
'macd': df.macd.values[i],
|
||||
'macds': df.macds.values[i],
|
||||
'macdo': df.macdo.values[i],
|
||||
'macd_buy': 0}
|
||||
|
||||
# MACD가 3일 전부터 상승이라면 매수
|
||||
if df.macd.values[i - 1] < df.macd.values[i]:
|
||||
# 어제는 MACD-Sign이 MACD 위에 있지만, 오늘은 MACD가 MACD-Sign 위로 올라오면 매수
|
||||
if df.macd.values[i-1] < df.macds.values[i-1] and df.macd.values[i] > df.macds.values[i]:
|
||||
result['macd_buy'] = 1
|
||||
|
||||
# MACD가 3일 전부터 하락이라면 매도
|
||||
if df.macd.values[i - 1] > df.macd.values[i]:
|
||||
# 어제는 MACD가 MACD-Sign 위에 있지만, 오늘은 MACD-Sign이 MACD 위로 올라오면 매도
|
||||
if df.macd.values[i - 1] > df.macds.values[i - 1] and df.macd.values[i] < df.macds.values[i]:
|
||||
result['macd_buy'] = -1
|
||||
|
||||
results.append(result)
|
||||
return results
|
||||
Reference in New Issue
Block a user