init
This commit is contained in:
130
hts/HTS.py
130
hts/HTS.py
@@ -1,11 +1,15 @@
|
||||
import os
|
||||
import re
|
||||
import win32com.client
|
||||
#import win32com.client
|
||||
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 mplfinance as mpf
|
||||
import cufflinks as cf
|
||||
import plotly.graph_objects as go
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
class HTS:
|
||||
|
||||
@@ -270,9 +274,13 @@ class HTS:
|
||||
size = objStockChart.GetHeaderValue(3)
|
||||
|
||||
#print("날짜", "시간", "시가", "고가", "저가", "종가", "거래량")
|
||||
start_time = datetime.strptime(day+" 093000", '%Y%m%d %H%M%S')
|
||||
for i in range(size-1, -1, -1):
|
||||
#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)
|
||||
#high = objStockChart.GetDataValue(3, i)
|
||||
#low = objStockChart.GetDataValue(4, i)
|
||||
@@ -287,44 +295,76 @@ class HTS:
|
||||
result["vol"].append(vol)
|
||||
return
|
||||
|
||||
def getCSV(self, fileName, result):
|
||||
def getCSV(self, fileName, day, result):
|
||||
data = pd.read_csv(fileName)
|
||||
|
||||
days = data.날짜
|
||||
time = data.시간
|
||||
close = data.종가
|
||||
for i in range(len(data)-1, -1, -1):
|
||||
if time[i] not in result["check"]:
|
||||
result["check"].add(time[i])
|
||||
result["time"].append(time[i])
|
||||
vol = data.거래량
|
||||
start_time = datetime.strptime(day + " 093000", '%Y%m%d %H%M%S')
|
||||
|
||||
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["vol"].append(0)
|
||||
result["vol"].append(vol[i])
|
||||
return
|
||||
|
||||
def analyze(self, result):
|
||||
df = pd.DataFrame(result["close"])
|
||||
y_value = result["close"]
|
||||
#x_value = [i for i in range(len(y_value))]
|
||||
vol = result["vol"]
|
||||
df = pd.DataFrame(y_value)
|
||||
point = result["time"]
|
||||
|
||||
max20 = df.rolling(window=20).mean()
|
||||
stddev20 = df.rolling(window=20).std()
|
||||
upper = max20 + (stddev20 * 2) # 상단 볼린저 밴드
|
||||
lower = max20 - (stddev20 * 2) # 하단 볼린저 밴드
|
||||
middle = (upper + lower) / 2 # 중심 블린저 밴드
|
||||
upper_df = max20 + (stddev20 * 2) # 상단 볼린저 밴드
|
||||
lower_df = max20 - (stddev20 * 2) # 하단 볼린저 밴드
|
||||
|
||||
x_value = [i for i in range(len(y_value))]
|
||||
|
||||
window = 3
|
||||
window = 60
|
||||
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:] # 종가
|
||||
high = df.rolling(window=window).max() # 고가
|
||||
low = 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() # 이동평균선
|
||||
high_df = df.rolling(window=window).max() # 고가
|
||||
low_df = df.rolling(window=window).min() # 저가
|
||||
|
||||
temp = {'Open': open, 'High': high.values.tolist(), 'Low': low.values.tolist(), 'Close': close, 'Volume': vol}
|
||||
data = pd.DataFrame(temp, index=x_value)
|
||||
return data
|
||||
high, low, upper, lower = [], [], [], []
|
||||
for i in range(len(high_df)):
|
||||
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):
|
||||
result = {"check": set(),
|
||||
@@ -334,16 +374,40 @@ class HTS:
|
||||
|
||||
|
||||
#self.getRealTime(stock_code, day, result)
|
||||
self.getCSV("data_s_1.csv", result)
|
||||
self.getCSV("data_s_2.csv", result)
|
||||
data = self.analyze(result)
|
||||
self.getCSV("data_s_1.csv", day, result)
|
||||
self.getCSV("data_s_2.csv", day, 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()
|
||||
"""
|
||||
|
||||
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__":
|
||||
|
||||
@@ -358,9 +422,9 @@ if __name__ == "__main__":
|
||||
#hts.all_stocks()
|
||||
#hts.getChartData(stock_code)
|
||||
#hts.currentStock(stock_code)
|
||||
#hts.printStockData(stock_code, day)
|
||||
|
||||
day = datetime.today().strftime("%Y%m%d")
|
||||
day = '20210917'
|
||||
#hts.buyRealTime(stock_code, day)
|
||||
hts.printStockData(stock_code, day)
|
||||
hts.buyRealTime(stock_code, day)
|
||||
print ("done...")
|
||||
|
||||
3588
hts/data_s_1.csv
3588
hts/data_s_1.csv
File diff suppressed because it is too large
Load Diff
2284
hts/data_s_2.csv
2284
hts/data_s_2.csv
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user