init
This commit is contained in:
@@ -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
103
hts/DailyStatus.py
Normal 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
|
||||
Reference in New Issue
Block a user