From 04c0805f6fd44e4c6502fe60db887495c4869610 Mon Sep 17 00:00:00 2001 From: dsyoon Date: Tue, 16 May 2023 21:25:41 +0900 Subject: [PATCH] init --- stock/analysis/AnalyzerSqlite.py | 19 +++++-- stock/analysis/Common.py | 52 +++++++++++++++++++- stock/{crawler => analysis}/MovingAverage.py | 0 3 files changed, 67 insertions(+), 4 deletions(-) rename stock/{crawler => analysis}/MovingAverage.py (100%) diff --git a/stock/analysis/AnalyzerSqlite.py b/stock/analysis/AnalyzerSqlite.py index 4146596..ce468aa 100644 --- a/stock/analysis/AnalyzerSqlite.py +++ b/stock/analysis/AnalyzerSqlite.py @@ -23,7 +23,7 @@ from stock.analysis.IchimokuCloud import IchimokuCloud from stock.analysis.RSI import RSI from stock.analysis.MACD import MACD from stock.analysis.Envelope import Envelope -from stock.crawler.MovingAverage import MovingAverage +from stock.analysis.MovingAverage import MovingAverage from hts.BuySellChecker import BuySellChecker @@ -421,7 +421,8 @@ class AnalyzerSqlite: "ichimokucloud_changeLine": ichimokucloud_changeLine, "ichimokucloud_baseLine": ichimokucloud_baseLine, "ichimokucloud_leadingSpan1": ichimokucloud_leadingSpan1, "ichimokucloud_leadingSpan2": ichimokucloud_leadingSpan2, "stochastic_fast_k": stochastic_fast_k, "stochastic_slow_k": stochastic_slow_k, "stochastic_slow_d": stochastic_slow_d, "rsi": rsi, "rsis": rsis, - "macd": macd, "macds": macds, "macdo": macdo + "macd": macd, "macds": macds, "macdo": macdo, + "obv5": [], "obv20": [], "obv60": [] } return stock @@ -451,6 +452,7 @@ class AnalyzerSqlite: self.makeDir("daily_env_상단_volume") self.makeDir("daily_이전에_없던_거래량") self.makeDir("daily_이격도") + self.makeDir("daily_OBV") #self.makeDir("daily_EV하단_내려옴") #self.makeDir("daily_BB하단_내려옴") @@ -551,7 +553,10 @@ class AnalyzerSqlite: check = self.common.check_mv_20_60(stock_weekly) if check: dir_name = "weekly_mv_20_60" - log = "RSI_" + "{:.2f}".format(stock_monthly['rsi'][0]) + if stock_monthly['rsi'][0] is not None: + log = "RSI_" + "{:.2f}".format(stock_monthly['rsi'][0]) + else: + log = "" self.writeFile(dir_name, CODE, NAME, top, stock_monthly, log) # 2) daily @@ -577,6 +582,14 @@ class AnalyzerSqlite: dir_name = "daily_이격도" log = "이격도_" + str(top) self.writeFile(dir_name, CODE, NAME, top, stock_daily, log) + + # daily_OBV + obv = self.common.check_obv(stock_daily) + if 0 < obv: + dir_name = "daily_OBV" + log = "OBV_" + str(obv) + self.writeFile(dir_name, CODE, NAME, top, stock_daily, log) + """ # daily_EV하단_내려옴 check = self.common.check_under_EV_Low(stock_daily) diff --git a/stock/analysis/Common.py b/stock/analysis/Common.py index 815f548..4f6d8ec 100644 --- a/stock/analysis/Common.py +++ b/stock/analysis/Common.py @@ -1,4 +1,6 @@ +from stock.analysis.MovingAverage import MovingAverage + class Common: # 상향 @@ -586,4 +588,52 @@ class Common: for c in range(1, 4): if stock['close'][c] < stock['bolingerband_lower'][c]: return True - return False \ No newline at end of file + return False + + # OBV (최저점에서 누적 거래량) 체크 + def check_obv(self, stock): + lowest_index = -1 + p_price = 99999999999999 + size = len(stock['close']) + for i in range(size): + if stock['low'][i] < p_price: + p_price = stock['low'][i] + lowest_index = i + + if lowest_index > 600: + lowest_index = 600 + + obv = 0 + obvs = [] + for i in range(lowest_index, -1, -1): + if stock['open'][i] < stock['close'][i]: + obv += stock['volume'][i] + elif stock['close'][i] < stock['open'][i]: + obv -= stock['volume'][i] + + obvs.append(obv) + + q_5 = MovingAverage(5) + q_20 = MovingAverage(20) + q_60 = MovingAverage(60) + + if len(obvs) > 60: + for i in range(len(obvs)): + q_5.enqueue(obvs[i]) + q_20.enqueue(obvs[i]) + q_60.enqueue(obvs[i]) + + stock['obv5'].append( q_5.avg() ) + stock['obv20'].append( q_20.avg() ) + stock['obv60'].append( q_60.avg() ) + lowest_index -= 1 + + stock['obv5'] = list(reversed(stock['obv5'])) + stock['obv20'] = list(reversed(stock['obv20'])) + stock['obv60'] = list(reversed(stock['obv60'])) + + obvs = list(reversed(obvs)) + if len(obvs) > 60 and obv > 0: + return obv + + return -1 diff --git a/stock/crawler/MovingAverage.py b/stock/analysis/MovingAverage.py similarity index 100% rename from stock/crawler/MovingAverage.py rename to stock/analysis/MovingAverage.py