From 38be8718e4f1a11911c5bc02f6b34f7cecc0f8f2 Mon Sep 17 00:00:00 2001 From: dsyoon Date: Thu, 25 Jan 2024 08:58:13 +0900 Subject: [PATCH] init --- stock/analysis/AnalyzerSqlite.py | 115 +++++++++++++++++++------------ stock/analysis/Common.py | 20 +++--- 2 files changed, 81 insertions(+), 54 deletions(-) diff --git a/stock/analysis/AnalyzerSqlite.py b/stock/analysis/AnalyzerSqlite.py index afeb9e3..ade0d2b 100644 --- a/stock/analysis/AnalyzerSqlite.py +++ b/stock/analysis/AnalyzerSqlite.py @@ -341,8 +341,8 @@ class AnalyzerSqlite: cursor = conn.cursor() 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 += ' disparity_avg5, disparity_avg10, disparity_avg20, disparity_avg60, disparity_avg120, ' + sql += ' avg3, avg4, avg5, avg6, avg10, avg12, avg20, avg36, avg40, avg48, avg60, avg120, avg200, avg240, avg300, avg360, avg480, avg720, avg1440, ' + sql += ' disparity_avg5, disparity_avg10, disparity_avg20, disparity_avg60, disparity_avg120, disparity_avg240, disparity_avg480, ' sql += ' bolingerband_upper, bolingerband_lower, bolingerband_middle, ' sql += ' envelope_upper, envelope_lower, envelope_middle, ' sql += ' ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_laggingSpan, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2, ' @@ -358,8 +358,8 @@ class AnalyzerSqlite: ymd = [] close, open, high, low, volume = [], [], [], [], [] - 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 = [], [], [], [], [] + avg3, avg4, avg5, avg6, avg10, avg12, avg20, avg36, avg40, avg48, avg60, avg120, avg200, avg240, avg300, avg360, avg480, avg720, avg1440 = [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [] + disparity_avg5, disparity_avg10, disparity_avg20, disparity_avg60, disparity_avg120, disparity_avg240, disparity_avg480 = [], [], [], [], [], [], [] bolingerband_upper, bolingerband_lower, bolingerband_middle = [], [], [] envelope_upper, envelope_lower, envelope_middle = [], [], [] ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_laggingSpan, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2 = [], [], [], [], [] @@ -389,36 +389,42 @@ class AnalyzerSqlite: avg200.append(price[18]) avg240.append(price[19]) avg300.append(price[20]) - disparity_avg5.append(price[21]) - disparity_avg10.append(price[22]) - disparity_avg20.append(price[23]) - disparity_avg60.append(price[24]) - disparity_avg120.append(price[25]) - bolingerband_upper.append(price[26]) - bolingerband_lower.append(price[27]) - bolingerband_middle.append(price[28]) - envelope_upper.append(price[29]) - envelope_lower.append(price[30]) - envelope_middle.append(price[31]) - ichimokucloud_changeLine.append(price[32]) - ichimokucloud_baseLine.append(price[33]) - ichimokucloud_laggingSpan.append(price[34]) - ichimokucloud_leadingSpan1.append(price[35]) - ichimokucloud_leadingSpan2.append(price[36]) - stochastic_fast_k.append(price[37]) - stochastic_slow_k.append(price[38]) - stochastic_slow_d.append(price[39]) - rsi.append(price[40]) - rsis.append(price[41]) - macd.append(price[42]) - macds.append(price[43]) - macdo.append(price[44]) + avg360.append(price[21]) + avg480.append(price[22]) + avg720.append(price[23]) + avg1440.append(price[24]) + disparity_avg5.append(price[25]) + disparity_avg10.append(price[26]) + disparity_avg20.append(price[27]) + disparity_avg60.append(price[28]) + disparity_avg120.append(price[29]) + disparity_avg240.append(price[30]) + disparity_avg480.append(price[31]) + bolingerband_upper.append(price[32]) + bolingerband_lower.append(price[33]) + bolingerband_middle.append(price[34]) + envelope_upper.append(price[35]) + envelope_lower.append(price[36]) + envelope_middle.append(price[37]) + ichimokucloud_changeLine.append(price[38]) + ichimokucloud_baseLine.append(price[39]) + ichimokucloud_laggingSpan.append(price[40]) + ichimokucloud_leadingSpan1.append(price[41]) + ichimokucloud_leadingSpan2.append(price[42]) + stochastic_fast_k.append(price[43]) + stochastic_slow_k.append(price[44]) + stochastic_slow_d.append(price[45]) + rsi.append(price[46]) + rsis.append(price[47]) + macd.append(price[48]) + macds.append(price[49]) + macdo.append(price[50]) stock = { "ymd": ymd, "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, "avg240": avg240, "avg300": avg300, - "disparity_avg5": disparity_avg5, "disparity_avg10": disparity_avg10, "disparity_avg20": disparity_avg20, "disparity_avg60": disparity_avg60, "disparity_avg120": disparity_avg120, + "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, "avg360": avg360, "avg480": avg300, "avg720": avg720, "avg1440": avg1440, + "disparity_avg5": disparity_avg5, "disparity_avg10": disparity_avg10, "disparity_avg20": disparity_avg20, "disparity_avg60": disparity_avg60, "disparity_avg120": disparity_avg120, "disparity_avg240": disparity_avg240, "disparity_avg480": disparity_avg480, "upper": bolingerband_upper, "lower": bolingerband_lower, "middle": bolingerband_middle, "envelope_upper": envelope_upper, "envelope_lower": envelope_lower, "envelope_middle": envelope_middle, "ichimokucloud_changeLine": ichimokucloud_changeLine, "ichimokucloud_baseLine": ichimokucloud_baseLine, "ichimokucloud_laggingSpan": ichimokucloud_laggingSpan, "ichimokucloud_leadingSpan1": ichimokucloud_leadingSpan1, "ichimokucloud_leadingSpan2": ichimokucloud_leadingSpan2, @@ -565,6 +571,9 @@ class AnalyzerSqlite: q_200 = MovingAverage(200) q_240 = MovingAverage(240) q_300 = MovingAverage(300) + q_360 = MovingAverage(360) + q_720 = MovingAverage(720) + q_1440 = MovingAverage(1440) for i in range(len(stock)): q_3.enqueue(stock[i]['close']) @@ -583,6 +592,9 @@ class AnalyzerSqlite: q_200.enqueue(stock[i]['close']) q_240.enqueue(stock[i]['close']) q_300.enqueue(stock[i]['close']) + q_360.enqueue(stock[i]['close']) + q_720.enqueue(stock[i]['close']) + q_1440.enqueue(stock[i]['close']) stock[i]['avg3'] = q_3.avg() stock[i]['avg4'] = q_4.avg() @@ -600,6 +612,10 @@ class AnalyzerSqlite: stock[i]['avg200'] = q_200.avg() stock[i]['avg240'] = q_240.avg() stock[i]['avg300'] = q_300.avg() + stock[i]['avg360'] = q_360.avg() + stock[i]['avg480'] = q_360.avg() + stock[i]['avg720'] = q_720.avg() + stock[i]['avg1440'] = q_1440.avg() return @@ -610,6 +626,8 @@ class AnalyzerSqlite: stock[i]['disparity_avg20'] = 100 * (stock[i]["open"] / stock[i]["avg20"]) stock[i]['disparity_avg60'] = 100 * (stock[i]["open"] / stock[i]["avg60"]) stock[i]['disparity_avg120'] = 100 * (stock[i]["open"] / stock[i]["avg120"]) + stock[i]['disparity_avg240'] = 100 * (stock[i]["open"] / stock[i]["avg240"]) + stock[i]['disparity_avg480'] = 100 * (stock[i]["open"] / stock[i]["avg480"]) return @@ -642,11 +660,17 @@ class AnalyzerSqlite: "avg200": -1, "avg240": -1, "avg300": -1, + "avg360": -1, + "avg480": -1, + "avg720": -1, + "avg1440": -1, "disparity_avg5": -1, "disparity_avg10": -1, "disparity_avg20": -1, "disparity_avg60": -1, "disparity_avg120": -1, + "disparity_avg240": -1, + "disparity_avg480": -1, "bolingerband_upper": -1, "bolingerband_lower": -1, "bolingerband_middle": -1, @@ -675,7 +699,7 @@ class AnalyzerSqlite: stockAnalysisTableName = 'stock_analysis_' + type # 테이블 생성 - cursor.execute("CREATE TABLE IF NOT EXISTS " + stockAnalysisTableName + " (CODE text, NAME text, ymd text, close REAL, diff REAL, open REAL, high REAL, low REAL, volume REAL, avg3 REAL, avg4 REAL, avg5 REAL, avg6 REAL, avg10 REAL, avg12 REAL, avg20 REAL, avg36 REAL, avg40 REAL, avg48 REAL, avg60 REAL, avg120 REAL, avg200 REAL, avg240 REAL, avg300 REAL, disparity_avg5 REAL, disparity_avg10 REAL, disparity_avg20 REAL, disparity_avg60 REAL, disparity_avg120, bolingerband_upper REAL, bolingerband_lower REAL, bolingerband_middle REAL, envelope_upper REAL, envelope_lower REAL, envelope_middle REAL, ichimokucloud_changeLine REAL, ichimokucloud_baseLine REAL, ichimokucloud_laggingSpan REAL, ichimokucloud_leadingSpan1 REAL, ichimokucloud_leadingSpan2 REAL, stochastic_fast_k REAL, stochastic_slow_k REAL, stochastic_slow_d REAL, rsi REAL, rsis REAL, macd REAL, macds REAL, macdo REAL, rp REAL)") + cursor.execute("CREATE TABLE IF NOT EXISTS " + stockAnalysisTableName + " (CODE text, NAME text, ymd text, close REAL, diff REAL, open REAL, high REAL, low REAL, volume REAL, avg3 REAL, avg4 REAL, avg5 REAL, avg6 REAL, avg10 REAL, avg12 REAL, avg20 REAL, avg36 REAL, avg40 REAL, avg48 REAL, avg60 REAL, avg120 REAL, avg200 REAL, avg240 REAL, avg300 REAL, avg360 REAL, avg720 REAL, avg1440 REAL, disparity_avg5 REAL, disparity_avg10 REAL, disparity_avg20 REAL, disparity_avg60 REAL, disparity_avg120, bolingerband_upper REAL, bolingerband_lower REAL, bolingerband_middle REAL, envelope_upper REAL, envelope_lower REAL, envelope_middle REAL, ichimokucloud_changeLine REAL, ichimokucloud_baseLine REAL, ichimokucloud_laggingSpan REAL, ichimokucloud_leadingSpan1 REAL, ichimokucloud_leadingSpan2 REAL, stochastic_fast_k REAL, stochastic_slow_k REAL, stochastic_slow_d REAL, rsi REAL, rsis REAL, macd REAL, macds REAL, macdo REAL, rp REAL)") # 키 생성 create_key = "CREATE INDEX IF NOT EXISTS " + stockAnalysisTableName + "_idx on " + stockAnalysisTableName + " (CODE, ymd) " @@ -701,19 +725,19 @@ class AnalyzerSqlite: result = cursor.fetchone() if result == None: sql = "INSERT INTO " + stockAnalysisTableName + "(CODE, NAME, ymd, close, diff, open, high, low, volume, " - 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 += " avg3, avg4, avg5, avg6, avg10, avg12, avg20, avg36, avg40, avg48, avg60, avg120, avg200, avg240, avg300, avg360, avg720, avg1440, " + sql += " disparity_avg5, disparity_avg10, disparity_avg20, disparity_avg60, disparity_avg120, disparity_avg240, disparity_avg480, " sql += " bolingerband_upper, bolingerband_lower, bolingerband_middle, " sql += " envelope_upper, envelope_lower, envelope_middle, " sql += " ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_laggingSpan, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2, " sql += " stochastic_fast_k, stochastic_slow_k, stochastic_slow_d, " sql += " rsi, rsis, macd, macds, macdo) " - sql += " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" + sql += " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" cursor.execute(sql, ( stock["CODE"], stock["NAME"], price['ymd'], price['close'], price['diff'], price['open'], price['high'], price['low'], price['volume'], - price['avg3'], price['avg4'], price['avg5'], price['avg6'], price['avg10'], price['avg12'], price['avg20'], price['avg36'], price['avg40'], price['avg48'], price['avg60'], price['avg120'], price['avg200'], price['avg240'], price['avg300'], - price['disparity_avg5'], price['disparity_avg10'], price['disparity_avg20'], price['disparity_avg60'], price['disparity_avg120'], + price['avg3'], price['avg4'], price['avg5'], price['avg6'], price['avg10'], price['avg12'], price['avg20'], price['avg36'], price['avg40'], price['avg48'], price['avg60'], price['avg120'], price['avg200'], price['avg240'], price['avg300'], price['avg360'], price['avg720'], price['avg1440'], + price['disparity_avg5'], price['disparity_avg10'], price['disparity_avg20'], price['disparity_avg60'], price['disparity_avg120'], price['disparity_avg240'], price['disparity_avg480'], price['bolingerband_upper'], price['bolingerband_lower'], price['bolingerband_middle'], price['envelope_upper'], price['envelope_lower'], price['envelope_middle'], price['ichimokucloud_changeLine'], price['ichimokucloud_baseLine'], price['ichimokucloud_laggingSpan'], price['ichimokucloud_leadingSpan1'], price['ichimokucloud_leadingSpan2'], @@ -722,8 +746,8 @@ class AnalyzerSqlite: else: sql = "UPDATE " + stockAnalysisTableName + " SET close=?, diff=?, open=?, high=?, low=?, volume=?, " - 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 += " avg3=?, avg4=?, avg5=?, avg6=?, avg10=?, avg12=?, avg20=?, avg36=?, avg40=?, avg48=?, avg60=?, avg120=?, avg200=?, avg240=?, avg300=?, avg360=?, avg720=?, avg1440=?, " + sql += " disparity_avg5=?, disparity_avg10=?, disparity_avg20=?, disparity_avg60=?, disparity_avg120=?, disparity_avg240=?, disparity_avg480=?, " sql += " bolingerband_upper=?, bolingerband_lower=?, bolingerband_middle=?, " sql += " envelope_upper=?, envelope_lower=?, envelope_middle=?, " sql += " ichimokucloud_changeLine=?, ichimokucloud_baseLine=?, ichimokucloud_laggingSpan=?, ichimokucloud_leadingSpan1=?, ichimokucloud_leadingSpan2=?, " @@ -734,8 +758,8 @@ class AnalyzerSqlite: cursor.execute(sql, (price['close'], price['diff'], price['open'], price['high'], price['low'], price['volume'], - price['avg3'], price['avg4'], price['avg5'], price['avg6'], price['avg10'], price['avg12'], price['avg20'], price['avg36'], price['avg40'], price['avg48'], price['avg60'], price['avg120'], price['avg200'], price['avg240'], price['avg300'], - price['disparity_avg5'], price['disparity_avg10'], price['disparity_avg20'], price['disparity_avg60'], price['disparity_avg120'], + price['avg3'], price['avg4'], price['avg5'], price['avg6'], price['avg10'], price['avg12'], price['avg20'], price['avg36'], price['avg40'], price['avg48'], price['avg60'], price['avg120'], price['avg200'], price['avg240'], price['avg300'], price['avg360'], price['avg720'], price['avg1440'], + price['disparity_avg5'], price['disparity_avg10'], price['disparity_avg20'], price['disparity_avg60'], price['disparity_avg120'], price['disparity_avg240'], price['disparity_avg480'], price['bolingerband_upper'], price['bolingerband_lower'], price['bolingerband_middle'], price['envelope_upper'], price['envelope_lower'], price['envelope_middle'], price['ichimokucloud_changeLine'], price['ichimokucloud_baseLine'], price['ichimokucloud_laggingSpan'], price['ichimokucloud_leadingSpan1'], price['ichimokucloud_leadingSpan2'], @@ -772,11 +796,16 @@ class AnalyzerSqlite: "avg200": -1, "avg240": -1, "avg300": -1, + "avg360": -1, + "avg720": -1, + "avg1440": -1, "disparity_avg5": -1, "disparity_avg10": -1, "disparity_avg20": -1, "disparity_avg60": -1, "disparity_avg120": -1, + "disparity_avg240": -1, + "disparity_avg480": -1, "bolingerband_upper": -1, "bolingerband_lower": -1, "bolingerband_middle": -1, @@ -894,9 +923,9 @@ if __name__ == "__main__": stockFileName = os.path.join(RESOURCE_PATH, 'stock.db') analyzer = AnalyzerSqlite(stockFileName) - #analyzer.analyzeDaily() - #analyzer.analyzeGrouping("weekly") - #analyzer.analyzeGrouping("monthly") + analyzer.analyzeDaily() + analyzer.analyzeGrouping("weekly") + analyzer.analyzeGrouping("monthly") # HTML 출력 outPath = os.path.join(PROJECT_HOME, "resources", "analysis") diff --git a/stock/analysis/Common.py b/stock/analysis/Common.py index 8b4a972..aa9c9cd 100644 --- a/stock/analysis/Common.py +++ b/stock/analysis/Common.py @@ -580,17 +580,15 @@ class Common: (stock['rsi'][-1:] < 33) or 0.9 <= param['bull'][0] / param['bear'][0] ): - # trend 상승 - if stock['trend'][i - 1] < stock['trend'][i]: - # avg360 상승 - if stock['avg360'][i - 1] < stock['avg360'][i]: - # avg3 < trend - if stock['avg3'][i] < stock['trend'][i]: - # avg3 이전 3개 봉 위 - if np.max(stock['avg3'][i - 3:i]) < stock['avg3'][i]: - buy_type = "trend" - buy_weight = 1 # 8 - check = True + # avg360 상승 + if stock['avg300'][i - 1] < stock['avg300'][i]: + # avg3 < trend + if stock['avg3'][i] < stock['trend'][i]: + # avg3 이전 3개 봉 위 + if np.max(stock['avg3'][i - 3:i]) < stock['avg3'][i]: + buy_type = "trend" + buy_weight = 1 # 8 + check = True # 상승 추세일 때 if (stock['macd'][-2] < stock['macd'][-1] and stock['macds'][-1] < stock['macd'][