analyser_hj3415 2.10.1__py3-none-any.whl → 2.10.3__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
analyser_hj3415/cli.py CHANGED
@@ -114,7 +114,7 @@ def analyser_manager():
114
114
 
115
115
  args = parser.parse_args()
116
116
 
117
- from analyser_hj3415 import eval, tsa
117
+ from . import eval, tsa, score
118
118
 
119
119
  if args.type == 'red':
120
120
  if args.command == 'get':
@@ -206,8 +206,7 @@ def analyser_manager():
206
206
 
207
207
  elif args.type == 'prophet':
208
208
  if args.command == 'ranking':
209
- myprophet = tsa.MyProphet
210
- result = myprophet.ranking(refresh=args.refresh, expire_time_h=48)
209
+ result = score.Score.ranking(refresh=args.refresh, expire_time_h=48)
211
210
  print(result)
212
211
  mymongo.Logs.save('cli','INFO', 'run >> analyser prophet ranking')
213
212
 
analyser_hj3415/eval.py CHANGED
@@ -4,7 +4,7 @@ from utils_hj3415 import utils, helpers
4
4
  from typing import Tuple
5
5
  from db_hj3415 import myredis, mymongo
6
6
  import math
7
- from analyser_hj3415.cli import AnalyserSettingsManager
7
+ from .cli import AnalyserSettingsManager
8
8
  from collections import OrderedDict
9
9
  import logging
10
10
 
@@ -0,0 +1,159 @@
1
+ from db_hj3415 import myredis
2
+ from utils_hj3415 import utils, helpers
3
+ import datetime
4
+ from collections import OrderedDict
5
+ from . import eval, tsa
6
+
7
+ import logging
8
+
9
+ score_logger = helpers.setup_logger('score_logger', logging.WARNING)
10
+
11
+
12
+ def is_within_last_three_days(date_to_check: datetime.datetime.date) -> bool:
13
+ today = datetime.datetime.now().date() # 현재 날짜 (시간은 무시)
14
+ # print('today - ', today)
15
+ three_days_ago = today - datetime.timedelta(days=3) # 3일 전 날짜
16
+ return three_days_ago <= date_to_check <= today
17
+
18
+
19
+ class Score:
20
+ def __init__(self, code):
21
+ self._code = code
22
+ self.c101 = myredis.C101(code)
23
+ self.name = self.c101.get_name()
24
+ self.c108 = myredis.C108(code)
25
+ self.dart = myredis.Dart(code)
26
+ self.red = eval.Red(code)
27
+ self.mil = eval.Mil(code)
28
+ self.lstm = tsa.MyLSTM(code)
29
+ self.prophet = tsa.MyProphet(code)
30
+
31
+ @property
32
+ def code(self) -> str:
33
+ return self._code
34
+
35
+ @code.setter
36
+ def code(self, code: str):
37
+ assert utils.is_6digit(code), f'Invalid value : {code}'
38
+ score_logger.info(f'change code : {self.code} -> {code}')
39
+ self._code = code
40
+ self.c101.code = code
41
+ self.name = self.c101.get_name()
42
+ self.c108.code = code
43
+ self.dart.code = code
44
+ self.red.code = code
45
+ self.mil.code = code
46
+ self.lstm.code = code
47
+ self.prophet.code = code
48
+
49
+ def get(self, refresh=False, expire_time_h=24) -> dict:
50
+ """
51
+ 한 종목의 각분야 평가를 모아서 딕셔너리 형태로 반환함.
52
+ redis_name = self.code + '_score'
53
+
54
+ Returns:
55
+ dict: A dictionary containing the following key-value pairs:
56
+
57
+ - 'code': str - 종목코드
58
+ - 'name': str - 종목명
59
+ - '시가총액': str - 시가총액
60
+ - 'is_update_c108': bool - 최근 3일 이내에 c108이 없데이트 되었는가
61
+ - 'is_update_dart': bool - 최근 3일 이내에 Dart가 없데이트 되었는가
62
+ - 'red_score': float - Red score
63
+ - '이익지표': float - Mil의 이익지표
64
+ - '주주수익률': float - Mil의 주주수익률
65
+ - 'is_lstm_up': Union[bool, None] - lstm 예측치가 상승인지 아닌지, returns None - 데이터가 없으면..
66
+ - 'prophet_score': int - prophet score
67
+ """
68
+ print(f"{self.code}/{self.name}의 scoring을 시작합니다.")
69
+ redis_name = self.code + '_score'
70
+ print(
71
+ f"redisname: '{redis_name}' / refresh : {refresh} / expire_time : {expire_time_h}h")
72
+
73
+ def fetch_score() -> dict:
74
+ score_logger.info("시가총액 데이터 추출중..")
75
+ 시가총액 = utils.format_large_number(int(self.c101.get_recent()['시가총액']))
76
+
77
+ score_logger.info("C108 최근 데이터 추출중..")
78
+ # c108이 최근에 업데이트 되었는지...
79
+ c108_recent_date = self.c108.get_recent_date()
80
+ # print('code - ', code, ' | c108 recent date - ', c108_recent_date.date())
81
+ if c108_recent_date is None:
82
+ is_update_c108 = False
83
+ else:
84
+ is_update_c108 = is_within_last_three_days(c108_recent_date.date())
85
+
86
+ score_logger.info("Red score 계산중..")
87
+ red_score = self.red.get(verbose=False).score
88
+
89
+ score_logger.info("Mil data 계산중..")
90
+ mil_data = self.mil.get(verbose=False)
91
+
92
+ score_logger.info("\tProphet 최근 데이터 조회중..")
93
+ prophet_score = self.prophet.scoring()
94
+
95
+ return {
96
+ 'name': self.name,
97
+ '시가총액': 시가총액,
98
+ 'is_update_c108': is_update_c108,
99
+ 'red_score': red_score,
100
+ '이익지표': mil_data.이익지표,
101
+ '주주수익률': mil_data.주주수익률,
102
+ 'prophet_score': prophet_score,
103
+ }
104
+ data_dict = myredis.Base.fetch_and_cache_data(redis_name, refresh, fetch_score, timer=expire_time_h * 3600)
105
+ return data_dict
106
+
107
+ @classmethod
108
+ def ranking(self, refresh=False, expire_time_h=24, top='all') -> OrderedDict:
109
+ """
110
+ prophet score 기준으로 정렬하여 ordered dict로 반환함
111
+
112
+ Parameters:
113
+ refresh (bool): Specifies whether to refresh the ranking data. Defaults
114
+ to `False`.
115
+ expire_time_h (int): Time in hours after which the cached data should
116
+ expire. Defaults to `24` hours.
117
+ top (Union[str, int]): Determines how many top rankings to return.
118
+ Defaults to `'all'`. If an integer is provided, it limits the
119
+ ranking to the specified count.
120
+
121
+ Returns:
122
+ OrderedDict: A dictionary containing the rankings, sorted in
123
+ descending order by `prophet_score`.
124
+
125
+ Raises:
126
+ ValueError: Raised if the parameter `top` is neither `'all'` nor an
127
+ integer.
128
+ """
129
+ print("**** Start score_ranking... ****")
130
+ redis_name = 'score_ranking'
131
+
132
+ print(
133
+ f"redisname: '{redis_name}' / refresh : {refresh} / expire_time : {expire_time_h}h")
134
+
135
+ def fetch_ranking() -> dict:
136
+ data = {}
137
+ s = Score('005930')
138
+ for code in myredis.Corps.list_all_codes():
139
+ try:
140
+ s.code = code
141
+ except ValueError:
142
+ score_logger.error(f'score ranking error : {code}')
143
+ continue
144
+ score = s.get()
145
+ data[code] = score
146
+ return data
147
+
148
+ data_dict = myredis.Base.fetch_and_cache_data(redis_name, refresh, fetch_ranking, timer=expire_time_h * 3600)
149
+
150
+ # prophet_score를 기준으로 정렬
151
+ ranking = OrderedDict(sorted(data_dict.items(), key=lambda x: x[1]['prophet_score'], reverse=True))
152
+
153
+ if top == 'all':
154
+ return ranking
155
+ else:
156
+ if isinstance(top, int):
157
+ return OrderedDict(list(ranking.items())[:top])
158
+ else:
159
+ raise ValueError("top 인자는 'all' 이나 int형 이어야 합니다.")
analyser_hj3415/tsa.py CHANGED
@@ -193,6 +193,22 @@ class MyProphet:
193
193
  Exception("to 인자가 맞지 않습니다.")
194
194
 
195
195
  def scoring(self) -> int:
196
+ """
197
+ prophet의 yhat_lower 예측치와 주가를 비교하여 주가가 낮으면 양의 점수를 높으면 음의 점수를 준다.
198
+
199
+ Returns:
200
+ int: The calculated score based on the deviation between the recent price
201
+ and the expected lower limit.
202
+
203
+ Parameters:
204
+ None
205
+
206
+ Raises:
207
+ AttributeError: Raised if the necessary attributes like `df_real` or methods like `get_yhat`
208
+ are not correctly set or implemented.
209
+ KeyError: Raised if the expected keys (`'yhat_lower'` or `'y'`) are not found in the data involved.
210
+ ValueError: Raised if the format of data does not conform to expected structure for calculations.
211
+ """
196
212
  last_real_data = self.df_real.iloc[-1]
197
213
  recent_price = last_real_data['y']
198
214
  recent_date = datetime.strftime(last_real_data['ds'], '%Y-%m-%d')
@@ -204,45 +220,9 @@ class MyProphet:
204
220
  score = -deviation
205
221
  else:
206
222
  score = deviation
207
- print(f"{self.code}/{self.name} date: {recent_date} 가격:{recent_price} 기대하한값:{yhat_lower} 편차:{deviation} score:{score}")
223
+ tsa_logger.info(f"{self.code}/{self.name} date: {recent_date} 가격:{recent_price} 기대하한값:{yhat_lower} 편차:{deviation} score:{score}")
208
224
  return score
209
225
 
210
- @classmethod
211
- def ranking(cls, refresh = False, expire_time_h = 24, top='all') -> OrderedDict:
212
- """
213
- 가장 최근 날짜의 랭킹 분석
214
- :param refresh:
215
- :return:
216
- """
217
- print("**** Start myprophet_ranking... ****")
218
- redis_name = 'myprophet_ranking'
219
-
220
- print(
221
- f"redisname: '{redis_name}' / refresh : {refresh} / expire_time : {expire_time_h}h")
222
-
223
- def fetch_ranking() -> dict:
224
- data = {}
225
- p = MyProphet('005930')
226
- for code in myredis.Corps.list_all_codes():
227
- try:
228
- p.code = code
229
- except ValueError:
230
- tsa_logger.error(f'myprophet ranking error : {code}/{myredis.Corps(code, "c101").get_name()}')
231
- continue
232
- score = p.scoring()
233
- data[code] = score
234
- return data
235
-
236
- data_dict = myredis.Base.fetch_and_cache_data(redis_name, refresh, fetch_ranking, timer=expire_time_h * 3600)
237
-
238
- ranking = OrderedDict(sorted(data_dict.items(), key=lambda item: item[1], reverse=True))
239
- if top == 'all':
240
- return ranking
241
- else:
242
- if isinstance(top, int):
243
- return OrderedDict(list(ranking.items())[:top])
244
- else:
245
- raise ValueError("top 인자는 'all' 이나 int형 이어야 합니다.")
246
226
 
247
227
  @dataclass
248
228
  class LSTMData:
@@ -698,6 +678,12 @@ class MyLSTM:
698
678
  plt.show()"""
699
679
 
700
680
  def is_up(self)-> bool:
681
+ """
682
+ lstm 데이터가 증가하는 추세인지 확인후 참/거짓 반환
683
+
684
+ Returns:
685
+ bool: True if the data is strictly increasing, False otherwise.
686
+ """
701
687
  # 튜플의 [0]은 날짜 [1]은 값 배열
702
688
  data = self.get_final_predictions(refresh=False, expire_time_h=24)[1]
703
689
  # 데이터를 1D 배열로 변환
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: analyser_hj3415
3
- Version: 2.10.1
3
+ Version: 2.10.3
4
4
  Summary: Stock analyser and database processing programs
5
5
  Requires-Python: >=3.6
6
6
  Description-Content-Type: text/markdown
@@ -1,13 +1,14 @@
1
1
  analyser_hj3415/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- analyser_hj3415/cli.py,sha256=a4oUwfPFEdd3r2Fq2EMHBITcp6lbXUjZvVWvCHIvCUQ,12540
3
- analyser_hj3415/eval.py,sha256=eNrcbpVyj7SZJevWqatlj_gJ2EQTmLZAz2nPG5qNv6k,38811
4
- analyser_hj3415/tsa.py,sha256=gbpS4ZXgHYlN1MggqA3UUiTkmz8-WvYkxto_yjQt13g,28558
2
+ analyser_hj3415/cli.py,sha256=eRaFtkioooe2Rgzq5J3Lxd2oX17OnIwDZPo2msutjM0,12497
3
+ analyser_hj3415/eval.py,sha256=9rWNTa3vbUnegOfpfVtWLXmt8cxU2zWZD5yEsFlfTzQ,38796
4
+ analyser_hj3415/score.py,sha256=YG5SmovRUxne0lzqftlb3zesxRZZD54nLe7sZWxws5Y,6379
5
+ analyser_hj3415/tsa.py,sha256=X62ypwSWRMAAU72IJoBdEeyU8rVaaMRqZ3XsslziBfM,28111
5
6
  analyser_hj3415/workroom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
7
  analyser_hj3415/workroom/mysklearn.py,sha256=wJXKz5MqqTzADdG2mqRMMzc_G9RzwYjj5_j4gyOopxQ,2030
7
8
  analyser_hj3415/workroom/mysklearn2.py,sha256=1lIy6EWEQHkOzDS-av8U0zQH6DuCLKWMI73dnJx5KRs,1495
8
9
  analyser_hj3415/workroom/score.py,sha256=P6nHBJYmyhigGtT4qna4BmNtvt4B93b7SKyzdstJK24,17376
9
10
  analyser_hj3415/workroom/trash.py,sha256=zF-W0piqkGr66UP6-iybo9EXh2gO0RP6R1FnIpsGkl8,12262
10
- analyser_hj3415-2.10.1.dist-info/entry_points.txt,sha256=ZfjPnJuH8SzvhE9vftIPMBIofsc65IAWYOhqOC_L5ck,65
11
- analyser_hj3415-2.10.1.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
12
- analyser_hj3415-2.10.1.dist-info/METADATA,sha256=HDWRHN49PtQQ0rzT2L9QObehx9r1E773C0vj2hQfcIc,6777
13
- analyser_hj3415-2.10.1.dist-info/RECORD,,
11
+ analyser_hj3415-2.10.3.dist-info/entry_points.txt,sha256=ZfjPnJuH8SzvhE9vftIPMBIofsc65IAWYOhqOC_L5ck,65
12
+ analyser_hj3415-2.10.3.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
13
+ analyser_hj3415-2.10.3.dist-info/METADATA,sha256=M9hC2Wu9HrNES0QvJND1rRnrmCNZ08OYAO0KgGUlJtM,6777
14
+ analyser_hj3415-2.10.3.dist-info/RECORD,,