init
This commit is contained in:
@@ -20,6 +20,7 @@ from stockpredictor.analysis.Common import Common
|
|||||||
from stockpredictor.analysis.Stochastic import Stochastic
|
from stockpredictor.analysis.Stochastic import Stochastic
|
||||||
from stockpredictor.analysis.BolingerBand import BolingerBand
|
from stockpredictor.analysis.BolingerBand import BolingerBand
|
||||||
from stockpredictor.analysis.IchimokuCloud import IchimokuCloud
|
from stockpredictor.analysis.IchimokuCloud import IchimokuCloud
|
||||||
|
from stockpredictor.analysis.RSI import RSI
|
||||||
from stockpredictor.crawler.sQLite.MovingAverage import MovingAverage
|
from stockpredictor.crawler.sQLite.MovingAverage import MovingAverage
|
||||||
|
|
||||||
class AnalyzerSqlite:
|
class AnalyzerSqlite:
|
||||||
@@ -28,6 +29,7 @@ class AnalyzerSqlite:
|
|||||||
stochastic = None
|
stochastic = None
|
||||||
bolingerBand = None
|
bolingerBand = None
|
||||||
ichimokuCloud = None
|
ichimokuCloud = None
|
||||||
|
rsi = None
|
||||||
|
|
||||||
topCompany = None
|
topCompany = None
|
||||||
fnguide = None
|
fnguide = None
|
||||||
@@ -47,6 +49,7 @@ class AnalyzerSqlite:
|
|||||||
self.stochastic = Stochastic()
|
self.stochastic = Stochastic()
|
||||||
self.bolingerBand = BolingerBand()
|
self.bolingerBand = BolingerBand()
|
||||||
self.ichimokuCloud = IchimokuCloud()
|
self.ichimokuCloud = IchimokuCloud()
|
||||||
|
self.rsi = RSI()
|
||||||
|
|
||||||
self.topCompany = self.getTopCompany(stockFileName, 2000)
|
self.topCompany = self.getTopCompany(stockFileName, 2000)
|
||||||
self.fnguide = self.readFnguide(stockFileName)
|
self.fnguide = self.readFnguide(stockFileName)
|
||||||
@@ -122,6 +125,8 @@ class AnalyzerSqlite:
|
|||||||
avg120 = list(reversed(stock['avg120']))
|
avg120 = list(reversed(stock['avg120']))
|
||||||
avg240 = list(reversed(stock['avg240']))
|
avg240 = list(reversed(stock['avg240']))
|
||||||
avg300 = list(reversed(stock['avg300']))
|
avg300 = list(reversed(stock['avg300']))
|
||||||
|
rsi = list(reversed(stock['rsi']))
|
||||||
|
rsis = list(reversed(stock['rsis']))
|
||||||
stochastic_slow_k = list(reversed(stock['stochastic_slow_k']))
|
stochastic_slow_k = list(reversed(stock['stochastic_slow_k']))
|
||||||
stochastic_slow_d = list(reversed(stock['stochastic_slow_d']))
|
stochastic_slow_d = list(reversed(stock['stochastic_slow_d']))
|
||||||
bolingerband_upper = list(reversed(stock['bolingerband_upper']))
|
bolingerband_upper = list(reversed(stock['bolingerband_upper']))
|
||||||
@@ -149,19 +154,28 @@ class AnalyzerSqlite:
|
|||||||
volume = go.Bar(x=ymd, y=volume, name="volume")
|
volume = go.Bar(x=ymd, y=volume, name="volume")
|
||||||
volume_data = [volume]
|
volume_data = [volume]
|
||||||
|
|
||||||
|
# stochastic
|
||||||
|
rsi = go.Scatter(x=ymd, y=rsi, name="rsi", line_color='#8B4513')
|
||||||
|
rsis = go.Scatter(x=ymd, y=rsis, name="rsis", line_color='#4169E1')
|
||||||
|
rsi_data = [rsi, rsis]
|
||||||
|
|
||||||
# stochastic
|
# stochastic
|
||||||
slow_k = go.Scatter(x=ymd, y=stochastic_slow_k, name="Slow%K", line_color='#8B4513')
|
slow_k = go.Scatter(x=ymd, y=stochastic_slow_k, name="Slow%K", line_color='#8B4513')
|
||||||
slow_d = go.Scatter(x=ymd, y=stochastic_slow_d, name="Slow%D", line_color='#4169E1')
|
slow_d = go.Scatter(x=ymd, y=stochastic_slow_d, name="Slow%D", line_color='#4169E1')
|
||||||
stochastic_data = [slow_k, slow_d]
|
stochastic_data = [slow_k, slow_d]
|
||||||
|
|
||||||
fig = subplots.make_subplots(rows=3, cols=1, subplot_titles=('차트', '거래량', 'Stochastic'), row_heights=[1200, 500, 500])
|
fig = subplots.make_subplots(rows=4, cols=1,
|
||||||
|
subplot_titles=('차트', '거래량', 'rsi', 'Stochastic'),
|
||||||
|
row_heights=[1200, 500, 500, 500])
|
||||||
|
|
||||||
for trace in candle_data:
|
for trace in candle_data:
|
||||||
fig.append_trace(trace, 1, 1)
|
fig.append_trace(trace, 1, 1)
|
||||||
for trace in volume_data:
|
for trace in volume_data:
|
||||||
fig.append_trace(trace, 2, 1)
|
fig.append_trace(trace, 2, 1)
|
||||||
for trace in stochastic_data:
|
for trace in rsi_data:
|
||||||
fig.append_trace(trace, 3, 1)
|
fig.append_trace(trace, 3, 1)
|
||||||
|
for trace in stochastic_data:
|
||||||
|
fig.append_trace(trace, 4, 1)
|
||||||
|
|
||||||
fig.update_layout(height=2200, xaxis_rangeslider_visible=False)
|
fig.update_layout(height=2200, xaxis_rangeslider_visible=False)
|
||||||
|
|
||||||
@@ -202,7 +216,14 @@ class AnalyzerSqlite:
|
|||||||
shutil.rmtree(outPath)
|
shutil.rmtree(outPath)
|
||||||
os.mkdir(outPath)
|
os.mkdir(outPath)
|
||||||
|
|
||||||
self.makeDir("20주선_40주선_상향돌파")
|
self.makeDir("weekly_20주선_40주선_상향돌파")
|
||||||
|
self.makeDir("weekly_종가_20주선_상향돌파")
|
||||||
|
self.makeDir("weekly_rsi_32이하")
|
||||||
|
self.makeDir("weekly_rsi_rsis_위로_올라옴")
|
||||||
|
self.makeDir("monthly_20월선_40월선_상향돌파")
|
||||||
|
self.makeDir("monthly_종가_20주선_상향돌파")
|
||||||
|
self.makeDir("monthly_rsi_32이하")
|
||||||
|
self.makeDir("monthly_rsi_rsis_위로_올라옴")
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -255,7 +276,8 @@ class AnalyzerSqlite:
|
|||||||
sql += ' avg5, avg10, avg20, avg40, avg60, avg120, avg200, avg240, avg300, '
|
sql += ' avg5, avg10, avg20, avg40, avg60, avg120, avg200, avg240, avg300, '
|
||||||
sql += ' bolingerband_upper, bolingerband_lower, bolingerband_middle, '
|
sql += ' bolingerband_upper, bolingerband_lower, bolingerband_middle, '
|
||||||
sql += ' ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2, '
|
sql += ' ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2, '
|
||||||
sql += ' stochastic_fast_k, stochastic_slow_k, stochastic_slow_d '
|
sql += ' stochastic_fast_k, stochastic_slow_k, stochastic_slow_d, '
|
||||||
|
sql += ' rsi, rsis '
|
||||||
sql += ' FROM ' + TableName + ' where CODE=? order by ymd desc limit 512'
|
sql += ' FROM ' + TableName + ' where CODE=? order by ymd desc limit 512'
|
||||||
cursor.execute(sql, (CODE,))
|
cursor.execute(sql, (CODE,))
|
||||||
prices = cursor.fetchall()
|
prices = cursor.fetchall()
|
||||||
@@ -269,6 +291,7 @@ class AnalyzerSqlite:
|
|||||||
bolingerband_upper, bolingerband_lower, bolingerband_middle = [], [], []
|
bolingerband_upper, bolingerband_lower, bolingerband_middle = [], [], []
|
||||||
ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2 = [], [], [], []
|
ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2 = [], [], [], []
|
||||||
stochastic_fast_k, stochastic_slow_k, stochastic_slow_d = [], [], []
|
stochastic_fast_k, stochastic_slow_k, stochastic_slow_d = [], [], []
|
||||||
|
rsi, rsis = [], []
|
||||||
|
|
||||||
for price in prices:
|
for price in prices:
|
||||||
ymd.append(price[0])
|
ymd.append(price[0])
|
||||||
@@ -296,6 +319,8 @@ class AnalyzerSqlite:
|
|||||||
stochastic_fast_k.append(price[22])
|
stochastic_fast_k.append(price[22])
|
||||||
stochastic_slow_k.append(price[23])
|
stochastic_slow_k.append(price[23])
|
||||||
stochastic_slow_d.append(price[24])
|
stochastic_slow_d.append(price[24])
|
||||||
|
rsi.append(price[25])
|
||||||
|
rsis.append(price[26])
|
||||||
|
|
||||||
stock = {
|
stock = {
|
||||||
"ymd": ymd,
|
"ymd": ymd,
|
||||||
@@ -307,8 +332,8 @@ class AnalyzerSqlite:
|
|||||||
"ichimokucloud_changeLine": ichimokucloud_changeLine, "ichimokucloud_baseLine": ichimokucloud_baseLine,
|
"ichimokucloud_changeLine": ichimokucloud_changeLine, "ichimokucloud_baseLine": ichimokucloud_baseLine,
|
||||||
"ichimokucloud_leadingSpan1": ichimokucloud_leadingSpan1,
|
"ichimokucloud_leadingSpan1": ichimokucloud_leadingSpan1,
|
||||||
"ichimokucloud_leadingSpan2": ichimokucloud_leadingSpan2,
|
"ichimokucloud_leadingSpan2": ichimokucloud_leadingSpan2,
|
||||||
"stochastic_fast_k": stochastic_fast_k, "stochastic_slow_k": stochastic_slow_k,
|
"stochastic_fast_k": stochastic_fast_k, "stochastic_slow_k": stochastic_slow_k, "stochastic_slow_d": stochastic_slow_d,
|
||||||
"stochastic_slow_d": stochastic_slow_d
|
"rsi": rsi, "rsis": rsis
|
||||||
}
|
}
|
||||||
|
|
||||||
return stock
|
return stock
|
||||||
@@ -341,7 +366,7 @@ class AnalyzerSqlite:
|
|||||||
if CODE in self.topCompany:
|
if CODE in self.topCompany:
|
||||||
top = str(self.topCompany[CODE][0])
|
top = str(self.topCompany[CODE][0])
|
||||||
|
|
||||||
stock_daily = self.getStockData(stockAnalysisTableName, CODE)
|
#stock_daily = self.getStockData(stockAnalysisTableName, CODE)
|
||||||
stock_weekly = self.getStockData(stockAnalysisWeeklyTableName, CODE)
|
stock_weekly = self.getStockData(stockAnalysisWeeklyTableName, CODE)
|
||||||
stock_monthly = self.getStockData(stockAnalysisMonthlyTableName, CODE)
|
stock_monthly = self.getStockData(stockAnalysisMonthlyTableName, CODE)
|
||||||
|
|
||||||
@@ -350,16 +375,72 @@ class AnalyzerSqlite:
|
|||||||
# 종목 상태 체크 분석
|
# 종목 상태 체크 분석
|
||||||
status = ""
|
status = ""
|
||||||
|
|
||||||
|
# [Weekly]
|
||||||
# 정배열 체크
|
# 정배열 체크
|
||||||
temp_status = self.common.check_RightArrange(stock_weekly)
|
temp_status = self.common.check_RightArrange(stock_weekly)
|
||||||
if temp_status != "":
|
if temp_status != "":
|
||||||
status += temp_status
|
status += temp_status
|
||||||
|
|
||||||
|
# 20주선이 40주 선을 상향 돌파함
|
||||||
if len(stock_weekly['close']) > 40:
|
if len(stock_weekly['close']) > 40:
|
||||||
if stock_weekly['avg20'][1] <= stock_weekly['avg40'][1] and stock_weekly['avg20'][0] > stock_weekly['avg40'][0]:
|
if (stock_weekly['avg20'][1] is not None and stock_weekly['avg40'][1] is not None and
|
||||||
type = "20주선_40주선_상향돌파"
|
stock_weekly['avg20'][0] is not None and stock_weekly['avg40'][0] is not None):
|
||||||
self.writeFile(type, CODE, NAME, top, stock_weekly, status)
|
if stock_weekly['avg20'][1] <= stock_weekly['avg40'][1] and stock_weekly['avg20'][0] > stock_weekly['avg40'][0]:
|
||||||
|
type = "weekly_20주선_40주선_상향돌파"
|
||||||
|
self.writeFile(type, CODE, NAME, top, stock_weekly, status)
|
||||||
|
|
||||||
|
# 종가가 20주선을 상향 돌파함
|
||||||
|
if len(stock_weekly['close']) > 2:
|
||||||
|
if stock_weekly['close'][1] is not None and stock_weekly['avg20'][1] is not None and stock_weekly['close'][0] is not None and stock_weekly['avg20'][0] is not None:
|
||||||
|
if stock_weekly['close'][1] <= stock_weekly['avg20'][1] and stock_weekly['close'][0] > stock_weekly['avg20'][0]:
|
||||||
|
type = "weekly_종가_20주선_상향돌파"
|
||||||
|
self.writeFile(type, CODE, NAME, top, stock_weekly, status)
|
||||||
|
|
||||||
|
# RSI가 32 이하인 경우 (30이 이하로 떨어지는 것 미리 확인)
|
||||||
|
if len(stock_monthly['close']) > 1:
|
||||||
|
if stock_weekly['rsi'][0] is not None:
|
||||||
|
if stock_weekly['rsi'][0] <= 32:
|
||||||
|
type = "weekly_rsi_32이하"
|
||||||
|
self.writeFile(type, CODE, NAME, top, stock_weekly, status)
|
||||||
|
|
||||||
|
# rsi가 40 이하이고, rsis 아래에서 위로 올라올 때
|
||||||
|
if len(stock_weekly['close']) > 60:
|
||||||
|
if stock_weekly['rsi'][0] is not None and stock_weekly['rsis'][0] is not None and stock_weekly['rsi'][1] is not None and stock_weekly['rsis'][1] is not None:
|
||||||
|
if stock_weekly['rsi'][0] < 40:
|
||||||
|
if stock_weekly['rsi'][0] > stock_weekly['rsis'][0] and stock_weekly['rsi'][1] <= stock_weekly['rsis'][1]:
|
||||||
|
type = "weekly_rsi_rsis_위로_올라옴"
|
||||||
|
self.writeFile(type, CODE, NAME, top, stock_weekly, status)
|
||||||
|
|
||||||
|
# [Monthly]
|
||||||
|
# 20주선이 40주 선을 상향 돌파함
|
||||||
|
if len(stock_monthly['close']) > 40:
|
||||||
|
if (stock_monthly['avg20'][1] is not None and stock_monthly['avg40'][1] is not None and
|
||||||
|
stock_monthly['avg20'][0] is not None and stock_monthly['avg40'][0] is not None):
|
||||||
|
if stock_monthly['avg20'][1] <= stock_monthly['avg40'][1] and stock_monthly['avg20'][0] > stock_monthly['avg40'][0]:
|
||||||
|
type = "monthly_20월선_40월선_상향돌파"
|
||||||
|
self.writeFile(type, CODE, NAME, top, stock_weekly, status)
|
||||||
|
|
||||||
|
# 종가가 20주선을 상향 돌파함
|
||||||
|
if len(stock_monthly['close']) > 2:
|
||||||
|
if stock_monthly['close'][1] is not None and stock_monthly['avg20'][1] is not None and stock_monthly['close'][0] is not None and stock_monthly['avg20'][0] is not None:
|
||||||
|
if stock_monthly['close'][1] <= stock_monthly['avg20'][1] and stock_monthly['close'][0] > stock_monthly['avg20'][0]:
|
||||||
|
type = "monthly_종가_20주선_상향돌파"
|
||||||
|
self.writeFile(type, CODE, NAME, top, stock_weekly, status)
|
||||||
|
|
||||||
|
# RSI가 32 이하인 경우 (30이 이하로 떨어지는 것 미리 확인)
|
||||||
|
if len(stock_monthly['close']) > 1:
|
||||||
|
if stock_monthly['rsi'][0] is not None:
|
||||||
|
if stock_monthly['rsi'][0] <= 32:
|
||||||
|
type = "monthly_rsi_32이하"
|
||||||
|
self.writeFile(type, CODE, NAME, top, stock_weekly, status)
|
||||||
|
|
||||||
|
# rsi가 rsis 아래에서 위로 올라올 때
|
||||||
|
if len(stock_monthly['close']) > 60:
|
||||||
|
if stock_monthly['rsi'][0] is not None and stock_monthly['rsis'][0] is not None and stock_monthly['rsi'][1] is not None and stock_monthly['rsis'][1] is not None:
|
||||||
|
if stock_monthly['rsi'][0] < 40:
|
||||||
|
if stock_monthly['rsi'][0] > stock_monthly['rsis'][0] and stock_monthly['rsi'][1] <= stock_monthly['rsis'][1]:
|
||||||
|
type = "monthly_rsi_rsis_위로_올라옴"
|
||||||
|
self.writeFile(type, CODE, NAME, top, stock_monthly, status)
|
||||||
return
|
return
|
||||||
|
|
||||||
def get_moving_average(self, stock):
|
def get_moving_average(self, stock):
|
||||||
@@ -427,7 +508,9 @@ class AnalyzerSqlite:
|
|||||||
"ichimokucloud_leadingSpan2": -1,
|
"ichimokucloud_leadingSpan2": -1,
|
||||||
"stochastic_fast_k": -1,
|
"stochastic_fast_k": -1,
|
||||||
"stochastic_slow_k": -1,
|
"stochastic_slow_k": -1,
|
||||||
"stochastic_slow_d": -1
|
"stochastic_slow_d": -1,
|
||||||
|
"rsi": -1,
|
||||||
|
"rsis": -1
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
previous_close = weekDict['close'][ts]
|
previous_close = weekDict['close'][ts]
|
||||||
@@ -441,7 +524,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, avg5 REAL, avg10 REAL, avg20 REAL, avg40 REAL, avg60 REAL, avg120 REAL, avg200 REAL, avg240 REAL, avg300 REAL, bolingerband_upper REAL, bolingerband_lower REAL, bolingerband_middle REAL, ichimokucloud_changeLine REAL, ichimokucloud_baseLine REAL, ichimokucloud_leadingSpan1 REAL, ichimokucloud_leadingSpan2 REAL, stochastic_fast_k REAL, stochastic_slow_k REAL, stochastic_slow_d 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, avg5 REAL, avg10 REAL, avg20 REAL, avg40 REAL, avg60 REAL, avg120 REAL, avg200 REAL, avg240 REAL, avg300 REAL, bolingerband_upper REAL, bolingerband_lower REAL, bolingerband_middle REAL, ichimokucloud_changeLine REAL, ichimokucloud_baseLine REAL, ichimokucloud_leadingSpan1 REAL, ichimokucloud_leadingSpan2 REAL, stochastic_fast_k REAL, stochastic_slow_k REAL, stochastic_slow_d REAL, rsi REAL, rsis 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) "
|
||||||
@@ -454,6 +537,7 @@ class AnalyzerSqlite:
|
|||||||
self.ichimokuCloud.analyze(stock)
|
self.ichimokuCloud.analyze(stock)
|
||||||
self.stochastic.analyze(stock)
|
self.stochastic.analyze(stock)
|
||||||
self.bolingerBand.analyze(stock)
|
self.bolingerBand.analyze(stock)
|
||||||
|
self.rsi.analyze(stock)
|
||||||
|
|
||||||
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:
|
||||||
@@ -464,8 +548,9 @@ class AnalyzerSqlite:
|
|||||||
sql += " avg5, avg10, avg20, avg40, avg60, avg120, avg200, avg240, avg300, "
|
sql += " avg5, avg10, avg20, avg40, avg60, avg120, avg200, avg240, avg300, "
|
||||||
sql += " bolingerband_upper, bolingerband_lower, bolingerband_middle, "
|
sql += " bolingerband_upper, bolingerband_lower, bolingerband_middle, "
|
||||||
sql += " ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2, "
|
sql += " ichimokucloud_changeLine, ichimokucloud_baseLine, ichimokucloud_leadingSpan1, ichimokucloud_leadingSpan2, "
|
||||||
sql += " stochastic_fast_k, stochastic_slow_k, stochastic_slow_d) "
|
sql += " stochastic_fast_k, stochastic_slow_k, stochastic_slow_d, "
|
||||||
sql += " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
|
sql += " rsi, rsis) "
|
||||||
|
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'],
|
||||||
@@ -473,14 +558,16 @@ class AnalyzerSqlite:
|
|||||||
price['bolingerband_upper'], price['bolingerband_lower'], price['bolingerband_middle'],
|
price['bolingerband_upper'], price['bolingerband_lower'], price['bolingerband_middle'],
|
||||||
price['ichimokucloud_changeLine'], price['ichimokucloud_baseLine'], price['ichimokucloud_leadingSpan1'],
|
price['ichimokucloud_changeLine'], price['ichimokucloud_baseLine'], price['ichimokucloud_leadingSpan1'],
|
||||||
price['ichimokucloud_leadingSpan2'],
|
price['ichimokucloud_leadingSpan2'],
|
||||||
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'],))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
sql = "UPDATE " + stockAnalysisTableName + " SET close=?, diff=?, open=?, high=?, low=?, volume=?, "
|
sql = "UPDATE " + stockAnalysisTableName + " SET close=?, diff=?, open=?, high=?, low=?, volume=?, "
|
||||||
sql += " avg5=?, avg10=?, avg20=?, avg40=?, avg60=?, avg120=?, avg200=?, avg240=?, avg300=?, "
|
sql += " avg5=?, avg10=?, avg20=?, avg40=?, avg60=?, avg120=?, avg200=?, avg240=?, avg300=?, "
|
||||||
sql += " bolingerband_upper=?, bolingerband_lower=?, bolingerband_middle=?, "
|
sql += " bolingerband_upper=?, bolingerband_lower=?, bolingerband_middle=?, "
|
||||||
sql += " ichimokucloud_changeLine=?, ichimokucloud_baseLine=?, ichimokucloud_leadingSpan1=?, ichimokucloud_leadingSpan2=?, "
|
sql += " ichimokucloud_changeLine=?, ichimokucloud_baseLine=?, ichimokucloud_leadingSpan1=?, ichimokucloud_leadingSpan2=?, "
|
||||||
sql += " stochastic_fast_k=?, stochastic_slow_k=?, stochastic_slow_d=? "
|
sql += " stochastic_fast_k=?, stochastic_slow_k=?, stochastic_slow_d=?, "
|
||||||
|
sql += " rsi=?, rsis=? "
|
||||||
sql += " WHERE CODE=? and ymd=?"
|
sql += " WHERE CODE=? and ymd=?"
|
||||||
|
|
||||||
cursor.execute(sql,
|
cursor.execute(sql,
|
||||||
@@ -489,6 +576,7 @@ class AnalyzerSqlite:
|
|||||||
price['bolingerband_upper'], price['bolingerband_lower'], price['bolingerband_middle'], price['ichimokucloud_changeLine'], price['ichimokucloud_baseLine'],
|
price['bolingerband_upper'], price['bolingerband_lower'], price['bolingerband_middle'], price['ichimokucloud_changeLine'], price['ichimokucloud_baseLine'],
|
||||||
price['ichimokucloud_leadingSpan1'], price['ichimokucloud_leadingSpan2'],
|
price['ichimokucloud_leadingSpan1'], price['ichimokucloud_leadingSpan2'],
|
||||||
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'],
|
||||||
stock["CODE"], price['ymd'],))
|
stock["CODE"], price['ymd'],))
|
||||||
break
|
break
|
||||||
|
|
||||||
@@ -542,7 +630,9 @@ class AnalyzerSqlite:
|
|||||||
"ichimokucloud_leadingSpan2": -1,
|
"ichimokucloud_leadingSpan2": -1,
|
||||||
"stochastic_fast_k": -1,
|
"stochastic_fast_k": -1,
|
||||||
"stochastic_slow_k": -1,
|
"stochastic_slow_k": -1,
|
||||||
"stochastic_slow_d": -1})
|
"stochastic_slow_d": -1,
|
||||||
|
"rsi": -1,
|
||||||
|
"rsis": -1})
|
||||||
|
|
||||||
self.analyzeAdditionalInfo(stock, cursor)
|
self.analyzeAdditionalInfo(stock, cursor)
|
||||||
|
|
||||||
@@ -598,7 +688,9 @@ class AnalyzerSqlite:
|
|||||||
"ichimokucloud_leadingSpan2": -1,
|
"ichimokucloud_leadingSpan2": -1,
|
||||||
"stochastic_fast_k": -1,
|
"stochastic_fast_k": -1,
|
||||||
"stochastic_slow_k": -1,
|
"stochastic_slow_k": -1,
|
||||||
"stochastic_slow_d": -1})
|
"stochastic_slow_d": -1,
|
||||||
|
"rsi": -1,
|
||||||
|
"rsis": -1})
|
||||||
|
|
||||||
agg_dict = {'open': 'first',
|
agg_dict = {'open': 'first',
|
||||||
'high': 'max',
|
'high': 'max',
|
||||||
|
|||||||
@@ -46,46 +46,10 @@ class RSI:
|
|||||||
따라서 과매수 구간에서는 매도 준비를, 과매도 구간에서는 매수 준비를 해야 한다.
|
따라서 과매수 구간에서는 매도 준비를, 과매도 구간에서는 매수 준비를 해야 한다.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
results = []
|
|
||||||
df = pd.DataFrame()
|
df = pd.DataFrame()
|
||||||
df = df.from_dict(stock['PRICE'])
|
df = df.from_dict(stock['PRICE'])
|
||||||
df = self.apply(df)
|
df = self.apply(df)
|
||||||
|
|
||||||
for i in range(len(df.rsi)):
|
for i in range(len(df.rsi)):
|
||||||
result = {'DATE':stock['PRICE'][i]['DATE'],
|
stock['PRICE'][i]['rsi'] = df.rsi.values[i]
|
||||||
'rsi': df.rsi.values[i],
|
stock['PRICE'][i]['rsis'] = df.rsis.values[i]
|
||||||
'rsis': df.rsis.values[i],
|
|
||||||
'rsi_buy': 0}
|
|
||||||
|
|
||||||
# rsi가 상향이고 30을 돌파하면 매수,
|
|
||||||
if df.rsi.values[i - 1] < df.rsi.values[i]:
|
|
||||||
if df.rsi.values[i-1] <= 30 and df.rsi.values[i] > 30:
|
|
||||||
result['rsi_buy'] = 1
|
|
||||||
|
|
||||||
# rsi가 상향이고 40을 돌파하면 매수,
|
|
||||||
if df.rsi.values[i - 1] < df.rsi.values[i]:
|
|
||||||
if df.rsi.values[i-1] <= 50 and df.rsi.values[i] > 50:
|
|
||||||
result['rsi_buy'] = 1
|
|
||||||
|
|
||||||
# rsi가 상향이고 70을 돌파하면 단기매수,
|
|
||||||
if df.rsi.values[i - 1] < df.rsi.values[i]:
|
|
||||||
if df.rsi.values[i-1] <= 70 and df.rsi.values[i] > 70:
|
|
||||||
result['rsi_buy'] = 1
|
|
||||||
|
|
||||||
# rsi가 하향이고 70이하로 떨어지면 매도,
|
|
||||||
if df.rsi.values[i - 1] > df.rsi.values[i]:
|
|
||||||
if df.rsi.values[i-1] > 70 and df.rsi.values[i] <= 70:
|
|
||||||
result['rsi_buy'] = -1
|
|
||||||
|
|
||||||
# rsi가 하향이고 50이하로 떨어지면 매도,
|
|
||||||
if df.rsi.values[i - 1] > df.rsi.values[i]:
|
|
||||||
if df.rsi.values[i-1] > 50 and df.rsi.values[i] <= 50:
|
|
||||||
result['rsi_buy'] = -1
|
|
||||||
|
|
||||||
# rsi가 하향이고 30이하로 떨어지면 단기매도,
|
|
||||||
if df.rsi.values[i - 1] > df.rsi.values[i]:
|
|
||||||
if df.rsi.values[i-1] > 30 and df.rsi.values[i] <= 30:
|
|
||||||
result['rsi_buy'] = -1
|
|
||||||
|
|
||||||
results.append(result)
|
|
||||||
return results
|
|
||||||
|
|||||||
Reference in New Issue
Block a user