analyser_hj3415 3.2.1__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.
- analyser_hj3415/__init__.py +0 -5
- analyser_hj3415/analyser/__init__.py +30 -0
- analyser_hj3415/analyser/compile.py +84 -65
- 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 -13
- analyser_hj3415/analyser/tsa/common.py +33 -0
- analyser_hj3415/analyser/tsa/lstm.py +108 -137
- analyser_hj3415/analyser/tsa/prophet.py +262 -126
- analyser_hj3415/cli.py +13 -11
- {analyser_hj3415-3.2.1.dist-info → analyser_hj3415-3.3.0.dist-info}/METADATA +1 -1
- analyser_hj3415-3.3.0.dist-info/RECORD +23 -0
- analyser_hj3415-3.2.1.dist-info/RECORD +0 -22
- {analyser_hj3415-3.2.1.dist-info → analyser_hj3415-3.3.0.dist-info}/WHEEL +0 -0
- {analyser_hj3415-3.2.1.dist-info → analyser_hj3415-3.3.0.dist-info}/entry_points.txt +0 -0
@@ -7,13 +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
|
16
|
+
from analyser_hj3415.analyser import eval, MIs, tsa
|
17
|
+
|
15
18
|
|
16
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
|
17
35
|
|
18
36
|
|
19
37
|
class MyProphet:
|
@@ -23,103 +41,214 @@ class MyProphet:
|
|
23
41
|
self.model = Prophet()
|
24
42
|
self._ticker = ticker
|
25
43
|
|
26
|
-
self.raw_data =
|
27
|
-
self.df_real =
|
28
|
-
self.df_forecast =
|
44
|
+
self.raw_data = pd.DataFrame()
|
45
|
+
self.df_real = pd.DataFrame()
|
46
|
+
self.df_forecast = pd.DataFrame()
|
29
47
|
|
30
48
|
@property
|
31
49
|
def ticker(self) -> str:
|
50
|
+
"""
|
51
|
+
현재 설정된 티커를 반환합니다.
|
52
|
+
|
53
|
+
반환값:
|
54
|
+
str: 현재 티커 값.
|
55
|
+
"""
|
32
56
|
return self._ticker
|
33
57
|
|
34
58
|
@ticker.setter
|
35
59
|
def ticker(self, ticker: str):
|
60
|
+
"""
|
61
|
+
티커 값을 변경하고 관련 데이터를 초기화합니다.
|
62
|
+
|
63
|
+
매개변수:
|
64
|
+
ticker (str): 새로 설정할 티커 값.
|
65
|
+
"""
|
36
66
|
mylogger.info(f'change ticker : {self.ticker} -> {ticker}')
|
37
67
|
self.scaler = StandardScaler()
|
38
68
|
self.model = Prophet()
|
39
69
|
self._ticker = ticker
|
40
70
|
|
41
|
-
self.raw_data =
|
42
|
-
self.df_real =
|
43
|
-
self.df_forecast =
|
71
|
+
self.raw_data = pd.DataFrame()
|
72
|
+
self.df_real = pd.DataFrame()
|
73
|
+
self.df_forecast = pd.DataFrame()
|
44
74
|
|
45
|
-
|
46
|
-
def is_valid_date(date_string):
|
47
|
-
try:
|
48
|
-
# %Y-%m-%d 형식으로 문자열을 datetime 객체로 변환 시도
|
49
|
-
datetime.strptime(date_string, '%Y-%m-%d')
|
50
|
-
return True
|
51
|
-
except ValueError:
|
52
|
-
# 변환이 실패하면 ValueError가 발생, 형식이 맞지 않음
|
53
|
-
return False
|
54
|
-
|
55
|
-
def _get_raw_data(self) -> pd.DataFrame:
|
56
|
-
"""
|
57
|
-
야후에서 해당 종목의 4년간 주가 raw data를 받아온다.
|
58
|
-
:return:
|
75
|
+
def initializing(self):
|
59
76
|
"""
|
60
|
-
|
61
|
-
today = datetime.today()
|
77
|
+
Prophet 모델 사용을 위한 데이터를 초기화합니다.
|
62
78
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
return yf.download(
|
67
|
-
tickers=self.ticker,
|
68
|
-
start=four_years_ago.strftime('%Y-%m-%d'),
|
69
|
-
end=today.strftime('%Y-%m-%d')
|
70
|
-
)
|
71
|
-
|
72
|
-
def _preprocessing_for_prophet(self) -> pd.DataFrame:
|
73
|
-
"""
|
74
|
-
Prophet이 사용할 수 있도록 데이터 준비
|
75
|
-
ds는 날짜, y는 주가
|
76
|
-
:return:
|
79
|
+
- Yahoo Finance에서 데이터를 가져옵니다.
|
80
|
+
- 데이터를 Prophet 형식에 맞게 전처리합니다.
|
81
|
+
- Prophet 모델을 사용하여 예측 데이터를 생성합니다.
|
77
82
|
"""
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
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")
|
93
155
|
|
94
|
-
self.
|
156
|
+
self.scaler = StandardScaler()
|
157
|
+
self.model = Prophet()
|
95
158
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
mylogger.debug(future)
|
159
|
+
self.raw_data = get_raw_data()
|
160
|
+
self.df_real = preprocessing_for_prophet()
|
161
|
+
self.df_forecast = make_forecast()
|
100
162
|
|
101
|
-
|
102
|
-
|
103
|
-
|
163
|
+
def generate_data(self, refresh: bool) -> ProphetData:
|
164
|
+
"""
|
165
|
+
ProphetData 객체를 생성하거나 캐시된 데이터를 반환합니다.
|
104
166
|
|
105
|
-
|
106
|
-
|
107
|
-
mylogger.debug(forecast)
|
108
|
-
return forecast
|
167
|
+
매개변수:
|
168
|
+
refresh (bool): 데이터를 새로 생성할지 여부.
|
109
169
|
|
110
|
-
|
111
|
-
|
112
|
-
최근 날짜의 예측데이터를 반환한다.
|
113
|
-
:return: {'ds':..., 'yhat':.., 'yhat_lower':.., 'yhat_upper':..,}
|
170
|
+
반환값:
|
171
|
+
ProphetData: 생성된 ProphetData 객체.
|
114
172
|
"""
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
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
|
121
244
|
|
122
245
|
def visualization(self):
|
246
|
+
"""
|
247
|
+
Prophet 모델의 예측 결과를 시각화합니다.
|
248
|
+
|
249
|
+
- Matplotlib를 사용하여 예측 결과 및 추세/계절성을 그래프로 출력.
|
250
|
+
"""
|
251
|
+
self.initializing()
|
123
252
|
# 예측 결과 출력
|
124
253
|
print(self.df_forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())
|
125
254
|
# 예측 결과 시각화 (Matplotlib 사용)
|
@@ -130,10 +259,19 @@ class MyProphet:
|
|
130
259
|
|
131
260
|
def export(self, to="html") -> Optional[str]:
|
132
261
|
"""
|
133
|
-
|
134
|
-
|
135
|
-
|
262
|
+
예측 결과를 시각화하여 다양한 형식으로 내보냅니다.
|
263
|
+
|
264
|
+
매개변수:
|
265
|
+
refresh (bool): 데이터를 새로 생성할지 여부.
|
266
|
+
to (str): 내보낼 형식 ('html', 'png', 'file').
|
267
|
+
|
268
|
+
반환값:
|
269
|
+
Optional[str]: HTML 문자열로 반환하거나 PNG/HTML 파일로 저장합니다.
|
270
|
+
|
271
|
+
예외:
|
272
|
+
Exception: 지원되지 않는 형식의 경우 예외 발생.
|
136
273
|
"""
|
274
|
+
self.initializing()
|
137
275
|
# Plotly를 사용한 시각화
|
138
276
|
fig = go.Figure()
|
139
277
|
|
@@ -176,62 +314,56 @@ class MyProphet:
|
|
176
314
|
else:
|
177
315
|
Exception("to 인자가 맞지 않습니다.")
|
178
316
|
|
179
|
-
def
|
317
|
+
def is_prophet_up(self, refresh: bool) -> bool:
|
180
318
|
"""
|
181
|
-
|
182
|
-
|
183
|
-
The method computes deviations between the recent price and predefined forecasted bounds (`yhat_lower` and `yhat_upper`)
|
184
|
-
to determine whether to buy, sell, or hold a financial instrument. The calculation involves generating a deviation score
|
185
|
-
that is transformed using a sigmoid function. The scores are then adjusted based on the position of the recent price relative
|
186
|
-
to the forecasted bounds. Logging is used extensively throughout the method to record the values and decisions for debugging
|
187
|
-
and traceability purposes.
|
319
|
+
Prophet 예측이 상승 추세인지 여부를 확인합니다.
|
188
320
|
|
189
|
-
|
190
|
-
|
191
|
-
and an integer score associated with that action.
|
321
|
+
매개변수:
|
322
|
+
refresh (bool): 데이터를 새로 생성할지 여부.
|
192
323
|
|
193
|
-
|
194
|
-
|
324
|
+
반환값:
|
325
|
+
bool: 상승 추세 여부.
|
195
326
|
"""
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
yhat_dict = self.get_yhat()
|
200
|
-
mylogger.info(f'recent_price: {recent_price}, yhat_dict: {yhat_dict}')
|
201
|
-
|
202
|
-
yhat_lower = tools.to_int(yhat_dict['yhat_lower'])
|
203
|
-
yhat_upper = tools.to_int(yhat_dict['yhat_upper'])
|
204
|
-
#yhat = tools.to_int(yhat_dict['yhat'])
|
205
|
-
|
206
|
-
buying_deviation = eval.Tools.cal_deviation(recent_price, yhat_lower)
|
207
|
-
|
208
|
-
buying_score = tools.to_int(eval.Tools.sigmoid_score(buying_deviation))
|
209
|
-
# 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")
|
210
330
|
|
211
|
-
|
212
|
-
|
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)
|
213
335
|
|
214
|
-
|
336
|
+
return myredis.Base.fetch_and_cache_data(redis_name, refresh, fetch_is_prophet_up, timer=expire_time)
|
215
337
|
|
216
|
-
|
217
|
-
|
338
|
+
@staticmethod
|
339
|
+
def is_valid_date(date_string):
|
340
|
+
"""
|
341
|
+
주어진 문자열이 'YYYY-MM-DD' 형식의 유효한 날짜인지 확인합니다.
|
218
342
|
|
219
|
-
|
220
|
-
|
343
|
+
매개변수:
|
344
|
+
date_string (str): 확인할 날짜 문자열.
|
221
345
|
|
222
|
-
|
223
|
-
|
224
|
-
|
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
|
225
356
|
|
226
|
-
if buying_score > 0:
|
227
|
-
return 'buy', buying_score
|
228
|
-
elif selling_score > 0:
|
229
|
-
return 'sell', selling_score
|
230
|
-
else:
|
231
|
-
return 'hold', 0
|
232
357
|
|
233
358
|
|
234
359
|
class CorpProphet(MyProphet):
|
360
|
+
"""
|
361
|
+
기업 코드를 기반으로 주가를 예측하는 Prophet 모델 클래스.
|
362
|
+
|
363
|
+
속성:
|
364
|
+
code (str): 기업 코드.
|
365
|
+
name (str): 기업명.
|
366
|
+
"""
|
235
367
|
def __init__(self, code: str):
|
236
368
|
assert tools.is_6digit(code), f'Invalid value : {code}'
|
237
369
|
self._code = code
|
@@ -251,11 +383,16 @@ class CorpProphet(MyProphet):
|
|
251
383
|
|
252
384
|
|
253
385
|
class MIProphet(MyProphet):
|
386
|
+
"""
|
387
|
+
특정 MI(Market Indicator) 타입에 따라 주가를 예측하는 Prophet 모델 클래스.
|
388
|
+
|
389
|
+
속성:
|
390
|
+
mi_type (str): MI 타입.
|
391
|
+
"""
|
254
392
|
def __init__(self, mi_type: str):
|
255
|
-
|
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
|
395
|
+
super().__init__(ticker=getattr(MIs, mi_type))
|
259
396
|
|
260
397
|
@property
|
261
398
|
def mi_type(self) -> str:
|
@@ -263,7 +400,6 @@ class MIProphet(MyProphet):
|
|
263
400
|
|
264
401
|
@mi_type.setter
|
265
402
|
def mi_type(self, mi_type: str):
|
266
|
-
|
267
|
-
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})"
|
268
404
|
self._mi_type = mi_type
|
269
|
-
self.ticker = MIs
|
405
|
+
self.ticker = getattr(MIs, mi_type)
|
analyser_hj3415/cli.py
CHANGED
@@ -2,12 +2,11 @@ import argparse
|
|
2
2
|
import pprint
|
3
3
|
|
4
4
|
from utils_hj3415 import tools
|
5
|
-
from analyser_hj3415.analyser import eval, tsa, compile
|
5
|
+
from analyser_hj3415.analyser import eval, tsa, compile, MIs
|
6
6
|
from db_hj3415 import myredis, mymongo
|
7
7
|
|
8
8
|
|
9
9
|
def analyser_manager():
|
10
|
-
from analyser_hj3415.analyser.tsa import MIs
|
11
10
|
parser = argparse.ArgumentParser(description="Analyser Commands")
|
12
11
|
type_subparsers = parser.add_subparsers(dest='type', help='분석 타입')
|
13
12
|
|
@@ -19,7 +18,7 @@ def analyser_manager():
|
|
19
18
|
ranking_parser.add_argument('-r', '--refresh', action='store_true', help='래디스 캐시를 사용하지 않고 강제로 재계산 할지')
|
20
19
|
# prophet - score 파서
|
21
20
|
prophet_get_parser = prophet_subparser.add_parser('score', help='prophet score 계산')
|
22
|
-
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)}')
|
23
22
|
prophet_get_parser.add_argument('-r', '--refresh', action='store_true', help='래디스 캐시를 사용하지 않고 강제로 재계산 할지')
|
24
23
|
|
25
24
|
# lstm 명령어 서브파서
|
@@ -28,10 +27,11 @@ def analyser_manager():
|
|
28
27
|
# lstm - caching 파서
|
29
28
|
caching_parser = lstm_subparser.add_parser('caching', help='lstm 랭킹 책정 및 레디스 저장')
|
30
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도 캐싱할지')
|
31
31
|
caching_parser.add_argument('-t', '--top', type=int, help='prophet ranking 몇위까지 작업을 할지')
|
32
32
|
# lstm - predict 파서
|
33
33
|
lstm_get_parser = lstm_subparser.add_parser('predict', help='lstm get final prediction 시행')
|
34
|
-
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)}')
|
35
35
|
lstm_get_parser.add_argument('-n', '--num', type=int, default=5, help='ensemble training 횟수 설정')
|
36
36
|
lstm_get_parser.add_argument('-r', '--refresh', action='store_true', help='래디스 캐시를 사용하지 않고 강제로 재계산 할지')
|
37
37
|
|
@@ -177,13 +177,14 @@ def analyser_manager():
|
|
177
177
|
print(e)
|
178
178
|
mymongo.Logs.save('cli', 'ERROR', f'analyser prophet ranking 실행중 에러 - {e}')
|
179
179
|
elif args.command == 'score':
|
180
|
-
|
181
|
-
|
180
|
+
mi_type = str(args.target).upper()
|
181
|
+
if mi_type in MIs._fields:
|
182
|
+
myprophet = tsa.MIProphet(mi_type)
|
182
183
|
elif tools.is_6digit(args.target):
|
183
184
|
myprophet = tsa.CorpProphet(args.target)
|
184
185
|
else:
|
185
186
|
raise Exception("Invalid target")
|
186
|
-
print(myprophet.
|
187
|
+
print(myprophet.generate_data(refresh=args.refresh).score)
|
187
188
|
# mymongo.Logs.save('cli','INFO', f'run >> analyser prophet get {args.target}')
|
188
189
|
|
189
190
|
elif args.type == 'lstm':
|
@@ -194,18 +195,19 @@ def analyser_manager():
|
|
194
195
|
compile.CorpCompile.analyse_lstm_topn(refresh=args.refresh, top=args.top)
|
195
196
|
else:
|
196
197
|
compile.CorpCompile.analyse_lstm_topn(refresh=args.refresh)
|
197
|
-
|
198
|
+
if args.market_index:
|
199
|
+
compile.MICompile.analyser_lstm_all_mi(refresh=args.refresh)
|
198
200
|
except Exception as e:
|
199
201
|
print(e)
|
200
202
|
mymongo.Logs.save('cli','ERROR', f'analyser lstm caching 실행중 에러 - {e}')
|
201
203
|
elif args.command == 'predict':
|
202
|
-
|
203
|
-
|
204
|
+
mi_type = str(args.target).upper()
|
205
|
+
if mi_type in MIs._fields:
|
206
|
+
mylstm = tsa.MILSTM(mi_type)
|
204
207
|
elif tools.is_6digit(args.target):
|
205
208
|
mylstm = tsa.CorpLSTM(args.target)
|
206
209
|
else:
|
207
210
|
raise Exception("Invalid target")
|
208
|
-
mylstm.initializing()
|
209
211
|
future_data, grade = mylstm.get_final_predictions(refresh=args.refresh, num=args.num)
|
210
212
|
print(future_data)
|
211
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=_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=f2E9Neh7Nzkhvdj7HWWlgxZK2sB95rBtaIgWEHzxK9E,450
|
2
|
-
analyser_hj3415/cli.py,sha256=iNyZz77BNe_aPcqiJrhWhjvxJZJQfmWQev8dM9xu2H8,11824
|
3
|
-
analyser_hj3415/analyser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
|
-
analyser_hj3415/analyser/compile.py,sha256=INd9XI-V21Q48HQkk8oUke7k_mE4kIbqorahiaPeKaQ,7720
|
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=0XIpMgYIiyDrSE3sp9S0J0gXwW4cpk6nQmxSjC3KkY4,371
|
12
|
-
analyser_hj3415/analyser/tsa/lstm.py,sha256=22Rd1PTBeDAvITb1zw65Y51lLB76w6MyWXNKku6RzjM,29975
|
13
|
-
analyser_hj3415/analyser/tsa/prophet.py,sha256=jHaOufe7FAJanPXgPh0YxvQ4OiATJue_7cDyfHnq1hc,10156
|
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.1.dist-info/entry_points.txt,sha256=ZfjPnJuH8SzvhE9vftIPMBIofsc65IAWYOhqOC_L5ck,65
|
20
|
-
analyser_hj3415-3.2.1.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
|
21
|
-
analyser_hj3415-3.2.1.dist-info/METADATA,sha256=ysCQEllcgKTZjSHajJ6lx0iyGfS_DI5MUACiPRpnwew,6777
|
22
|
-
analyser_hj3415-3.2.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|