This commit is contained in:
dosangyoon
2022-08-12 03:14:55 +09:00
parent 95f68cab7b
commit a1d8bb10f3
4 changed files with 128 additions and 98 deletions

View File

@@ -49,9 +49,10 @@ class Simulation (HTS):
'close': 'int',
'volume': 'int',
'avg3': 'float',
'avg5': 'float',
'avg10': 'float',
'avg20': 'float',
'avg6': 'float',
'avg9': 'float',
'avg12': 'float',
'avg24': 'float',
'avg30': 'float',
'avg60': 'float',
'fast_k': 'float',
@@ -69,7 +70,7 @@ class Simulation (HTS):
buy_line[i] = nan
buy_size.append(0)
else:
buy_colors.append("#00ced1")
buy_colors.append("#D87D0F")
buy_size.append(10 + (5 * buy_weight_line[i]))
sell_colors = []
@@ -78,7 +79,7 @@ class Simulation (HTS):
sell_colors.append("#ffffff")
sell_line[i] = nan
else:
sell_colors.append("#D87D0F")
sell_colors.append("#00ced1")
# 그래프를 설정한다.
buy_check = go.Scatter(x=data['date'], y=buy_line, mode='markers', name="buy", marker=dict(size=buy_size, color=buy_colors, line_width=0))
@@ -86,11 +87,11 @@ class Simulation (HTS):
upper = go.Scatter(x=data['date'], y=data["upper"], name="upper", line_color='#000000')
lower = go.Scatter(x=data['date'], y=data["lower"], name="lower", line_color='#000000')
avg3 = go.Scatter(x=data['date'], y=data["avg3"], name="avg3", line_color='#8F8203')
avg5 = go.Scatter(x=data['date'], y=data["avg5"], name="avg5", line_color='#089B5B')
avg10 = go.Scatter(x=data['date'], y=data["avg10"], name="avg10", line_color='#ff00ff')
avg20 = go.Scatter(x=data['date'], y=data["avg20"], name="avg20", line_color='#1469F4')
avg30 = go.Scatter(x=data['date'], y=data["avg30"], name="avg30", line_color='#000000')
avg60 = go.Scatter(x=data['date'], y=data["avg60"], name="avg60", line_color='#008000')
avg6 = go.Scatter(x=data['date'], y=data["avg6"], name="avg6", line_color='#089B5B')
avg9 = go.Scatter(x=data['date'], y=data["avg9"], name="avg9", line_color='#ff00ff')
avg12 = go.Scatter(x=data['date'], y=data["avg12"], name="avg12", line_color='#1469F4')
avg24 = go.Scatter(x=data['date'], y=data["avg24"], name="avg24", line_color='#000000')
avg30 = go.Scatter(x=data['date'], y=data["avg30"], name="avg30", line_color='#008000')
candle_stick = go.Candlestick(x=data['date'], open=data['open'], high=data['high'], low=data['low'], close=data['close'], increasing_line_color='red', decreasing_line_color='blue')
volume_line = go.Scatter(x=data['date'], y=data["volume"], mode='lines', name='volume')
@@ -106,7 +107,7 @@ class Simulation (HTS):
rsi_line = go.Scatter(x=data['date'], y=data["rsi"], mode='lines', name='rsi')
rsis_line = go.Scatter(x=data['date'], y=data["rsis"], mode='lines', name='rsis')
candle_data = [candle_stick, upper, lower, avg3, avg5, avg10, avg20, avg30, avg60, buy_check, sell_check]
candle_data = [candle_stick, upper, lower, avg3, avg6, avg9, avg12, avg24, avg30, buy_check, sell_check]
volume_data = [volume_line]
macd_data = [macd_line, macd_s_line, macd_o_line]
stochastic_data = [slow_k_line, slow_d_line]
@@ -180,7 +181,7 @@ if __name__ == "__main__":
# to check bying
stock_codes = {
"252670": ['20220801', '20220802', '20220803', '20220804', '20220805', '20220808', '20220809', '20220810', '20220811'],
#"122630": ['20220810'],
"122630": ['20220801', '20220802', '20220803', '20220804', '20220805', '20220808', '20220809', '20220810', '20220811'],
}
method = "rule" # "rule", "ml", "answer"

View File

@@ -1,4 +1,5 @@
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
@@ -195,54 +196,49 @@ class BuySellChecker:
if i > START_TIME_INDEX:
# 매수 분석
if i > 740:
# "15:00" 까지만 매수
if i > 710:
# "14:30" 까지만 매수
return buy, weight
if i > 380 + 30 and data["macd"][i] < -25:
if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][i]):
if data["avg3"][i] > min(data["avg6"][i], data["avg9"][i], data["avg12"][i]):
buy = data["high"][i]
if i < 381 + 30:
if i < 381 + 40:
weight = 1
else:
weight = 5
return buy, weight
if i > 380 + 30 and data["macd"][i] < -5 and data["rsi"][i] < 30:
if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][i]):
if data["avg3"][i] > min(data["avg6"][i], data["avg9"][i], data["avg12"][i]):
buy = int((data["open"][i] + data["close"][i]) / 2)
weight = 2
return buy, weight
if i > 380 + 30 and data["slow_k"][i] < 10 and data["rsi"][i] < 30:
if data["slow_k"][i - 1] < min(data["slow_k"][i - 2], data["slow_k"][i]):
if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][i]):
if data["avg3"][i] > min(data["avg6"][i], data["avg9"][i], data["avg12"][i]):
buy = int((data["open"][i] + data["close"][i]) / 2)
weight = 2
return buy, weight
# 3분선이 5분선이 돌파가 이전보다 높은 경우 매수
if data["slow_k"][i] < 20 and data["avg3"][i - 1] < data["avg5"][i - 1] and data["avg3"][i] > data["avg5"][i]:
buy = int((data["open"][i] + data["close"][i]) / 2)
weight = 1
return buy, weight
# 3분선이 5분선이 돌파가 이전보다 높은 경우 매수
if data["slow_k"][i] < 70 and data["avg3"][i - 1] < data["avg5"][i - 1] and data["avg3"][i] > data["avg5"][i]:
if data["slow_k"][i] < 70 and data["avg3"][i - 1] < data["avg6"][i - 1] and data["avg3"][i] > data["avg6"][i]:
max_avg3 = 0
p_avg3 = 999999
for c in range(1, 50):
if max_avg3 < data["avg5"][i - c]:
max_avg3 = data["avg5"][i - c]
if data["avg3"][i-c-1] < data["avg5"][i-c-1] and data["avg3"][i-c] > data["avg5"][i-c]:
if max_avg3 < data["avg6"][i - c]:
max_avg3 = data["avg6"][i - c]
if data["avg3"][i-c-2] < data["avg6"][i-c-2] and data["avg3"][i-c-1] <= data["avg6"][i-c-1] and data["avg3"][i-c] > data["avg6"][i-c]:
p_avg3 = data["avg3"][i-c]
break
if data["avg3"][i] > p_avg3 and max_avg3 < data["avg3"][i]:
if max(data["avg3"][i-3], data["avg3"][i-2], data["avg3"][i-1]) - min(data["avg3"][i-3], data["avg3"][i-2], data["avg3"][i-1]) > 1:
#if data["avg6"][i-10] > data["avg6"][i]:
if i == 382 or i == 383:
if data["close"][i] != data["high"][i]:
return -1, -1
#buy = int((data["open"][i] + data["close"][i]) / 2)
buy = data["low"][i]
weight = 1
return buy, weight
@@ -451,25 +447,25 @@ class BuySellChecker:
# 매도 분석
# 10분선 위에서 3분선이 5분선을 하향 돌파 하는 경우 매도
if data["slow_k"][i - 1] > 60 and data["avg3"][i - 1] >= data["avg5"][i - 1] and data["avg3"][i] < data["avg5"][i]:
if max(data["avg3"][i], data["avg5"][i]) < data["avg10"][i]:
sell = int((data["high"][i] + data["low"][i]) / 2)
if data["slow_k"][i - 1] > 70 and data["avg3"][i - 1] >= data["avg6"][i - 1] and data["avg3"][i] < data["avg6"][i]:
if max(data["avg3"][i], data["avg6"][i]) < data["avg9"][i]:
sell = int((data["open"][i] + data["close"][i]) / 2)
weight = 1
return sell, weight
"""
# 3분선이 5분 이상 5분선 위에 있다가 5분선 아래로 내려옴
if i >= 381 + 5:
vaild = True
for c in range(1, 6):
if data["avg3"][i - c] < data["avg5"][i - c]:
for c in range(1, 11):
if data["avg3"][i - c] < data["avg6"][i - c]:
vaild = False
break
if vaild:
if data["avg3"][i] < data["avg5"][i]:
if data["avg3"][i] < data["avg6"][i]:
sell = int(data["avg3"][i] - data["avg3"][i]%5)
weight = 1
return sell, weight
"""
"""
# 3분 선이 40분 전부터 게속 20분선 위에 있다가 아래로 내려오면 매도함
if data["avg3"][i] < data["avg20"][i]:
@@ -553,42 +549,49 @@ class BuySellChecker:
if i >= START_TIME_INDEX:
# 매수 분석
if i > 740:
# "15:00" 까지만 매수
if i > 710:
# "14:30" 까지만 매수
return buy, weight
if i > 380 + 30 and data["macd"][i] < -25:
if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][i]):
if data["avg3"][i] > min(data["avg6"][i], data["avg9"][i], data["avg12"][i]):
buy = data["high"][i]
if i < 381 + 30:
if i < 381 + 40:
weight = 1
else:
weight = 5
return buy, weight
if i > 380 + 30 and data["macd"][i] < -5 and data["rsi"][i] < 30:
if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][i]):
if data["avg3"][i] > min(data["avg6"][i], data["avg9"][i], data["avg12"][i]):
buy = int((data["open"][i] + data["close"][i]) / 2)
weight = 2
return buy, weight
if i > 380 + 30 and data["slow_k"][i] < 10 and data["rsi"][i] < 30:
if data["slow_k"][i - 1] < min(data["slow_k"][i - 2], data["slow_k"][i]):
if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][i]):
if data["avg3"][i] > min(data["avg6"][i], data["avg9"][i], data["avg12"][i]):
buy = int((data["open"][i] + data["close"][i]) / 2)
weight = 2
return buy, weight
# 3분선이 5분선이 돌파가 이전보다 높은 경우 매수
if data["avg3"][i - 1] < data["avg5"][i - 1] and data["avg3"][i] > data["avg5"][i]:
if (data["avg3"][i - 1] < data["avg9"][i - 1] and data["avg3"][i] > data["avg9"][i] or
data["avg3"][i - 2] < data["avg9"][i - 2] and data["avg3"][i - 1] > data["avg9"][i - 1] and data["avg3"][i] > data["avg9"][i]):
max_avg3 = 0
p_avg3 = 999999
for c in range(1, 50):
if data["avg3"][i-c-1] < data["avg5"][i-c-1] and data["avg3"][i-c] > data["avg5"][i-c]:
p_avg3 = data["avg3"][i-c]
for c in range(2, 50):
if max_avg3 < data["avg9"][i - c]:
max_avg3 = data["avg9"][i - c]
if data["avg3"][i - c - 2] < data["avg9"][i - c - 2] and data["avg3"][i - c - 1] <= data["avg9"][i - c - 1] and data["avg3"][i - c] > data["avg9"][i - c]:
p_avg3 = data["avg3"][i - c]
break
if data["avg3"][i] > p_avg3:
if data["slow_k"][i] < 30 or i < 381 + 10:
buy = int((data["open"][i] + data["close"][i]) / 2)
if data["avg3"][i] > p_avg3+3 and max_avg3 < data["avg3"][i]:
# if data["avg6"][i-10] > data["avg6"][i]:
if i == 382 or i == 383:
if data["close"][i] != data["high"][i]:
return -1, -1
buy = data["low"][i]
weight = 1
return buy, weight
"""
@@ -796,26 +799,25 @@ class BuySellChecker:
# 매도 분석
# 10분선 위에서 3분선이 5분선을 하향 돌파 하는 경우 매도
if data["avg3"][i - 1] >= data["avg5"][i - 1] and data["avg3"][i] < data["avg5"][i]:
if min(data["avg3"][i], data["avg5"][i]) > data["avg10"][i]:
if data["slow_k"][i] > 80:
sell = int((data["high"][i] + data["low"][i]) / 2)
if data["slow_k"][i - 1] > 70 and data["avg3"][i - 1] >= data["avg6"][i - 1] and data["avg3"][i] < data["avg6"][i]:
if max(data["avg3"][i], data["avg6"][i]) < data["avg9"][i]:
sell = int((data["open"][i] + data["close"][i]) / 2)
weight = 1
return sell, weight
"""
# 3분선이 5분 이상 5분선 위에 있다가 5분선 아래로 내려옴
# 3분선이 10분 이상 6분선 위에 있다가 5분선 아래로 내려옴
if i >= 381 + 5:
vaild = True
for c in range(1, 6):
if data["avg3"][i - c] < data["avg5"][i - c]:
for c in range(1, 11):
if data["avg3"][i - c] < data["avg6"][i - c]:
vaild = False
break
if vaild:
if data["avg3"][i] < data["avg5"][i]:
if data["avg3"][i] < data["avg6"][i]:
sell = int(data["avg3"][i] - data["avg3"][i]%5)
weight = 1
return sell, weight
"""
"""
# 3분 선이 40분 전부터 게속 20분선 위에 있다가 아래로 내려오면 매도함
if data["avg3"][i] < data["avg20"][i]:
@@ -892,14 +894,14 @@ class BuySellChecker:
close_df = pd.DataFrame(close)
avg3_list = close_df.rolling(window=3).mean().fillna(close[0]).values.tolist()
avg3 = [item[0] for item in avg3_list]
avg5_list = close_df.rolling(window=5).mean().fillna(close[0]).values.tolist()
avg5 = [item[0] for item in avg5_list]
avg7_list = close_df.rolling(window=7).mean().fillna(close[0]).values.tolist()
avg7 = [item[0] for item in avg7_list]
avg10_list = close_df.rolling(window=10).mean().fillna(close[0]).values.tolist()
avg10 = [item[0] for item in avg10_list]
avg20_list = close_df.rolling(window=20).mean().fillna(close[0]).values.tolist()
avg20 = [item[0] for item in avg20_list]
avg6_list = close_df.rolling(window=6).mean().fillna(close[0]).values.tolist()
avg6 = [item[0] for item in avg6_list]
avg9_list = close_df.rolling(window=9).mean().fillna(close[0]).values.tolist()
avg9 = [item[0] for item in avg9_list]
avg12_list = close_df.rolling(window=12).mean().fillna(close[0]).values.tolist()
avg12 = [item[0] for item in avg12_list]
avg24_list = close_df.rolling(window=24).mean().fillna(close[0]).values.tolist()
avg24 = [item[0] for item in avg24_list]
avg30_list = close_df.rolling(window=30).mean().fillna(close[0]).values.tolist()
avg30 = [item[0] for item in avg30_list]
avg60_list = close_df.rolling(window=60).mean().fillna(close[0]).values.tolist()
@@ -925,7 +927,7 @@ class BuySellChecker:
STOCK = []
for i in range(len(open)):
STOCK.append({'volume': vol[i], 'close': close[i], 'open': open[i], 'high': high[i], 'low': low[i],
'avg3': avg3[i], 'avg5': avg5[i], 'avg7': avg7[i],'avg10': avg10[i],'avg20': avg20[i],'avg30': avg30[i],'avg60': avg60[i]})
'avg3': avg3[i], 'avg6': avg6[i], 'avg9': avg9[i], 'avg12': avg12[i],'avg24': avg24[i],'avg30': avg30[i],'avg60': avg60[i]})
# stochastic 계산
stochastic_df = self.stochastic.apply(STOCK, n=30, m=5, t=5)
@@ -957,7 +959,7 @@ class BuySellChecker:
temp = {"date": point_temp,
"open": open, "high": high, "low": low, "close": close, "volume": vol, "upper": upper, "lower": lower,
"avg3": avg3, "avg7": avg7, "avg5": avg5, "avg10": avg10, "avg20": avg20, "avg30": avg30, "avg60": avg60,
"avg3": avg3, "avg6": avg6, "avg9": avg9, "avg12": avg12, "avg24": avg24, "avg30": avg30, "avg60": avg60,
"macd": macd, "macds": macds, "macdo": macdo,
"fast_k": fast_k, "slow_k": slow_k, "slow_d": slow_d,
"rsi": rsi, "rsis": rsis}
@@ -1309,8 +1311,8 @@ class BuySellChecker:
sell, weight = self.getSellPriceAndWeight_3000(data, last_index)
buy, weight = self.getBuyPriceAndWeight_3000(data, last_index)
else:
sell, weight = self.getBuyPriceAndWeight_3000(data, last_index)
buy, weight = self.getBuyPriceAndWeight_3000(data, last_index)
sell, weight = self.getSellPriceAndWeight_15000(data, last_index)
buy, weight = self.getBuyPriceAndWeight_15000(data, last_index)
bsLine['buy'] = [buy]
bsLine['buy_weight'] = [weight]

Binary file not shown.

View File

@@ -289,24 +289,51 @@ if __name__ == "__main__":
labelMaker = LabelMaker(RESOURCE_PATH)
view = True
stock_code = "252670"
ymd = "20220809"
stock_code = "122630"
ymd = "20220811"
if view:
labelMaker.makeLabel(db_filename, "252670", "20220809", "0930", 1)
labelMaker.makeLabel(db_filename, "252670", "20220809", "0931", 1)
labelMaker.makeLabel(db_filename, "252670", "20220809", "0951", 1)
labelMaker.makeLabel(db_filename, "252670", "20220809", "0953", 1)
labelMaker.makeLabel(db_filename, "252670", "20220809", "0954", 1)
labelMaker.makeLabel(db_filename, "252670", "20220809", "0955", 1)
labelMaker.makeLabel(db_filename, "252670", "20220809", "0956", 1)
labelMaker.makeLabel(db_filename, "252670", "20220809", "0959", 1)
labelMaker.makeLabel(db_filename, "252670", "20220809", "1509", 1)
labelMaker.makeLabel(db_filename, "252670", "20220809", "1515", 1)
labelMaker.makeLabel(db_filename, "252670", "20220809", "1516", 1)
labelMaker.makeLabel(db_filename, "252670", "20220809", "1518", 1)
labelMaker.makeLabel(db_filename, "252670", "20220809", "1519", 1)
labelMaker.makeLabel(db_filename, "252670", "20220809", "1520", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "0905", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "0910", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "0911", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1030", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1034", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1109", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1110", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1111", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1207", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1211", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1228", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1229", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1230", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1231", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1232", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1249", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1303", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1304", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1420", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1421", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1436", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1437", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1438", 2)
labelMaker.makeLabel(db_filename, "122630", "20220811", "0949", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1000", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1001", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1016", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1017", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1045", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1049", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1126", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1127", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1315", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1316", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1317", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1458", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1459", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1500", 1)
labelMaker.makeLabel(db_filename, "122630", "20220811", "1501", 1)
labelMaker.showLabels(stock_code, ymd)
else: