This commit is contained in:
dosangyoon
2021-09-20 21:27:54 +09:00
parent 7e2563f92b
commit f22d0cfd55
3 changed files with 2955 additions and 3047 deletions

View File

@@ -1,11 +1,15 @@
import os import os
import re import re
import win32com.client #import win32com.client
from datetime import datetime from datetime import datetime
#import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import mplfinance as mpf
import pandas as pd import pandas as pd
#import mplfinance as mpf import cufflinks as cf
import plotly.graph_objects as go
import matplotlib.pyplot as plt
class HTS: class HTS:
@@ -270,9 +274,13 @@ class HTS:
size = objStockChart.GetHeaderValue(3) size = objStockChart.GetHeaderValue(3)
#print("날짜", "시간", "시가", "고가", "저가", "종가", "거래량") #print("날짜", "시간", "시가", "고가", "저가", "종가", "거래량")
start_time = datetime.strptime(day+" 093000", '%Y%m%d %H%M%S')
for i in range(size-1, -1, -1): for i in range(size-1, -1, -1):
#day = objStockChart.GetDataValue(0, i) #day = objStockChart.GetDataValue(0, i)
time = objStockChart.GetDataValue(1, i) time = datetime.strptime(day+" "+objStockChart.GetDataValue(1, i), '%Y%m%d %H%M%S')
if time < start_time:
continue
#open = objStockChart.GetDataValue(2, i) #open = objStockChart.GetDataValue(2, i)
#high = objStockChart.GetDataValue(3, i) #high = objStockChart.GetDataValue(3, i)
#low = objStockChart.GetDataValue(4, i) #low = objStockChart.GetDataValue(4, i)
@@ -287,44 +295,76 @@ class HTS:
result["vol"].append(vol) result["vol"].append(vol)
return return
def getCSV(self, fileName, result): def getCSV(self, fileName, day, result):
data = pd.read_csv(fileName) data = pd.read_csv(fileName)
days = data.날짜
time = data.시간 time = data.시간
close = data.종가 close = data.종가
for i in range(len(data)-1, -1, -1): vol = data.거래량
if time[i] not in result["check"]: start_time = datetime.strptime(day + " 093000", '%Y%m%d %H%M%S')
result["check"].add(time[i])
result["time"].append(time[i]) for i in range(len(data)):
temp = datetime.strptime(str(days[i]) + " " + str(time[i]), '%Y%m%d %H%M%S')
if temp < start_time:
continue
if temp not in result["check"]:
result["check"].add(temp)
result["time"].append(temp)
result["close"].append(close[i]) result["close"].append(close[i])
result["vol"].append(0) result["vol"].append(vol[i])
return return
def analyze(self, result): def analyze(self, result):
df = pd.DataFrame(result["close"])
y_value = result["close"] y_value = result["close"]
#x_value = [i for i in range(len(y_value))]
vol = result["vol"] vol = result["vol"]
df = pd.DataFrame(y_value)
point = result["time"]
max20 = df.rolling(window=20).mean() max20 = df.rolling(window=20).mean()
stddev20 = df.rolling(window=20).std() stddev20 = df.rolling(window=20).std()
upper = max20 + (stddev20 * 2) # 상단 볼린저 밴드 upper_df = max20 + (stddev20 * 2) # 상단 볼린저 밴드
lower = max20 - (stddev20 * 2) # 하단 볼린저 밴드 lower_df = max20 - (stddev20 * 2) # 하단 볼린저 밴드
middle = (upper + lower) / 2 # 중심 블린저 밴드
x_value = [i for i in range(len(y_value))] window = 60
window = 3
open = y_value[:len(y_value)-window] + [y_value[len(y_value)-window] for i in range(window)] # 시가 open = y_value[:len(y_value)-window] + [y_value[len(y_value)-window] for i in range(window)] # 시가
close = [y_value[window-1] for i in range(window-1)] + y_value[window-1:] # 종가 close = [y_value[window-1] for i in range(window-1)] + y_value[window-1:] # 종가
high = df.rolling(window=window).max() # 고가 high_df = df.rolling(window=window).max() # 고가
low = df.rolling(window=window).min() # 저가 low_df = df.rolling(window=window).min() # 저가
mean5 = df.rolling(window=window).mean() # 이동평균선
mean20 = df.rolling(window=window*4).mean() # 이동평균선
mean60 = df.rolling(window=window*12).mean() # 이동평균선
temp = {'Open': open, 'High': high.values.tolist(), 'Low': low.values.tolist(), 'Close': close, 'Volume': vol} high, low, upper, lower = [], [], [], []
data = pd.DataFrame(temp, index=x_value) for i in range(len(high_df)):
return data if i < window:
high.append(high_df.values[window - 1][0])
low.append(low_df.values[window - 1][0])
upper.append(upper_df.values[window - 1][0])
lower.append(lower_df.values[window - 1][0])
else:
high.append(high_df.values[i][0])
low.append(low_df.values[i][0])
upper.append(upper_df.values[i][0])
lower.append(lower_df.values[i][0])
open_temp = [open[i] for i in range(len(open)) if i % window == 0]
high_temp = [high[i] for i in range(len(high)) if i % window == 0]
low_temp = [low[i] for i in range(len(low)) if i % window == 0]
close_temp = [close[i] for i in range(len(close)) if i % window == 0]
vol_temp = [vol[i] for i in range(len(vol)) if i % window == 0]
point_temp = [point[i] for i in range(len(point)) if i % window == 0]
upper_temp = [upper[i] for i in range(len(upper)) if i % window == 0]
lower_temp = [lower[i] for i in range(len(lower)) if i % window == 0]
temp = {"Open": open_temp, "High": high_temp, "Low": low_temp, "Close": close_temp, "Volume": vol_temp, "Date": point_temp}
data = pd.DataFrame(temp)
df_final_time = pd.DatetimeIndex(point_temp)
data.index = df_final_time
return data, upper_temp, lower_temp
def buyRealTime(self, stock_code, day): def buyRealTime(self, stock_code, day):
result = {"check": set(), result = {"check": set(),
@@ -334,16 +374,40 @@ class HTS:
#self.getRealTime(stock_code, day, result) #self.getRealTime(stock_code, day, result)
self.getCSV("data_s_1.csv", result) self.getCSV("data_s_1.csv", day, result)
self.getCSV("data_s_2.csv", result) self.getCSV("data_s_2.csv", day, result)
data = self.analyze(result) data, upper, lower = self.analyze(result)
mpf.plot(data, type='candle', mav=(3, 6, 9)) data['Open'] = pd.to_numeric(data['Open'])
data['High'] = pd.to_numeric(data['High'])
data['Low'] = pd.to_numeric(data['Low'])
data['Close'] = pd.to_numeric(data['Close'])
data['Volume'] = pd.to_numeric(data['Volume'])
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111)
"""
# 이동평균선 그리기
ax.plot(upper, label='upper', linewidth=1.5)
ax.plot(lower, label='lower', linewidth=1.5)
# 참고) https://pypi.org/project/mplfinance/
mc = mpf.make_marketcolors(up='red', down='blue', inherit=True)
style_final = mpf.make_mpf_style(marketcolors=mc)
mpf.plot(data, ax=ax, style=style_final)
plt.grid()
plt.show() plt.show()
"""
print(result) bolinger_upper = go.Scatter(x=data['Date'], y=upper, name="upper", line_color='#8B4513')
bolinger_lower = go.Scatter(x=data['Date'], y=lower, name="lower", line_color='#8B4513')
candle_stick = go.Candlestick(x=data['Date'], open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'])
fig = go.Figure(data=[candle_stick, bolinger_upper, bolinger_lower])
fig.update_layout(title="2x")
fig.show()
return result return
if __name__ == "__main__": if __name__ == "__main__":
@@ -358,9 +422,9 @@ if __name__ == "__main__":
#hts.all_stocks() #hts.all_stocks()
#hts.getChartData(stock_code) #hts.getChartData(stock_code)
#hts.currentStock(stock_code) #hts.currentStock(stock_code)
#hts.printStockData(stock_code, day)
day = datetime.today().strftime("%Y%m%d") day = datetime.today().strftime("%Y%m%d")
day = '20210917' day = '20210917'
#hts.buyRealTime(stock_code, day) hts.buyRealTime(stock_code, day)
hts.printStockData(stock_code, day)
print ("done...") print ("done...")

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff