init
This commit is contained in:
@@ -1071,12 +1071,27 @@ class BuySellChecker:
|
||||
bsLine['sell'] = [-1 for i in range(size)]
|
||||
bsLine['sell_weight'] = [-1 for i in range(size)]
|
||||
|
||||
gap_interval = 60
|
||||
gap_state = False
|
||||
for i in range(size):
|
||||
if isRealTime:
|
||||
if i < size - 1:
|
||||
continue
|
||||
|
||||
if i > 10:
|
||||
# 만약 전일 저가와 오늘 종의 차이가 1만원이 넘으면 향후 60일은 분석하지 않는다.
|
||||
if data['low'][i-1] - data['high'][i] > 10000:
|
||||
gap_state = True
|
||||
gap_interval -= 1
|
||||
continue
|
||||
if gap_state:
|
||||
if gap_interval <= 0:
|
||||
gap_state = False
|
||||
gap_interval = 60
|
||||
else:
|
||||
gap_interval -= 1
|
||||
continue
|
||||
|
||||
if data['disparity'][i] < 2:
|
||||
check = True
|
||||
for l in range(i-3, i):
|
||||
|
||||
@@ -1,356 +0,0 @@
|
||||
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 sklearn.linear_model import LinearRegression
|
||||
from sklearn.preprocessing import StandardScaler, MinMaxScaler
|
||||
|
||||
from stock.analysis.AnalyzerSqlite import AnalyzerSqlite
|
||||
class DailyStatus:
|
||||
tableName = None
|
||||
dbFileName = None
|
||||
RESOURCE_PATH = None
|
||||
analyzerSqlite = None
|
||||
|
||||
def __init__(self, RESOURCE_PATH):
|
||||
self.RESOURCE_PATH = RESOURCE_PATH
|
||||
self.tableName = 'stock'
|
||||
self.dbFileName = "stock.db"
|
||||
self.analyzerSqlite = AnalyzerSqlite(os.path.join(self.RESOURCE_PATH, self.dbFileName))
|
||||
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, limit=350):
|
||||
stockTableName = 'stock'
|
||||
|
||||
conn = sqlite3.connect(os.path.join(self.RESOURCE_PATH, self.dbFileName))
|
||||
cursor = conn.cursor()
|
||||
|
||||
stock = {"CODE": stock_code, "NAME": "", "PRICE": []}
|
||||
|
||||
sql = 'SELECT ymd, close, diff, open, high, low, volume FROM ' + stockTableName + ' where CODE=? order by ymd desc '
|
||||
sql += ' limit ' + str(limit)
|
||||
cursor.execute(sql, (stock['CODE'],))
|
||||
items = cursor.fetchall()
|
||||
|
||||
items_reverse = reversed(items)
|
||||
for item in items_reverse:
|
||||
stock['PRICE'].append(
|
||||
{
|
||||
"ymd": item[0],
|
||||
"close": item[1],
|
||||
"diff": item[2],
|
||||
"open": item[3],
|
||||
"high": item[4],
|
||||
"low": item[5],
|
||||
"volume": item[6],
|
||||
"avg3": -1,
|
||||
"avg4": -1,
|
||||
"avg5": -1,
|
||||
"avg6": -1,
|
||||
"avg10": -1,
|
||||
"avg12": -1,
|
||||
"avg20": -1,
|
||||
"avg36": -1,
|
||||
"avg40": -1,
|
||||
"avg48": -1,
|
||||
"avg60": -1,
|
||||
"avg120": -1,
|
||||
"avg200": -1,
|
||||
"avg240": -1,
|
||||
"avg300": -1,
|
||||
"disparity_avg5": -1,
|
||||
"disparity_avg10": -1,
|
||||
"disparity_avg20": -1,
|
||||
"disparity_avg60": -1,
|
||||
"disparity_avg120": -1,
|
||||
"bolingerband_upper": -1,
|
||||
"bolingerband_lower": -1,
|
||||
"bolingerband_middle": -1,
|
||||
"envelope_upper": -1,
|
||||
"envelope_lower": -1,
|
||||
"envelope_middle": -1,
|
||||
"ichimokucloud_changeLine": -1,
|
||||
"ichimokucloud_baseLine": -1,
|
||||
"ichimokucloud_leadingSpan1": -1,
|
||||
"ichimokucloud_leadingSpan2": -1,
|
||||
"stochastic_fast_k": -1,
|
||||
"stochastic_slow_k": -1,
|
||||
"stochastic_slow_d": -1,
|
||||
"rsi": -1,
|
||||
"rsis": -1,
|
||||
"macd": -1,
|
||||
"macds": -1,
|
||||
"macdo": -1,
|
||||
}
|
||||
)
|
||||
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
return stock
|
||||
|
||||
def analyze (self, stock, days=120):
|
||||
stock["PRICE"] = sorted(stock["PRICE"], key=lambda x: x['ymd'])
|
||||
self.analyzerSqlite.get_moving_average(stock["PRICE"])
|
||||
|
||||
# 이동 평균을 이용한 이격도 계산
|
||||
self.analyzerSqlite.get_disparity(stock["PRICE"])
|
||||
|
||||
self.analyzerSqlite.ichimokuCloud.analyze(stock)
|
||||
self.analyzerSqlite.stochastic.analyze(stock)
|
||||
self.analyzerSqlite.bolingerBand.analyze(stock)
|
||||
self.analyzerSqlite.envelope.analyze(stock)
|
||||
self.analyzerSqlite.rsi.analyze(stock)
|
||||
self.analyzerSqlite.macd.analyze(stock)
|
||||
|
||||
result = {
|
||||
"ymd": [],
|
||||
"open": [],
|
||||
"close": [],
|
||||
"high": [],
|
||||
"low": [],
|
||||
"avg3": [],
|
||||
"avg4": [],
|
||||
"avg5": [],
|
||||
"avg6": [],
|
||||
"avg10": [],
|
||||
"avg12": [],
|
||||
"avg20": [],
|
||||
"avg36": [],
|
||||
"avg40": [],
|
||||
"avg48": [],
|
||||
"avg60": [],
|
||||
"avg120": [],
|
||||
"avg200": [],
|
||||
"avg240": [],
|
||||
"avg300": [],
|
||||
"disparity_avg5": [],
|
||||
"disparity_avg20": [],
|
||||
"disparity_avg60": [],
|
||||
"disparity_avg120": [],
|
||||
"disparity": [],
|
||||
"disparity_type": [],
|
||||
"envelope_upper": [],
|
||||
"envelope_lower": [],
|
||||
"envelope_middle": [],
|
||||
"rsi": [],
|
||||
"rsis": [],
|
||||
"macd": [],
|
||||
"macds": [],
|
||||
"slow_k": [],
|
||||
"slow_d": [],
|
||||
"buy": [],
|
||||
"sell": [],
|
||||
}
|
||||
for item in stock['PRICE']:
|
||||
result["ymd"].append(item['ymd'])
|
||||
result["open"].append(item['open'])
|
||||
result["close"].append(item['close'])
|
||||
result["high"].append(item['high'])
|
||||
result["low"].append(item['low'])
|
||||
result["avg3"].append(item['avg3'])
|
||||
result["avg4"].append(item['avg4'])
|
||||
result["avg5"].append(item['avg5'])
|
||||
result["avg6"].append(item['avg6'])
|
||||
result["avg10"].append(item['avg10'])
|
||||
result["avg12"].append(item['avg12'])
|
||||
result["avg20"].append(item['avg20'])
|
||||
result["avg36"].append(item['avg36'])
|
||||
result["avg40"].append(item['avg40'])
|
||||
result["avg48"].append(item['avg48'])
|
||||
result["avg60"].append(item['avg60'])
|
||||
result["avg120"].append(item['avg120'])
|
||||
result["avg200"].append(item['avg200'])
|
||||
result["avg240"].append(item['avg240'])
|
||||
result["avg300"].append(item['avg300'])
|
||||
result["disparity_avg5"].append(item['disparity_avg5'])
|
||||
result["disparity_avg20"].append(item['disparity_avg20'])
|
||||
result["disparity_avg60"].append(item['disparity_avg60'])
|
||||
result["disparity_avg120"].append(item['disparity_avg120'])
|
||||
result['disparity'].append(max(item['disparity_avg5'], item['disparity_avg20'], item['disparity_avg60']) - min(item['disparity_avg5'], item['disparity_avg20'], item['disparity_avg60']))
|
||||
if item['disparity_avg60'] < item['disparity_avg20'] < item['disparity_avg5']:
|
||||
result['disparity_type'].append(1)
|
||||
elif item['disparity_avg5'] < item['disparity_avg20'] < item['disparity_avg60']:
|
||||
result['disparity_type'].append(-1)
|
||||
else:
|
||||
result['disparity_type'].append(0)
|
||||
result["envelope_upper"].append(item['envelope_upper'])
|
||||
result["envelope_lower"].append(item['envelope_lower'])
|
||||
result["envelope_middle"].append(item['envelope_middle'])
|
||||
result["rsi"].append(item['rsi'])
|
||||
result["rsis"].append(item['rsis'])
|
||||
result["macd"].append(item['macd'])
|
||||
result["macds"].append(item['macds'])
|
||||
result["slow_k"].append(item['stochastic_slow_k'])
|
||||
result["slow_d"].append(item['stochastic_slow_d'])
|
||||
result["buy"].append(-1)
|
||||
result["sell"].append(-1)
|
||||
|
||||
data = pd.DataFrame(result)
|
||||
df_final_time = pd.DatetimeIndex(result['ymd'])
|
||||
data.index = df_final_time
|
||||
|
||||
data = data.astype(
|
||||
{
|
||||
'open': 'int',
|
||||
'high': 'int',
|
||||
'low': 'int',
|
||||
'close': 'int',
|
||||
'avg3': 'float',
|
||||
'avg4': 'float',
|
||||
'avg5': 'float',
|
||||
'avg6': 'float',
|
||||
'avg10': 'float',
|
||||
'avg12': 'float',
|
||||
'avg20': 'float',
|
||||
'avg36': 'float',
|
||||
'avg40': 'float',
|
||||
'avg48': 'float',
|
||||
'avg60': 'float',
|
||||
'avg120': 'float',
|
||||
'avg200': 'float',
|
||||
'avg240': 'float',
|
||||
'avg300': 'float',
|
||||
'disparity_avg5': 'float',
|
||||
'disparity_avg20': 'float',
|
||||
'disparity_avg60': 'float',
|
||||
'disparity_avg120': 'float',
|
||||
'buy': 'int',
|
||||
'sell': 'int',
|
||||
'slow_k': 'float',
|
||||
'slow_d': 'float',
|
||||
'macd': 'float',
|
||||
'macds': 'float',
|
||||
'envelope_upper': 'float',
|
||||
'envelope_lower': 'float',
|
||||
'envelope_middle': 'float',
|
||||
'rsi': 'float',
|
||||
'rsis': 'float'
|
||||
}
|
||||
)
|
||||
|
||||
scaler = StandardScaler()
|
||||
low_df = pd.DataFrame(data['low'])
|
||||
low_df.index = [c for c in range(len(low_df))]
|
||||
low_std = scaler.fit_transform(data['low'].values.reshape(-1, 1))
|
||||
low_std = pd.DataFrame(low_std, columns=['low_std'])
|
||||
|
||||
min_df = pd.DataFrame({'open': data['open'].to_list(), 'close': data['close'].to_list()})
|
||||
min_df['min_std'] = min_df.min(axis=1)
|
||||
min_df.index = [c for c in range(len(min_df))]
|
||||
min_std = scaler.fit_transform(min_df['min_std'].values.reshape(-1, 1))
|
||||
min_std = pd.DataFrame(min_std, columns=['min_std'])
|
||||
|
||||
line_fitter = LinearRegression()
|
||||
size = len(data["close"])
|
||||
gradients_low = []
|
||||
gradients_avg5 = []
|
||||
gradients_avg20 = []
|
||||
gradients_avg60 = []
|
||||
|
||||
for i in range(size):
|
||||
coef_low = -999
|
||||
coef_avg5 = -999
|
||||
coef_avg20 = -999
|
||||
coef_avg60 = -999
|
||||
|
||||
if i > 0:
|
||||
l = days if i >= days else i
|
||||
x = pd.DataFrame([c for c in range(i - l, i + 1)])
|
||||
y = pd.DataFrame(low_std.values.tolist()[i - l:i + 1])
|
||||
line_fitter.fit(x.values.reshape(-1, 1), y)
|
||||
coef_low = line_fitter.coef_[0][0]
|
||||
|
||||
l = 5 if i >= 5 else i
|
||||
x = pd.DataFrame([c for c in range(i - l, i + 1)])
|
||||
y = pd.DataFrame(min_std.values.tolist()[i - l:i + 1])
|
||||
line_fitter.fit(x.values.reshape(-1, 1), y)
|
||||
coef_avg5 = line_fitter.coef_[0][0]
|
||||
|
||||
l = 20 if i >= 20 else i
|
||||
x = pd.DataFrame([c for c in range(i - l, i + 1)])
|
||||
y = pd.DataFrame(min_std.values.tolist()[i - l:i + 1])
|
||||
line_fitter.fit(x.values.reshape(-1, 1), y)
|
||||
coef_avg20 = line_fitter.coef_[0][0]
|
||||
|
||||
l = 60 if i >= 60 else i
|
||||
x = pd.DataFrame([c for c in range(i - l, i + 1)])
|
||||
y = pd.DataFrame(min_std.values.tolist()[i - l:i + 1])
|
||||
line_fitter.fit(x.values.reshape(-1, 1), y)
|
||||
coef_avg60 = line_fitter.coef_[0][0]
|
||||
|
||||
gradients_low.append(coef_low)
|
||||
gradients_avg5.append(coef_avg5)
|
||||
gradients_avg20.append(coef_avg20)
|
||||
gradients_avg60.append(coef_avg60)
|
||||
|
||||
gradients_low_df = pd.DataFrame(gradients_low, columns=['gradients_low'])
|
||||
gradients_avg5_df = pd.DataFrame(gradients_avg5, columns=['gradients_avg5'])
|
||||
gradients_avg20_df = pd.DataFrame(gradients_avg20, columns=['gradients_avg20'])
|
||||
gradients_avg60_df = pd.DataFrame(gradients_avg60, columns=['gradients_avg60'])
|
||||
|
||||
gradients_low_df.index = df_final_time
|
||||
gradients_avg5_df.index = df_final_time
|
||||
gradients_avg20_df.index = df_final_time
|
||||
gradients_avg60_df.index = df_final_time
|
||||
|
||||
data = data.merge(gradients_low_df, left_index=True, right_index=True)
|
||||
data = data.merge(gradients_avg5_df, left_index=True, right_index=True)
|
||||
data = data.merge(gradients_avg20_df, left_index=True, right_index=True)
|
||||
data = data.merge(gradients_avg60_df, left_index=True, right_index=True)
|
||||
|
||||
return data
|
||||
|
||||
Reference in New Issue
Block a user