diff --git a/hts/HTS_5min.py b/hts/HTS_5min.py index 7d18450..a76d9ac 100644 --- a/hts/HTS_5min.py +++ b/hts/HTS_5min.py @@ -1019,7 +1019,7 @@ class HTS: sell_price = int(jangoDic[code]['장부가'] / 10) * 10 # 만약 오후 1시 이전이라면 한 호가 (5원) 더 올려서 매도한다. if datetime.now() < datetime.strptime(given_day + " 104000", '%Y%m%d %H%M%S'): - if lower != None: + if lower is not None: if lower[len(lower)-2] < lower[len(lower)-1]: sell_price += 5 diff --git a/stockpredictor/analysis/Analyzer.py b/stockpredictor/analysis/Analyzer.py index 3642b67..3b15694 100644 --- a/stockpredictor/analysis/Analyzer.py +++ b/stockpredictor/analysis/Analyzer.py @@ -63,7 +63,7 @@ class Analyzer: rowid = 1 cursor.execute('SELECT * FROM fnguide WHERE rowid=?', (rowid,)) result = cursor.fetchone() - while result != None: + while result is not None: if result[2] == "227950": print (1) data = json.loads(result[2]) @@ -144,7 +144,7 @@ class Analyzer: rowid = 1 cursor.execute('SELECT * FROM ' + self.tableName + ' WHERE rowid=?', (rowid,)) result = cursor.fetchone() - while result != None: + while result is not None: stock = {"CODE": result[0], "NAME": result[1], "PRICE": json.loads(result[2])} results = self.stochastic.analyze(stock) text = json.dumps(results, ensure_ascii=False) @@ -466,7 +466,7 @@ class Analyzer: for check_index in range(365): inde_check.append([0,0]) - while result != None: + while result is not None: item_code = result[0] item_name = result[1] print("#html", rowid, item_name) @@ -589,7 +589,7 @@ class Analyzer: rowid = 1 cursor.execute('SELECT * FROM ' + self.tableName + ' WHERE rowid=?', (rowid,)) result = cursor.fetchone() - while result != None: + while result is not None: stock = {"CODE": result[0], "NAME": result[1], "PRICE": json.loads(result[2])} try: diff --git a/stockpredictor/analysis/AnalyzerSqlite.py b/stockpredictor/analysis/AnalyzerSqlite.py index 0b38b92..bfe33d0 100644 --- a/stockpredictor/analysis/AnalyzerSqlite.py +++ b/stockpredictor/analysis/AnalyzerSqlite.py @@ -389,7 +389,10 @@ class AnalyzerSqlite: self.makeDir("0_240일선 아래") self.makeDir("1_기준선 위 전환선 올라옴") self.makeDir("1_기준선 위 120일선 올라옴") + self.makeDir("1_기준선 위 200일선 올라옴") + self.makeDir("1_기준선 위 240일선 올라옴") self.makeDir("1_240일선 돌파") + self.makeDir("1_200일선 돌파") self.makeDir("1_20일선 돌파") self.makeDir("1_60일선 돌파") self.makeDir("1_거래량 5배 이상") @@ -503,36 +506,38 @@ class AnalyzerSqlite: # 종목 상태 체크 분석 state = self.analyzeFinalScore(stock) - # 스토케스틱이 10 미만 + # 0_스토케스틱이 10 미만 if len(close) > 5 and stochastic_score is not None and stochastic_score < 10: type = "0_스토케스틱이 10 미만" self.writeFile(type, CODE, NAME, stock, state) - # bolingerband 하단 + # 0_bolingerband 하단 if len(close) > 60 and bolingerband_lower[0] is not None and close[0] < bolingerband_lower[0]: type = "0_bolingerband 하단" self.writeFile(type, CODE, NAME, stock, state) - # 260일 위치 에너지가 10% 미만 + # 0_260일 위치 에너지가 10% 미만 if len(close) > 5 and positionalEnergy1 is not None and positionalEnergy1 < 0.1: type = "0_260일 위치 에너지가 10% 미만" self.writeFile(type, CODE, NAME, stock, state) - # 260일 가격 반토막 이상 + # 0_260일 가격 반토막 이상 if len(close) > 5 and positionalEnergy2 is not None and positionalEnergy2 < 0.5: type = "0_260일 가격 반토막 이상" self.writeFile(type, CODE, NAME, stock, state) - # 종가가 240일선 아래라면 매수한다. + # 0_종가가 240일선 아래라면 매수한다. if close[0] < avg240[0]: type = "0_240일선 아래" self.writeFile(type, CODE, NAME, stock, state) - # 기준선 위 전환선 올라옴 + # 1_기준선 위 전환선 올라옴 if len(close) > 50: if ((ichimokucloud_changeLine[0] > ichimokucloud_baseLine[0] and - ichimokucloud_changeLine[1] < ichimokucloud_baseLine[1] and - ichimokucloud_changeLine[2] < ichimokucloud_baseLine[2]) and + ichimokucloud_changeLine[1] < ichimokucloud_baseLine[1] and + ichimokucloud_changeLine[2] < ichimokucloud_baseLine[2] and + ichimokucloud_changeLine[3] < ichimokucloud_baseLine[3] and + ichimokucloud_changeLine[4] < ichimokucloud_baseLine[4]) and volume[0] > volume[1]): type = "1_기준선 위 전환선 올라옴" self.writeFile(type, CODE, NAME, stock, state) @@ -540,53 +545,82 @@ class AnalyzerSqlite: # "1_기준선 위 120일선 올라옴" if len(close) > 50: if ((avg120[0] > ichimokucloud_baseLine[0] and - avg120[1] < ichimokucloud_baseLine[1] and - avg120[2] < ichimokucloud_baseLine[2]) and + avg120[1] < ichimokucloud_baseLine[1] and + avg120[2] < ichimokucloud_baseLine[2] and + avg120[3] < ichimokucloud_baseLine[3] and + avg120[4] < ichimokucloud_baseLine[4]) and volume[0] > volume[1]): type = "1_기준선 위 120일선 올라옴" self.writeFile(type, CODE, NAME, stock, state) - # 종가가 240일선 돌파 - if close[0] > avg240[0] and close[1] < avg240[1]: + # "1_기준선 위 200일선 올라옴" + if len(close) > 50: + if ((avg200[0] > ichimokucloud_baseLine[0] and + avg200[1] < ichimokucloud_baseLine[1] and + avg200[2] < ichimokucloud_baseLine[2] and + avg200[3] < ichimokucloud_baseLine[3] and + avg200[4] < ichimokucloud_baseLine[4]) and + volume[0] > volume[1]): + type = "1_기준선 위 200일선 올라옴" + self.writeFile(type, CODE, NAME, stock, state) + + # "1_기준선 위 240일선 올라옴" + if len(close) > 50: + if ((avg240[0] > ichimokucloud_baseLine[0] and + avg240[1] < ichimokucloud_baseLine[1] and + avg240[2] < ichimokucloud_baseLine[2] and + avg240[3] < ichimokucloud_baseLine[3] and + avg240[4] < ichimokucloud_baseLine[4]) and + volume[0] > volume[1]): + type = "1_기준선 위 240일선 올라옴" + self.writeFile(type, CODE, NAME, stock, state) + + # 1_종가가 200일선 돌파 + if close[0] > avg200[0] and close[1] < avg200[1] and close[2] < avg200[2] and close[3] < avg200[3] and close[4] < avg200[4]: + type = "1_200일선 돌파" + self.writeFile(type, CODE, NAME, stock, state) + + # 1_종가가 240일선 돌파 + if close[0] > avg240[0] and close[1] < avg240[1] and close[2] < avg240[2] and close[3] < avg240[3] and close[4] < avg240[4]: type = "1_240일선 돌파" self.writeFile(type, CODE, NAME, stock, state) - # 20일선 돌파 + # 1_20일선 돌파 temp_status = self.common.check_Dolpa_Jiji(stock, '20') if temp_status != "": type = "1_20일선 돌파" self.writeFile(type, CODE, NAME, stock, state) - # 60일선 돌파 + # 1_60일선 돌파 temp_status = self.common.check_Dolpa_Jiji(stock, '60') if temp_status != "": type = "1_60일선 돌파" self.writeFile(type, CODE, NAME, stock, state) - # 골든크로스 + # 1_골든크로스 golden_cross_status = self.common.check_golded_cross(stock) if golden_cross_status != "": type = "1_GoldenCross" self.writeFile(type, CODE, NAME, stock, state) - # 거래량 5배 이상 - if volume[0] > volume[1]*5: + # 1_거래량 5배 이상 + if len(volume)>2 and volume[0] > volume[1]*5: type = "1_거래량 5배 이상" self.writeFile(type, CODE, NAME, stock, state) - # bolingerband 하단 돌파 상승 + # 1_bolingerband 하단 돌파 상승 if (len(close) > 60 and (bolingerband_lower[0] is not None and bolingerband_lower[1] is not None) and close[0] > bolingerband_lower[0] and close[1] < bolingerband_lower[1]): type = "1_bolingerband 하단 돌파 상승" self.writeFile(type, CODE, NAME, stock, state) - # 정배열 + # 1_정배열 right_arrange = self.common.check_RightArrange(stock) if right_arrange != "": type = "1_정배열" self.writeFile(type, CODE, NAME, stock, state) - # 모든 라인 돌파 + # 1_모든 라인 돌파 if (len(close) > 50 and close[0] > max(open[0], avg5[0], avg20[0], avg60[0], avg120[0], avg240[0], bolingerband_upper[0], ichimokucloud_changeLine[0], ichimokucloud_baseLine[0]) and open[0] < max(open[0], avg5[0], avg20[0], avg60[0], avg120[0], avg240[0], bolingerband_upper[0], ichimokucloud_changeLine[0], ichimokucloud_baseLine[0])): diff --git a/stockpredictor/analysis/Common.old.py b/stockpredictor/analysis/Common.old.py index 5755d19..3ec20b9 100644 --- a/stockpredictor/analysis/Common.old.py +++ b/stockpredictor/analysis/Common.old.py @@ -4,7 +4,7 @@ class Common: # 상향 def checkUpward(self, type, data): check = True - if type != None: + if type is not None: for i in range(len(data)-1): # 만약 이전이 이후보다 크다면, 상승이 아님 if data[i][type] > data[i+1][type]: diff --git a/stockpredictor/analysis/Common.py b/stockpredictor/analysis/Common.py index e0e3c83..5626250 100644 --- a/stockpredictor/analysis/Common.py +++ b/stockpredictor/analysis/Common.py @@ -4,7 +4,7 @@ class Common: # 상향 def checkUpward(self, type, data): check = True - if type != None: + if type is not None: for i in range(len(data)-1): # 만약 이전이 이후보다 크다면, 상승이 아님 if data[i][type] > data[i+1][type]: diff --git a/stockpredictor/crawler/sQLite/StockCrawler.py b/stockpredictor/crawler/sQLite/StockCrawler.py index eb44c70..ada02de 100644 --- a/stockpredictor/crawler/sQLite/StockCrawler.py +++ b/stockpredictor/crawler/sQLite/StockCrawler.py @@ -5,7 +5,7 @@ import re import json import sqlite3 import requests -import math +from time import sleep import time # 닐짜 형식으로 바뀐 this_date값을 확인 가능 @@ -126,7 +126,7 @@ class StockCrawler: cursor.execute('SELECT ymd FROM ' + tableName + ' WHERE CODE=? order by ymd desc', (stock["CODE"],)) result = cursor.fetchone() ymd = "2019.01.01" - if result != None: + if result is not None: ymd = result[0] stock_data = self.crawl_specific_stock(stock["CODE"], ymd) @@ -139,6 +139,7 @@ class StockCrawler: #else: # cursor.execute("UPDATE " + tableName + " SET close=?, diff=?, open=?, high=?, low=?, volume=? WHERE CODE=? and ymd=?", (item['close'], item['diff'], item['open'], item['high'], item['low'], item['volume'], stock["CODE"], item['ymd'])) + sleep(0.05) conn.commit() cursor.close() conn.close() @@ -166,19 +167,20 @@ class StockCrawler: start_time = time.time() idx = 0 for item in items: + idx += 1 + conn = sqlite3.connect(inFileName) cursor = conn.cursor() - idx += 1 - item_name = item[0] item_code = item[1] cursor.execute('SELECT ymd FROM ' + tableName + ' WHERE CODE=? order by ymd desc', (item_code,)) result = cursor.fetchone() stock = {"CODE": item_code, "NAME": item_name} + ymd = "2020.01.01" - if result != None: + if result is not None: ymd = result[0] stock_data = self.crawl_specific_stock(item_code, ymd) @@ -197,6 +199,7 @@ class StockCrawler: print(idx, item_name, item_code, (time.time() - start_time), "s") start_time = time.time() + sleep(0.05) return @@ -228,7 +231,8 @@ class StockCrawler: df = df.append(html[0], ignore_index=True) break df = df.append(html[0], ignore_index=True) - if lastPage: + df = df.dropna() + if lastPage or len(df) < 1 or df.날짜[0]=='': print("\t- lastpage:", page) break @@ -319,7 +323,7 @@ class StockCrawler: lastDay = "" cursor.execute('SELECT * FROM ' + tableName + ' WHERE CODE=?', (stock["CODE"],)) result = cursor.fetchone() - if result != None: + if result is not None: stock["PRICE"] = json.loads(result[2]) lastDay = stock["PRICE"][len(stock["PRICE"]) - 1]["DATE"] diff --git a/stockpredictor/crawler/toSQLite/StockCrawler.py b/stockpredictor/crawler/toSQLite/StockCrawler.py index c5eb0c8..bb60d8d 100644 --- a/stockpredictor/crawler/toSQLite/StockCrawler.py +++ b/stockpredictor/crawler/toSQLite/StockCrawler.py @@ -152,7 +152,7 @@ class StockCrawler: start_time = time.time() cursor.execute('SELECT * FROM ' + tableName + ' WHERE CODE=?', (stock["CODE"],)) result = cursor.fetchone() - if result != None: + if result is not None: stock["PRICE"] = json.loads(result[2]) self.crawl_specific_stock(stock) text = json.dumps(stock['PRICE'], ensure_ascii=False) @@ -189,7 +189,7 @@ class StockCrawler: cursor.execute('SELECT * FROM ' + tableName + ' WHERE CODE=?', (item_code,)) result = cursor.fetchone() stock = {"CODE": item_code, "NAME": item_name, "PRICE": []} - if result != None: + if result is not None: stock["PRICE"] = json.loads(result[2]) self.crawl_specific_stock(stock) @@ -403,7 +403,7 @@ class StockCrawler: lastDay = "" cursor.execute('SELECT * FROM ' + tableName + ' WHERE CODE=?', (stock["CODE"],)) result = cursor.fetchone() - if result != None: + if result is not None: stock["PRICE"] = json.loads(result[2]) lastDay = stock["PRICE"][len(stock["PRICE"]) - 1]["DATE"] diff --git a/stockpredictor/train/PricePredictor.py b/stockpredictor/train/PricePredictor.py index bd3da46..df2d335 100644 --- a/stockpredictor/train/PricePredictor.py +++ b/stockpredictor/train/PricePredictor.py @@ -34,7 +34,7 @@ class PricePredictor: rowid = 1 cursor.execute('SELECT * FROM stock WHERE rowid=?', (rowid,)) result = cursor.fetchone() - while result != None: + while result is not None: prices = json.loads(result[2]) stock = [] for price in prices: