This commit is contained in:
dsyoon
2023-01-10 02:41:36 +09:00
parent 221c9a0075
commit ab0195a84c
5 changed files with 662 additions and 3 deletions

View File

@@ -1,5 +1,4 @@
import pandas as pd
import numpy as np
from stock.analysis.Common import Common
from stock.analysis.Stochastic import Stochastic
from stock.analysis.RSI import RSI
@@ -838,4 +837,202 @@ class BuySellChecker:
bsLine['buy'][i] = int((data["open"][i] + data["close"][i]) / 2)
bsLine['buy_weight'][i] = 1
return bsLine, data
return bsLine, data
def getBuyPriceAndWeight_Envelope_trend(self, data, i):
buy, weight, type = -1, -1, -1
if data['close'][i-1] < data['envelope_lower'][i-1] and data['envelope_lower'][i] < data['close'][i]:
buy = data["close"][i]
weight = 1
type = 1
if data['close'][i] < data['envelope_lower'][i]:
if data['rsis'][i] < data['rsi'][i]:
buy = data["close"][i]
weight = 1
type = 2
if data['close'][i-1] < data['envelope_middle'][i-1] and data['envelope_middle'][i] < data['close'][i]:
if data['slow_k'][i] < 25:
buy = data["close"][i]
weight = 1
type = 3
check1 = False
check2 = False
if data['slow_k'][i] < 40:
if data['close'][i-1] < data['envelope_middle'][i-1] and data['envelope_middle'][i] < data['close'][i]:
idx = -1
for t1 in range(i-1, i-10, -1):
if data['close'][t1] < data['envelope_middle'][t1]:
check1 = True
idx = t1
break
if check1:
for t1 in range(idx-1, i - 10, -1):
if data['envelope_middle'][t1] < data['close'][t1]:
check2 = True
break
if check2:
buy = data["close"][i]
weight = 1
type = 4
if data.index[i].strftime("%Y.%m.%d") == "2021.12.21":
print(1)
check = True
if data['slow_k'][i] < 40:
if data['close'][i - 1] < data['envelope_middle'][i - 1] and data['envelope_middle'][i] < data['close'][i]:
for t1 in range(i-1, i-10, -1):
if data['envelope_middle'][t1] < data['close'][t1]:
check = False
if check:
buy = data["close"][i]
weight = 1
type = 4
return buy, weight, type
def getSellPriceAndWeight_Envelope_trend(self, data, i):
sell, weight, type = -1, -1, -1
if data.index[i].strftime("%Y.%m.%d") == "2022.12.01":
print (1)
# upper lined에서 처리
if data['close'][i-1] < data['envelope_upper'][i - 1] and data['envelope_upper'][i] < data['close'][i]:
if data['slow_d'][i-1] <= data['slow_k'][i - 1] and data['slow_k'][i] <= data['slow_d'][i]:
sell = data["close"][i]
weight = 1
type = 1
if data['envelope_upper'][i-1] < data['close'][i - 1] and data['envelope_upper'][i] < data['close'][i]:
if data['slow_d'][i-1] <= data['slow_k'][i - 1] and data['slow_k'][i] <= data['slow_d'][i]:
sell = data["close"][i]
weight = 1
type = 2
if data['envelope_upper'][i-1] < data['close'][i - 1] and data['envelope_upper'][i] < data['close'][i]:
if data['slow_d'][i-1] +2 <= data['slow_k'][i - 1] and data['slow_d'][i]+1 == data['slow_k'][i]:
sell = data["close"][i]
weight = 1
type = 3
if data['envelope_upper'][i]<data['high'][i] and data['open'][i] < data['close'][i]:
if data['close'][i] - data['open'][i] < data['high'][i] - data['close'][i]:
sell = data["close"][i]
weight = 1
type = 4
return sell, weight, type
def getBuyPriceAndWeight_Envelope(self, data, i):
buy, weight, type = -1, -1, -1
if data['close'][i-1] < data['envelope_lower'][i-1] and data['envelope_lower'][i] < data['close'][i]:
buy = data["close"][i]
weight = 1
type = 1
if data['close'][i] < data['envelope_lower'][i]:
if data['rsis'][i] < data['rsi'][i]:
buy = data["close"][i]
weight = 1
type = 2
return buy, weight, type
def getSellPriceAndWeight_Envelope(self, data, i):
sell, weight, type = -1, -1, -1
if data.index[i].strftime("%Y.%m.%d") == "2022.12.01":
print (1)
# upper lined에서 처리
if data['close'][i-1] < data['envelope_upper'][i - 1] and data['envelope_upper'][i] < data['close'][i]:
if data['slow_d'][i-1] <= data['slow_k'][i - 1] and data['slow_k'][i] <= data['slow_d'][i]:
sell = data["close"][i]
weight = 1
type = 1
if data['envelope_upper'][i-1] < data['close'][i - 1] and data['envelope_upper'][i] < data['close'][i]:
if data['slow_d'][i-1] <= data['slow_k'][i - 1] and data['slow_k'][i] <= data['slow_d'][i]:
sell = data["close"][i]
weight = 1
type = 2
if data['envelope_upper'][i-1] < data['close'][i - 1] and data['envelope_upper'][i] < data['close'][i]:
if data['slow_d'][i-1] +2 <= data['slow_k'][i - 1] and data['slow_d'][i]+1 == data['slow_k'][i]:
sell = data["close"][i]
weight = 1
type = 3
# middle lined에서 처리
middle_up = False
if data['envelope_middle'][i-1] < data['close'][i-1] or data['envelope_middle'][i] < data['open'][i]:
if data['envelope_middle'][i-2] < data['close'][i-2] or data['envelope_middle'][i-1] < data['close'][i-1] or data['envelope_middle'][i] < data['close'][i]:
for t in range(i-1, i-20, -1):
if data['envelope_upper'][t] <= data['close'][t]:
middle_up = False
break
if data['close'][t] < data['envelope_middle'][t]:
middle_up = True
break
if middle_up:
if data['slow_d'][i-1] < data['slow_k'][i-1] and data['slow_k'][i] < data['slow_d'][i]:
sell = data["close"][i]
weight = 1
type = 4
return sell, weight, type
def checkEnvelopeTiming(self, data, stock_code, isRealTime=True):
# 어제 오늘 데이터로 분석
bsLine = {}
size = len(data["close"])
if isRealTime:
# isRealTime=True, 실시간 적용
last_index = size - 1
if stock_code == "252670":
buy, buy_weight, buy_type = self.getBuyPriceAndWeight_Envelope(data, last_index)
sell, sell_weight, sell_type = self.getSellPriceAndWeight_Envelope(data, last_index)
else:
buy, buy_weight, buy_type = self.getBuyPriceAndWeight_Envelope(data, last_index)
sell, sell_weight, sell_type = self.getSellPriceAndWeight_Envelope(data, last_index)
bsLine['buy'] = [buy]
bsLine['buy_weight'] = [buy_weight]
bsLine['sell'] = [sell]
bsLine['sell_weight'] = [sell_weight]
else:
# Type=False, 시뮬레이션 적용
bsLine['buy'] = [-1 for i in range(size)]
bsLine['buy_weight'] = [-1 for i in range(size)]
bsLine['sell'] = [-1 for i in range(size)]
bsLine['sell_weight'] = [-1 for i in range(size)]
for i in range(size):
if stock_code == "252670":
buy, buy_weight, buy_type = self.getBuyPriceAndWeight_Envelope_trend(data, i)
sell, sell_weight, sell_type = self.getSellPriceAndWeight_Envelope_trend(data, i)
else:
buy, buy_weight, buy_type = self.getBuyPriceAndWeight_Envelope(data, i)
sell, sell_weight, sell_type = self.getSellPriceAndWeight_Envelope(data, i)
bsLine['buy'][i] = buy
bsLine['buy_weight'][i] = buy_weight
bsLine['sell'][i] = sell
bsLine['sell_weight'][i] = sell_weight
if i > 0:
if bsLine['sell'][i-1] > -1:
bsLine['sell'][i] = -1
bsLine['sell_weight'][i] = -1
return bsLine, data

103
hts/DailyStatus.py Normal file
View File

@@ -0,0 +1,103 @@
import os.path
import pandas as pd
import platform
if platform.system().lower().find("window") >= 0 and platform.architecture()[0] != "64bit" :
import win32com.client
import sqlite3
from datetime import datetime, timedelta
class DailyStatus:
tableName = None
dbFileName = None
RESOURCE_PATH = None
def __init__(self, RESOURCE_PATH):
self.RESOURCE_PATH = RESOURCE_PATH
self.tableName = 'stock_analysis'
self.dbFileName = "stock.db"
return
def getDBData(self, stock_code, day, result):
conn = sqlite3.connect(os.path.join(self.RESOURCE_PATH, self.dbFileName))
cursor = conn.cursor()
cursor.execute('SELECT ymd, close, open, high, low, envelope_upper, envelope_lower, envelope_middle, rsi, rsis, macd, macds, stochastic_slow_k, stochastic_slow_d FROM ' + self.tableName + ' WHERE CODE=? and ymd=? order by ymd', (stock_code, day,))
db_result = cursor.fetchall()
for rows in db_result:
ymd = rows[0]
close = rows[1]
open = rows[2]
high = rows[3]
low = rows[4]
envelope_upper = rows[5]
envelope_lower = rows[6]
envelope_middle = rows[7]
rsi = 0 if rows[8] is None else rows[8]
rsis = 0 if rows[9] is None else rows[9]
macd = rows[10]
macds = rows[11]
stochastic_slow_k = 0 if rows[12] is None else rows[12]
stochastic_slow_d = 0 if rows[13] is None else rows[13]
result["ymd"].append(ymd)
result["open"].append(int(open))
result["close"].append(int(close))
result["high"].append(int(high))
result["low"].append(int(low))
result["envelope_upper"].append(int(envelope_upper))
result["envelope_lower"].append(int(envelope_lower))
result["envelope_middle"].append(int(envelope_middle))
result["rsi"].append(int(rsi))
result["rsis"].append(int(rsis))
result["macd"].append(int(macd))
result["macds"].append(int(macds))
result["slow_k"].append(int(stochastic_slow_k))
result["slow_d"].append(int(stochastic_slow_d))
return
def isValidYMD(self, stock_code, day):
conn = sqlite3.connect(os.path.join(self.RESOURCE_PATH, self.dbFileName))
cursor = conn.cursor()
cursor.execute('SELECT ymd, count(*) as cnt FROM ' + self.tableName + ' WHERE CODE=? and ymd=?', (stock_code, day,))
db_result = cursor.fetchone()
if db_result[1] > 0:
return True
return False
def getLastData(self, stock_code, today, n=10):
result = {
"ymd": [],
"open": [],
"close": [],
"high": [],
"low": [],
"envelope_upper": [],
"envelope_lower": [],
"envelope_middle": [],
"rsi": [],
"rsis": [],
"macd": [],
"macds": [],
"slow_k": [],
"slow_d": []
}
days = []
for i in range(1, n):
last_day = (datetime.strptime(today, '%Y%m%d') - timedelta(i)).strftime('%Y.%m.%d')
isValid = self.isValidYMD(stock_code, last_day)
if isValid:
days.append(last_day)
days = sorted(days)
for day in days:
self.getDBData(stock_code, day, result)
data = pd.DataFrame(result)
df_final_time = pd.DatetimeIndex(result['ymd'])
data.index = df_final_time
return data