From 83f7f2f528d3dab075553d85ded00e63b93f14aa Mon Sep 17 00:00:00 2001 From: dsyoon Date: Sun, 2 Apr 2023 20:59:07 +0900 Subject: [PATCH] init --- resources/BuyCount.xlsx | Bin 41861 -> 44911 bytes stock/analysis/AnalyzerSqlite.py | 192 ++++++++++++++++++------------- stock/analysis/BolingerBand.py | 2 +- 3 files changed, 113 insertions(+), 81 deletions(-) diff --git a/resources/BuyCount.xlsx b/resources/BuyCount.xlsx index 5fed4f735212d059cfd1b753dc382cc4144feda6..8a3aac7fce318870a2c81dda1353c7c34ab16383 100644 GIT binary patch delta 34842 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 delta 31567 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 5: if stock_daily['envelope_lower'][0] is not None and stock_daily['envelope_lower'][1] is not None: - # BB 하단에 부딪힘 + # ev 하단에 부딪힘 if stock_daily['close'][1] < stock_daily['avg5'][1] and stock_daily['avg5'][0] < stock_daily['close'][0]: check = False for c in range(1, 4): @@ -575,6 +580,21 @@ class AnalyzerSqlite: final_status_count += 1 self.writeFile(dir_code, dir_name, CODE, NAME, top, stock_daily, status) + if len(stock_daily['volume']) > 5: + if stock_daily['bolingerband_lower'][0] is not None and stock_daily['bolingerband_lower'][1] is not None: + # bb 하단에 부딪힘 + if stock_daily['close'][1] < stock_daily['avg5'][1] and stock_daily['avg5'][0] < stock_daily['close'][0]: + check = False + for c in range(1, 4): + if stock_daily['close'][c] < stock_daily['bolingerband_lower'][c]: + check = True + break + if check: + dir_code = "17" + dir_name = "daily_EV하단_내려옴" + final_status_count += 1 + self.writeFile(dir_code, dir_name, CODE, NAME, top, stock_daily, status) + if final_status_count >= 5: dir_code = "0" dir_name = "final" @@ -705,7 +725,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_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)") + 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_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) " @@ -779,29 +799,8 @@ class AnalyzerSqlite: cursor.execute("commit",) return - def analyzeDaily(self): - stockTableName = 'stock' - - conn = sqlite3.connect(self.stockFileName) - cursor = conn.cursor() - - cursor.execute('SELECT distinct code, name FROM ' + stockTableName + ' order by code') - items = cursor.fetchall() - - for rowid, item in enumerate(items): - - stock = {"CODE": item[0], "NAME": item[1], "PRICE":[]} - print("Daily # :", rowid, ", CODE: ", stock['CODE'], ", NAME: ", stock['NAME']) - - sql = 'SELECT ymd, close, diff, open, high, low, volume FROM ' + stockTableName + ' where CODE=? order by ymd desc ' - sql += ' limit 350' - cursor.execute(sql, (stock['CODE'],)) - items = cursor.fetchall() - - items_reverse = reversed(items) - for item in items_reverse: - stock['PRICE'].append( - { + def setItem(self, item): + return { "ymd": item[0], "close": item[1], "diff": item[2], @@ -847,7 +846,32 @@ class AnalyzerSqlite: "macd": -1, "macds": -1, "macdo": -1, + "rp": -1 } + + def analyzeDaily(self): + stockTableName = 'stock' + + conn = sqlite3.connect(self.stockFileName) + cursor = conn.cursor() + + cursor.execute('SELECT distinct code, name FROM ' + stockTableName + ' order by code') + items = cursor.fetchall() + + for rowid, item in enumerate(items): + + stock = {"CODE": item[0], "NAME": item[1], "PRICE":[]} + print("Daily # :", rowid, ", CODE: ", stock['CODE'], ", NAME: ", stock['NAME']) + + sql = 'SELECT ymd, close, diff, open, high, low, volume FROM ' + stockTableName + ' where CODE=? order by ymd desc ' + sql += ' limit 350' + cursor.execute(sql, (stock['CODE'],)) + items = cursor.fetchall() + + items_reverse = reversed(items) + for item in items_reverse: + stock['PRICE'].append( + self.setItem(item) ) self.analyzeAdditionalInfo(stock, cursor) @@ -880,53 +904,7 @@ class AnalyzerSqlite: items_reverse = reversed(items) for item in items_reverse: stock['PRICE'].append( - { - "ymd": item[0], - "close": item[1], - "diff": item[2], - "open": item[3], - "high": item[4], - "low": item[5], - "volume": item[6], - "avg3": -1, - "avg4": -1, - "avg5": -1, - "avg6": -1, - "avg10": -1, - "avg12": -1, - "avg20": -1, - "avg36": -1, - "avg40": -1, - "avg48": -1, - "avg60": -1, - "avg120": -1, - "avg200": -1, - "avg240": -1, - "avg300": -1, - "disparity_avg5": -1, - "disparity_avg10": -1, - "disparity_avg20": -1, - "disparity_avg60": -1, - "disparity_avg120": -1, - "bolingerband_upper": -1, - "bolingerband_lower": -1, - "bolingerband_middle": -1, - "envelope_upper": -1, - "envelope_lower": -1, - "envelope_middle": -1, - "ichimokucloud_changeLine": -1, - "ichimokucloud_baseLine": -1, - "ichimokucloud_leadingSpan1": -1, - "ichimokucloud_leadingSpan2": -1, - "stochastic_fast_k": -1, - "stochastic_slow_k": -1, - "stochastic_slow_d": -1, - "rsi": -1, - "rsis": -1, - "macd": -1, - "macds": -1, - "macdo": -1 - } + self.setItem(item) ) agg_dict = {'open': 'first', @@ -957,6 +935,60 @@ class AnalyzerSqlite: return + def analyzeRP (self): + + type = {200:None, 52: "weekly", 12: "monthly"} + limits = [200, 52, 12] + + for limit in limits: + if type[limit]==None: + stockAnalysisTableName = 'stock_analysis' + else: + stockAnalysisTableName = 'stock_analysis_' + type[limit] + + conn = sqlite3.connect(self.stockFileName) + cursor = conn.cursor() + + # S: Kospi 구하기 (RP 계산을 위함) + kospi = {"CODE": "^KS11", "NAME": "Kospi", "PRICE": []} + sql = "SELECT CODE, NAME, ymd, close, diff, open, high, low, volume, avg200 FROM " + stockAnalysisTableName + " where CODE=? order by ymd desc " + sql += ' limit ' + str(limit) + cursor.execute(sql, (kospi['CODE'],)) + items = cursor.fetchall() + + items_reverse = reversed(items) + for item in items_reverse: + kospi['PRICE'].append(self.setItem(item)) + # E: Kospi 구하기 (RP 계산을 위함) + + # S: 종목 구하기 + cursor.execute('SELECT distinct code, name FROM ' + stockAnalysisTableName + ' order by code') + items = cursor.fetchall() + + for rowid, item in enumerate(items): + + stock = {"CODE": item[0], "NAME": item[1], "PRICE": []} + print("Daily # :", rowid, ", CODE: ", stock['CODE'], ", NAME: ", stock['NAME']) + + sql = "SELECT CODE, NAME, ymd, close, diff, open, high, low, volume, avg200 FROM " + stockAnalysisTableName + " where CODE=? order by ymd desc " + sql += ' limit ' + str(limit) + cursor.execute(sql, (stock['CODE'],)) + items = cursor.fetchall() + + items_reverse = reversed(items) + for item in items_reverse: + stock['PRICE'].append(self.setItem(item)) + + self.relativePerformance.analyze(stock, kospi) + + sql = "UPDATE " + stockAnalysisTableName + " SET rp=? WHERE CODE=? and ymd=?" + + cursor.execute(sql, (price['rp'], stock["CODE"], price['ymd'],)) + + cursor.execute("commit",) + + return + if __name__ == "__main__": start = time.time() @@ -966,11 +998,11 @@ 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") + + #analyzer.analyzeRP() # HTML 출력 outPath = os.path.join(PROJECT_HOME, "resources", "analysis") diff --git a/stock/analysis/BolingerBand.py b/stock/analysis/BolingerBand.py index dd55121..a88bfea 100644 --- a/stock/analysis/BolingerBand.py +++ b/stock/analysis/BolingerBand.py @@ -12,7 +12,7 @@ class BolingerBand: self.common = Common() return - def apply(self, df, n=13, t=2): + def apply(self, df, n=25, t=2): # 입력받은 값이 dataframe이라는 것을 정의해줌 df = pd.DataFrame(df)