840 lines
38 KiB
Python
840 lines
38 KiB
Python
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
|
|
from stock.analysis.MACD import MACD
|
|
from stock.analysis.IchimokuCloud import IchimokuCloud
|
|
|
|
class BuySellChecker:
|
|
|
|
common = None
|
|
stochastic = None
|
|
rsi = None
|
|
macd = None
|
|
ichimokuCloud = None
|
|
|
|
def __init__(self):
|
|
self.common = Common()
|
|
self.stochastic = Stochastic()
|
|
self.rsi = RSI()
|
|
self.macd = MACD()
|
|
self.ichimokuCloud = IchimokuCloud()
|
|
|
|
return
|
|
|
|
def getPriceAndWeight1(self, data, i):
|
|
buy, weight, sell = -1, -1, -1
|
|
|
|
START_TIME_INDEX = 0
|
|
for c in range(370, len(data.index)):
|
|
if data.index[c].strftime("%H:%M:%S") == "09:01:00":
|
|
START_TIME_INDEX = c
|
|
break
|
|
|
|
if i >= START_TIME_INDEX:
|
|
################
|
|
### sell 분석 ###
|
|
################
|
|
# 1. 볼린져밴드 상단이 최고와 종가 사이 아래에 있는 경우 매도한다.
|
|
#if (hts["high"][i] - hts["close"][i]) / 2 + hts["close"][i] > hts["upper"][i]:
|
|
# sell = hts["high"][i]
|
|
|
|
# 2. slow_k가 90이 넘으면 매도한다.
|
|
if data["slow_k"][i] > 90:
|
|
sell = data["high"][i]
|
|
|
|
#if hts["slow_k"][i] >= 85:
|
|
# if hts["slow_d"][i-1] < hts["slow_k"][i-1] and hts["slow_k"][i] < hts["slow_d"][i]:
|
|
# sell = hts["high"][i]
|
|
|
|
# 3. 2시 이후에는 최고가가 볼린져밴드 상단 위에 있으면 매도한다.
|
|
if i > 300 and data["high"][i] > data["upper"][i]:
|
|
sell = data["high"][i]
|
|
|
|
##########################
|
|
### buy 분석 ###
|
|
##########################
|
|
if data["low"][i] < data["lower"][i] + 5 and data["open"][i] <= data["close"][i]:
|
|
if data["slow_k"][i-1] < 30 and data["slow_k"][i] < 30:
|
|
if data["slow_k"][i-1] < data["slow_k"][i]:
|
|
buy = data["low"][i]
|
|
|
|
if data["rsi"][i] < 25:
|
|
if data["rsi"][i - 2] < data["rsis"][i - 2] and data["rsi"][i - 1] < data["rsis"][i - 1] and data["rsis"][i] < data["rsi"][i]:
|
|
if data["close"][i] < data["avg5"][i]:
|
|
buy = data["close"][i]
|
|
else:
|
|
buy = data["low"][i]
|
|
weight = 1
|
|
|
|
#############################
|
|
### STOCHASTIC weight 분석 ###
|
|
#############################
|
|
if data["slow_k"][i] in (0, 1, 2, 3):
|
|
weight = 1
|
|
if data["slow_k"][i] in (4, 5, 6, 7, 8):
|
|
weight = 1
|
|
elif data["slow_k"][i] in (9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20):
|
|
weight = 1
|
|
elif data["slow_k"][i] in (21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35):
|
|
weight = 1
|
|
|
|
return buy, weight, sell
|
|
|
|
def getPriceAndWeight2(self, data, i):
|
|
buy, weight, sell = -1, -1, -1
|
|
|
|
START_TIME_INDEX = 0
|
|
for c in range(370, len(data.index)):
|
|
if data.index[c].strftime("%H:%M:%S") == "09:01:00":
|
|
START_TIME_INDEX = c
|
|
break
|
|
|
|
if i >= START_TIME_INDEX:
|
|
################
|
|
### sell 분석 ###
|
|
################
|
|
# 1. 볼린져밴드 상단이 최고와 종가 사이 아래에 있는 경우 매도한다.
|
|
if (data["high"][i] - data["close"][i]) / 2 + data["close"][i] > data["upper"][i]:
|
|
sell = data["high"][i]
|
|
|
|
if data["slow_k"][i] >= 85:
|
|
if data["slow_d"][i - 1] < data["slow_k"][i - 1] and data["slow_k"][i] < data["slow_d"][i]:
|
|
sell = data["high"][i]
|
|
|
|
# 3. 2시 이후에는 최고가가 볼린져밴드 상단 위에 있으면 매도한다.
|
|
if i > 300 and data["high"][i] > data["upper"][i]:
|
|
sell = data["high"][i]
|
|
|
|
##########################
|
|
### STOCHASTIC buy 분석 ###
|
|
##########################
|
|
if i < 40:
|
|
pre_slow = data["slow_k"][i - 1] / data["slow_d"][i - 1] - 1
|
|
now_slow = data["slow_k"][i] / data["slow_d"][i] - 1
|
|
if pre_slow < 0 and 0 < now_slow:
|
|
if data["slow_k"][i] <= 35:
|
|
if (data["close"][i] - data["lower"][i]) / (data["upper"][i] - data["lower"][i]) < 0.35:
|
|
if data["slow_k"][i - 1] < data["slow_d"][i - 1] and data["slow_d"][i] < data["slow_k"][i]:
|
|
if data['avg10'][i] < data['avg5'][i]:
|
|
if data["open"][i] < data["close"][i]:
|
|
buy = data["close"][i]
|
|
else:
|
|
buy = data["low"][i]
|
|
else:
|
|
pre_slow = data["slow_k"][i - 1] / data["slow_d"][i - 1] - 1
|
|
now_slow = data["slow_k"][i] / data["slow_d"][i] - 1
|
|
if pre_slow < 0 and pre_slow < now_slow and -0.15 < now_slow:
|
|
if data["slow_k"][i] <= 30:
|
|
if (data["close"][i] - data["lower"][i]) / (data["upper"][i] - data["lower"][i]) < 0.35:
|
|
if data["slow_k"][i - 1] < data["slow_d"][i - 1] and data["slow_d"][i] < data["slow_k"][i]:
|
|
if data['avg10'][i] < data['avg5'][i]:
|
|
if data["close"][i] < data["avg5"][i]:
|
|
buy = data["close"][i]
|
|
else:
|
|
buy = data["low"][i]
|
|
|
|
#############################
|
|
### STOCHASTIC weight 분석 ###
|
|
#############################
|
|
if data["slow_k"][i] in (0, 1, 2, 3):
|
|
weight = 1
|
|
if data["slow_k"][i] in (4, 5, 6, 7, 8):
|
|
weight = 1
|
|
elif data["slow_k"][i] in (9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20):
|
|
weight = 1
|
|
elif data["slow_k"][i] in (21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35):
|
|
weight = 1
|
|
|
|
return buy, weight, sell
|
|
|
|
def getBuyCheck(self, data, i, buy, weight):
|
|
if data['close'][i]<data['avg3'][i]<data['avg5'][i]<data['avg10'][i]<data['avg20'][i]<data['avg30'][i]:
|
|
buy, weight, sell = -1, -1, -1
|
|
|
|
if data['slow_k'][i] > 40:
|
|
buy, weight, sell = -1, -1, -1
|
|
|
|
return buy, weight
|
|
|
|
|
|
|
|
|
|
def isYangbong(self, data, i):
|
|
if data['close'][i] > data['open'][i]:
|
|
return True
|
|
else:
|
|
if data['low'][i] < data['close'][i] == data['open'][i] == data['high'][i]:
|
|
return True
|
|
if data['low'][i] < data['open'][i] == data['close'][i] < data['high'][i]:
|
|
return True
|
|
return False
|
|
|
|
def isUmbong(self, data, i):
|
|
if data['close'][i] < data['open'][i]:
|
|
return True
|
|
else:
|
|
if data['low'][i] == data['close'][i] == data['open'][i] < data['high'][i]:
|
|
return True
|
|
if data['low'][i] < data['open'][i] == data['close'][i] < data['high'][i]:
|
|
return True
|
|
return False
|
|
|
|
|
|
|
|
# 곱버스에 해당함
|
|
def getBuyPriceAndWeight_252670(self, data, i):
|
|
buy, weight = -1, -1
|
|
|
|
START_TIME_INDEX = 0
|
|
for c in range(370, len(data.index)):
|
|
if data.index[c].strftime("%H:%M:%S") == "09:01:00":
|
|
START_TIME_INDEX = c
|
|
break
|
|
|
|
if i > START_TIME_INDEX:
|
|
# 매수 분석
|
|
|
|
param = 1
|
|
if (data["macd"][i] < -3.345900723 and data["macds"][i] < -2.6891156 and
|
|
data["diff_avg27"][i] < -0.533890436*param and
|
|
data["diff_avg3_avg27"][i] < -8.13705767 * param and
|
|
data["diff_avg3_avg54"][i] < -11.87996492 * param and
|
|
|
|
data["diff_avg6_avg27"][i] < -6.800010317 * param and
|
|
data["diff_avg6_avg54"][i] < -10.54291757*param and
|
|
|
|
data["diff_avg9_avg27"][i] < -5.492365625 * param and
|
|
data["diff_avg9_avg54"][i] < -9.235272877*param and
|
|
|
|
data["diff_avg12_avg27"][i] < -4.243719695 * param and
|
|
data["diff_avg12_avg54"][i] < -7.986626947*param and
|
|
|
|
data["diff_change_lead1"][i] < -11.86803621 * param and
|
|
data["diff_open_lead1"][i] < -14.51775766*param and
|
|
data["diff_close_lead1"][i] < -14.69185237*param and
|
|
data["diff_high_lead1"][i] < -11.33530641*param and
|
|
data["diff_low_lead1"][i] < -18.93976323*param and
|
|
|
|
27.50548619 - 20.56512876/3 < data["diff_upper_lower"][i] < 27.50548619*param + 20.56512876
|
|
#data["diff_change_base"][i] < -5.250696379*param
|
|
):
|
|
|
|
buy = int((data["open"][i] + data["close"][i]) / 2)
|
|
weight = 1
|
|
return buy, weight
|
|
|
|
|
|
return buy, weight
|
|
|
|
def getSellPriceAndWeight_252670(self, data, i):
|
|
sell, weight = -1, -1
|
|
|
|
START_TIME_INDEX = 0
|
|
for c in range(370, len(data.index)):
|
|
if data.index[c].strftime("%H:%M:%S") == "09:01:00":
|
|
START_TIME_INDEX = c
|
|
break
|
|
|
|
if i > START_TIME_INDEX:
|
|
# 매수 분석
|
|
|
|
|
|
# 3분선이 10분 이상 6분선 위에 있다가 5분선 아래로 내려옴
|
|
if i >= 381 + 5:
|
|
vaild = True
|
|
count = 0
|
|
for c in range(1, 11):
|
|
if data["avg3"][i - c] == data["avg6"][i - c]:
|
|
count += 1
|
|
if data["avg3"][i - c] < data["avg6"][i - c]:
|
|
vaild = False
|
|
break
|
|
if vaild and count < 3:
|
|
if data["avg3"][i] < data["avg6"][i]:
|
|
sell = int(data["avg3"][i] - data["avg3"][i]%5)
|
|
weight = 1
|
|
return sell, weight
|
|
|
|
param = 1
|
|
if (
|
|
data["diff_avg27"][i] > 0.371828521*param and
|
|
data["diff_avg3_avg27"][i] > 6.254009915 * param and
|
|
data["diff_avg3_avg54"][i] > 8.234179061 * param and
|
|
|
|
data["diff_avg6_avg27"][i] > 4.87605716 * param and
|
|
data["diff_avg6_avg54"][i] > 6.856226305*param and
|
|
|
|
data["diff_avg9_avg27"][i] > 3.664333625 * param and
|
|
data["diff_avg9_avg54"][i] > 5.64450277*param and
|
|
|
|
data["diff_avg12_avg27"][i] > 2.802566346 * param and
|
|
data["diff_avg12_avg54"][i] > 4.782735491*param and
|
|
|
|
data["diff_change_lead1"][i] > 7.057086614 * param and
|
|
data["diff_open_lead1"][i] > 10.34448819*param and
|
|
data["diff_close_lead1"][i] > 11.17125984*param and
|
|
data["diff_high_lead1"][i] > 13.69094488*param and
|
|
data["diff_low_lead1"][i] > 7.234251969*param and
|
|
|
|
data["diff_upper_lower"][i] > 19.77913348*param and
|
|
data["diff_change_base"][i] > 3.011811024*param
|
|
):
|
|
|
|
buy = int((data["open"][i] + data["close"][i]) / 2)
|
|
weight = 1
|
|
return buy, weight
|
|
|
|
return sell, weight
|
|
|
|
def getBuyPriceAndWeight_122630(self, data, i):
|
|
buy, weight = -1, -1
|
|
|
|
START_TIME_INDEX = 0
|
|
for c in range(370, len(data.index)):
|
|
if data.index[c].strftime("%H:%M:%S") == "09:01:00":
|
|
START_TIME_INDEX = c
|
|
break
|
|
|
|
if i > START_TIME_INDEX:
|
|
# 매수 분석
|
|
|
|
param = 1
|
|
if (data["macd"][i] < -1.481742793 and data["macdo"][i] < -0.966054903 and
|
|
data["diff_avg27"][i] < -0.522721303 * param and
|
|
data["diff_avg3_avg27"][i] < -6.486734962 * param and
|
|
data["diff_avg3_avg54"][i] < -4.764250066 * param and
|
|
|
|
data["diff_avg6_avg27"][i] < -3.106120305 * param and
|
|
data["diff_avg6_avg54"][i] < -1.383635408 * param and
|
|
|
|
data["diff_avg9_avg27"][i] < -3.007617547 * param and
|
|
data["diff_avg9_avg54"][i] < -1.28513265 * param and
|
|
|
|
data["diff_avg12_avg27"][i] < -3.206593118 * param and
|
|
data["diff_avg12_avg54"][i] < -1.484108222 * param and
|
|
|
|
data["diff_change_lead1"][i] < -2.872340426 * param and
|
|
data["diff_open_lead1"][i] < -4.787234043 * param and
|
|
data["diff_close_lead1"][i] < -12.34042553 * param and
|
|
data["diff_high_lead1"][i] < 0.106382979 * param and
|
|
data["diff_low_lead1"][i] < -17.69503546 * param and
|
|
|
|
data["diff_upper_lower"][i] < 110.7506807 * param + 124.7189534 / 3 and
|
|
data["diff_change_base"][i] < -7.712765957 * param and
|
|
|
|
data["diff_avg3"][i] < -4.621749409 * param and
|
|
data["diff_avg6"][i] < -1.88534279 * param and
|
|
data["diff_avg9"][i] < -0.996847912 * param and
|
|
data["diff_avg12"][i] < -1.025413712 * param and
|
|
data["diff_avg27"][i] < -0.522721303 * param and
|
|
data["diff_avg54"][i] < 0.005910165 * param
|
|
):
|
|
buy = int((data["open"][i] + data["close"][i]) / 2)
|
|
weight = 1
|
|
return buy, weight
|
|
|
|
return buy, weight
|
|
|
|
|
|
def getSellPriceAndWeight_122630(self, data, i):
|
|
sell, weight = -1, -1
|
|
|
|
START_TIME_INDEX = 0
|
|
for c in range(370, len(data.index)):
|
|
if data.index[c].strftime("%H:%M:%S") == "09:01:00":
|
|
START_TIME_INDEX = c
|
|
break
|
|
|
|
if i > START_TIME_INDEX:
|
|
# 매수 분석
|
|
|
|
# 3분선이 10분 이상 6분선 위에 있다가 5분선 아래로 내려옴
|
|
if i >= 381 + 5:
|
|
vaild = True
|
|
count = 0
|
|
for c in range(1, 11):
|
|
if data["avg3"][i - c] == data["avg6"][i - c]:
|
|
count += 1
|
|
if data["avg3"][i - c] < data["avg6"][i - c]:
|
|
vaild = False
|
|
break
|
|
if vaild and count < 3:
|
|
if data["avg3"][i] < data["avg6"][i]:
|
|
sell = int(data["avg3"][i] - data["avg3"][i]%5)
|
|
weight = 1
|
|
return sell, weight
|
|
|
|
param = 2
|
|
if (data["macd"][i] > 11.4590339 and
|
|
data["diff_avg27"][i] > 2.261904762 * param and
|
|
data["diff_avg3_avg27"][i] > 28.83730159 * param and
|
|
data["diff_avg3_avg54"][i] > 40.84391534 * param and
|
|
|
|
data["diff_avg6_avg27"][i] > 22.49801587 * param and
|
|
data["diff_avg6_avg54"][i] > 34.50462963 * param and
|
|
|
|
data["diff_avg9_avg27"][i] > 17.6984127 * param and
|
|
data["diff_avg9_avg54"][i] > 29.70502646 * param and
|
|
|
|
data["diff_avg12_avg27"][i] > 13.59920635 * param and
|
|
data["diff_avg12_avg54"][i] > 25.60582011 * param and
|
|
|
|
data["diff_change_lead1"][i] > 40.82142857 * param and
|
|
data["diff_open_lead1"][i] > 53.48214286 * param and
|
|
data["diff_close_lead1"][i] > 58.23214286 * param and
|
|
data["diff_high_lead1"][i] > 63.125 * param and
|
|
data["diff_low_lead1"][i] > 49.41071429 * param and
|
|
|
|
data["diff_upper_lower"][i] < 70.63330362 * param + 124.7189534 / 3 and
|
|
data["diff_change_base"][i] > 16.73214286 * param and
|
|
|
|
data["diff_avg3"][i] > 4.714285714 * param and
|
|
data["diff_avg6"][i] > 3.857142857 * param and
|
|
data["diff_avg9"][i] > 3.373015873 * param and
|
|
data["diff_avg12"][i] > 3.026785714 * param and
|
|
data["diff_avg27"][i] > 2.261904762 * param and
|
|
data["diff_avg54"][i] > 1.18452381 * param
|
|
):
|
|
buy = int((data["open"][i] + data["close"][i]) / 2)
|
|
weight = 1
|
|
return buy, weight
|
|
|
|
return sell, weight
|
|
|
|
def analyze(self, result):
|
|
# 기본 캔들 정보
|
|
open = result["open"]
|
|
close = result["close"]
|
|
high = result["high"]
|
|
low = result["low"]
|
|
vol = result["vol"]
|
|
label = result["label"]
|
|
|
|
# 캔들 정보 연산
|
|
height = [close[i] - open[i] for i in range(0, len(close))]
|
|
top_tail_height = [high[i] - max(open[i], close[i]) for i in range(0, len(close))]
|
|
bottom_tail_height = [min(open[i], close[i]) - low[i] for i in range(0, len(close))]
|
|
|
|
# 이동 평균
|
|
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]
|
|
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]
|
|
avg27_list = close_df.rolling(window=27).mean().fillna(close[0]).values.tolist()
|
|
avg27 = [item[0] for item in avg27_list]
|
|
avg54_list = close_df.rolling(window=54).mean().fillna(close[0]).values.tolist()
|
|
avg54 = [item[0] for item in avg54_list]
|
|
|
|
abs_avg_1 = [max(avg3[i], avg6[i], avg9[i], avg12[i], avg27[i], avg54[i]) - min(avg3[i], avg6[i], avg9[i], avg12[i], avg27[i], avg54[i]) for i in range(0, len(close))]
|
|
abs_avg_2 = [max(avg3[i], avg6[i], avg9[i], avg12[i], avg27[i]) - min(avg3[i], avg6[i], avg9[i], avg12[i], avg27[i]) for i in range(0, len(close))]
|
|
abs_avg_3 = [max(avg3[i], avg6[i], avg9[i], avg12[i]) - min(avg3[i], avg6[i], avg9[i], avg12[i]) for i in range(0, len(close))]
|
|
abs_avg_4 = [max(avg3[i], avg6[i], avg9[i]) - min(avg3[i], avg6[i], avg9[i]) for i in range(0, len(close))]
|
|
abs_avg_5 = [max(avg3[i], avg6[i]) - min(avg3[i], avg6[i]) for i in range(0, len(close))]
|
|
|
|
diff_open, diff_close, diff_low, diff_high = [], [], [], []
|
|
diff_open.append(0)
|
|
for i in range(1, len(open)):
|
|
diff_open.append(open[i] - open[i - 1])
|
|
diff_close.append(0)
|
|
for i in range(1, len(close)):
|
|
diff_close.append(close[i] - close[i - 1])
|
|
diff_low.append(0)
|
|
for i in range(1, len(low)):
|
|
diff_low.append(low[i] - low[i - 1])
|
|
diff_high.append(0)
|
|
for i in range(1, len(high)):
|
|
diff_high.append(high[i] - high[i - 1])
|
|
|
|
diff_avg3, diff_avg6, diff_avg9, diff_avg12, diff_avg27, diff_avg54 = [], [], [], [], [], []
|
|
diff_avg3.append(0)
|
|
for i in range(1, len(avg3)):
|
|
diff_avg3.append(avg3[i]-avg3[i-1])
|
|
diff_avg6.append(0)
|
|
for i in range(1, len(avg6)):
|
|
diff_avg6.append(avg6[i] - avg6[i - 1])
|
|
diff_avg9.append(0)
|
|
for i in range(1, len(avg9)):
|
|
diff_avg9.append(avg9[i] - avg9[i - 1])
|
|
diff_avg12.append(0)
|
|
for i in range(1, len(avg12)):
|
|
diff_avg12.append(avg12[i] - avg12[i - 1])
|
|
diff_avg27.append(0)
|
|
for i in range(1, len(avg27)):
|
|
diff_avg27.append(avg27[i] - avg27[i - 1])
|
|
diff_avg54.append(0)
|
|
for i in range(1, len(avg54)):
|
|
diff_avg54.append(avg54[i] - avg54[i - 1])
|
|
|
|
|
|
diff_avg3_avg6 = [avg3[i] - avg6[i] for i in range(0, len(close))]
|
|
diff_avg3_avg9 = [avg3[i] - avg9[i] for i in range(0, len(close))]
|
|
diff_avg3_avg12 = [avg3[i] - avg12[i] for i in range(0, len(close))]
|
|
diff_avg3_avg27 = [avg3[i] - avg27[i] for i in range(0, len(close))]
|
|
diff_avg3_avg54 = [avg3[i] - avg54[i] for i in range(0, len(close))]
|
|
diff_avg6_avg9 = [avg6[i] - avg9[i] for i in range(0, len(close))]
|
|
diff_avg6_avg12 = [avg6[i] - avg12[i] for i in range(0, len(close))]
|
|
diff_avg6_avg27 = [avg6[i] - avg27[i] for i in range(0, len(close))]
|
|
diff_avg6_avg54 = [avg6[i] - avg54[i] for i in range(0, len(close))]
|
|
diff_avg9_avg12 = [avg9[i] - avg12[i] for i in range(0, len(close))]
|
|
diff_avg9_avg27 = [avg9[i] - avg27[i] for i in range(0, len(close))]
|
|
diff_avg9_avg54 = [avg9[i] - avg54[i] for i in range(0, len(close))]
|
|
diff_avg12_avg27 = [avg12[i] - avg27[i] for i in range(0, len(close))]
|
|
diff_avg12_avg54 = [avg12[i] - avg54[i] for i in range(0, len(close))]
|
|
diff_avg27_avg54 = [avg27[i] - avg54[i] for i in range(0, len(close))]
|
|
|
|
# 볼린져 밴드
|
|
df = pd.DataFrame(close)
|
|
max20 = df.rolling(window=20).mean()
|
|
stddev20 = df.rolling(window=20).std()
|
|
upper_df = max20 + (stddev20 * 2) # 상단 볼린저 밴드
|
|
lower_df = max20 - (stddev20 * 2) # 하단 볼린저 밴드
|
|
|
|
upper, lower = [], []
|
|
for i in range(len(upper_df)):
|
|
if i < 10:
|
|
upper.append(upper_df.values[0][0])
|
|
lower.append(lower_df.values[0][0])
|
|
else:
|
|
upper.append(upper_df.values[i][0])
|
|
lower.append(lower_df.values[i][0])
|
|
|
|
point_temp = result["time"]
|
|
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], 'avg6': avg6[i],'avg9': avg9[i],'avg12': avg12[i],'avg27': avg27[i],'avg54': avg54[i]})
|
|
|
|
# stochastic
|
|
stochastic_df = self.stochastic.apply(STOCK, n=30, m=5, t=5)
|
|
fast_k = stochastic_df['fast_k'].values.tolist()
|
|
slow_k = stochastic_df['slow_k'].values.tolist()
|
|
slow_d = stochastic_df['slow_d'].values.tolist()
|
|
|
|
# macd
|
|
macd_df = self.macd.apply(STOCK, short=12, long=26, t=9)
|
|
macd = macd_df['macd'].values.tolist()
|
|
macds = macd_df['macds'].values.tolist()
|
|
macdo = macd_df['macdo'].values.tolist()
|
|
|
|
# rsi
|
|
rsi_df = self.rsi.apply(STOCK, period=30, window=5)
|
|
rsi = rsi_df['rsi'].values.tolist()
|
|
rsis = rsi_df['rsis'].values.tolist()
|
|
|
|
# ichimokuCloud
|
|
ichimokuCloud_df = self.ichimokuCloud.apply(STOCK, c=9, b=26, l=52)
|
|
ichimokuCloud_df = ichimokuCloud_df[:len(ichimokuCloud_df) - 51]
|
|
changeLine = ichimokuCloud_df['changeLine'].values.tolist()
|
|
baseLine = ichimokuCloud_df['baseLine'].values.tolist()
|
|
leadingSpan1 = ichimokuCloud_df['leadingSpan1'].values.tolist()
|
|
leadingSpan2 = ichimokuCloud_df['leadingSpan2'].values.tolist()
|
|
|
|
# 간격
|
|
##### 볼린져 밴드
|
|
diff_upper_lower = [upper[i] - lower[i] for i in range(0, len(upper))]
|
|
diff_open_lower = [open[i] - lower[i] for i in range(0, len(open))]
|
|
diff_open_upper = [open[i] - upper[i] for i in range(0, len(open))]
|
|
diff_close_lower = [close[i] - lower[i] for i in range(0, len(close))]
|
|
diff_close_upper = [close[i] - upper[i] for i in range(0, len(close))]
|
|
diff_high_lower = [high[i] - lower[i] for i in range(0, len(high))]
|
|
diff_high_upper = [high[i] - upper[i] for i in range(0, len(high))]
|
|
diff_low_lower = [low[i] - lower[i] for i in range(0, len(low))]
|
|
diff_low_upper = [low[i] - upper[i] for i in range(0, len(low))]
|
|
|
|
|
|
##### 일목균형표
|
|
diff_lead1_lead2 = [leadingSpan1[i] - leadingSpan2[i] for i in range(0, len(leadingSpan1))]
|
|
diff_change_base = [changeLine[i] - baseLine[i] for i in range(0, len(baseLine))]
|
|
diff_base_lead1 = [baseLine[i] - leadingSpan1[i] for i in range(0, len(baseLine))]
|
|
diff_base_lead2 = [baseLine[i] - leadingSpan2[i] for i in range(0, len(baseLine))]
|
|
diff_change_lead1 = [changeLine[i] - leadingSpan1[i] for i in range(0, len(changeLine))]
|
|
diff_change_lead2 = [changeLine[i] - leadingSpan2[i] for i in range(0, len(changeLine))]
|
|
diff_open_lead2 = [open[i] - leadingSpan2[i] for i in range(0, len(open))]
|
|
diff_open_lead1 = [open[i] - leadingSpan1[i] for i in range(0, len(open))]
|
|
diff_open_change = [open[i] - changeLine[i] for i in range(0, len(open))]
|
|
diff_open_base = [open[i] - baseLine[i] for i in range(0, len(open))]
|
|
diff_close_lead2 = [close[i] - leadingSpan2[i] for i in range(0, len(close))]
|
|
diff_close_lead1 = [close[i] - leadingSpan1[i] for i in range(0, len(close))]
|
|
diff_close_change = [close[i] - changeLine[i] for i in range(0, len(close))]
|
|
diff_close_base = [close[i] - baseLine[i] for i in range(0, len(close))]
|
|
diff_high_lead2 = [high[i] - leadingSpan2[i] for i in range(0, len(high))]
|
|
diff_high_lead1 = [high[i] - leadingSpan1[i] for i in range(0, len(high))]
|
|
diff_high_change = [high[i] - changeLine[i] for i in range(0, len(high))]
|
|
diff_high_base = [high[i] - baseLine[i] for i in range(0, len(high))]
|
|
diff_low_lead2 = [low[i] - leadingSpan2[i] for i in range(0, len(low))]
|
|
diff_low_lead1 = [low[i] - leadingSpan1[i] for i in range(0, len(low))]
|
|
diff_low_change = [low[i] - changeLine[i] for i in range(0, len(low))]
|
|
diff_low_base = [low[i] - baseLine[i] for i in range(0, len(low))]
|
|
diff_macd_macds = [macd[i] - macds[i] for i in range(0, len(macd))]
|
|
diff_slowk_slowd = [slow_k[i] - slow_d[i] for i in range(0, len(slow_k))]
|
|
diff_rsi_rsis = [rsi[i] - rsis[i] for i in range(0, len(rsi))]
|
|
|
|
|
|
diff_macd, diff_macdo, diff_macds = [], [], []
|
|
diff_macd.append(0)
|
|
for i in range(1, len(macd)):
|
|
diff_macd.append(macd[i] - macd[i - 1])
|
|
diff_macdo.append(0)
|
|
for i in range(1, len(macdo)):
|
|
diff_macdo.append(macdo[i] - macdo[i - 1])
|
|
diff_macds.append(0)
|
|
for i in range(1, len(macds)):
|
|
diff_macds.append(macds[i] - macds[i - 1])
|
|
|
|
diff_fast_k, diff_slow_k, diff_slow_d = [], [], []
|
|
diff_fast_k.append(0)
|
|
for i in range(1, len(fast_k)):
|
|
diff_fast_k.append(fast_k[i] - fast_k[i - 1])
|
|
diff_slow_k.append(0)
|
|
for i in range(1, len(slow_k)):
|
|
diff_slow_k.append(slow_k[i] - slow_k[i - 1])
|
|
diff_slow_d.append(0)
|
|
for i in range(1, len(slow_d)):
|
|
diff_slow_d.append(slow_d[i] - slow_d[i - 1])
|
|
|
|
diff_rsi, diff_rsis = [], []
|
|
diff_rsi.append(0)
|
|
for i in range(1, len(rsi)):
|
|
diff_rsi.append(rsi[i] - rsi[i - 1])
|
|
diff_rsis.append(0)
|
|
for i in range(1, len(rsis)):
|
|
diff_rsis.append(rsis[i] - rsis[i - 1])
|
|
|
|
diff_changeLine, diff_baseLine = [], []
|
|
diff_changeLine.append(0)
|
|
for i in range(1, len(changeLine)):
|
|
diff_changeLine.append(changeLine[i] - changeLine[i - 1])
|
|
diff_baseLine.append(0)
|
|
for i in range(1, len(baseLine)):
|
|
diff_baseLine.append(baseLine[i] - baseLine[i - 1])
|
|
|
|
diff_upper, diff_lower = [], []
|
|
diff_upper.append(0)
|
|
for i in range(1, len(upper)):
|
|
diff_upper.append(upper[i] - upper[i - 1])
|
|
diff_lower.append(0)
|
|
for i in range(1, len(lower)):
|
|
diff_lower.append(lower[i] - lower[i - 1])
|
|
|
|
# 결과
|
|
temp = {
|
|
"date": point_temp,
|
|
"open": open, "high": high, "low": low, "close": close, "volume": vol,
|
|
"avg3": avg3, "avg6": avg6, "avg9": avg9, "avg12": avg12, "avg27": avg27, "avg54": avg54,
|
|
"upper": upper, "lower": lower,
|
|
"macd": macd, "macds": macds, "macdo": macdo,
|
|
"fast_k": fast_k, "slow_k": slow_k, "slow_d": slow_d,
|
|
"rsi": rsi, "rsis": rsis,
|
|
"changeLine": changeLine, "baseLine": baseLine, "leadingSpan1": leadingSpan1, "leadingSpan2": leadingSpan2,
|
|
"height": height, "top_tail_height": top_tail_height, "bottom_tail_height": bottom_tail_height,
|
|
"abs_avg_1": abs_avg_1, "abs_avg_2": abs_avg_2, "abs_avg_3": abs_avg_3, "abs_avg_4": abs_avg_4, "abs_avg_5": abs_avg_5,
|
|
"diff_open": diff_open, "diff_close": diff_close, "diff_low": diff_low, "diff_high": diff_high,
|
|
"diff_avg3":diff_avg3, "diff_avg6":diff_avg6, "diff_avg9":diff_avg9, "diff_avg12":diff_avg12, "diff_avg27":diff_avg27, "diff_avg54":diff_avg54,
|
|
"diff_macd":diff_macd, "diff_macdo":diff_macdo, "diff_macds":diff_macds,
|
|
"diff_fast_k":diff_fast_k, "diff_slow_k":diff_slow_k, "diff_slow_d":diff_slow_d,
|
|
"diff_rsi":diff_rsi, "diff_rsis":diff_rsis,
|
|
"diff_changeLine":diff_changeLine, "diff_baseLine":diff_baseLine,
|
|
"diff_upper":diff_upper, "diff_lower":diff_lower,
|
|
"diff_avg3_avg6": diff_avg3_avg6,
|
|
"diff_avg3_avg9": diff_avg3_avg9,
|
|
"diff_avg3_avg12": diff_avg3_avg12,
|
|
"diff_avg3_avg27": diff_avg3_avg27,
|
|
"diff_avg3_avg54": diff_avg3_avg54,
|
|
"diff_avg6_avg9": diff_avg6_avg9,
|
|
"diff_avg6_avg12": diff_avg6_avg12,
|
|
"diff_avg6_avg27": diff_avg6_avg27,
|
|
"diff_avg6_avg54": diff_avg6_avg54,
|
|
"diff_avg9_avg12": diff_avg9_avg12,
|
|
"diff_avg9_avg27": diff_avg9_avg27,
|
|
"diff_avg9_avg54": diff_avg9_avg54,
|
|
"diff_avg12_avg27": diff_avg12_avg27,
|
|
"diff_avg12_avg54": diff_avg12_avg54,
|
|
"diff_avg27_avg54": diff_avg27_avg54,
|
|
"diff_upper_lower": diff_upper_lower,
|
|
"diff_open_lower": diff_open_lower,
|
|
"diff_open_upper": diff_open_upper,
|
|
"diff_close_lower": diff_close_lower,
|
|
"diff_close_upper": diff_close_upper,
|
|
"diff_high_lower": diff_high_lower,
|
|
"diff_high_upper": diff_high_upper,
|
|
"diff_low_lower": diff_low_lower,
|
|
"diff_low_upper": diff_low_upper,
|
|
"diff_lead1_lead2": diff_lead1_lead2,
|
|
"diff_change_base": diff_change_base,
|
|
"diff_base_lead1": diff_base_lead1,
|
|
"diff_base_lead2": diff_base_lead2,
|
|
"diff_change_lead1": diff_change_lead1,
|
|
"diff_change_lead2": diff_change_lead2,
|
|
"diff_open_lead2": diff_open_lead2,
|
|
"diff_open_lead1": diff_open_lead1,
|
|
"diff_open_change": diff_open_change,
|
|
"diff_open_base": diff_open_base,
|
|
"diff_close_lead2": diff_close_lead2,
|
|
"diff_close_lead1": diff_close_lead1,
|
|
"diff_close_change": diff_close_change,
|
|
"diff_close_base": diff_close_base,
|
|
"diff_high_lead2": diff_high_lead2,
|
|
"diff_high_lead1": diff_high_lead1,
|
|
"diff_high_change": diff_high_change,
|
|
"diff_high_base": diff_high_base,
|
|
"diff_low_lead2": diff_low_lead2,
|
|
"diff_low_lead1": diff_low_lead1,
|
|
"diff_low_change": diff_low_change,
|
|
"diff_low_base": diff_low_base,
|
|
"diff_macd_macds": diff_macd_macds,
|
|
"diff_slowk_slowd": diff_slowk_slowd,
|
|
"diff_rsi_rsis": diff_rsi_rsis,
|
|
|
|
"label": label
|
|
}
|
|
|
|
data = pd.DataFrame(temp)
|
|
df_final_time = pd.DatetimeIndex(point_temp)
|
|
data.index = df_final_time
|
|
|
|
data = data.fillna(close[0])
|
|
return data
|
|
|
|
def write(self, outFp, df, i):
|
|
outFp.write(str(df["macd"][i]) + "\t")
|
|
outFp.write(str(df["macds"][i]) + "\t")
|
|
outFp.write(str(df["macdo"][i]) + "\t")
|
|
outFp.write(str(df["fast_k"][i]) + "\t")
|
|
outFp.write(str(df["slow_k"][i]) + "\t")
|
|
outFp.write(str(df["slow_d"][i]) + "\t")
|
|
outFp.write(str(df["rsi"][i]) + "\t")
|
|
outFp.write(str(df["rsis"][i]) + "\t")
|
|
outFp.write(str(df["height"][i]) + "\t")
|
|
outFp.write(str(df["top_tail_height"][i]) + "\t")
|
|
outFp.write(str(df["bottom_tail_height"][i]) + "\t")
|
|
outFp.write(str(df["abs_avg_1"][i]) + "\t")
|
|
outFp.write(str(df["abs_avg_2"][i]) + "\t")
|
|
outFp.write(str(df["abs_avg_3"][i]) + "\t")
|
|
outFp.write(str(df["abs_avg_4"][i]) + "\t")
|
|
outFp.write(str(df["abs_avg_5"][i]) + "\t")
|
|
outFp.write(str(df["diff_open"][i]) + "\t")
|
|
outFp.write(str(df["diff_close"][i]) + "\t")
|
|
outFp.write(str(df["diff_low"][i]) + "\t")
|
|
outFp.write(str(df["diff_high"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg3"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg6"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg9"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg12"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg27"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg54"][i]) + "\t")
|
|
outFp.write(str(df["diff_macd"][i]) + "\t")
|
|
outFp.write(str(df["diff_macdo"][i]) + "\t")
|
|
outFp.write(str(df["diff_macds"][i]) + "\t")
|
|
outFp.write(str(df["diff_fast_k"][i]) + "\t")
|
|
outFp.write(str(df["diff_slow_k"][i]) + "\t")
|
|
outFp.write(str(df["diff_slow_d"][i]) + "\t")
|
|
outFp.write(str(df["diff_rsi"][i]) + "\t")
|
|
outFp.write(str(df["diff_rsis"][i]) + "\t")
|
|
outFp.write(str(df["diff_changeLine"][i]) + "\t")
|
|
outFp.write(str(df["diff_baseLine"][i]) + "\t")
|
|
outFp.write(str(df["diff_upper"][i]) + "\t")
|
|
outFp.write(str(df["diff_lower"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg3_avg6"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg3_avg9"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg3_avg12"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg3_avg27"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg3_avg54"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg6_avg9"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg6_avg12"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg6_avg27"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg6_avg54"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg9_avg12"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg9_avg27"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg9_avg54"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg12_avg27"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg12_avg54"][i]) + "\t")
|
|
outFp.write(str(df["diff_avg27_avg54"][i]) + "\t")
|
|
outFp.write(str(df["diff_upper_lower"][i]) + "\t")
|
|
outFp.write(str(df["diff_open_lower"][i]) + "\t")
|
|
outFp.write(str(df["diff_open_upper"][i]) + "\t")
|
|
outFp.write(str(df["diff_close_lower"][i]) + "\t")
|
|
outFp.write(str(df["diff_close_upper"][i]) + "\t")
|
|
outFp.write(str(df["diff_high_lower"][i]) + "\t")
|
|
outFp.write(str(df["diff_high_upper"][i]) + "\t")
|
|
outFp.write(str(df["diff_low_lower"][i]) + "\t")
|
|
outFp.write(str(df["diff_low_upper"][i]) + "\t")
|
|
outFp.write(str(df["diff_lead1_lead2"][i]) + "\t")
|
|
outFp.write(str(df["diff_change_base"][i]) + "\t")
|
|
outFp.write(str(df["diff_base_lead1"][i]) + "\t")
|
|
outFp.write(str(df["diff_base_lead2"][i]) + "\t")
|
|
outFp.write(str(df["diff_change_lead1"][i]) + "\t")
|
|
outFp.write(str(df["diff_change_lead2"][i]) + "\t")
|
|
outFp.write(str(df["diff_open_lead2"][i]) + "\t")
|
|
outFp.write(str(df["diff_open_lead1"][i]) + "\t")
|
|
outFp.write(str(df["diff_open_change"][i]) + "\t")
|
|
outFp.write(str(df["diff_open_base"][i]) + "\t")
|
|
outFp.write(str(df["diff_close_lead2"][i]) + "\t")
|
|
outFp.write(str(df["diff_close_lead1"][i]) + "\t")
|
|
outFp.write(str(df["diff_close_change"][i]) + "\t")
|
|
outFp.write(str(df["diff_close_base"][i]) + "\t")
|
|
outFp.write(str(df["diff_high_lead2"][i]) + "\t")
|
|
outFp.write(str(df["diff_high_lead1"][i]) + "\t")
|
|
outFp.write(str(df["diff_high_change"][i]) + "\t")
|
|
outFp.write(str(df["diff_high_base"][i]) + "\t")
|
|
outFp.write(str(df["diff_low_lead2"][i]) + "\t")
|
|
outFp.write(str(df["diff_low_lead1"][i]) + "\t")
|
|
outFp.write(str(df["diff_low_change"][i]) + "\t")
|
|
outFp.write(str(df["diff_low_base"][i]) + "\t")
|
|
outFp.write(str(df["diff_macd_macds"][i]) + "\t")
|
|
outFp.write(str(df["diff_slowk_slowd"][i]) + "\t")
|
|
outFp.write(str(df["diff_rsi_rsis"][i]) + "\t")
|
|
outFp.write(str(df["label"][i]) + "\n")
|
|
return
|
|
|
|
def checkTransaction(self, data, stock_code, isRealTime=True):
|
|
# 4일치 중에서 앞에 2일은 제거한다.
|
|
date = data['date'].dt.date.unique().tolist()
|
|
data = data[data['date'].dt.date != date[0]]
|
|
data = data[data['date'].dt.date != date[1]]
|
|
|
|
# 어제 오늘 데이터로 분석
|
|
bsLine = {}
|
|
size = len(data["close"])
|
|
if isRealTime:
|
|
# isRealTime=True, 실시간 적용
|
|
last_index = size - 1
|
|
|
|
if stock_code == "252670":
|
|
sell, sell_weight = self.getSellPriceAndWeight_252670(data, last_index)
|
|
buy, buy_weight = self.getBuyPriceAndWeight_252670(data, last_index)
|
|
else:
|
|
sell, sell_weight = self.getSellPriceAndWeight_122630(data, last_index)
|
|
buy, buy_weight = self.getBuyPriceAndWeight_122630(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":
|
|
sell, sell_weight = self.getSellPriceAndWeight_252670(data, i)
|
|
buy, buy_weight = self.getBuyPriceAndWeight_252670(data, i)
|
|
else:
|
|
sell, sell_weight = self.getSellPriceAndWeight_122630(data, i)
|
|
buy, buy_weight = self.getBuyPriceAndWeight_122630(data, i)
|
|
bsLine['buy'][i] = buy
|
|
bsLine['buy_weight'][i] = buy_weight
|
|
bsLine['sell'][i] = sell
|
|
bsLine['sell_weight'][i] = sell_weight
|
|
|
|
return bsLine, data
|