init
This commit is contained in:
@@ -8,6 +8,7 @@ from datetime import datetime
|
|||||||
from dateutil.relativedelta import relativedelta
|
from dateutil.relativedelta import relativedelta
|
||||||
from matplotlib import rc
|
from matplotlib import rc
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
rc('font', family='AppleGothic')
|
rc('font', family='AppleGothic')
|
||||||
plt.rcParams['axes.unicode_minus'] = False
|
plt.rcParams['axes.unicode_minus'] = False
|
||||||
@@ -371,7 +372,7 @@ class AnalyzerSqlite:
|
|||||||
sql += ' macd, macds, macdo, '
|
sql += ' macd, macds, macdo, '
|
||||||
sql += ' mfi, '
|
sql += ' mfi, '
|
||||||
sql += ' trend, trend_k, trend_s '
|
sql += ' trend, trend_k, trend_s '
|
||||||
sql += ' FROM ' + TableName + ' where CODE=? order by ymd desc limit 512 '
|
sql += ' FROM ' + TableName + ' where CODE=? order by ymd limit 512 '
|
||||||
cursor.execute(sql, (CODE,))
|
cursor.execute(sql, (CODE,))
|
||||||
prices = cursor.fetchall()
|
prices = cursor.fetchall()
|
||||||
|
|
||||||
@@ -545,7 +546,7 @@ class AnalyzerSqlite:
|
|||||||
|
|
||||||
count = 0
|
count = 0
|
||||||
# 거래량이 10만 이상이고, 종가가 1천원 이상인지 체크 (https://happpy-rich.tistory.com/94)
|
# 거래량이 10만 이상이고, 종가가 1천원 이상인지 체크 (https://happpy-rich.tistory.com/94)
|
||||||
if stock_daily['volume'][0] > 100000 and stock_daily['close'][0] > 1000:
|
if stock_daily['volume'][-1] > 100000 and stock_daily['close'][-1] > 1000:
|
||||||
# 종목 상태 체크 분석
|
# 종목 상태 체크 분석
|
||||||
|
|
||||||
# Monthly 체크
|
# Monthly 체크
|
||||||
@@ -556,7 +557,7 @@ class AnalyzerSqlite:
|
|||||||
if check:
|
if check:
|
||||||
count += 1
|
count += 1
|
||||||
dir_name = "monthly_env_하단_rsi_50"
|
dir_name = "monthly_env_하단_rsi_50"
|
||||||
log = "RSI_" + "{:.2f}".format(stock_monthly['rsi'][0])
|
log = "RSI_" + "{:.2f}".format(stock_monthly['rsi'][-1])
|
||||||
self.writeFile(dir_name, CODE, NAME, top, stock_monthly, log)
|
self.writeFile(dir_name, CODE, NAME, top, stock_monthly, log)
|
||||||
|
|
||||||
|
|
||||||
@@ -727,6 +728,9 @@ class AnalyzerSqlite:
|
|||||||
"macds": -1,
|
"macds": -1,
|
||||||
"macdo": -1,
|
"macdo": -1,
|
||||||
"mfi": -1,
|
"mfi": -1,
|
||||||
|
"last_min": -1,
|
||||||
|
"last_max": -1,
|
||||||
|
"last_middle": -1,
|
||||||
"trend": -1,
|
"trend": -1,
|
||||||
"trend_k": -1,
|
"trend_k": -1,
|
||||||
"trend_s": -1
|
"trend_s": -1
|
||||||
@@ -743,7 +747,7 @@ class AnalyzerSqlite:
|
|||||||
stockAnalysisTableName = 'stock_analysis_' + type
|
stockAnalysisTableName = 'stock_analysis_' + type
|
||||||
|
|
||||||
# 테이블 생성
|
# 테이블 생성
|
||||||
cursor.execute("CREATE TABLE IF NOT EXISTS " + stockAnalysisTableName + " (CODE text, NAME text, ymd text, close REAL, diff REAL, open REAL, high REAL, low REAL, volume REAL, avg3 REAL, avg4 REAL, avg5 REAL, avg6 REAL, avg10 REAL, avg12 REAL, avg20 REAL, avg36 REAL, avg40 REAL, avg48 REAL, avg60 REAL, avg120 REAL, avg200 REAL, avg240 REAL, avg300 REAL, avg360 REAL, avg480 REAL, avg720 REAL, avg1440 REAL, disparity_avg5 REAL, disparity_avg10 REAL, disparity_avg20 REAL, disparity_avg60 REAL, disparity_avg120 REAL, disparity_avg240 REAL, disparity_avg480, bolingerband_upper REAL, bolingerband_lower REAL, bolingerband_middle REAL, bolingerband_width REAL, bolingerband_pb REAL, envelope_upper REAL, envelope_lower REAL, envelope_middle REAL, ichimokucloud_changeLine REAL, ichimokucloud_baseLine REAL, ichimokucloud_laggingSpan REAL, ichimokucloud_leadingSpan1 REAL, ichimokucloud_leadingSpan2 REAL, stochastic_fast_k REAL, stochastic_slow_k REAL, stochastic_slow_d REAL, rsi REAL, rsis REAL, macd REAL, macds REAL, macdo REAL, mfi REAL, trend REAL, trend_k REAL, trend_s REAL)")
|
cursor.execute("CREATE TABLE IF NOT EXISTS " + stockAnalysisTableName + " (CODE text, NAME text, ymd text, close REAL, diff REAL, open REAL, high REAL, low REAL, volume REAL, avg3 REAL, avg4 REAL, avg5 REAL, avg6 REAL, avg10 REAL, avg12 REAL, avg20 REAL, avg36 REAL, avg40 REAL, avg48 REAL, avg60 REAL, avg120 REAL, avg200 REAL, avg240 REAL, avg300 REAL, avg360 REAL, avg480 REAL, avg720 REAL, avg1440 REAL, disparity_avg5 REAL, disparity_avg10 REAL, disparity_avg20 REAL, disparity_avg60 REAL, disparity_avg120 REAL, disparity_avg240 REAL, disparity_avg480, bolingerband_upper REAL, bolingerband_lower REAL, bolingerband_middle REAL, bolingerband_width REAL, bolingerband_pb REAL, envelope_upper REAL, envelope_lower REAL, envelope_middle REAL, ichimokucloud_changeLine REAL, ichimokucloud_baseLine REAL, ichimokucloud_laggingSpan REAL, ichimokucloud_leadingSpan1 REAL, ichimokucloud_leadingSpan2 REAL, stochastic_fast_k REAL, stochastic_slow_k REAL, stochastic_slow_d REAL, rsi REAL, rsis REAL, macd REAL, macds REAL, macdo REAL, mfi REAL, last_min REAL, last_max REAL, last_middle REAL, trend REAL, trend_k REAL, trend_s REAL)")
|
||||||
|
|
||||||
# 키 생성
|
# 키 생성
|
||||||
create_key = "CREATE INDEX IF NOT EXISTS " + stockAnalysisTableName + "_idx on " + stockAnalysisTableName + " (CODE, ymd) "
|
create_key = "CREATE INDEX IF NOT EXISTS " + stockAnalysisTableName + "_idx on " + stockAnalysisTableName + " (CODE, ymd) "
|
||||||
@@ -804,6 +808,14 @@ class AnalyzerSqlite:
|
|||||||
price['trend_k'] = stock['PRICE'][i]['avg120']
|
price['trend_k'] = stock['PRICE'][i]['avg120']
|
||||||
|
|
||||||
|
|
||||||
|
last_min = np.array([np.min(close_list[i - 20:i]) if 19 < i else np.min(close_list[:i+1]) for i in range(len(close_list))])
|
||||||
|
last_max = np.array([np.max(close_list[i - 20:i]) if 19 < i else np.max(close_list[:i+1]) for i in range(len(close_list))])
|
||||||
|
last_middle = (last_max + last_min) / 2
|
||||||
|
for i, price in enumerate(stock['PRICE']):
|
||||||
|
price['last_min'] = last_min[i]
|
||||||
|
price['last_max'] = last_max[i]
|
||||||
|
price['last_middle'] = last_middle[i]
|
||||||
|
|
||||||
sorted_stock = sorted(stock["PRICE"], key=lambda x: x['ymd'], reverse=True)
|
sorted_stock = sorted(stock["PRICE"], key=lambda x: x['ymd'], reverse=True)
|
||||||
for price in sorted_stock:
|
for price in sorted_stock:
|
||||||
cursor.execute('SELECT * FROM ' + stockAnalysisTableName + ' WHERE CODE=? and ymd=?', (stock['CODE'], price['ymd'],))
|
cursor.execute('SELECT * FROM ' + stockAnalysisTableName + ' WHERE CODE=? and ymd=?', (stock['CODE'], price['ymd'],))
|
||||||
@@ -818,8 +830,9 @@ class AnalyzerSqlite:
|
|||||||
sql += " stochastic_fast_k, stochastic_slow_k, stochastic_slow_d, "
|
sql += " stochastic_fast_k, stochastic_slow_k, stochastic_slow_d, "
|
||||||
sql += " rsi, rsis, macd, macds, macdo, "
|
sql += " rsi, rsis, macd, macds, macdo, "
|
||||||
sql += " mfi, "
|
sql += " mfi, "
|
||||||
|
sql += " last_min, last_max, last_middle, "
|
||||||
sql += " trend, trend_k, trend_s) "
|
sql += " trend, trend_k, trend_s) "
|
||||||
sql += " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
|
sql += " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
|
||||||
|
|
||||||
cursor.execute(sql, (
|
cursor.execute(sql, (
|
||||||
stock["CODE"], stock["NAME"], price['ymd'], price['close'], price['diff'], price['open'], price['high'], price['low'], price['volume'],
|
stock["CODE"], stock["NAME"], price['ymd'], price['close'], price['diff'], price['open'], price['high'], price['low'], price['volume'],
|
||||||
@@ -831,6 +844,7 @@ class AnalyzerSqlite:
|
|||||||
price['stochastic_fast_k'], price['stochastic_slow_k'], price['stochastic_slow_d'],
|
price['stochastic_fast_k'], price['stochastic_slow_k'], price['stochastic_slow_d'],
|
||||||
price['rsi'], price['rsis'], price['macd'], price['macds'], price['macdo'],
|
price['rsi'], price['rsis'], price['macd'], price['macds'], price['macdo'],
|
||||||
price['mfi'],
|
price['mfi'],
|
||||||
|
price['last_min'], price['last_max'], price['last_middle'],
|
||||||
price['trend'],price['trend_k'],price['trend_s'],
|
price['trend'],price['trend_k'],price['trend_s'],
|
||||||
))
|
))
|
||||||
|
|
||||||
@@ -845,6 +859,7 @@ class AnalyzerSqlite:
|
|||||||
sql += " rsi=?, rsis=?, "
|
sql += " rsi=?, rsis=?, "
|
||||||
sql += " macd=?, macds=?, macdo=?, "
|
sql += " macd=?, macds=?, macdo=?, "
|
||||||
sql += " mfi=?, "
|
sql += " mfi=?, "
|
||||||
|
sql += " last_min=?, last_max=?, last_middle=?, "
|
||||||
sql += " trend=?, trend_k=?, trend_s=? "
|
sql += " trend=?, trend_k=?, trend_s=? "
|
||||||
sql += " WHERE CODE=? and ymd=?"
|
sql += " WHERE CODE=? and ymd=?"
|
||||||
|
|
||||||
@@ -859,6 +874,7 @@ class AnalyzerSqlite:
|
|||||||
price['rsi'], price['rsis'],
|
price['rsi'], price['rsis'],
|
||||||
price['macd'], price['macds'], price['macdo'],
|
price['macd'], price['macds'], price['macdo'],
|
||||||
price['mfi'],
|
price['mfi'],
|
||||||
|
price['last_min'], price['last_max'], price['last_middle'],
|
||||||
price['trend'], price['trend_k'], price['trend_s'],
|
price['trend'], price['trend_k'], price['trend_s'],
|
||||||
stock["CODE"], price['ymd'],))
|
stock["CODE"], price['ymd'],))
|
||||||
break
|
break
|
||||||
@@ -923,6 +939,9 @@ class AnalyzerSqlite:
|
|||||||
"macds": -1,
|
"macds": -1,
|
||||||
"macdo": -1,
|
"macdo": -1,
|
||||||
"mfi": -1,
|
"mfi": -1,
|
||||||
|
"last_min": -1,
|
||||||
|
"last_max": -1,
|
||||||
|
"last_middle": -1,
|
||||||
"trend": -1,
|
"trend": -1,
|
||||||
"trend_k": -1,
|
"trend_k": -1,
|
||||||
"trend_s": -1
|
"trend_s": -1
|
||||||
|
|||||||
@@ -488,8 +488,8 @@ class Common:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def check_env_lower_rsi(self, stock):
|
def check_env_lower_rsi(self, stock):
|
||||||
if stock['close'][1] < stock['envelope_lower'][1] and stock['envelope_lower'][0] < stock['close'][0]:
|
if stock['close'][-2] < stock['envelope_lower'][-2] and stock['envelope_lower'][-1] < stock['close'][-1]:
|
||||||
if stock['rsi'][0] < 50:
|
if stock['rsi'][-1] < 50:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -521,9 +521,9 @@ class Common:
|
|||||||
def check_volume(self, stock):
|
def check_volume(self, stock):
|
||||||
c_index = 200
|
c_index = 200
|
||||||
|
|
||||||
max_volume = max(stock['volume'][1:c_index+1])
|
max_volume = max(stock['volume'][-c_index:-1])
|
||||||
if 0 < max_volume*2 < stock['volume'][0] and stock['close'][1] < stock['close'][0]:
|
if 0 < max_volume*2 < stock['volume'][-1] and stock['close'][-2] < stock['close'][-1]:
|
||||||
log = "{:.2f}".format(stock['volume'][0]/max_volume)
|
log = "{:.2f}".format(stock['volume'][-1]/max_volume)
|
||||||
return True, log
|
return True, log
|
||||||
|
|
||||||
return False, ""
|
return False, ""
|
||||||
@@ -570,28 +570,23 @@ class Common:
|
|||||||
if len(stock['trend']) < 10:
|
if len(stock['trend']) < 10:
|
||||||
return check
|
return check
|
||||||
|
|
||||||
if np.average(stock['trend'][1:21]) < stock['trend'][0] and np.average(stock['trend_k'][1:21]) < stock['trend_k'][0]:
|
i = len(stock['ymd']) - 1
|
||||||
# 1일 트렌드가 시그널 위로 상승 돌파 할 때
|
check = False
|
||||||
if stock['trend_k'][1] <= stock['trend_s'][1] and stock['trend_s'][0] < stock['trend_k'][0]:
|
|
||||||
|
|
||||||
# 1일 트렌드가 7일 트렌드보다 작을 때 (상승 초/중기 매수를 위해서)
|
|
||||||
if stock['trend_k'][0] < stock['trend'][0]:
|
|
||||||
# 상승을 체크하기 위해서 선행 스팬 활용
|
|
||||||
check = True
|
|
||||||
|
|
||||||
|
for c in range(5):
|
||||||
# 추세가 상승 중일 때 매수의 관점 (소추세가 하락해 있을 때 매수의 기회)
|
# 추세가 상승 중일 때 매수의 관점 (소추세가 하락해 있을 때 매수의 기회)
|
||||||
# macd가 0 이하에서 macd 매수 체크 (macd가 macds를 상승 돌파)
|
if np.average(stock['avg60'][i - c - 3:i - c]) < stock['avg60'][i - c]:
|
||||||
if stock['macd'][1] < stock['macds'][1] and stock['macds'][0] < stock['macd'][0] and stock['macd'][0] < np.min(stock['macd'][1:]) * 0.5:
|
if stock['avg60'][i - c] < stock['avg20'][i - c]:
|
||||||
if stock['avg120'][0] < stock['trend_k'][0]:
|
if stock['slow_d'][i - c] < stock['slow_k'][i - c] and stock['slow_k'][i - c - 1] < stock['slow_k'][i - c] and stock['slow_k'][i - c] < 50:
|
||||||
# slow_k가 50이하에서 상승 중이고 slow_d를 상승 돌파 할 때
|
if stock['close'][i - c] < stock['last_middle'][i - c] - (stock['last_middle'][i - c] - stock['last_min'][i - c]) * 0.5:
|
||||||
check = True
|
check = True
|
||||||
|
|
||||||
# slow_k가 10이하에서 상승 중이고 slow_d를 상승 돌파 할 때
|
# 거래량은 6시간 중 가장 많은 것보다 1.5배 이상 많고, 종가는 3시간 중에서 가장 높을 때
|
||||||
if stock['slow_k'][0] is not None and stock['slow_k'][1] is not None:
|
if np.max(stock['volume'][i - c - 120:i - c - 2]) * 1.5 < stock['volume'][i - c] and np.max(stock['close'][i - c - 20: i - c]) < stock['close'][i - c]:
|
||||||
if stock['slow_k'][1] < stock['slow_d'][1] and stock['slow_d'][0] < stock['slow_k'][0] and stock['slow_k'][0] < 10:
|
if stock['open'][i - c - 1] < stock['close'][i - c - 1] and stock['close'][i - c - 1] - stock['open'][i - c - 1] < stock['close'][i - c] - stock['open'][i - c]:
|
||||||
if stock['avg120'][0] < stock['trend_k'][0]:
|
# 양봉이고 몸통이 3/4 이상일 때
|
||||||
|
if stock['open'][i - c] < stock['close'][i - c] and stock['high'][i - c] - stock['close'][i - c] < (stock['close'][i - c] - stock['open'][i - c]) * 0.25:
|
||||||
check = True
|
check = True
|
||||||
|
|
||||||
return check
|
return check
|
||||||
|
|
||||||
|
|
||||||
@@ -612,9 +607,9 @@ class Common:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def check_under_BB_Low(self, stock):
|
def check_under_BB_Low(self, stock):
|
||||||
if stock['lower'][0] is not None and stock['lower'][1] is not None:
|
if stock['lower'][-1] is not None and stock['lower'][-2] is not None:
|
||||||
# bb 하단에 부딪힘
|
# bb 하단에 부딪힘
|
||||||
if stock['close'][0] < stock['lower'][0]:
|
if stock['close'][-1] < stock['lower'][-1]:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user