init
This commit is contained in:
48
hts/HTS.py
48
hts/HTS.py
@@ -456,13 +456,13 @@ class HTS:
|
|||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def insertStockData(self, inFileName, stock_code, stock_name, today):
|
def insertStockData(self, db_filename, stock_code, stock_name, today):
|
||||||
tableName = 'hts'
|
tableName = 'hts'
|
||||||
conn = sqlite3.connect(inFileName)
|
conn = sqlite3.connect(db_filename)
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
|
|
||||||
# 테이블 생성
|
# 테이블 생성
|
||||||
cursor.execute("CREATE TABLE IF NOT EXISTS " + tableName + " (CODE text, NAME text, ymd text, hms text, close REAL, open REAL, high REAL, low REAL, volume REAL)")
|
cursor.execute("CREATE TABLE IF NOT EXISTS " + tableName + " (CODE text, NAME text, ymd text, hms text, close REAL, open REAL, high REAL, low REAL, volume REAL, label INTEGER DEFAULT 0)")
|
||||||
|
|
||||||
# 키 생성
|
# 키 생성
|
||||||
create_key = "CREATE INDEX IF NOT EXISTS " + tableName + "_idx on " + tableName + " (CODE, ymd, hms) "
|
create_key = "CREATE INDEX IF NOT EXISTS " + tableName + "_idx on " + tableName + " (CODE, ymd, hms) "
|
||||||
@@ -474,7 +474,7 @@ class HTS:
|
|||||||
|
|
||||||
items = self.getStockInfo(stock_code, today)
|
items = self.getStockInfo(stock_code, today)
|
||||||
|
|
||||||
conn = sqlite3.connect(inFileName)
|
conn = sqlite3.connect(db_filename)
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
idx = 0
|
idx = 0
|
||||||
for item in items:
|
for item in items:
|
||||||
@@ -548,6 +548,46 @@ class HTS:
|
|||||||
result["vol"].append(int(vol))
|
result["vol"].append(int(vol))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def updateLabel(self, db_filename, stock_code, bsLine, data, ymd):
|
||||||
|
tableName = 'hts'
|
||||||
|
conn = sqlite3.connect(db_filename)
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
cursor.execute('Update ' + tableName + ' set label=? WHERE CODE=? and ymd=?', (0, stock_code, ymd,))
|
||||||
|
|
||||||
|
for i in range(len(bsLine["buy"])):
|
||||||
|
if bsLine["buy"][i] > 0:
|
||||||
|
ymd = data['date'][i].strftime('%Y%m%d')
|
||||||
|
hms = data['date'][i].strftime('%H%M')
|
||||||
|
cursor.execute('Update ' + tableName + ' set label=? WHERE CODE=? and ymd=? and hms=?', (2, stock_code, ymd, hms))
|
||||||
|
|
||||||
|
for i in range(len(bsLine["sell"])):
|
||||||
|
if bsLine["sell"][i] > 0:
|
||||||
|
ymd = data['date'][i].strftime('%Y%m%d')
|
||||||
|
hms = data['date'][i].strftime('%H%M')
|
||||||
|
cursor.execute('Update ' + tableName + ' set label=? WHERE CODE=? and ymd=? and hms=?', (1, stock_code, ymd, hms))
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
cursor.close()
|
||||||
|
conn.close()
|
||||||
|
print("insert...", stock_code, ymd)
|
||||||
|
return
|
||||||
|
|
||||||
|
def getYMD(self, stock_code):
|
||||||
|
tableName = 'hts'
|
||||||
|
conn = sqlite3.connect(os.path.join(self.RESOURCE_PATH, "hts.db"))
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
result = []
|
||||||
|
cursor.execute('SELECT distinct ymd FROM ' + tableName + ' WHERE CODE=? order by ymd', (stock_code,))
|
||||||
|
db_result = cursor.fetchall()
|
||||||
|
for rows in db_result:
|
||||||
|
ymd = rows[0] # hts.날짜
|
||||||
|
|
||||||
|
result.append(ymd)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
def getDBData(self, stock_code, day, result):
|
def getDBData(self, stock_code, day, result):
|
||||||
tableName = 'hts'
|
tableName = 'hts'
|
||||||
conn = sqlite3.connect(os.path.join(self.RESOURCE_PATH, "hts.db"))
|
conn = sqlite3.connect(os.path.join(self.RESOURCE_PATH, "hts.db"))
|
||||||
|
|||||||
BIN
resources/hts.db
BIN
resources/hts.db
Binary file not shown.
@@ -14,7 +14,7 @@ class DBManager:
|
|||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
|
|
||||||
# 테이블 생성
|
# 테이블 생성
|
||||||
cursor.execute("CREATE TABLE IF NOT EXISTS " + tableName + " (CODE text, NAME text, ymd text, hms text, close REAL, open REAL, high REAL, low REAL, volume REAL, label INTEGER)")
|
cursor.execute("CREATE TABLE IF NOT EXISTS " + tableName + " (CODE text, NAME text, ymd text, hms text, close REAL, open REAL, high REAL, low REAL, volume REAL, label INTEGER DEFAULT 0)")
|
||||||
|
|
||||||
# 키 생성
|
# 키 생성
|
||||||
create_key = "CREATE INDEX IF NOT EXISTS " + tableName + "_idx on " + tableName + " (CODE, ymd, hms, label) "
|
create_key = "CREATE INDEX IF NOT EXISTS " + tableName + "_idx on " + tableName + " (CODE, ymd, hms, label) "
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import os
|
import os
|
||||||
import csv
|
import csv
|
||||||
|
import logging
|
||||||
from math import nan
|
from math import nan
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import plotly.graph_objects as go
|
import plotly.graph_objects as go
|
||||||
@@ -17,7 +18,7 @@ class LabelMaker (HTS):
|
|||||||
self.buySellChecker = BuySellChecker()
|
self.buySellChecker = BuySellChecker()
|
||||||
return
|
return
|
||||||
|
|
||||||
def checkTransaction(self, data):
|
def checkTransaction(self, data, duration=60):
|
||||||
bsLine = {}
|
bsLine = {}
|
||||||
size = len(data["close"])
|
size = len(data["close"])
|
||||||
|
|
||||||
@@ -27,18 +28,17 @@ class LabelMaker (HTS):
|
|||||||
bsLine['sell'] = [-1 for i in range(size)]
|
bsLine['sell'] = [-1 for i in range(size)]
|
||||||
bsLine['sell_weight'] = [-1 for i in range(size)]
|
bsLine['sell_weight'] = [-1 for i in range(size)]
|
||||||
|
|
||||||
|
# 매수 처리
|
||||||
p_min_price = 999999999
|
p_min_price = 999999999
|
||||||
p_max_price = 999999999
|
# - 10을 한 것은 3시 11분까지 매매를 하기 위함임
|
||||||
for i in range(size-60):
|
for i in range(size-duration-10):
|
||||||
min_price, min_price_c, max_price, max_price_c = 9999999, -1, 0, -1
|
min_price, min_price_c, = 9999999, -1
|
||||||
for c in range(i, i+60):
|
for c in range(i, i+duration):
|
||||||
if min(data["close"][c], data["close"][c]) < min_price:
|
if min(data["close"][c], data["close"][c]) < min_price:
|
||||||
min_price = min(data["close"][c], data["close"][c])
|
min_price = min(data["close"][c], data["close"][c])
|
||||||
min_price_c = c
|
min_price_c = c
|
||||||
if max(data["close"][c], data["close"][c]) > max_price:
|
|
||||||
max_price = max(data["close"][c], data["close"][c])
|
|
||||||
max_price_c = c
|
|
||||||
|
|
||||||
|
# 매수 처리
|
||||||
if min_price_c > 0:
|
if min_price_c > 0:
|
||||||
isValid = True
|
isValid = True
|
||||||
for c in range(2, 10):
|
for c in range(2, 10):
|
||||||
@@ -50,17 +50,43 @@ class LabelMaker (HTS):
|
|||||||
bsLine['buy'][min_price_c] = min_price
|
bsLine['buy'][min_price_c] = min_price
|
||||||
bsLine['buy_weight'][min_price_c] = 1
|
bsLine['buy_weight'][min_price_c] = 1
|
||||||
p_min_price = min_price
|
p_min_price = min_price
|
||||||
if max_price_c > 0 and bsLine['buy'][max_price_c-2] < 0:
|
|
||||||
isValid = True
|
# 매도 처리
|
||||||
for c in range(2, 10):
|
buy_i = [c for c in range(size) if bsLine['buy'][c] > 0]
|
||||||
if bsLine['buy'][max_price_c - c] > 0:
|
for i in range(len(buy_i)):
|
||||||
isValid = False
|
if i < len(buy_i)-1:
|
||||||
break
|
boundry = data["high"][buy_i[i]+1: buy_i[i+1]]
|
||||||
if isValid:
|
if len(boundry) > 1:
|
||||||
if max_price > p_max_price:
|
max_price = max(boundry)
|
||||||
bsLine['sell'][max_price_c] = max_price
|
for c in range(buy_i[i], buy_i[i+1]):
|
||||||
bsLine['sell_weight'][max_price_c] = 1
|
if data["high"][c] == max_price:
|
||||||
p_max_price = max_price
|
isValid = False
|
||||||
|
for d in range(c - 1, 0, -1):
|
||||||
|
if bsLine['sell'][d] > 0 and bsLine['buy'][d] < 0:
|
||||||
|
break
|
||||||
|
if bsLine['sell'][d] < 0 and bsLine['buy'][d] > 0:
|
||||||
|
isValid = True
|
||||||
|
break
|
||||||
|
if isValid:
|
||||||
|
bsLine['sell'][c] = max_price
|
||||||
|
bsLine['sell_weight'][c] = 1
|
||||||
|
else:
|
||||||
|
boundry = data["high"][buy_i[i] + 1:]
|
||||||
|
if len(boundry) > 1:
|
||||||
|
max_price = max(boundry)
|
||||||
|
for c in range(buy_i[i], len(data["high"])):
|
||||||
|
if data["high"][c] == max_price:
|
||||||
|
isValid = False
|
||||||
|
for d in range(c-1, 0, -1):
|
||||||
|
if bsLine['sell'][d] > 0 and bsLine['buy'][d] < 0 :
|
||||||
|
break
|
||||||
|
if bsLine['sell'][d] < 0 and bsLine['buy'][d] > 0 :
|
||||||
|
isValid = True
|
||||||
|
break
|
||||||
|
if isValid:
|
||||||
|
bsLine['sell'][c] = max_price
|
||||||
|
bsLine['sell_weight'][c] = 1
|
||||||
|
|
||||||
return bsLine, data
|
return bsLine, data
|
||||||
|
|
||||||
def draw_simple(self, stock_code, given_day, data, bsLine):
|
def draw_simple(self, stock_code, given_day, data, bsLine):
|
||||||
@@ -200,15 +226,18 @@ class LabelMaker (HTS):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def writeLabelFile(self, bsLine, data, ymd):
|
def writeLabelFile(self, stock_code, bsLine, data, ymd):
|
||||||
outFileName = os.path.join(self.RESOURCE_PATH, "tmp", ymd+".sell.csv")
|
if not os.path.isdir(os.path.join(self.RESOURCE_PATH, "tmp")):
|
||||||
|
os.mkdir(os.path.join(self.RESOURCE_PATH, "tmp"))
|
||||||
|
|
||||||
|
outFileName = os.path.join(self.RESOURCE_PATH, "tmp", stock_code+"."+ymd+".sell.csv")
|
||||||
with open(outFileName, "w", encoding="utf-8") as outFp:
|
with open(outFileName, "w", encoding="utf-8") as outFp:
|
||||||
writer = csv.writer(outFp)
|
writer = csv.writer(outFp)
|
||||||
for i, price in enumerate(bsLine["sell"]):
|
for i, price in enumerate(bsLine["sell"]):
|
||||||
if price != -1:
|
if price != -1:
|
||||||
writer.writerow([data['date'][i], bsLine["sell"][i]])
|
writer.writerow([data['date'][i], bsLine["sell"][i]])
|
||||||
|
|
||||||
outFileName = os.path.join(self.RESOURCE_PATH, "tmp", ymd + ".buy.csv")
|
outFileName = os.path.join(self.RESOURCE_PATH, "tmp", stock_code+"."+ymd + ".buy.csv")
|
||||||
with open(outFileName, "w", encoding="utf-8") as outFp:
|
with open(outFileName, "w", encoding="utf-8") as outFp:
|
||||||
writer = csv.writer(outFp)
|
writer = csv.writer(outFp)
|
||||||
for i, price in enumerate(bsLine["buy"]):
|
for i, price in enumerate(bsLine["buy"]):
|
||||||
@@ -216,25 +245,42 @@ class LabelMaker (HTS):
|
|||||||
writer.writerow([data['date'][i], bsLine["buy"][i]])
|
writer.writerow([data['date'][i], bsLine["buy"][i]])
|
||||||
return
|
return
|
||||||
|
|
||||||
def makeCandidate(self, stock_code, ymd="20220727"):
|
def makeCandidate(self, stock_code, ymd="20220727", view=False):
|
||||||
result = {"check": set(), "time": [], "open": [], "close": [], "high": [], "low": [], "vol": [], "label": []}
|
result = {"check": set(), "time": [], "open": [], "close": [], "high": [], "low": [], "vol": [], "label": []}
|
||||||
self.getDBData(stock_code, ymd, result)
|
self.getDBData(stock_code, ymd, result)
|
||||||
|
|
||||||
data = self.buySellChecker.analyze(result)
|
data = self.buySellChecker.analyze(result)
|
||||||
bsLine, data = self.checkTransaction(data)
|
bsLine, data = self.checkTransaction(data)
|
||||||
|
|
||||||
self.writeLabelFile(bsLine, data, ymd)
|
self.writeLabelFile(stock_code, bsLine, data, ymd)
|
||||||
self.draw_simple(stock_code, ymd, data, bsLine)
|
if view:
|
||||||
self.draw_detail(stock_code, ymd, data, bsLine)
|
self.draw_simple(stock_code, ymd, data, bsLine)
|
||||||
return
|
#self.draw_detail(stock_code, ymd, data, bsLine)
|
||||||
|
|
||||||
|
return bsLine, data
|
||||||
|
|
||||||
|
def getDate(self, stock_code):
|
||||||
|
ymds = self.getYMD(stock_code)
|
||||||
|
return ymds
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
PROJECT_HOME = os.path.join(os.path.dirname(os.path.join(os.path.dirname(os.path.join(os.path.dirname(__file__))))))
|
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")
|
RESOURCE_PATH = os.path.join(PROJECT_HOME, "resources")
|
||||||
|
db_filename = os.path.join(RESOURCE_PATH, "hts.db")
|
||||||
|
|
||||||
labelMaker = LabelMaker()
|
labelMaker = LabelMaker()
|
||||||
|
|
||||||
|
view = True
|
||||||
stock_code = "252670"
|
stock_code = "252670"
|
||||||
#stock_code = "122630"
|
ymd = "20200701"
|
||||||
|
|
||||||
labelMaker.makeCandidate(stock_code, "20220801")
|
if view:
|
||||||
|
bsLine, data = labelMaker.makeCandidate(stock_code, ymd, view=view)
|
||||||
|
else:
|
||||||
|
stock_codes = ["252670", "122630"]
|
||||||
|
for stock_code in stock_codes:
|
||||||
|
ymds = labelMaker.getDate(stock_code)
|
||||||
|
for ymd in ymds:
|
||||||
|
logging.info(stock_code, ymd)
|
||||||
|
bsLine, data = labelMaker.makeCandidate(stock_code, ymd)
|
||||||
|
labelMaker.updateLabel(db_filename, stock_code, bsLine, data, ymd)
|
||||||
|
|||||||
Reference in New Issue
Block a user