analyser_hj3415 3.2.2__py3-none-any.whl → 3.3.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- analyser_hj3415/analyser/__init__.py +30 -12
- analyser_hj3415/analyser/compile.py +222 -133
- analyser_hj3415/analyser/eval/blue.py +78 -9
- analyser_hj3415/analyser/eval/common.py +72 -110
- analyser_hj3415/analyser/eval/growth.py +77 -6
- analyser_hj3415/analyser/eval/mil.py +119 -18
- analyser_hj3415/analyser/eval/red.py +95 -66
- analyser_hj3415/analyser/tsa/__init__.py +1 -1
- analyser_hj3415/analyser/tsa/common.py +33 -0
- analyser_hj3415/analyser/tsa/lstm.py +108 -133
- analyser_hj3415/analyser/tsa/prophet.py +261 -124
- analyser_hj3415/cli.py +12 -9
- {analyser_hj3415-3.2.2.dist-info → analyser_hj3415-3.3.1.dist-info}/METADATA +1 -1
- analyser_hj3415-3.3.1.dist-info/RECORD +23 -0
- analyser_hj3415-3.2.2.dist-info/RECORD +0 -22
- {analyser_hj3415-3.2.2.dist-info → analyser_hj3415-3.3.1.dist-info}/WHEEL +0 -0
- {analyser_hj3415-3.2.2.dist-info → analyser_hj3415-3.3.1.dist-info}/entry_points.txt +0 -0
@@ -7,14 +7,31 @@ from sklearn.preprocessing import StandardScaler
|
|
7
7
|
import matplotlib.pyplot as plt # Matplotlib 수동 임포트
|
8
8
|
import plotly.graph_objs as go
|
9
9
|
from plotly.offline import plot
|
10
|
+
from dataclasses import dataclass
|
11
|
+
import os
|
10
12
|
|
11
13
|
from utils_hj3415 import tools, setup_logger
|
12
14
|
from db_hj3415 import myredis
|
13
15
|
|
14
|
-
from analyser_hj3415.analyser import eval, MIs
|
16
|
+
from analyser_hj3415.analyser import eval, MIs, tsa
|
15
17
|
|
16
18
|
|
17
19
|
mylogger = setup_logger(__name__,'WARNING')
|
20
|
+
expire_time = tools.to_int(os.getenv('DEFAULT_EXPIRE_TIME_H', 48)) * 3600
|
21
|
+
|
22
|
+
|
23
|
+
@dataclass
|
24
|
+
class ProphetData:
|
25
|
+
ticker: str
|
26
|
+
|
27
|
+
date: datetime.date
|
28
|
+
price: float
|
29
|
+
yhat: float
|
30
|
+
yhat_upper: float
|
31
|
+
yhat_lower: float
|
32
|
+
|
33
|
+
trading_action: str = ''
|
34
|
+
score: int = None
|
18
35
|
|
19
36
|
|
20
37
|
class MyProphet:
|
@@ -24,103 +41,214 @@ class MyProphet:
|
|
24
41
|
self.model = Prophet()
|
25
42
|
self._ticker = ticker
|
26
43
|
|
27
|
-
self.raw_data =
|
28
|
-
self.df_real =
|
29
|
-
self.df_forecast =
|
44
|
+
self.raw_data = pd.DataFrame()
|
45
|
+
self.df_real = pd.DataFrame()
|
46
|
+
self.df_forecast = pd.DataFrame()
|
30
47
|
|
31
48
|
@property
|
32
49
|
def ticker(self) -> str:
|
50
|
+
"""
|
51
|
+
현재 설정된 티커를 반환합니다.
|
52
|
+
|
53
|
+
반환값:
|
54
|
+
str: 현재 티커 값.
|
55
|
+
"""
|
33
56
|
return self._ticker
|
34
57
|
|
35
58
|
@ticker.setter
|
36
59
|
def ticker(self, ticker: str):
|
60
|
+
"""
|
61
|
+
티커 값을 변경하고 관련 데이터를 초기화합니다.
|
62
|
+
|
63
|
+
매개변수:
|
64
|
+
ticker (str): 새로 설정할 티커 값.
|
65
|
+
"""
|
37
66
|
mylogger.info(f'change ticker : {self.ticker} -> {ticker}')
|
38
67
|
self.scaler = StandardScaler()
|
39
68
|
self.model = Prophet()
|
40
69
|
self._ticker = ticker
|
41
70
|
|
42
|
-
self.raw_data =
|
43
|
-
self.df_real =
|
44
|
-
self.df_forecast =
|
45
|
-
|
46
|
-
@staticmethod
|
47
|
-
def is_valid_date(date_string):
|
48
|
-
try:
|
49
|
-
# %Y-%m-%d 형식으로 문자열을 datetime 객체로 변환 시도
|
50
|
-
datetime.strptime(date_string, '%Y-%m-%d')
|
51
|
-
return True
|
52
|
-
except ValueError:
|
53
|
-
# 변환이 실패하면 ValueError가 발생, 형식이 맞지 않음
|
54
|
-
return False
|
71
|
+
self.raw_data = pd.DataFrame()
|
72
|
+
self.df_real = pd.DataFrame()
|
73
|
+
self.df_forecast = pd.DataFrame()
|
55
74
|
|
56
|
-
def
|
57
|
-
"""
|
58
|
-
야후에서 해당 종목의 4년간 주가 raw data를 받아온다.
|
59
|
-
:return:
|
75
|
+
def initializing(self):
|
60
76
|
"""
|
61
|
-
|
62
|
-
today = datetime.today()
|
77
|
+
Prophet 모델 사용을 위한 데이터를 초기화합니다.
|
63
78
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
return yf.download(
|
68
|
-
tickers=self.ticker,
|
69
|
-
start=four_years_ago.strftime('%Y-%m-%d'),
|
70
|
-
end=today.strftime('%Y-%m-%d')
|
71
|
-
)
|
72
|
-
|
73
|
-
def _preprocessing_for_prophet(self) -> pd.DataFrame:
|
74
|
-
"""
|
75
|
-
Prophet이 사용할 수 있도록 데이터 준비
|
76
|
-
ds는 날짜, y는 주가
|
77
|
-
:return:
|
79
|
+
- Yahoo Finance에서 데이터를 가져옵니다.
|
80
|
+
- 데이터를 Prophet 형식에 맞게 전처리합니다.
|
81
|
+
- Prophet 모델을 사용하여 예측 데이터를 생성합니다.
|
78
82
|
"""
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
83
|
+
def get_raw_data() -> pd.DataFrame:
|
84
|
+
"""
|
85
|
+
Yahoo Finance에서 4년간의 주가 데이터를 가져옵니다.
|
86
|
+
|
87
|
+
반환값:
|
88
|
+
pd.DataFrame: 가져온 주가 데이터프레임.
|
89
|
+
"""
|
90
|
+
# 오늘 날짜 가져오기
|
91
|
+
today = datetime.today()
|
92
|
+
|
93
|
+
# 4년 전 날짜 계산 (4년 = 365일 * 4)
|
94
|
+
four_years_ago = today - timedelta(days=365 * 4)
|
95
|
+
|
96
|
+
return yf.download(
|
97
|
+
tickers=self.ticker,
|
98
|
+
start=four_years_ago.strftime('%Y-%m-%d'),
|
99
|
+
end=today.strftime('%Y-%m-%d')
|
100
|
+
)
|
101
|
+
|
102
|
+
def preprocessing_for_prophet() -> pd.DataFrame:
|
103
|
+
"""
|
104
|
+
Prophet 모델에서 사용할 수 있도록 데이터를 준비합니다.
|
105
|
+
|
106
|
+
- 'Close'와 'Volume' 열을 사용.
|
107
|
+
- 날짜를 'ds', 종가를 'y', 거래량을 'volume'으로 변경.
|
108
|
+
- 거래량 데이터를 정규화하여 'volume_scaled' 열 추가.
|
109
|
+
|
110
|
+
반환값:
|
111
|
+
pd.DataFrame: Prophet 모델 입력 형식에 맞게 처리된 데이터프레임.
|
112
|
+
"""
|
113
|
+
df = self.raw_data[['Close', 'Volume']].reset_index()
|
114
|
+
df.columns = ['ds', 'y', 'volume'] # Prophet의 형식에 맞게 열 이름 변경
|
115
|
+
|
116
|
+
# ds 열에서 타임존 제거
|
117
|
+
df['ds'] = df['ds'].dt.tz_localize(None)
|
118
|
+
|
119
|
+
# 추가 변수를 정규화
|
120
|
+
df['volume_scaled'] = self.scaler.fit_transform(df[['volume']])
|
121
|
+
mylogger.debug('_preprocessing_for_prophet')
|
122
|
+
mylogger.debug(df)
|
123
|
+
return df
|
124
|
+
|
125
|
+
def make_forecast() -> pd.DataFrame:
|
126
|
+
"""
|
127
|
+
Prophet 모델을 사용하여 향후 180일간 주가를 예측합니다.
|
128
|
+
|
129
|
+
- 거래량 데이터('volume_scaled')를 추가 변수로 사용.
|
130
|
+
- 예측 결과를 데이터프레임으로 반환.
|
131
|
+
|
132
|
+
반환값:
|
133
|
+
pd.DataFrame: 예측 결과를 포함한 데이터프레임.
|
134
|
+
"""
|
135
|
+
# 정규화된 'volume_scaled' 변수를 외부 변수로 추가
|
136
|
+
self.model.add_regressor('volume_scaled')
|
137
|
+
|
138
|
+
self.model.fit(self.df_real)
|
139
|
+
|
140
|
+
# 향후 180일 동안의 주가 예측
|
141
|
+
future = self.model.make_future_dataframe(periods=180)
|
142
|
+
mylogger.debug('_make_forecast_future')
|
143
|
+
mylogger.debug(future)
|
144
|
+
|
145
|
+
# 미래 데이터에 거래량 추가 (평균 거래량을 사용해 정규화)
|
146
|
+
future_volume = pd.DataFrame({'volume': [self.raw_data['Volume'].mean()] * len(future)})
|
147
|
+
future['volume_scaled'] = self.scaler.transform(future_volume[['volume']])
|
148
|
+
|
149
|
+
forecast = self.model.predict(future)
|
150
|
+
mylogger.debug('_make_forecast')
|
151
|
+
mylogger.debug(forecast)
|
152
|
+
return forecast
|
153
|
+
|
154
|
+
print("Initializing data for MyProphet")
|
94
155
|
|
95
|
-
self.
|
156
|
+
self.scaler = StandardScaler()
|
157
|
+
self.model = Prophet()
|
96
158
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
mylogger.debug(future)
|
159
|
+
self.raw_data = get_raw_data()
|
160
|
+
self.df_real = preprocessing_for_prophet()
|
161
|
+
self.df_forecast = make_forecast()
|
101
162
|
|
102
|
-
|
103
|
-
|
104
|
-
|
163
|
+
def generate_data(self, refresh: bool) -> ProphetData:
|
164
|
+
"""
|
165
|
+
ProphetData 객체를 생성하거나 캐시된 데이터를 반환합니다.
|
105
166
|
|
106
|
-
|
107
|
-
|
108
|
-
mylogger.debug(forecast)
|
109
|
-
return forecast
|
167
|
+
매개변수:
|
168
|
+
refresh (bool): 데이터를 새로 생성할지 여부.
|
110
169
|
|
111
|
-
|
112
|
-
|
113
|
-
최근 날짜의 예측데이터를 반환한다.
|
114
|
-
:return: {'ds':..., 'yhat':.., 'yhat_lower':.., 'yhat_upper':..,}
|
170
|
+
반환값:
|
171
|
+
ProphetData: 생성된 ProphetData 객체.
|
115
172
|
"""
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
173
|
+
print("**** Start generate_data... ****")
|
174
|
+
redis_name = f'{self.ticker}_myprophet_data'
|
175
|
+
|
176
|
+
print(
|
177
|
+
f"redisname: '{redis_name}' / refresh : {refresh} / expire_time : {expire_time / 3600}h")
|
178
|
+
|
179
|
+
def fetch_generate_prophet_data() -> ProphetData:
|
180
|
+
def scoring(price: float, yhat_lower: float, yhat_upper: float, method: str = 'sigmoid') -> Tuple[str, int]:
|
181
|
+
"""
|
182
|
+
주어진 가격과 임계값을 기준으로 매매 행동('buy', 'sell', 'hold')과 점수를 결정합니다.
|
183
|
+
|
184
|
+
매개변수:
|
185
|
+
price (float): 자산의 현재 가격.
|
186
|
+
yhat_lower (float): 가격 예측의 하한 임계값.
|
187
|
+
yhat_upper (float): 가격 예측의 상한 임계값.
|
188
|
+
method (str, optional): 점수를 계산하는 방법 ('sigmoid' 또는 'log'). 기본값은 'sigmoid'.
|
189
|
+
|
190
|
+
반환값:
|
191
|
+
Tuple[str, int]: 매매 행동('buy', 'sell', 'hold')과 관련 점수로 이루어진 튜플.
|
192
|
+
|
193
|
+
예외:
|
194
|
+
ValueError: 지원되지 않는 점수 계산 방법이 제공된 경우 발생.
|
195
|
+
"""
|
196
|
+
|
197
|
+
def calculate_score(deviation: float, method_in: str) -> int:
|
198
|
+
if method_in == 'sigmoid':
|
199
|
+
return tools.to_int(eval.Tools.sigmoid_score(deviation))
|
200
|
+
elif method_in == 'log':
|
201
|
+
return tools.to_int(eval.Tools.log_score(deviation))
|
202
|
+
else:
|
203
|
+
raise ValueError(f"Unsupported scoring method: {method}")
|
204
|
+
|
205
|
+
buying_deviation = eval.Tools.cal_deviation(price, yhat_lower)
|
206
|
+
buying_score = calculate_score(buying_deviation, method)
|
207
|
+
if price >= yhat_lower:
|
208
|
+
buying_score = -buying_score
|
209
|
+
|
210
|
+
selling_deviation = eval.Tools.cal_deviation(price, yhat_upper)
|
211
|
+
selling_score = calculate_score(selling_deviation, method)
|
212
|
+
if price <= yhat_upper:
|
213
|
+
selling_score = -selling_score
|
214
|
+
|
215
|
+
if buying_score > 0:
|
216
|
+
return 'buy', buying_score
|
217
|
+
elif selling_score > 0:
|
218
|
+
return 'sell', selling_score
|
219
|
+
else:
|
220
|
+
return 'hold', 0
|
221
|
+
|
222
|
+
self.initializing()
|
223
|
+
latest_row = self.df_real.iloc[-1]
|
224
|
+
latest_yhat = \
|
225
|
+
self.df_forecast.loc[self.df_forecast['ds'] == latest_row['ds'], ['ds', 'yhat_lower', 'yhat_upper', 'yhat']].iloc[
|
226
|
+
0].to_dict()
|
227
|
+
|
228
|
+
data = ProphetData(
|
229
|
+
ticker=self.ticker,
|
230
|
+
date=latest_row['ds'].date(),
|
231
|
+
price=latest_row['y'],
|
232
|
+
yhat=latest_yhat['yhat'],
|
233
|
+
yhat_lower=latest_yhat['yhat_lower'],
|
234
|
+
yhat_upper=latest_yhat['yhat_upper'],
|
235
|
+
)
|
236
|
+
|
237
|
+
data.trading_action, data.score = scoring(data.price, data.yhat_lower, data.yhat_upper)
|
238
|
+
return data
|
239
|
+
|
240
|
+
|
241
|
+
prophet_data = myredis.Base.fetch_and_cache_data(redis_name, refresh, fetch_generate_prophet_data, timer=expire_time)
|
242
|
+
|
243
|
+
return prophet_data
|
122
244
|
|
123
245
|
def visualization(self):
|
246
|
+
"""
|
247
|
+
Prophet 모델의 예측 결과를 시각화합니다.
|
248
|
+
|
249
|
+
- Matplotlib를 사용하여 예측 결과 및 추세/계절성을 그래프로 출력.
|
250
|
+
"""
|
251
|
+
self.initializing()
|
124
252
|
# 예측 결과 출력
|
125
253
|
print(self.df_forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())
|
126
254
|
# 예측 결과 시각화 (Matplotlib 사용)
|
@@ -131,10 +259,19 @@ class MyProphet:
|
|
131
259
|
|
132
260
|
def export(self, to="html") -> Optional[str]:
|
133
261
|
"""
|
134
|
-
|
135
|
-
|
136
|
-
|
262
|
+
예측 결과를 시각화하여 다양한 형식으로 내보냅니다.
|
263
|
+
|
264
|
+
매개변수:
|
265
|
+
refresh (bool): 데이터를 새로 생성할지 여부.
|
266
|
+
to (str): 내보낼 형식 ('html', 'png', 'file').
|
267
|
+
|
268
|
+
반환값:
|
269
|
+
Optional[str]: HTML 문자열로 반환하거나 PNG/HTML 파일로 저장합니다.
|
270
|
+
|
271
|
+
예외:
|
272
|
+
Exception: 지원되지 않는 형식의 경우 예외 발생.
|
137
273
|
"""
|
274
|
+
self.initializing()
|
138
275
|
# Plotly를 사용한 시각화
|
139
276
|
fig = go.Figure()
|
140
277
|
|
@@ -177,62 +314,56 @@ class MyProphet:
|
|
177
314
|
else:
|
178
315
|
Exception("to 인자가 맞지 않습니다.")
|
179
316
|
|
180
|
-
def
|
317
|
+
def is_prophet_up(self, refresh: bool) -> bool:
|
181
318
|
"""
|
182
|
-
|
183
|
-
|
184
|
-
The method computes deviations between the recent price and predefined forecasted bounds (`yhat_lower` and `yhat_upper`)
|
185
|
-
to determine whether to buy, sell, or hold a financial instrument. The calculation involves generating a deviation score
|
186
|
-
that is transformed using a sigmoid function. The scores are then adjusted based on the position of the recent price relative
|
187
|
-
to the forecasted bounds. Logging is used extensively throughout the method to record the values and decisions for debugging
|
188
|
-
and traceability purposes.
|
319
|
+
Prophet 예측이 상승 추세인지 여부를 확인합니다.
|
189
320
|
|
190
|
-
|
191
|
-
|
192
|
-
and an integer score associated with that action.
|
321
|
+
매개변수:
|
322
|
+
refresh (bool): 데이터를 새로 생성할지 여부.
|
193
323
|
|
194
|
-
|
195
|
-
|
324
|
+
반환값:
|
325
|
+
bool: 상승 추세 여부.
|
196
326
|
"""
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
yhat_dict = self.get_yhat()
|
201
|
-
mylogger.info(f'recent_price: {recent_price}, yhat_dict: {yhat_dict}')
|
202
|
-
|
203
|
-
yhat_lower = tools.to_int(yhat_dict['yhat_lower'])
|
204
|
-
yhat_upper = tools.to_int(yhat_dict['yhat_upper'])
|
205
|
-
#yhat = tools.to_int(yhat_dict['yhat'])
|
206
|
-
|
207
|
-
buying_deviation = eval.Tools.cal_deviation(recent_price, yhat_lower)
|
208
|
-
|
209
|
-
buying_score = tools.to_int(eval.Tools.sigmoid_score(buying_deviation))
|
210
|
-
# score = tools.to_int(Tools.log_score(deviation))
|
327
|
+
print("**** Caching is_prophet_up ... ****")
|
328
|
+
redis_name = f'{self.ticker}_is_prophet_up'
|
329
|
+
print(f"redisname: '{redis_name}' / expire_time : {expire_time / 3600}h")
|
211
330
|
|
212
|
-
|
213
|
-
|
331
|
+
def fetch_is_prophet_up():
|
332
|
+
self.initializing()
|
333
|
+
yhat_dict = self.df_forecast.set_index('ds')['yhat'].to_dict()
|
334
|
+
return tsa.common.is_up_by_OLS(yhat_dict)
|
214
335
|
|
215
|
-
|
336
|
+
return myredis.Base.fetch_and_cache_data(redis_name, refresh, fetch_is_prophet_up, timer=expire_time)
|
216
337
|
|
217
|
-
|
218
|
-
|
338
|
+
@staticmethod
|
339
|
+
def is_valid_date(date_string):
|
340
|
+
"""
|
341
|
+
주어진 문자열이 'YYYY-MM-DD' 형식의 유효한 날짜인지 확인합니다.
|
219
342
|
|
220
|
-
|
221
|
-
|
343
|
+
매개변수:
|
344
|
+
date_string (str): 확인할 날짜 문자열.
|
222
345
|
|
223
|
-
|
224
|
-
|
225
|
-
|
346
|
+
반환값:
|
347
|
+
bool: 유효한 날짜 형식이면 True, 그렇지 않으면 False.
|
348
|
+
"""
|
349
|
+
try:
|
350
|
+
# %Y-%m-%d 형식으로 문자열을 datetime 객체로 변환 시도
|
351
|
+
datetime.strptime(date_string, '%Y-%m-%d')
|
352
|
+
return True
|
353
|
+
except ValueError:
|
354
|
+
# 변환이 실패하면 ValueError가 발생, 형식이 맞지 않음
|
355
|
+
return False
|
226
356
|
|
227
|
-
if buying_score > 0:
|
228
|
-
return 'buy', buying_score
|
229
|
-
elif selling_score > 0:
|
230
|
-
return 'sell', selling_score
|
231
|
-
else:
|
232
|
-
return 'hold', 0
|
233
357
|
|
234
358
|
|
235
359
|
class CorpProphet(MyProphet):
|
360
|
+
"""
|
361
|
+
기업 코드를 기반으로 주가를 예측하는 Prophet 모델 클래스.
|
362
|
+
|
363
|
+
속성:
|
364
|
+
code (str): 기업 코드.
|
365
|
+
name (str): 기업명.
|
366
|
+
"""
|
236
367
|
def __init__(self, code: str):
|
237
368
|
assert tools.is_6digit(code), f'Invalid value : {code}'
|
238
369
|
self._code = code
|
@@ -252,10 +383,16 @@ class CorpProphet(MyProphet):
|
|
252
383
|
|
253
384
|
|
254
385
|
class MIProphet(MyProphet):
|
386
|
+
"""
|
387
|
+
특정 MI(Market Indicator) 타입에 따라 주가를 예측하는 Prophet 모델 클래스.
|
388
|
+
|
389
|
+
속성:
|
390
|
+
mi_type (str): MI 타입.
|
391
|
+
"""
|
255
392
|
def __init__(self, mi_type: str):
|
256
|
-
assert mi_type in MIs.
|
393
|
+
assert mi_type in MIs._fields, f"Invalid MI type ({MIs._fields})"
|
257
394
|
self._mi_type = mi_type
|
258
|
-
super().__init__(ticker=MIs
|
395
|
+
super().__init__(ticker=getattr(MIs, mi_type))
|
259
396
|
|
260
397
|
@property
|
261
398
|
def mi_type(self) -> str:
|
@@ -263,6 +400,6 @@ class MIProphet(MyProphet):
|
|
263
400
|
|
264
401
|
@mi_type.setter
|
265
402
|
def mi_type(self, mi_type: str):
|
266
|
-
assert mi_type in MIs.
|
403
|
+
assert mi_type in MIs._fields, f"Invalid MI type ({MIs._fields})"
|
267
404
|
self._mi_type = mi_type
|
268
|
-
self.ticker = MIs
|
405
|
+
self.ticker = getattr(MIs, mi_type)
|
analyser_hj3415/cli.py
CHANGED
@@ -18,7 +18,7 @@ def analyser_manager():
|
|
18
18
|
ranking_parser.add_argument('-r', '--refresh', action='store_true', help='래디스 캐시를 사용하지 않고 강제로 재계산 할지')
|
19
19
|
# prophet - score 파서
|
20
20
|
prophet_get_parser = prophet_subparser.add_parser('score', help='prophet score 계산')
|
21
|
-
prophet_get_parser.add_argument('target', type=str, help=f'종목코드 or {list(MIs.
|
21
|
+
prophet_get_parser.add_argument('target', type=str, help=f'종목코드 or {list(MIs._fields)}')
|
22
22
|
prophet_get_parser.add_argument('-r', '--refresh', action='store_true', help='래디스 캐시를 사용하지 않고 강제로 재계산 할지')
|
23
23
|
|
24
24
|
# lstm 명령어 서브파서
|
@@ -27,10 +27,11 @@ def analyser_manager():
|
|
27
27
|
# lstm - caching 파서
|
28
28
|
caching_parser = lstm_subparser.add_parser('caching', help='lstm 랭킹 책정 및 레디스 저장')
|
29
29
|
caching_parser.add_argument('-r', '--refresh', action='store_true', help='래디스 캐시를 사용하지 않고 강제로 재계산 할지')
|
30
|
+
caching_parser.add_argument('-mi', '--market_index', action='store_true', help='Market index도 캐싱할지')
|
30
31
|
caching_parser.add_argument('-t', '--top', type=int, help='prophet ranking 몇위까지 작업을 할지')
|
31
32
|
# lstm - predict 파서
|
32
33
|
lstm_get_parser = lstm_subparser.add_parser('predict', help='lstm get final prediction 시행')
|
33
|
-
lstm_get_parser.add_argument('target', type=str, help=f'종목코드 or {list(MIs.
|
34
|
+
lstm_get_parser.add_argument('target', type=str, help=f'종목코드 or {list(MIs._fields)}')
|
34
35
|
lstm_get_parser.add_argument('-n', '--num', type=int, default=5, help='ensemble training 횟수 설정')
|
35
36
|
lstm_get_parser.add_argument('-r', '--refresh', action='store_true', help='래디스 캐시를 사용하지 않고 강제로 재계산 할지')
|
36
37
|
|
@@ -176,13 +177,14 @@ def analyser_manager():
|
|
176
177
|
print(e)
|
177
178
|
mymongo.Logs.save('cli', 'ERROR', f'analyser prophet ranking 실행중 에러 - {e}')
|
178
179
|
elif args.command == 'score':
|
179
|
-
|
180
|
-
|
180
|
+
mi_type = str(args.target).upper()
|
181
|
+
if mi_type in MIs._fields:
|
182
|
+
myprophet = tsa.MIProphet(mi_type)
|
181
183
|
elif tools.is_6digit(args.target):
|
182
184
|
myprophet = tsa.CorpProphet(args.target)
|
183
185
|
else:
|
184
186
|
raise Exception("Invalid target")
|
185
|
-
print(myprophet.
|
187
|
+
print(myprophet.generate_data(refresh=args.refresh).score)
|
186
188
|
# mymongo.Logs.save('cli','INFO', f'run >> analyser prophet get {args.target}')
|
187
189
|
|
188
190
|
elif args.type == 'lstm':
|
@@ -193,18 +195,19 @@ def analyser_manager():
|
|
193
195
|
compile.CorpCompile.analyse_lstm_topn(refresh=args.refresh, top=args.top)
|
194
196
|
else:
|
195
197
|
compile.CorpCompile.analyse_lstm_topn(refresh=args.refresh)
|
196
|
-
|
198
|
+
if args.market_index:
|
199
|
+
compile.MICompile.analyser_lstm_all_mi(refresh=args.refresh)
|
197
200
|
except Exception as e:
|
198
201
|
print(e)
|
199
202
|
mymongo.Logs.save('cli','ERROR', f'analyser lstm caching 실행중 에러 - {e}')
|
200
203
|
elif args.command == 'predict':
|
201
|
-
|
202
|
-
|
204
|
+
mi_type = str(args.target).upper()
|
205
|
+
if mi_type in MIs._fields:
|
206
|
+
mylstm = tsa.MILSTM(mi_type)
|
203
207
|
elif tools.is_6digit(args.target):
|
204
208
|
mylstm = tsa.CorpLSTM(args.target)
|
205
209
|
else:
|
206
210
|
raise Exception("Invalid target")
|
207
|
-
mylstm.initializing()
|
208
211
|
future_data, grade = mylstm.get_final_predictions(refresh=args.refresh, num=args.num)
|
209
212
|
print(future_data)
|
210
213
|
print(grade)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
analyser_hj3415/__init__.py,sha256=jqHEUoBeihYOMaS0bPOe3nRVXBufZ0clxc6M6jxPY0o,320
|
2
|
+
analyser_hj3415/cli.py,sha256=rn9feZcUpgIXM8JX0OsNCKy9oZauMnEcNKR38sSQfds,12017
|
3
|
+
analyser_hj3415/analyser/__init__.py,sha256=N0XyBfWJNpDS_6JYziKETWePO_jtFB1m7E8Qbwt1w0Q,1096
|
4
|
+
analyser_hj3415/analyser/compile.py,sha256=xumUdFxcBWPqiT0fLzl7ZP6Sx0Vj3uThPTMOJcjfeUE,12513
|
5
|
+
analyser_hj3415/analyser/eval/__init__.py,sha256=IP1d0Q3nOCAD3zK1qxrC685MkJQfUh-qaXc7xptTxk8,80
|
6
|
+
analyser_hj3415/analyser/eval/blue.py,sha256=p9_ddqLMJGq5HSn6NApuLhrX29qD--AASig9F71eb8I,10952
|
7
|
+
analyser_hj3415/analyser/eval/common.py,sha256=sNXapoofShA43ww_SLjXmIjkrAr1AhAcezdaN_X_3Us,11443
|
8
|
+
analyser_hj3415/analyser/eval/growth.py,sha256=CXAMxGUcjC75RRS6sDhC_Ol5p-y2L7Wl4LR3a04ouxM,6525
|
9
|
+
analyser_hj3415/analyser/eval/mil.py,sha256=mFMiFCuCBvlQrhQcM5hMg8U4zF32TS1GnUmk8fPd950,15178
|
10
|
+
analyser_hj3415/analyser/eval/red.py,sha256=8aJPpiVzLOZtt6kILCzqcfL8BrEVgIld1iI3StGvg8A,12193
|
11
|
+
analyser_hj3415/analyser/tsa/__init__.py,sha256=pg20ZQRABedTdaIoOr5t043RNKtJ7ji_WmnZrD1IhPg,147
|
12
|
+
analyser_hj3415/analyser/tsa/common.py,sha256=OnsZ_cFYmNzmk0tV5qSqVW-5jJyrwMWHguWdS2Z6fvY,979
|
13
|
+
analyser_hj3415/analyser/tsa/lstm.py,sha256=P8peqg6ZUpCSNKupjFlyba3xbPZoYtpd2UihXib_4Do,28548
|
14
|
+
analyser_hj3415/analyser/tsa/prophet.py,sha256=50tyvTZSfo3UcLuXMsgzr3ibsh5QHCv5SiQqKjM9igg,14658
|
15
|
+
analyser_hj3415/workroom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
16
|
+
analyser_hj3415/workroom/mysklearn.py,sha256=wJXKz5MqqTzADdG2mqRMMzc_G9RzwYjj5_j4gyOopxQ,2030
|
17
|
+
analyser_hj3415/workroom/mysklearn2.py,sha256=1lIy6EWEQHkOzDS-av8U0zQH6DuCLKWMI73dnJx5KRs,1495
|
18
|
+
analyser_hj3415/workroom/score.py,sha256=P6nHBJYmyhigGtT4qna4BmNtvt4B93b7SKyzdstJK24,17376
|
19
|
+
analyser_hj3415/workroom/trash.py,sha256=zF-W0piqkGr66UP6-iybo9EXh2gO0RP6R1FnIpsGkl8,12262
|
20
|
+
analyser_hj3415-3.3.1.dist-info/entry_points.txt,sha256=ZfjPnJuH8SzvhE9vftIPMBIofsc65IAWYOhqOC_L5ck,65
|
21
|
+
analyser_hj3415-3.3.1.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
|
22
|
+
analyser_hj3415-3.3.1.dist-info/METADATA,sha256=fkHlNPU6RQq-I-oxqzDi1vb7C0nFH6UNg0AbQ6SyWfw,6777
|
23
|
+
analyser_hj3415-3.3.1.dist-info/RECORD,,
|
@@ -1,22 +0,0 @@
|
|
1
|
-
analyser_hj3415/__init__.py,sha256=jqHEUoBeihYOMaS0bPOe3nRVXBufZ0clxc6M6jxPY0o,320
|
2
|
-
analyser_hj3415/cli.py,sha256=E4ElTT5QRuxlbBecayzjFgL32JKHRacBoy3OCyes_n8,11780
|
3
|
-
analyser_hj3415/analyser/__init__.py,sha256=rAY-FS6d1MtK3ShIYtuBAV5fk-GFlzxGF8c7JaGwD5Y,227
|
4
|
-
analyser_hj3415/analyser/compile.py,sha256=KmU4CD5xrjwcNbkZomju3eOWqElKSJdU5sO1TTAcEiE,10775
|
5
|
-
analyser_hj3415/analyser/eval/__init__.py,sha256=IP1d0Q3nOCAD3zK1qxrC685MkJQfUh-qaXc7xptTxk8,80
|
6
|
-
analyser_hj3415/analyser/eval/blue.py,sha256=fq_eln7-EdwICNQ2sMXAfZKXGhQ29EaJwsGvn7xA29U,7632
|
7
|
-
analyser_hj3415/analyser/eval/common.py,sha256=wcWJg_jNgr02i1U62oZGgLt2iscdle9X-u4aMnZl89Q,14127
|
8
|
-
analyser_hj3415/analyser/eval/growth.py,sha256=OXuBuPzVw3q6kpelNigiX7xvJNUP1gv26DNetc4aews,3315
|
9
|
-
analyser_hj3415/analyser/eval/mil.py,sha256=wN1jPu5zLJjoDk3kL7piL-4jWhpsAMeQpsTZll0a2dw,10568
|
10
|
-
analyser_hj3415/analyser/eval/red.py,sha256=rJbidKlo2s2EJHBGn4HDbfCDcEGP5Rst8iQeJ6jlzNA,10988
|
11
|
-
analyser_hj3415/analyser/tsa/__init__.py,sha256=OSl4eQUw0dN0del3-KF746jj-ouhNFtSaLUA5iC1JXs,100
|
12
|
-
analyser_hj3415/analyser/tsa/lstm.py,sha256=LuxpW9cQoQeSfYkqEtIelVb8QBNhujXOphu5VB2Ag3E,29881
|
13
|
-
analyser_hj3415/analyser/tsa/prophet.py,sha256=1qOyXHlupzto1wurOt80k_I6_-J7qWcEkWGhopgnAYI,10056
|
14
|
-
analyser_hj3415/workroom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
|
-
analyser_hj3415/workroom/mysklearn.py,sha256=wJXKz5MqqTzADdG2mqRMMzc_G9RzwYjj5_j4gyOopxQ,2030
|
16
|
-
analyser_hj3415/workroom/mysklearn2.py,sha256=1lIy6EWEQHkOzDS-av8U0zQH6DuCLKWMI73dnJx5KRs,1495
|
17
|
-
analyser_hj3415/workroom/score.py,sha256=P6nHBJYmyhigGtT4qna4BmNtvt4B93b7SKyzdstJK24,17376
|
18
|
-
analyser_hj3415/workroom/trash.py,sha256=zF-W0piqkGr66UP6-iybo9EXh2gO0RP6R1FnIpsGkl8,12262
|
19
|
-
analyser_hj3415-3.2.2.dist-info/entry_points.txt,sha256=ZfjPnJuH8SzvhE9vftIPMBIofsc65IAWYOhqOC_L5ck,65
|
20
|
-
analyser_hj3415-3.2.2.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
|
21
|
-
analyser_hj3415-3.2.2.dist-info/METADATA,sha256=Dtq5P_Uy1wwtvdg8oh7AcIbjF1p2XakhGO38ByLDII4,6777
|
22
|
-
analyser_hj3415-3.2.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|