analyser_hj3415 3.2.2__py3-none-any.whl → 3.3.0__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.
@@ -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 = self._get_raw_data()
28
- self.df_real = self._preprocessing_for_prophet()
29
- self.df_forecast = self._make_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 = self._get_raw_data()
43
- self.df_real = self._preprocessing_for_prophet()
44
- self.df_forecast = self._make_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 _get_raw_data(self) -> pd.DataFrame:
57
- """
58
- 야후에서 해당 종목의 4년간 주가 raw data를 받아온다.
59
- :return:
75
+ def initializing(self):
60
76
  """
61
- # 오늘 날짜 가져오기
62
- today = datetime.today()
77
+ Prophet 모델 사용을 위한 데이터를 초기화합니다.
63
78
 
64
- # 4년 날짜 계산 (4년 = 365일 * 4)
65
- four_years_ago = today - timedelta(days=365 * 4)
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
- df = self.raw_data[['Close', 'Volume']].reset_index()
80
- df.columns = ['ds', 'y', 'volume'] # Prophet의 형식에 맞게 열 이름 변경
81
-
82
- # ds 열에서 타임존 제거
83
- df['ds'] = df['ds'].dt.tz_localize(None)
84
-
85
- # 추가 변수를 정규화
86
- df['volume_scaled'] = self.scaler.fit_transform(df[['volume']])
87
- mylogger.debug('_preprocessing_for_prophet')
88
- mylogger.debug(df)
89
- return df
90
-
91
- def _make_forecast(self) -> pd.DataFrame:
92
- # 정규화된 'volume_scaled' 변수를 외부 변수로 추가
93
- self.model.add_regressor('volume_scaled')
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.model.fit(self.df_real)
156
+ self.scaler = StandardScaler()
157
+ self.model = Prophet()
96
158
 
97
- # 향후 180일 동안의 주가 예측
98
- future = self.model.make_future_dataframe(periods=180)
99
- mylogger.debug('_make_forecast_future')
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
- future_volume = pd.DataFrame({'volume': [self.raw_data['Volume'].mean()] * len(future)})
104
- future['volume_scaled'] = self.scaler.transform(future_volume[['volume']])
163
+ def generate_data(self, refresh: bool) -> ProphetData:
164
+ """
165
+ ProphetData 객체를 생성하거나 캐시된 데이터를 반환합니다.
105
166
 
106
- forecast = self.model.predict(future)
107
- mylogger.debug('_make_forecast')
108
- mylogger.debug(forecast)
109
- return forecast
167
+ 매개변수:
168
+ refresh (bool): 데이터를 새로 생성할지 여부.
110
169
 
111
- def get_yhat(self) -> dict:
112
- """
113
- 최근 날짜의 예측데이터를 반환한다.
114
- :return: {'ds':..., 'yhat':.., 'yhat_lower':.., 'yhat_upper':..,}
170
+ 반환값:
171
+ ProphetData: 생성된 ProphetData 객체.
115
172
  """
116
- df = self.df_forecast
117
- last_real_date = self.df_real.iloc[-1]['ds']
118
- mylogger.info(last_real_date)
119
- yhat_dict = df[df['ds']==last_real_date].iloc[0][['ds', 'yhat_lower', 'yhat_upper', 'yhat']].to_dict()
120
- mylogger.info(yhat_dict)
121
- return yhat_dict
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
- prophet과 plotly로 그래프를 그려서 html을 문자열로 반환
135
- :param to: html, png, file
136
- :return:
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 scoring(self) -> Tuple[str, int]:
317
+ def is_prophet_up(self, refresh: bool) -> bool:
181
318
  """
182
- Calculate and return a trading action and associated score based on recent market data and forecasted values.
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
- Returns:
191
- A tuple containing a string indicating the recommended trading action ('buy', 'sell', 'hold')
192
- and an integer score associated with that action.
321
+ 매개변수:
322
+ refresh (bool): 데이터를 새로 생성할지 여부.
193
323
 
194
- Raises:
195
- KeyError: If required keys are missing in the `yhat_dict` or `last_real_data` dictionary-like structures.
324
+ 반환값:
325
+ bool: 상승 추세 여부.
196
326
  """
197
- last_real_data = self.df_real.iloc[-1]
198
- recent_price = last_real_data['y']
199
- recent_date = datetime.strftime(last_real_data['ds'], '%Y-%m-%d')
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
- if recent_price >= yhat_lower:
213
- buying_score = -buying_score
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
- selling_deviation = eval.Tools.cal_deviation(recent_price, yhat_upper)
336
+ return myredis.Base.fetch_and_cache_data(redis_name, refresh, fetch_is_prophet_up, timer=expire_time)
216
337
 
217
- selling_score = tools.to_int(eval.Tools.sigmoid_score(selling_deviation))
218
- # score = tools.to_int(Tools.log_score(deviation))
338
+ @staticmethod
339
+ def is_valid_date(date_string):
340
+ """
341
+ 주어진 문자열이 'YYYY-MM-DD' 형식의 유효한 날짜인지 확인합니다.
219
342
 
220
- if recent_price <= yhat_upper:
221
- selling_score = -selling_score
343
+ 매개변수:
344
+ date_string (str): 확인할 날짜 문자열.
222
345
 
223
- mylogger.info(f"{self.ticker} date: {recent_date} 가격: {recent_price}"
224
- f" yhat_lower:{yhat_lower} yhat_upper:{yhat_upper}"
225
- f" buying_score:{buying_score} selling_score:{selling_score}")
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.keys(), f"Invalid MI type ({MIs.keys()})"
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[mi_type])
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.keys(), f"Invalid MI type ({MIs.keys()})"
403
+ assert mi_type in MIs._fields, f"Invalid MI type ({MIs._fields})"
267
404
  self._mi_type = mi_type
268
- self.ticker = MIs[mi_type]
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.keys())}')
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.keys())}')
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
- if args.target in MIs.keys():
180
- myprophet = tsa.MIProphet(args.target)
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.scoring())
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
- compile.MICompile.analyser_lstm_all_mi(refresh=args.refresh)
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
- if args.target in MIs.keys():
202
- mylstm = tsa.MILSTM(args.target)
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: analyser_hj3415
3
- Version: 3.2.2
3
+ Version: 3.3.0
4
4
  Summary: Stock analyser and database processing programs
5
5
  Requires-Python: >=3.6
6
6
  Description-Content-Type: text/markdown
@@ -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=_zOxWfBSLGv2QuKqL2LR-OS97JzXvkZfSSrpuRLU48c,8037
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.0.dist-info/entry_points.txt,sha256=ZfjPnJuH8SzvhE9vftIPMBIofsc65IAWYOhqOC_L5ck,65
21
+ analyser_hj3415-3.3.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
22
+ analyser_hj3415-3.3.0.dist-info/METADATA,sha256=oQXcQ45N87lL1UNCjceZWvAsgbzOKoL2m06iIM3cOvE,6777
23
+ analyser_hj3415-3.3.0.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,,