This commit is contained in:
dsyoon
2022-09-12 15:29:10 +09:00
parent 8541a1c034
commit 6690a5b022
2 changed files with 87 additions and 33 deletions

View File

@@ -97,6 +97,12 @@ class Simulation (HTS):
volume_line = go.Scatter(x=data['date'], y=data["volume"], mode='lines', name='volume') volume_line = go.Scatter(x=data['date'], y=data["volume"], mode='lines', name='volume')
#fast_k_line = go.Scatter(x=hts['date'], y=hts["fast_k"], mode='lines', name='fast_k') #fast_k_line = go.Scatter(x=hts['date'], y=hts["fast_k"], mode='lines', name='fast_k')
disparity_avg5 = go.Scatter(x=data['date'], y=data["disparity_avg5"], name="disparity_avg5", line_color='#8F8203')
disparity_avg10 = go.Scatter(x=data['date'], y=data["disparity_avg10"], name="disparity_avg10", line_color='#089B5B')
disparity_avg20 = go.Scatter(x=data['date'], y=data["disparity_avg20"], name="disparity_avg20", line_color='#ff00ff')
disparity_avg60 = go.Scatter(x=data['date'], y=data["disparity_avg60"], name="disparity_avg60", line_color='#1469F4')
disparity_avg120 = go.Scatter(x=data['date'], y=data["disparity_avg120"], name="disparity_avg120", line_color='#000000')
macd_line = go.Scatter(x=data['date'], y=data["macd"], mode='lines', name='macd') macd_line = go.Scatter(x=data['date'], y=data["macd"], mode='lines', name='macd')
macd_s_line = go.Scatter(x=data['date'], y=data["macds"], mode='lines', name='macds') macd_s_line = go.Scatter(x=data['date'], y=data["macds"], mode='lines', name='macds')
macd_o_line = go.Scatter(x=data['date'], y=data["macdo"], mode='lines', name='macdo') macd_o_line = go.Scatter(x=data['date'], y=data["macdo"], mode='lines', name='macdo')
@@ -109,6 +115,7 @@ class Simulation (HTS):
candle_data = [candle_stick, upper, lower, avg3, avg6, avg9, avg12, avg20, buy_check, sell_check, laggingSpan, changeLine, baseLine] candle_data = [candle_stick, upper, lower, avg3, avg6, avg9, avg12, avg20, buy_check, sell_check, laggingSpan, changeLine, baseLine]
volume_data = [volume_line] volume_data = [volume_line]
disparity_data = [disparity_avg5, disparity_avg10, disparity_avg20, disparity_avg60, disparity_avg120]
macd_data = [macd_line, macd_s_line, macd_o_line] macd_data = [macd_line, macd_s_line, macd_o_line]
stochastic_data = [slow_k_line, slow_d_line] stochastic_data = [slow_k_line, slow_d_line]
rsi_data = [rsi_line, rsis_line] rsi_data = [rsi_line, rsis_line]
@@ -120,17 +127,21 @@ class Simulation (HTS):
fig.show() fig.show()
""" """
fig = subplots.make_subplots(rows=5, cols=1, subplot_titles=('캔들', "거래량", "MACD", "스토캐스틱", "RSI")) fig = subplots.make_subplots(rows=6, cols=1,
subplot_titles=('캔들', "거래량", "이격도", "MACD", "스토캐스틱", "RSI"),
row_heights=[1200, 500, 500, 500, 500, 500])
for trace in candle_data: for trace in candle_data:
fig.append_trace(trace, 1, 1) fig.append_trace(trace, 1, 1)
for trace in volume_data: for trace in volume_data:
fig.append_trace(trace, 2, 1) fig.append_trace(trace, 2, 1)
for trace in macd_data: for trace in disparity_data:
fig.append_trace(trace, 3, 1) fig.append_trace(trace, 3, 1)
for trace in stochastic_data: for trace in macd_data:
fig.append_trace(trace, 4, 1) fig.append_trace(trace, 4, 1)
for trace in rsi_data: for trace in stochastic_data:
fig.append_trace(trace, 5, 1) fig.append_trace(trace, 5, 1)
for trace in rsi_data:
fig.append_trace(trace, 6, 1)
#fig.update_xaxes(nticks=5) #fig.update_xaxes(nticks=5)
#fig.update_layout(height=1800, title=stock_code + "_" + given_day, xaxis_rangeslider_visible=False) #fig.update_layout(height=1800, title=stock_code + "_" + given_day, xaxis_rangeslider_visible=False)

View File

@@ -21,6 +21,7 @@ from stock.analysis.Stochastic import Stochastic
from stock.analysis.BolingerBand import BolingerBand from stock.analysis.BolingerBand import BolingerBand
from stock.analysis.IchimokuCloud import IchimokuCloud from stock.analysis.IchimokuCloud import IchimokuCloud
from stock.analysis.RSI import RSI from stock.analysis.RSI import RSI
from stock.analysis.MACD import MACD
from stock.crawler.MovingAverage import MovingAverage from stock.crawler.MovingAverage import MovingAverage
class AnalyzerSqlite: class AnalyzerSqlite:
@@ -30,6 +31,7 @@ class AnalyzerSqlite:
bolingerBand = None bolingerBand = None
ichimokuCloud = None ichimokuCloud = None
rsi = None rsi = None
macd = None
topCompany = None topCompany = None
fnguide = None fnguide = None
@@ -50,6 +52,7 @@ class AnalyzerSqlite:
self.bolingerBand = BolingerBand() self.bolingerBand = BolingerBand()
self.ichimokuCloud = IchimokuCloud() self.ichimokuCloud = IchimokuCloud()
self.rsi = RSI() self.rsi = RSI()
self.macd = MACD()
self.topCompany = self.getTopCompany(stockFileName, 2000) self.topCompany = self.getTopCompany(stockFileName, 2000)
self.fnguide = self.readFnguide(stockFileName) self.fnguide = self.readFnguide(stockFileName)
@@ -132,6 +135,14 @@ class AnalyzerSqlite:
avg120 = list(reversed(stock['avg120'])) avg120 = list(reversed(stock['avg120']))
avg240 = list(reversed(stock['avg240'])) avg240 = list(reversed(stock['avg240']))
avg300 = list(reversed(stock['avg300'])) avg300 = list(reversed(stock['avg300']))
disparity_avg5 = list(reversed(stock['disparity_avg5']))
disparity_avg10 = list(reversed(stock['disparity_avg10']))
disparity_avg20 = list(reversed(stock['disparity_avg20']))
disparity_avg60 = list(reversed(stock['disparity_avg60']))
disparity_avg120 = list(reversed(stock['disparity_avg120']))
macd = list(reversed(stock['macd']))
macdo = list(reversed(stock['macdo']))
macds = list(reversed(stock['macds']))
rsi = list(reversed(stock['rsi'])) rsi = list(reversed(stock['rsi']))
rsis = list(reversed(stock['rsis'])) rsis = list(reversed(stock['rsis']))
stochastic_slow_k = list(reversed(stock['stochastic_slow_k'])) stochastic_slow_k = list(reversed(stock['stochastic_slow_k']))
@@ -168,6 +179,19 @@ class AnalyzerSqlite:
volume = go.Bar(x=ymd, y=volume, name="volume") volume = go.Bar(x=ymd, y=volume, name="volume")
volume_data = [volume] volume_data = [volume]
disparity_avg5 = go.Scatter(x=ymd, y=disparity_avg5, name="disparity_avg5", line_color='#8F8203')
disparity_avg10 = go.Scatter(x=ymd, y=disparity_avg10, name="disparity_avg10", line_color='#089B5B')
disparity_avg20 = go.Scatter(x=ymd, y=disparity_avg20, name="disparity_avg20", line_color='#ff00ff')
disparity_avg60 = go.Scatter(x=ymd, y=disparity_avg60, name="disparity_avg60", line_color='#1469F4')
disparity_avg120 = go.Scatter(x=ymd, y=disparity_avg120, name="disparity_avg120", line_color='#000000')
disparity_data = [disparity_avg5, disparity_avg10, disparity_avg20, disparity_avg60, disparity_avg120]
# macd
macd_line = go.Scatter(x=ymd, y=macd, mode='lines', name='macd')
macd_s_line = go.Scatter(x=ymd, y=macds, mode='lines', name='macds')
macd_o_line = go.Scatter(x=ymd, y=macdo, mode='lines', name='macdo')
macd_data = [macd_line, macd_s_line, macd_o_line]
# stochastic # stochastic
rsi = go.Scatter(x=ymd, y=rsi, name="rsi", line_color='#8B4513') rsi = go.Scatter(x=ymd, y=rsi, name="rsi", line_color='#8B4513')
rsis = go.Scatter(x=ymd, y=rsis, name="rsis", line_color='#4169E1') rsis = go.Scatter(x=ymd, y=rsis, name="rsis", line_color='#4169E1')
@@ -178,18 +202,21 @@ class AnalyzerSqlite:
slow_d = go.Scatter(x=ymd, y=stochastic_slow_d, name="Slow%D", line_color='#4169E1') slow_d = go.Scatter(x=ymd, y=stochastic_slow_d, name="Slow%D", line_color='#4169E1')
stochastic_data = [slow_k, slow_d] stochastic_data = [slow_k, slow_d]
fig = subplots.make_subplots(rows=4, cols=1, fig = subplots.make_subplots(rows=6, cols=1,
subplot_titles=('차트', '거래량', 'rsi', 'Stochastic'), subplot_titles=('캔들', "거래량", "이격도", "MACD", "스토캐스틱", "RSI"),
row_heights=[1200, 500, 500, 500]) row_heights=[1200, 500, 500, 500, 500, 500])
for trace in candle_data: for trace in candle_data:
fig.append_trace(trace, 1, 1) fig.append_trace(trace, 1, 1)
for trace in volume_data: for trace in volume_data:
fig.append_trace(trace, 2, 1) fig.append_trace(trace, 2, 1)
for trace in rsi_data: for trace in disparity_data:
fig.append_trace(trace, 3, 1) fig.append_trace(trace, 3, 1)
for trace in stochastic_data: for trace in macd_data:
fig.append_trace(trace, 4, 1) fig.append_trace(trace, 4, 1)
for trace in stochastic_data:
fig.append_trace(trace, 5, 1)
for trace in rsi_data:
fig.append_trace(trace, 6, 1)
fig.update_layout(height=2200, xaxis_rangeslider_visible=False) fig.update_layout(height=2200, xaxis_rangeslider_visible=False)
@@ -305,11 +332,13 @@ class AnalyzerSqlite:
sql = 'SELECT ymd, close, open, high, low, volume, ' sql = 'SELECT ymd, close, open, high, low, volume, '
sql += ' avg3, avg4, avg5, avg6, avg10, avg12, avg20, avg36, avg40, avg48, avg60, avg120, avg200, avg240, avg300, ' sql += ' avg3, avg4, avg5, avg6, avg10, avg12, avg20, avg36, avg40, avg48, avg60, avg120, avg200, avg240, avg300, '
sql += ' disparity_avg5, disparity_avg10, disparity_avg20, disparity_avg60, disparity_avg120, '
sql += ' bolingerband_upper, bolingerband_lower, bolingerband_middle, ' sql += ' bolingerband_upper, bolingerband_lower, bolingerband_middle, '
sql += ' ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2, ' sql += ' ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2, '
sql += ' stochastic_fast_k, stochastic_slow_k, stochastic_slow_d, ' sql += ' stochastic_fast_k, stochastic_slow_k, stochastic_slow_d, '
sql += ' rsi, rsis ' sql += ' rsi, rsis, '
sql += ' FROM ' + TableName + ' where CODE=? order by ymd desc limit 512' sql += ' macd, macds, macdo '
sql += ' FROM ' + TableName + ' where CODE=? order by ymd desc limit 512 '
cursor.execute(sql, (CODE,)) cursor.execute(sql, (CODE,))
prices = cursor.fetchall() prices = cursor.fetchall()
@@ -319,10 +348,12 @@ class AnalyzerSqlite:
ymd = [] ymd = []
close, open, high, low, volume = [], [], [], [], [] close, open, high, low, volume = [], [], [], [], []
avg3, avg4, avg5, avg6, avg10, avg12, avg20, avg36, avg40, avg48, avg60, avg120, avg200, avg240, avg300 = [], [], [], [], [], [], [], [], [], [], [], [], [], [], [] avg3, avg4, avg5, avg6, avg10, avg12, avg20, avg36, avg40, avg48, avg60, avg120, avg200, avg240, avg300 = [], [], [], [], [], [], [], [], [], [], [], [], [], [], []
disparity_avg5, disparity_avg10, disparity_avg20, disparity_avg60, disparity_avg120 = [], [], [], [], []
bolingerband_upper, bolingerband_lower, bolingerband_middle = [], [], [] bolingerband_upper, bolingerband_lower, bolingerband_middle = [], [], []
ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2 = [], [], [], [] ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2 = [], [], [], []
stochastic_fast_k, stochastic_slow_k, stochastic_slow_d = [], [], [] stochastic_fast_k, stochastic_slow_k, stochastic_slow_d = [], [], []
rsi, rsis = [], [] rsi, rsis = [], []
macd, macds, macdo = [], [], []
for price in prices: for price in prices:
ymd.append(price[0]) ymd.append(price[0])
@@ -346,31 +377,40 @@ class AnalyzerSqlite:
avg200.append(price[18]) avg200.append(price[18])
avg240.append(price[19]) avg240.append(price[19])
avg300.append(price[20]) avg300.append(price[20])
bolingerband_upper.append(price[21]) disparity_avg5.append(price[21])
bolingerband_lower.append(price[22]) disparity_avg10.append(price[22])
bolingerband_middle.append(price[23]) disparity_avg20.append(price[23])
ichimokucloud_changeLine.append(price[24]) disparity_avg60.append(price[24])
ichimokucloud_baseLine.append(price[25]) disparity_avg120.append(price[25])
ichimokucloud_leadingSpan1.append(price[26]) bolingerband_upper.append(price[26])
ichimokucloud_leadingSpan2.append(price[27]) bolingerband_lower.append(price[27])
stochastic_fast_k.append(price[28]) bolingerband_middle.append(price[28])
stochastic_slow_k.append(price[29]) ichimokucloud_changeLine.append(price[29])
stochastic_slow_d.append(price[30]) ichimokucloud_baseLine.append(price[30])
rsi.append(price[31]) ichimokucloud_leadingSpan1.append(price[31])
rsis.append(price[32]) ichimokucloud_leadingSpan2.append(price[32])
stochastic_fast_k.append(price[33])
stochastic_slow_k.append(price[34])
stochastic_slow_d.append(price[35])
rsi.append(price[36])
rsis.append(price[37])
macd.append(price[38])
macds.append(price[39])
macdo.append(price[40])
stock = { stock = {
"ymd": ymd, "ymd": ymd,
"close": close, "open": open, "high": high, "low": low, "volume": volume, "close": close, "open": open, "high": high, "low": low, "volume": volume,
"avg3": avg3, "avg4": avg4, "avg5": avg5, "avg6": avg6, "avg10": avg10, "avg12": avg12, "avg20": avg20, "avg36": avg36, "avg40": avg40, "avg48": avg48, "avg60": avg60, "avg120": avg120, "avg200": avg200, "avg300": avg300, "avg3": avg3, "avg4": avg4, "avg5": avg5, "avg6": avg6, "avg10": avg10, "avg12": avg12, "avg20": avg20, "avg36": avg36, "avg40": avg40, "avg48": avg48, "avg60": avg60, "avg120": avg120, "avg200": avg200, "avg240": avg240, "avg300": avg300,
"avg240": avg240, "disparity_avg5": disparity_avg5, "disparity_avg10": disparity_avg10, "disparity_avg20": disparity_avg20, "disparity_avg60": disparity_avg60, "disparity_avg120": disparity_avg120,
"bolingerband_upper": bolingerband_upper, "bolingerband_lower": bolingerband_lower, "bolingerband_upper": bolingerband_upper, "bolingerband_lower": bolingerband_lower,
"bolingerband_middle": bolingerband_middle, "bolingerband_middle": bolingerband_middle,
"ichimokucloud_changeLine": ichimokucloud_changeLine, "ichimokucloud_baseLine": ichimokucloud_baseLine, "ichimokucloud_changeLine": ichimokucloud_changeLine, "ichimokucloud_baseLine": ichimokucloud_baseLine,
"ichimokucloud_leadingSpan1": ichimokucloud_leadingSpan1, "ichimokucloud_leadingSpan1": ichimokucloud_leadingSpan1,
"ichimokucloud_leadingSpan2": ichimokucloud_leadingSpan2, "ichimokucloud_leadingSpan2": ichimokucloud_leadingSpan2,
"stochastic_fast_k": stochastic_fast_k, "stochastic_slow_k": stochastic_slow_k, "stochastic_slow_d": stochastic_slow_d, "stochastic_fast_k": stochastic_fast_k, "stochastic_slow_k": stochastic_slow_k, "stochastic_slow_d": stochastic_slow_d,
"rsi": rsi, "rsis": rsis "rsi": rsi, "rsis": rsis,
"macd": macd, "macds": macds, "macdo": macdo
} }
return stock return stock
@@ -744,6 +784,7 @@ class AnalyzerSqlite:
self.stochastic.analyze(stock) self.stochastic.analyze(stock)
self.bolingerBand.analyze(stock) self.bolingerBand.analyze(stock)
self.rsi.analyze(stock) self.rsi.analyze(stock)
self.macd.analyze(stock)
sorted_stock = sorted(stock["PRICE"], key=lambda x: x['ymd'], reverse=True) sorted_stock = sorted(stock["PRICE"], key=lambda x: x['ymd'], reverse=True)
for price in sorted_stock: for price in sorted_stock:
@@ -756,8 +797,8 @@ class AnalyzerSqlite:
sql += " bolingerband_upper, bolingerband_lower, bolingerband_middle, " sql += " bolingerband_upper, bolingerband_lower, bolingerband_middle, "
sql += " ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2, " sql += " ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2, "
sql += " stochastic_fast_k, stochastic_slow_k, stochastic_slow_d, " sql += " stochastic_fast_k, stochastic_slow_k, stochastic_slow_d, "
sql += " rsi, rsis) " sql += " rsi, rsis, macd, macds, macdo) "
sql += " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" sql += " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
cursor.execute(sql, ( cursor.execute(sql, (
stock["CODE"], stock["NAME"], price['ymd'], price['close'], price['diff'], price['open'], price['high'], price['low'], price['volume'], stock["CODE"], stock["NAME"], price['ymd'], price['close'], price['diff'], price['open'], price['high'], price['low'], price['volume'],
@@ -767,7 +808,7 @@ class AnalyzerSqlite:
price['ichimokucloud_changeLine'], price['ichimokucloud_baseLine'], price['ichimokucloud_leadingSpan1'], price['ichimokucloud_changeLine'], price['ichimokucloud_baseLine'], price['ichimokucloud_leadingSpan1'],
price['ichimokucloud_leadingSpan2'], price['ichimokucloud_leadingSpan2'],
price['stochastic_fast_k'], price['stochastic_slow_k'], price['stochastic_slow_d'], price['stochastic_fast_k'], price['stochastic_slow_k'], price['stochastic_slow_d'],
price['rsi'], price['rsis'],)) price['rsi'], price['rsis'], price['macd'], price['macds'], price['macdo'],))
else: else:
sql = "UPDATE " + stockAnalysisTableName + " SET close=?, diff=?, open=?, high=?, low=?, volume=?, " sql = "UPDATE " + stockAnalysisTableName + " SET close=?, diff=?, open=?, high=?, low=?, volume=?, "
@@ -777,6 +818,7 @@ class AnalyzerSqlite:
sql += " ichimokucloud_changeLine=?, ichimokucloud_baseLine=?, ichimokucloud_leadingSpan1=?, ichimokucloud_leadingSpan2=?, " sql += " ichimokucloud_changeLine=?, ichimokucloud_baseLine=?, ichimokucloud_leadingSpan1=?, ichimokucloud_leadingSpan2=?, "
sql += " stochastic_fast_k=?, stochastic_slow_k=?, stochastic_slow_d=?, " sql += " stochastic_fast_k=?, stochastic_slow_k=?, stochastic_slow_d=?, "
sql += " rsi=?, rsis=? " sql += " rsi=?, rsis=? "
sql += " macd=?, macds=?, macdo=? "
sql += " WHERE CODE=? and ymd=?" sql += " WHERE CODE=? and ymd=?"
cursor.execute(sql, cursor.execute(sql,
@@ -787,6 +829,7 @@ class AnalyzerSqlite:
price['ichimokucloud_leadingSpan1'], price['ichimokucloud_leadingSpan2'], price['ichimokucloud_leadingSpan1'], price['ichimokucloud_leadingSpan2'],
price['stochastic_fast_k'], price['stochastic_slow_k'], price['stochastic_slow_d'], price['stochastic_fast_k'], price['stochastic_slow_k'], price['stochastic_slow_d'],
price['rsi'], price['rsis'], price['rsi'], price['rsis'],
price['macd'], price['macds'], price['macdo'],
stock["CODE"], price['ymd'],)) stock["CODE"], price['ymd'],))
break break
@@ -960,9 +1003,9 @@ if __name__ == "__main__":
stockFileName = PROJECT_HOME + '/resources/stock.db' stockFileName = PROJECT_HOME + '/resources/stock.db'
analyzer = AnalyzerSqlite(PROJECT_HOME, stockFileName) analyzer = AnalyzerSqlite(PROJECT_HOME, stockFileName)
analyzer.analyzeDaily() #analyzer.analyzeDaily()
analyzer.analyzeGrouping("weekly") #analyzer.analyzeGrouping("weekly")
analyzer.analyzeGrouping("monthly") #analyzer.analyzeGrouping("monthly")
# HTML 출력 # HTML 출력
outPath = os.path.join(PROJECT_HOME, "resources", "analysis") outPath = os.path.join(PROJECT_HOME, "resources", "analysis")