analyser_hj3415 2.5.0__py2.py3-none-any.whl → 2.5.2__py2.py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
analyser_hj3415/.DS_Store CHANGED
Binary file
@@ -1,289 +1,295 @@
1
- """red, mil, blue 3가지 분야에서 자료를 계산하여 리턴하는 함수 모음
2
- """
3
- import math
4
-
5
- from analyser_hj3415 import tools
6
- from utils_hj3415 import utils
7
- from db_hj3415 import myredis
8
-
9
- import logging
10
-
11
- logger = logging.getLogger(__name__)
12
- formatter = logging.Formatter('%(levelname)s: [%(name)s] %(message)s')
13
- ch = logging.StreamHandler()
14
- ch.setFormatter(formatter)
15
- logger.addHandler(ch)
16
- logger.setLevel(logging.WARNING)
17
-
18
-
19
- # 주식을 통한 기대수익률 - 금리가 3%일 경우 두배인 6% 정도로 잡는다.
20
- EXPECT_EARN = 0.06
21
-
22
-
23
- def red(code: str) -> dict:
24
- """
25
- 리턴값
26
- {
27
- 'red_price': red_price,
28
- '사업가치': 사업가치,
29
- '재산가치': 재산가치,
30
- '부채평가': 부채평가,
31
- '발행주식수': 발행주식수,
32
- 'date': [각 유효한 값의 년월값 리스트(ex- 2020/09)],
33
- }
34
- """
35
- c103q = myredis.C103(code, 'c103재무상태표q')
36
-
37
- d1, 지배주주당기순이익 = tools.calc당기순이익(code)
38
- d2, 유동자산 = tools.calc유동자산(code)
39
- d3, 유동부채 = tools.calc유동부채(code)
40
- d4, 부채평가 = tools.calc비유동부채(code)
41
-
42
- c103q.page = 'c103재무상태표q'
43
- d5, 투자자산 = c103q.latest_value_pop2('투자자산')
44
- d6, 투자부동산 = c103q.latest_value_pop2('투자부동산')
45
-
46
- # 사업가치 계산 - 지배주주지분 당기순이익 / 기대수익률
47
- 사업가치 = round(utils.nan_to_zero(지배주주당기순이익) / EXPECT_EARN, 2)
48
-
49
- # 재산가치 계산 - 유동자산 - (유동부채*1.2) + 고정자산중 투자자산
50
- 재산가치 = round(유동자산 - (유동부채 * 1.2) + utils.nan_to_zero(투자자산) + utils.nan_to_zero(투자부동산), 2)
51
-
52
- _, 발행주식수 = c103q.latest_value_pop2('발행주식수')
53
- if math.isnan(발행주식수):
54
- 발행주식수 = utils.to_int(myredis.C101(code).get_recent().get('발행주식'))
55
- else:
56
- 발행주식수 = 발행주식수 * 1000
57
-
58
- try:
59
- red_price = round(((사업가치 + 재산가치 - 부채평가) * 100000000) / 발행주식수)
60
- except (ZeroDivisionError, ValueError) as e:
61
- red_price = math.nan
62
-
63
- logger.debug(f'Red Price : {red_price}원')
64
- return {
65
- 'red_price': red_price,
66
- '사업가치': 사업가치,
67
- '재산가치': 재산가치,
68
- '부채평가': 부채평가,
69
- '발행주식수': 발행주식수,
70
- 'date': tools.set_data(d1, d2, d3, d4, d5, d6), # ''값을 제거하고 리스트로 바꾼다.
71
- }
72
-
73
-
74
- def mil(code: str) -> dict:
75
- """
76
- 리턴값
77
- {
78
- '주주수익률': 주주수익률,
79
- '이익지표': 이익지표,
80
- '투자수익률': {'ROIC': roic, 'ROE': roe , 'ROE106': {}},
81
- '가치지표': {'FCF': fcf_dict, 'PFCF': pfcf_dict, 'PCR': pcr_dict},
82
- 'date': [각 유효한 값의 년월값 리스트(ex- 2020/09)],
83
- }
84
-
85
- - 재무활동현금흐름이 마이너스라는 것은 배당급 지급했거나, 자사주 매입했거나, 부채를 상환한 상태임.
86
- - 반대는 채권자로 자금을 조달했거나 신주를 발행했다는 의미
87
- <주주수익률> - 재무활동현금흐름/시가총액 => 5%이상인가?
88
-
89
- 투하자본수익률(ROIC)가 30%이상인가
90
- ROE(자기자본이익률) 20%이상이면 아주 우수 다른 투자이익률과 비교해볼것 10%미만이면 별로...단, 부채비율을 확인해야함.
91
-
92
- 이익지표 ...영업현금흐름이 순이익보다 많은가 - 결과값이 음수인가..
93
-
94
- FCF는 영업현금흐름에서 자본적 지출(유·무형투자 비용)을 차감한 순수한 현금력이라 할 수 있다.
95
- 말 그대로 자유롭게(Free) 사용할 수 있는 여윳돈을 뜻한다.
96
- 잉여현금흐름이 플러스라면 미래의 투자나 채무상환에 재원이 늘어난 것이다.
97
- CAPEX(Capital expenditures)는 미래의 이윤을 창출하기 위해 지출된 비용을 말한다.
98
- 이는 기업이 고정자산을 구매하거나, 유효수명이 당회계년도를 초과하는 기존의 고정자산에 대한 투자에 돈이 사용될 때 발생한다.
99
-
100
- 잉여현금흐름이 마이너스일때는 설비투자가 많은 시기라 주가가 약세이며 이후 설비투자 마무리되면서 주가가 상승할수 있다.
101
- 주가는 잉여현금흐름이 증가할때 상승하는 경향이 있다.
102
- fcf = 영업현금흐름 - capex
103
-
104
- 가치지표평가
105
- price to fcf 계산
106
- https://www.investopedia.com/terms/p/pricetofreecashflow.asp
107
- pcr보다 정확하게 주식의 가치를 평가할수 있음. 10배이하 추천
108
- """
109
- c103q = myredis.C103(code, 'c103현금흐름표q')
110
- c104q = myredis.C104(code, 'c104q')
111
- c106q = myredis.C106(code, 'c106q')
112
-
113
- marketcap억 = tools.get_marketcap(code) / 100000000
114
- logger.debug(f'{code} market cap: {marketcap억}')
115
- fcf_dict = tools.findFCF(code)
116
- pfcf_dict = tools.findPFCF(code)
117
- d1, 지배주주당기순이익 = tools.calc당기순이익(code)
118
-
119
- d2, 재무활동현금흐름 = c103q.sum_recent_4q('재무활동으로인한현금흐름')
120
- d3, 영업활동현금흐름 = c103q.sum_recent_4q('영업활동으로인한현금흐름')
121
-
122
- d4, roic = c104q.sum_recent_4q('ROIC')
123
- d5, roe = c104q.latest_value_pop2('ROE')
124
- roe106 = c106q.find('ROE')
125
-
126
- _, pcr_dict = c104q.find_without_yoy('PCR')
127
-
128
- try:
129
- 주주수익률 = round((재무활동현금흐름 / marketcap억 * -100), 2)
130
- 이익지표 = round((지배주주당기순이익 - 영업활동현금흐름) / marketcap억, 5)
131
- except ZeroDivisionError:
132
- 주주수익률 = math.nan
133
- 이익지표 = math.nan
134
-
135
- if math.isnan(주주수익률) or math.isnan(이익지표):
136
- logger.warning(f'주주수익률: {주주수익률} 이익지표: {이익지표}')
137
- logger.warning(f'재무활동현금흐름: {재무활동현금흐름} / 지배주주당기순이익: {지배주주당기순이익} / 영업활동현금흐름: {영업활동현금흐름}')
138
-
139
- logger.debug(f'{code} fcf_dict : {fcf_dict}')
140
- logger.debug(f"{code} market_cap : {marketcap억}")
141
- logger.debug(f'{code} pfcf_dict : {pfcf_dict}')
142
- logger.debug(f'{code} pcr_dict : {pcr_dict}')
143
-
144
- return {
145
- '주주수익률': 주주수익률,
146
- '이익지표': 이익지표,
147
- '투자수익률': {'ROIC': roic, 'ROE': roe, 'ROE106': roe106},
148
- '가치지표': {'FCF': fcf_dict, 'PFCF': pfcf_dict, 'PCR': pcr_dict},
149
- 'date': tools.set_data(d1, d2, d3, d4, d5),
150
- }
151
-
152
-
153
- def blue(code: str) -> dict:
154
- """
155
- 리턴값
156
- {
157
- 'date': [각 유효한 값의 최근분기 값 리스트(ex- 2020/09)],
158
- '순부채비율': (29.99, {'2018/12': 19.45, '2019/12': 19.52, '2020/12': 12.07, '2021/12': 82.2, '2022/12': 29.99, '2023/12': nan}),
159
- '순운전자본회전율': (1.04, {'2018/12': 21.91, '2019/12': 23.12, '2020/12': 5.88, '2021/12': 5.6, '2022/12': 6.04, '2023/12': nan}),
160
- '유동비율': 64.29,
161
- '이자보상배율': (-3.64, {'2018/12': 4.01, '2019/12': 1.3, '2020/12': -5.05, '2021/12': 0.56, '2022/12': -1.28, '2023/12': nan}),
162
- '재고자산회전율': (1.66, {'2018/12': 12.41, '2019/12': 12.44, '2020/12': 9.18, '2021/12': 9.76, '2022/12': 8.79, '2023/12': nan})
163
- }
164
-
165
- <유동비율>
166
- 100미만이면 주의하나 현금흐름창출력이 좋으면 괜찮을수 있다.
167
- 만약 100%이하면 유동자산에 추정영업현금흐름을 더해서 다시계산해보아 기회를 준다.
168
- <이자보상배율>
169
- 이자보상배율 영업이익/이자비용으로 1이면 자금사정빡빡 5이상이면 양호
170
- <순운전자금회전율>
171
- 순운전자금 => 기업활동을 하기 위해 필요한 자금 (매출채권 + 재고자산 - 매입채무)
172
- 순운전자본회전율은 매출액/순운전자본으로 일정비율이 유지되는것이 좋으며 너무 작아지면 순운전자본이 많아졌다는 의미로 재고나 외상이 쌓인다는 뜻
173
- <재고자산회전율>
174
- 재고자산회전율은 매출액/재고자산으로 회전율이 낮을수록 재고가 많다는 이야기이므로 불리 전년도등과 비교해서 큰차이 발생하면 알람.
175
- 재고자산회전율이 작아지면 재고가 쌓인다는뜻
176
- <순부채비율>
177
- 부채비율은 업종마다 달라 일괄비교 어려우나 순부채 비율이 20%이하인것이 좋고 꾸준히 늘어나지 않는것이 좋다.
178
- 순부채 비율이 30%이상이면 좋치 않다.
179
- <매출액>
180
- 매출액은 어떤경우에도 성장하는 기업이 좋다.매출이 20%씩 늘어나는 종목은 유망한 종목
181
- <영업이익률>
182
- 영업이익률은 기업의 경쟁력척도로 경쟁사에 비해 높으면 경제적해자를 갖춘셈
183
- """
184
-
185
- d1, 유동비율 = tools.calc유동비율(code, pop_count=3)
186
- logger.debug(f'유동비율 {유동비율} / [{d1}]')
187
-
188
- c104y = myredis.C104(code, 'c104y')
189
- _, dict이자보상배율y = c104y.find_with_yoy('이자보상배율')
190
- _, dict순운전자본회전율y = c104y.find_with_yoy('순운전자본회전율')
191
- _, dict재고자산회전율y = c104y.find_with_yoy('재고자산회전율')
192
- _, dict순부채비율y = c104y.find_with_yoy('순부채비율')
193
-
194
- c104q = myredis.C104(code, 'c104q')
195
- d6, 이자보상배율q = c104q.latest_value_pop2('이자보상배율')
196
- d7, 순운전자본회전율q = c104q.latest_value_pop2('순운전자본회전율')
197
- d8, 재고자산회전율q = c104q.latest_value_pop2('재고자산회전율')
198
- d9, 순부채비율q = c104q.latest_value_pop2('순부채비율')
199
-
200
- if len(dict이자보상배율y) == 0:
201
- logger.warning(f'empty dict - 이자보상배율 : {이자보상배율q} {dict이자보상배율y}')
202
-
203
- if len(dict순운전자본회전율y) == 0:
204
- logger.warning(f'empty dict - 순운전자본회전율 : {순운전자본회전율q} {dict순운전자본회전율y}')
205
-
206
- if len(dict재고자산회전율y) == 0:
207
- logger.warning(f'empty dict - 재고자산회전율 : {재고자산회전율q} {dict재고자산회전율y}')
208
-
209
- if len(dict순부채비율y) == 0:
210
- logger.warning(f'empty dict - 순부채비율 : {순부채비율q} {dict순부채비율y}')
211
-
212
- ################################################################
213
-
214
- return {
215
- '유동비율': 유동비율,
216
- '이자보상배율': (이자보상배율q, dict이자보상배율y),
217
- '순운전자본회전율': (순운전자본회전율q, dict순운전자본회전율y),
218
- '재고자산회전율': (재고자산회전율q, dict재고자산회전율y),
219
- '순부채비율': (순부채비율q, dict순부채비율y),
220
- 'date': tools.set_data(d1, d6, d7, d8, d9), # ''값을 제거하고 리스트로 바꾼다.
221
- }
222
-
223
-
224
- def growth(code: str) -> dict:
225
- """
226
- 리턴값
227
- {'date': [각 유효한 값의 최근분기 값 리스트(ex- 2020/09)],
228
- '매출액증가율': (-14.37, {'2018/12': -24.56, '2019/12': -20.19, '2020/12': -12.64, '2021/12': 38.65, '2022/12': -8.56, '2023/12': nan}),
229
- '영업이익률': {'뉴프렉스': '17.36', '동일기연': '13.58', '비에이치': '16.23', '에이엔피': '-9.30', '이브이첨단소재': '-4.93'}}
230
-
231
- <매출액>
232
- 매출액은 어떤경우에도 성장하는 기업이 좋다.매출이 20%씩 늘어나는 종목은 유망한 종목
233
- <영업이익률>
234
- 영업이익률은 기업의 경쟁력척도로 경쟁사에 비해 높으면 경제적해자를 갖춘셈
235
- """
236
- c104y = myredis.C104(code, 'c104y')
237
- c106y = myredis.C106(code, 'c106y')
238
-
239
- _, dict매출액증가율y = c104y.find_with_yoy('매출액증가율')
240
-
241
- c104q = myredis.C104(code, 'c104q')
242
- d2, 매출액증가율q = c104q.latest_value_pop2('매출액증가율')
243
-
244
- logger.debug(f'매출액증가율 : {매출액증가율q} {dict매출액증가율y}')
245
-
246
- ################################################################
247
-
248
- # c106 에서 타 기업과 영업이익률 비교
249
- dict영업이익률 = c106y.find('영업이익률')
250
-
251
- return {
252
- '매출액증가율': (매출액증가율q, dict매출액증가율y),
253
- '영업이익률': dict영업이익률,
254
- 'date': [d2, ]}
255
-
256
-
257
- """
258
- - 각분기의 합이 연이 아닌 타이틀( sum_4q를 사용하면 안됨)
259
- '*(지배)당기순이익'
260
- '*(비지배)당기순이익'
261
- '장기차입금'
262
- '현금및예치금'
263
- '매도가능금융자산'
264
- '매도파생결합증권'
265
- '만기보유금융자산'
266
- '당기손익-공정가치측정금융부채'
267
- '당기손익인식(지정)금융부채'
268
- '단기매매금융자산'
269
- '단기매매금융부채'
270
- '예수부채'
271
- '차입부채'
272
- '기타부채'
273
- '보험계약부채(책임준비금)'
274
- '*CAPEX'
275
- 'ROE'
276
- """
277
-
278
- """
279
- - sum_4q를 사용해도 되는 타이틀
280
- '자산총계'
281
- '당기순이익'
282
- '유동자산'
283
- '유동부채'
284
- '비유동부채'
285
-
286
- '영업활동으로인한현금흐름'
287
- '재무활동으로인한현금흐름'
288
- 'ROIC'
289
- """
1
+ """red, mil, blue 3가지 분야에서 자료를 계산하여 리턴하는 함수 모음
2
+ """
3
+ import math
4
+
5
+ from analyser_hj3415 import tools
6
+ from utils_hj3415 import utils
7
+ from db_hj3415 import myredis
8
+
9
+ import logging
10
+
11
+ logger = logging.getLogger(__name__)
12
+ formatter = logging.Formatter('%(levelname)s: [%(name)s] %(message)s')
13
+ ch = logging.StreamHandler()
14
+ ch.setFormatter(formatter)
15
+ logger.addHandler(ch)
16
+ logger.setLevel(logging.WARNING)
17
+
18
+
19
+ # 주식을 통한 기대수익률 - 금리가 3%일 경우 두배인 6% 정도로 잡는다.
20
+ EXPECT_EARN = 0.06
21
+
22
+
23
+ def red(code: str) -> dict:
24
+ """
25
+ 리턴값
26
+ {
27
+ 'red_price': red_price,
28
+ '사업가치': 사업가치,
29
+ '재산가치': 재산가치,
30
+ '부채평가': 부채평가,
31
+ '발행주식수': 발행주식수,
32
+ 'date': [각 유효한 값의 년월값 리스트(ex- 2020/09)],
33
+ }
34
+ """
35
+ c103q = myredis.C103(code, 'c103재무상태표q')
36
+
37
+ d1, 지배주주당기순이익 = tools.calc당기순이익(code)
38
+ # print("지배주주당기순이익: ", 지배주주당기순이익)
39
+ d2, 유동자산 = tools.calc유동자산(code)
40
+ d3, 유동부채 = tools.calc유동부채(code)
41
+ d4, 부채평가 = tools.calc비유동부채(code)
42
+
43
+ c103q.page = 'c103재무상태표q'
44
+ d5, 투자자산 = c103q.latest_value_pop2('투자자산')
45
+ d6, 투자부동산 = c103q.latest_value_pop2('투자부동산')
46
+
47
+ # 사업가치 계산 - 지배주주지분 당기순이익 / 기대수익률
48
+ 사업가치 = round(utils.nan_to_zero(지배주주당기순이익) / EXPECT_EARN, 2)
49
+
50
+ # 재산가치 계산 - 유동자산 - (유동부채*1.2) + 고정자산중 투자자산
51
+ 재산가치 = round(유동자산 - (유동부채 * 1.2) + utils.nan_to_zero(투자자산) + utils.nan_to_zero(투자부동산), 2)
52
+
53
+ _, 발행주식수 = c103q.latest_value_pop2('발행주식수')
54
+ if math.isnan(발행주식수):
55
+ 발행주식수 = utils.to_int(myredis.C101(code).get_recent().get('발행주식'))
56
+ else:
57
+ 발행주식수 = 발행주식수 * 1000
58
+
59
+ try:
60
+ red_price = round(((사업가치 + 재산가치 - 부채평가) * 100000000) / 발행주식수)
61
+ except (ZeroDivisionError, ValueError) as e:
62
+ red_price = math.nan
63
+
64
+ logger.debug(f'Red Price : {red_price}원')
65
+ return {
66
+ 'red_price': red_price,
67
+ '지배주주당기순이익': 지배주주당기순이익,
68
+ '사업가치': 사업가치,
69
+ '유동자산': 유동자산,
70
+ '유동부채': 유동부채,
71
+ '투자자산': 투자자산,
72
+ '투자부동산': 투자부동산,
73
+ '재산가치': 재산가치,
74
+ '부채평가': 부채평가,
75
+ '발행주식수': 발행주식수,
76
+ 'date': tools.set_data(d1, d2, d3, d4, d5, d6), # ''값을 제거하고 리스트로 바꾼다.
77
+ }
78
+
79
+
80
+ def mil(code: str) -> dict:
81
+ """
82
+ 리턴값
83
+ {
84
+ '주주수익률': 주주수익률,
85
+ '이익지표': 이익지표,
86
+ '투자수익률': {'ROIC': roic, 'ROE': roe , 'ROE106': {}},
87
+ '가치지표': {'FCF': fcf_dict, 'PFCF': pfcf_dict, 'PCR': pcr_dict},
88
+ 'date': [각 유효한 값의 년월값 리스트(ex- 2020/09)],
89
+ }
90
+
91
+ - 재무활동현금흐름이 마이너스라는 것은 배당급 지급했거나, 자사주 매입했거나, 부채를 상환한 상태임.
92
+ - 반대는 채권자로 자금을 조달했거나 신주를 발행했다는 의미
93
+ <주주수익률> - 재무활동현금흐름/시가총액 => 5%이상인가?
94
+
95
+ 투하자본수익률(ROIC) 30%이상인가
96
+ ROE(자기자본이익률) 20%이상이면 아주 우수 다른 투자이익률과 비교해볼것 10%미만이면 별로...단, 부채비율을 확인해야함.
97
+
98
+ 이익지표 ...영업현금흐름이 순이익보다 많은가 - 결과값이 음수인가..
99
+
100
+ FCF는 영업현금흐름에서 자본적 지출(유·무형투자 비용)을 차감한 순수한 현금력이라 있다.
101
+ 그대로 자유롭게(Free) 사용할 있는 여윳돈을 뜻한다.
102
+ 잉여현금흐름이 플러스라면 미래의 투자나 채무상환에 쓸 재원이 늘어난 것이다.
103
+ CAPEX(Capital expenditures)는 미래의 이윤을 창출하기 위해 지출된 비용을 말한다.
104
+ 이는 기업이 고정자산을 구매하거나, 유효수명이 당회계년도를 초과하는 기존의 고정자산에 대한 투자에 돈이 사용될 때 발생한다.
105
+
106
+ 잉여현금흐름이 마이너스일때는 설비투자가 많은 시기라 주가가 약세이며 이후 설비투자 마무리되면서 주가가 상승할수 있다.
107
+ 주가는 잉여현금흐름이 증가할때 상승하는 경향이 있다.
108
+ fcf = 영업현금흐름 - capex
109
+
110
+ 가치지표평가
111
+ price to fcf 계산
112
+ https://www.investopedia.com/terms/p/pricetofreecashflow.asp
113
+ pcr보다 정확하게 주식의 가치를 평가할수 있음. 10배이하 추천
114
+ """
115
+ c103q = myredis.C103(code, 'c103현금흐름표q')
116
+ c104q = myredis.C104(code, 'c104q')
117
+ c106q = myredis.C106(code, 'c106q')
118
+
119
+ marketcap억 = tools.get_marketcap(code) / 100000000
120
+ logger.debug(f'{code} market cap: {marketcap억}')
121
+ fcf_dict = tools.findFCF(code)
122
+ pfcf_dict = tools.findPFCF(code)
123
+ d1, 지배주주당기순이익 = tools.calc당기순이익(code)
124
+
125
+ d2, 재무활동현금흐름 = c103q.sum_recent_4q('재무활동으로인한현금흐름')
126
+ d3, 영업활동현금흐름 = c103q.sum_recent_4q('영업활동으로인한현금흐름')
127
+
128
+ d4, roic = c104q.sum_recent_4q('ROIC')
129
+ d5, roe = c104q.latest_value_pop2('ROE')
130
+ roe106 = c106q.find('ROE')
131
+
132
+ _, pcr_dict = c104q.find_without_yoy('PCR')
133
+
134
+ try:
135
+ 주주수익률 = round((재무활동현금흐름 / marketcap억 * -100), 2)
136
+ 이익지표 = round((지배주주당기순이익 - 영업활동현금흐름) / marketcap억, 5)
137
+ except ZeroDivisionError:
138
+ 주주수익률 = math.nan
139
+ 이익지표 = math.nan
140
+
141
+ if math.isnan(주주수익률) or math.isnan(이익지표):
142
+ logger.warning(f'주주수익률: {주주수익률} 이익지표: {이익지표}')
143
+ logger.warning(f'재무활동현금흐름: {재무활동현금흐름} / 지배주주당기순이익: {지배주주당기순이익} / 영업활동현금흐름: {영업활동현금흐름}')
144
+
145
+ logger.debug(f'{code} fcf_dict : {fcf_dict}')
146
+ logger.debug(f"{code} market_cap : {marketcap억}")
147
+ logger.debug(f'{code} pfcf_dict : {pfcf_dict}')
148
+ logger.debug(f'{code} pcr_dict : {pcr_dict}')
149
+
150
+ return {
151
+ '주주수익률': 주주수익률,
152
+ '이익지표': 이익지표,
153
+ '투자수익률': {'ROIC': roic, 'ROE': roe, 'ROE106': roe106},
154
+ '가치지표': {'FCF': fcf_dict, 'PFCF': pfcf_dict, 'PCR': pcr_dict},
155
+ 'date': tools.set_data(d1, d2, d3, d4, d5),
156
+ }
157
+
158
+
159
+ def blue(code: str) -> dict:
160
+ """
161
+ 리턴값
162
+ {
163
+ 'date': [각 유효한 값의 최근분기 값 리스트(ex- 2020/09)],
164
+ '순부채비율': (29.99, {'2018/12': 19.45, '2019/12': 19.52, '2020/12': 12.07, '2021/12': 82.2, '2022/12': 29.99, '2023/12': nan}),
165
+ '순운전자본회전율': (1.04, {'2018/12': 21.91, '2019/12': 23.12, '2020/12': 5.88, '2021/12': 5.6, '2022/12': 6.04, '2023/12': nan}),
166
+ '유동비율': 64.29,
167
+ '이자보상배율': (-3.64, {'2018/12': 4.01, '2019/12': 1.3, '2020/12': -5.05, '2021/12': 0.56, '2022/12': -1.28, '2023/12': nan}),
168
+ '재고자산회전율': (1.66, {'2018/12': 12.41, '2019/12': 12.44, '2020/12': 9.18, '2021/12': 9.76, '2022/12': 8.79, '2023/12': nan})
169
+ }
170
+
171
+ <유동비율>
172
+ 100미만이면 주의하나 현금흐름창출력이 좋으면 괜찮을수 있다.
173
+ 만약 100%이하면 유동자산에 추정영업현금흐름을 더해서 다시계산해보아 기회를 준다.
174
+ <이자보상배율>
175
+ 이자보상배율 영업이익/이자비용으로 1이면 자금사정빡빡 5이상이면 양호
176
+ <순운전자금회전율>
177
+ 순운전자금 => 기업활동을 하기 위해 필요한 자금 (매출채권 + 재고자산 - 매입채무)
178
+ 순운전자본회전율은 매출액/순운전자본으로 일정비율이 유지되는것이 좋으며 너무 작아지면 순운전자본이 많아졌다는 의미로 재고나 외상이 쌓인다는 뜻
179
+ <재고자산회전율>
180
+ 재고자산회전율은 매출액/재고자산으로 회전율이 낮을수록 재고가 많다는 이야기이므로 불리 전년도등과 비교해서 큰차이 발생하면 알람.
181
+ 재고자산회전율이 작아지면 재고가 쌓인다는뜻
182
+ <순부채비율>
183
+ 부채비율은 업종마다 달라 일괄비교 어려우나 순부채 비율이 20%이하인것이 좋고 꾸준히 늘어나지 않는것이 좋다.
184
+ 순부채 비율이 30%이상이면 좋치 않다.
185
+ <매출액>
186
+ 매출액은 어떤경우에도 성장하는 기업이 좋다.매출이 20%씩 늘어나는 종목은 유망한 종목
187
+ <영업이익률>
188
+ 영업이익률은 기업의 경쟁력척도로 경쟁사에 비해 높으면 경제적해자를 갖춘셈
189
+ """
190
+
191
+ d1, 유동비율 = tools.calc유동비율(code, pop_count=3)
192
+ logger.debug(f'유동비율 {유동비율} / [{d1}]')
193
+
194
+ c104y = myredis.C104(code, 'c104y')
195
+ _, dict이자보상배율y = c104y.find_with_yoy('이자보상배율')
196
+ _, dict순운전자본회전율y = c104y.find_with_yoy('순운전자본회전율')
197
+ _, dict재고자산회전율y = c104y.find_with_yoy('재고자산회전율')
198
+ _, dict순부채비율y = c104y.find_with_yoy('순부채비율')
199
+
200
+ c104q = myredis.C104(code, 'c104q')
201
+ d6, 이자보상배율q = c104q.latest_value_pop2('이자보상배율')
202
+ d7, 순운전자본회전율q = c104q.latest_value_pop2('순운전자본회전율')
203
+ d8, 재고자산회전율q = c104q.latest_value_pop2('재고자산회전율')
204
+ d9, 순부채비율q = c104q.latest_value_pop2('순부채비율')
205
+
206
+ if len(dict이자보상배율y) == 0:
207
+ logger.warning(f'empty dict - 이자보상배율 : {이자보상배율q} {dict이자보상배율y}')
208
+
209
+ if len(dict순운전자본회전율y) == 0:
210
+ logger.warning(f'empty dict - 순운전자본회전율 : {순운전자본회전율q} {dict순운전자본회전율y}')
211
+
212
+ if len(dict재고자산회전율y) == 0:
213
+ logger.warning(f'empty dict - 재고자산회전율 : {재고자산회전율q} {dict재고자산회전율y}')
214
+
215
+ if len(dict순부채비율y) == 0:
216
+ logger.warning(f'empty dict - 순부채비율 : {순부채비율q} {dict순부채비율y}')
217
+
218
+ ################################################################
219
+
220
+ return {
221
+ '유동비율': 유동비율,
222
+ '이자보상배율': (이자보상배율q, dict이자보상배율y),
223
+ '순운전자본회전율': (순운전자본회전율q, dict순운전자본회전율y),
224
+ '재고자산회전율': (재고자산회전율q, dict재고자산회전율y),
225
+ '순부채비율': (순부채비율q, dict순부채비율y),
226
+ 'date': tools.set_data(d1, d6, d7, d8, d9), # ''값을 제거하고 리스트로 바꾼다.
227
+ }
228
+
229
+
230
+ def growth(code: str) -> dict:
231
+ """
232
+ 리턴값
233
+ {'date': [각 유효한 값의 최근분기 값 리스트(ex- 2020/09)],
234
+ '매출액증가율': (-14.37, {'2018/12': -24.56, '2019/12': -20.19, '2020/12': -12.64, '2021/12': 38.65, '2022/12': -8.56, '2023/12': nan}),
235
+ '영업이익률': {'뉴프렉스': '17.36', '동일기연': '13.58', '비에이치': '16.23', '에이엔피': '-9.30', '이브이첨단소재': '-4.93'}}
236
+
237
+ <매출액>
238
+ 매출액은 어떤경우에도 성장하는 기업이 좋다.매출이 20%씩 늘어나는 종목은 유망한 종목
239
+ <영업이익률>
240
+ 영업이익률은 기업의 경쟁력척도로 경쟁사에 비해 높으면 경제적해자를 갖춘셈
241
+ """
242
+ c104y = myredis.C104(code, 'c104y')
243
+ c106y = myredis.C106(code, 'c106y')
244
+
245
+ _, dict매출액증가율y = c104y.find_with_yoy('매출액증가율')
246
+
247
+ c104q = myredis.C104(code, 'c104q')
248
+ d2, 매출액증가율q = c104q.latest_value_pop2('매출액증가율')
249
+
250
+ logger.debug(f'매출액증가율 : {매출액증가율q} {dict매출액증가율y}')
251
+
252
+ ################################################################
253
+
254
+ # c106 에서 타 기업과 영업이익률 비교
255
+ dict영업이익률 = c106y.find('영업이익률')
256
+
257
+ return {
258
+ '매출액증가율': (매출액증가율q, dict매출액증가율y),
259
+ '영업이익률': dict영업이익률,
260
+ 'date': [d2, ]}
261
+
262
+
263
+ """
264
+ - 각분기의 합이 연이 아닌 타이틀(즉 sum_4q를 사용하면 안됨)
265
+ '*(지배)당기순이익'
266
+ '*(비지배)당기순이익'
267
+ '장기차입금'
268
+ '현금및예치금'
269
+ '매도가능금융자산'
270
+ '매도파생결합증권'
271
+ '만기보유금융자산'
272
+ '당기손익-공정가치측정금융부채'
273
+ '당기손익인식(지정)금융부채'
274
+ '단기매매금융자산'
275
+ '단기매매금융부채'
276
+ '예수부채'
277
+ '차입부채'
278
+ '기타부채'
279
+ '보험계약부채(책임준비금)'
280
+ '*CAPEX'
281
+ 'ROE'
282
+ """
283
+
284
+ """
285
+ - sum_4q를 사용해도 되는 타이틀
286
+ '자산총계'
287
+ '당기순이익'
288
+ '유동자산'
289
+ '유동부채'
290
+ '비유동부채'
291
+
292
+ '영업활동으로인한현금흐름'
293
+ '재무활동으로인한현금흐름'
294
+ 'ROIC'
295
+ """