From 602cbe2263edffb77d6d55f90acd64f580bb4c7b Mon Sep 17 00:00:00 2001 From: dsyoon Date: Wed, 18 Jan 2023 01:35:51 +0900 Subject: [PATCH] init --- HTS_daily.py | 31 +++++++++++++-- StockCrawler.py | 4 +- stock/analysis/DailyStatus.py | 71 +++++------------------------------ 3 files changed, 40 insertions(+), 66 deletions(-) diff --git a/HTS_daily.py b/HTS_daily.py index 1aac939..1ed0d9a 100644 --- a/HTS_daily.py +++ b/HTS_daily.py @@ -41,6 +41,7 @@ class HTS_DAILY (HTS): # final_price가 0이고 diff가 None이면 장부가로 팔겠다는 의미임 sell_price = -1 + orderNum = None jangoDic = self.requstJango() if jangoDic and len(jangoDic.keys()) > 0: for code in jangoDic: @@ -57,13 +58,26 @@ class HTS_DAILY (HTS): if code == "A"+stock_code: orderNum = self.requestOrder(OrderType.sell, stock_code, jangoDic[code]['매도가능'], sell_price) print("ORDER_SELL", stock_code, log_time.strftime('%Y%m%d %H%M%S'), jangoDic[code]['매도가능'], sell_price) - return + return orderNum + + def valid_company(self): + valid_company = set() + conn = sqlite3.connect(os.path.join(self.RESOURCE_PATH, "stock.db")) + cursor = conn.cursor() + cursor.execute('select CODE, NAME, max(ymd) as ymd from fnguide where type != "E" group by 1 order by total_assets desc limit 2400') + items = cursor.fetchall() + cursor.close() + conn.close() + for item in items: + valid_company.add(item[0]) + return valid_company def buyRealTime(self, today, n = 200): print ("START...") THIS_TIME = datetime.now() + valid_company = self.valid_company() self.orderChecker.read(today) while datetime.strptime(today + " 070000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 153100", '%Y%m%d %H%M%S'): @@ -82,7 +96,7 @@ class HTS_DAILY (HTS): for idx, item in enumerate(items): stock_code = item[0] stock_name = item[1] - if stock_name.find('스팩') >= 0 or re.search("\d.*?호", stock_name) is not None: + if stock_name.find('스팩') >= 0 or re.search("\d.*?호", stock_name) is not None and stock_code not in valid_company: continue print(idx, stock_code, stock_name, ", CODE: ", stock_code, ", NAME: ", stock_name) @@ -99,7 +113,8 @@ class HTS_DAILY (HTS): bsLine, data = self.buySellChecker.checkTransactionWithEnvelope(data, stock_code, self.analyzed_day, isRealTime=False) - if len(data.index) > 10 and max(bsLine['buy'][len(bsLine['buy']) - 2:]) > 0 and not self.orderChecker.exist(stock_code): + # 다음 조건이면 매수한다. + if len(data.index) > 10 and max(bsLine['buy'][len(bsLine['buy']) - 2:]) > 1000 and not self.orderChecker.exist(stock_code): last_index = len(bsLine['buy'])-1 if bsLine['buy'][last_index] > 0: bs_buy_price = bsLine['buy'][last_index] @@ -113,6 +128,16 @@ class HTS_DAILY (HTS): # 로그 출력 print("BUY", THIS_TIME.strftime('%Y%m%d %H%M%S'), orderNum, stock_code, stock_name, bs_buy_price, buy_count) + # 다음 조건이면 매도한다. + if len(data.index) > 10 and max(bsLine['sell'][len(bsLine['sell']) - 2:]) > 0: + last_index = len(bsLine['sell']) - 1 + if bsLine['sell'][last_index] > 0: + bs_sell_price = bsLine['sell'][last_index] + orderNum = self.getSellingPrice(THIS_TIME, self.stock_code, bs_sell_price) + + # 로그 출력 + print("SELL", THIS_TIME.strftime('%Y%m%d %H%M%S'), orderNum, stock_code, stock_name, bs_sell_price) + THIS_TIME = datetime.now() return diff --git a/StockCrawler.py b/StockCrawler.py index c519003..f73dbc9 100644 --- a/StockCrawler.py +++ b/StockCrawler.py @@ -23,7 +23,7 @@ stockFileName = os.path.join(RESOURCE_PATH, 'stock.db') week = datetime.today().weekday() if week in (0, 1, 2, 3, 4): # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일 - """ + # 재무제표는 3개월마다 다운로드를 한다. fnGuideCrawler = FnGuideCrawler(START_DATE) print("[KOSPI 상장기업 재무제표 다운로드]") @@ -75,7 +75,7 @@ if week in (0, 1, 2, 3, 4): # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일 os.mkdir(outPath) analyzerSqlite.findCandidate(outPath) - """ + # envelopes를 이용한 daily check dailyStatus = DailyStatus(RESOURCE_PATH) dailyStatus.checkEnvelope() diff --git a/stock/analysis/DailyStatus.py b/stock/analysis/DailyStatus.py index 50f5382..b36268b 100644 --- a/stock/analysis/DailyStatus.py +++ b/stock/analysis/DailyStatus.py @@ -568,65 +568,6 @@ class DailyStatus (HTS): return - def getData(self, today, stock): - close = stock['PRICE'][len(stock['PRICE']) - 1]["close"] - open = stock['PRICE'][len(stock['PRICE']) - 1]["open"] - high = stock['PRICE'][len(stock['PRICE']) - 1]["high"] - low = stock['PRICE'][len(stock['PRICE']) - 1]["low"] - volume = stock['PRICE'][len(stock['PRICE']) - 1]["volume"] - - stock['PRICE'].append( - { - "ymd": today, - "close": close, - "diff": stock['PRICE'][len(stock['PRICE']) - 1]["close"] - close, - "open": open, - "high": high, - "low": low, - "volume": volume, - "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, - } - ) - - return - def checkEnvelope(self, stock_codes:list=None, isRealTime=False): if not isRealTime: n = 200 @@ -662,11 +603,15 @@ class DailyStatus (HTS): cursor.close() conn.close() + if not os.path.exists(os.path.join(self.RESOURCE_PATH, 'analysis', today)): + os.mkdir(os.path.join(self.RESOURCE_PATH, 'analysis', today)) + dailyDirName = os.path.join(self.RESOURCE_PATH, 'analysis', today, 'daily') if os.path.exists(dailyDirName): shutil.rmtree(dailyDirName) os.mkdir(dailyDirName) + analyzed_day = 120 for idx, item in enumerate(items): stock_code = item[0] stock_name = item[1] @@ -675,8 +620,6 @@ class DailyStatus (HTS): print(idx, stock_code, stock_name, ", CODE: ", stock_code, ", NAME: ", stock_name) stock = self.getLastData(stock_code, n) - self.getData(today, stock) - analyzed_day = 60 data = self.analyze(stock, analyzed_day) # 분석일 데이터만 활용한다 (이전 데이터는 제거) data.drop(data.index[:analyzed_day], inplace=True) @@ -694,3 +637,9 @@ class DailyStatus (HTS): return +if __name__ == "__main__": + PROJECT_HOME = os.path.join(os.path.dirname(os.path.join(os.path.dirname(os.path.join(os.path.dirname(__file__)))))) + RESOURCE_PATH = os.path.join(PROJECT_HOME, "resources") + + dailyStatus = DailyStatus(RESOURCE_PATH) + dailyStatus.checkEnvelope() \ No newline at end of file