This commit is contained in:
dosangyoon
2022-07-31 17:07:29 +09:00
parent cddcdf4f35
commit 5b5e2196c1
8 changed files with 502 additions and 62 deletions

View File

@@ -14,10 +14,10 @@ class DBManager:
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, type 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)")
# 키 생성
create_key = "CREATE INDEX IF NOT EXISTS " + tableName + "_idx on " + tableName + " (CODE, ymd, hms, type) "
create_key = "CREATE INDEX IF NOT EXISTS " + tableName + "_idx on " + tableName + " (CODE, ymd, hms, label) "
cursor.execute(create_key)
conn.commit()

View File

@@ -1,7 +1,12 @@
import os
import copy
import sqlite3
from datetime import datetime, timedelta
import numpy as np
import pandas as pd
from datetime import datetime, timedelta
from hts.BuySellChecker import BuySellChecker
from hts.HTS import HTS
from stock.analysis.Common import Common
from stock.analysis.Stochastic import Stochastic
@@ -9,7 +14,7 @@ from stock.analysis.RSI import RSI
from stock.analysis.MACD import MACD
from stock.analysis.IchimokuCloud import IchimokuCloud
class Stock2Vector:
class Stock2Vector(HTS):
RESOURCE_PATH = None
@@ -20,8 +25,12 @@ class Stock2Vector:
ichimokuCloud = None
def __init__(self, RESOURCE_PATH):
super().__init__(RESOURCE_PATH)
self.RESOURCE_PATH = RESOURCE_PATH
self.buySellChecker = BuySellChecker()
self.common = Common()
self.stochastic = Stochastic()
self.rsi = RSI()
@@ -110,16 +119,48 @@ class Stock2Vector:
df_final_time = pd.DatetimeIndex(point_temp)
data.index = df_final_time
data.fillna(0)
data = data.fillna(0)
return data
def getDBData(self, stock_code, lastday, result):
def getRealTime(self, stock_code, today, LAST_DATA=None):
if LAST_DATA is not None:
result = copy.deepcopy(LAST_DATA)
else:
result = {"check": set(), "time": [], "open": [], "close": [], "high": [], "low": [], "vol": [], "label": []}
self.getDBData(stock_code, today, result)
return result
def makeData(self, today, stock_code):
LAST_DATA = self.getLastData(stock_code, today)
result = self.getRealTime(stock_code, today, LAST_DATA)
# 분석을 통해서 볼린저밴드 상/하단을 계산한다.
df = self.buySellChecker.getVectorFeature(result)
minmax_df1 = (df - df.min()) / (df.max() - df.min())
minmax_df2 = minmax_df1.drop(["date"], axis="columns")
minmax_df = minmax_df2.join(df['date'])
# 4일치 중에서 앞에 2일은 제거한다.
date = df['date'].dt.date.unique().tolist()
df = df[df['date'].dt.date != date[0]]
df = df[df['date'].dt.date != date[1]]
minmax_df = minmax_df[minmax_df['date'].dt.date != date[0]]
minmax_df = minmax_df[minmax_df['date'].dt.date != date[1]]
return df, minmax_df
def makeTrainData(self, stock_code):
result = {"check": set(), "time": [], "open": [], "close": [], "high": [], "low": [], "vol": [], "label": []}
tableName = 'hts'
conn = sqlite3.connect(os.path.join(self.RESOURCE_PATH, "hts.db"))
cursor = conn.cursor()
cursor.execute('SELECT ymd, hms, open, high, low, close, volume FROM ' + tableName + ' WHERE CODE=? and ymd=? order by ymd, hms', (stock_code, lastday,))
cursor.execute('SELECT ymd, hms, open, high, low, close, volume, label FROM ' + tableName + ' WHERE CODE=? order by ymd, hms', (stock_code,))
db_result = cursor.fetchall()
for rows in db_result:
ymd = rows[0] # hts.날짜
@@ -129,6 +170,7 @@ class Stock2Vector:
low = rows[4] # hts.저가
close = rows[5] # hts.종가
vol = rows[6] # hts.거래량
label = 0 if rows[7] is None else rows[7] # hts.매매구분
temp = datetime.strptime(str(ymd) + " " + str(hms).zfill(4) + "00", '%Y%m%d %H%M%S')
@@ -138,46 +180,45 @@ class Stock2Vector:
result["high"].append(int(high))
result["low"].append(int(low))
result["vol"].append(int(vol))
return
def vectorize(self, stock_code, given_day):
result = {"check": set(),
"time": [],
"open": [],
"close": [],
"high": [],
"low": [],
"vol": []}
for i in range(1, 10):
last_day = (datetime.strptime(given_day, '%Y%m%d') - timedelta(i)).strftime('%Y%m%d')
self.getDBData(stock_code, last_day, result)
if len(result['time']) > 0:
break
self.getDBData(stock_code, given_day, result)
result["label"].append(int(label))
# 분석을 통해서 볼린저밴드 상/하단을 계산한다.
data = self.analyze(result)
df = self.buySellChecker.getVectorFeature(result)
minmax_df1 = (df - df.min()) / (df.max() - df.min())
minmax_df2 = minmax_df1.drop(["date"], axis="columns")
minmax_df = minmax_df2.join(df['date'])
return data
minmax_df = minmax_df.fillna(0)
return df, minmax_df
def vectorize(self, data):
vector = []
for key in data:
if key == "date":
continue
vector.append(data[key].tolist())
return np.asarray(vector)
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")
stock2Vector = Stock2Vector(RESOURCE_PATH)
# to check bying
stock_codes = {
# 252670
# 122630
"122630": ['20220725'],
"252670": ['20220729'],
}
for stock_code in stock_codes:
stock2Vector = Stock2Vector(RESOURCE_PATH)
for given_day in stock_codes[stock_code]:
stock2Vector.vectorize(stock_code, given_day)
data, minmax_data = stock2Vector.makeData(given_day, stock_code)
vector = stock2Vector.vectorize(data)
minmax_vector = stock2Vector.vectorize(minmax_data)
print (given_day)
print ("done...")