init
This commit is contained in:
130
hts/HTS.py
130
hts/HTS.py
@@ -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...")
|
||||||
|
|||||||
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