analyser_hj3415 2.6.8__py2.py3-none-any.whl → 2.7.1__py2.py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
File without changes
@@ -0,0 +1,113 @@
1
+ import yfinance as yf
2
+ import numpy as np
3
+ import pandas as pd
4
+ from sklearn.preprocessing import MinMaxScaler
5
+ from tensorflow.keras.models import Sequential
6
+ from tensorflow.keras.layers import LSTM, Dense, Dropout
7
+ import matplotlib.pyplot as plt
8
+
9
+ # 1. 데이터 다운로드 (애플 주식 데이터를 사용)
10
+ #stock_data = yf.download('AAPL', start='2020-01-01', end='2023-01-01')
11
+ # 삼성전자 주식 데이터 가져오기 (KOSPI 상장)
12
+ #stock_data = yf.download('005930.KS', start='2019-01-01', end='2024-10-10')
13
+ # 크래프톤 주식 데이터 가져오기 (KOSPI 상장)
14
+ #stock_data = yf.download('259960.KS', start='2020-01-01', end='2024-10-08')
15
+ # 하이닉스 주식 데이터 가져오기 (KOSPI 상장)
16
+ stock_data = yf.download('000660.KS', start='2019-01-01', end='2024-10-10')
17
+
18
+
19
+ # 2. 필요한 열만 선택 (종가만 사용)
20
+ data = stock_data['Close'].values.reshape(-1, 1)
21
+
22
+ # 3. 데이터 정규화 (0과 1 사이로 스케일링)
23
+ scaler = MinMaxScaler(feature_range=(0, 1))
24
+ scaled_data = scaler.fit_transform(data)
25
+
26
+ # 4. 학습 데이터 생성
27
+ # 주가 데이터를 80%는 학습용, 20%는 테스트용으로 분리하는 코드
28
+ train_size = int(len(scaled_data) * 0.8)
29
+ train_data = scaled_data[:train_size]
30
+ test_data = scaled_data[train_size:]
31
+
32
+
33
+ # 학습 데이터에 대한 입력(X)과 출력(y)를 생성
34
+ def create_dataset(data, time_step=60):
35
+ X, y = [], []
36
+ for i in range(len(data) - time_step):
37
+ X.append(data[i:i + time_step, 0])
38
+ y.append(data[i + time_step, 0])
39
+ return np.array(X), np.array(y)
40
+
41
+
42
+ X_train, y_train = create_dataset(train_data)
43
+ X_test, y_test = create_dataset(test_data)
44
+
45
+ # LSTM 모델 입력을 위해 데이터를 3차원으로 변환
46
+ X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
47
+ X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)
48
+
49
+ # 5. LSTM 모델 생성
50
+ model = Sequential()
51
+ model.add(LSTM(units=200, return_sequences=True, input_shape=(X_train.shape[1], 1)))
52
+ model.add(Dropout(0.2))
53
+ model.add(LSTM(units=100, return_sequences=False))
54
+ model.add(Dropout(0.2))
55
+ model.add(Dense(units=50))
56
+ model.add(Dropout(0.3))
57
+ model.add(Dense(units=1))
58
+
59
+ # 6. 모델 컴파일 및 학습
60
+ model.compile(optimizer='adam', loss='mean_squared_error')
61
+ model.fit(X_train, y_train, epochs=20, batch_size=32)
62
+
63
+ # 7. 테스트 데이터 예측
64
+ predictions = model.predict(X_test)
65
+ predictions = scaler.inverse_transform(predictions) # 스케일링 복원
66
+
67
+ # 8. 미래 30일 예측
68
+ # 마지막 60일간의 데이터를 기반으로 미래 30일을 예측
69
+ future_days = 30
70
+ last_60_days = test_data[-60:]
71
+ last_60_days = last_60_days.reshape(1, -1, 1)
72
+
73
+ future_predictions = []
74
+ for _ in range(future_days):
75
+ predicted_price = model.predict(last_60_days)
76
+ future_predictions.append(predicted_price[0][0])
77
+
78
+ # 예측값을 다시 입력으로 사용하여 새로운 예측을 만듦
79
+ predicted_price_reshaped = np.reshape(predicted_price, (1, 1, 1)) # 3D 배열로 변환
80
+ last_60_days = np.append(last_60_days[:, 1:, :], predicted_price_reshaped, axis=1)
81
+
82
+ # 예측된 주가를 다시 스케일링 복원
83
+ future_predictions = np.array(future_predictions).reshape(-1, 1)
84
+ future_predictions = scaler.inverse_transform(future_predictions)
85
+
86
+ # 9. 날짜 생성 (미래 예측 날짜)
87
+ last_date = stock_data.index[-1]
88
+ future_dates = pd.date_range(last_date, periods=future_days + 1).tolist()[1:]
89
+
90
+ # 10. 시각화
91
+ plt.figure(figsize=(10, 6))
92
+
93
+ # 실제 주가
94
+ plt.plot(stock_data.index, stock_data['Close'], label='Actual Price')
95
+
96
+ # 미래 주가 예측
97
+ plt.plot(future_dates, future_predictions, label='Future Predicted Price', linestyle='--')
98
+
99
+ plt.xlabel('Date')
100
+ plt.ylabel('Stock Price')
101
+ plt.legend()
102
+ plt.title('Apple Stock Price Prediction with LSTM')
103
+ plt.show()
104
+
105
+ # 8. 시각화
106
+ plt.figure(figsize=(10, 6))
107
+ plt.plot(stock_data.index[train_size + 60:], data[train_size + 60:], label='Actual Price')
108
+ plt.plot(stock_data.index[train_size + 60:], predictions, label='Predicted Price')
109
+ plt.xlabel('Date')
110
+ plt.ylabel('Price')
111
+ plt.legend()
112
+ plt.title('Apple Stock Price Prediction with LSTM')
113
+ plt.show()
@@ -0,0 +1,58 @@
1
+ # prophet 사용 공부
2
+
3
+ import yfinance as yf
4
+ import pandas as pd
5
+ from prophet import Prophet
6
+ import matplotlib.pyplot as plt # Matplotlib 수동 임포트
7
+
8
+
9
+ # 애플 주식 데이터를 다운로드
10
+ #stock_data = yf.download('AAPL', start='2020-01-01', end='2024-10-09')
11
+ # 삼성전자 주식 데이터 가져오기 (KOSPI 상장)
12
+ #stock_data = yf.download('005930.KS', start='2020-01-01', end='2024-08-01')
13
+ # 크래프톤 주식 데이터 가져오기 (KOSPI 상장)
14
+ #stock_data = yf.download('259960.KS', start='2020-01-01', end='2024-10-08')
15
+ # 하이닉스 주식 데이터 가져오기 (KOSPI 상장)
16
+ stock_data = yf.download('000660.KS', start='2020-01-01', end='2024-10-08')
17
+
18
+
19
+ # Prophet이 사용할 수 있도록 데이터 준비
20
+ df = stock_data[['Close', 'Volume']].reset_index()
21
+ df.columns = ['ds', 'y', 'volume'] # Prophet의 형식에 맞게 열 이름 변경
22
+
23
+ from sklearn.preprocessing import StandardScaler
24
+
25
+ # 추가 변수를 정규화
26
+ scaler = StandardScaler()
27
+ df['volume_scaled'] = scaler.fit_transform(df[['volume']])
28
+
29
+ # Prophet 모델 생성 및 학습
30
+ model = Prophet()
31
+
32
+ # 정규화된 'volume_scaled' 변수를 외부 변수로 추가
33
+ model.add_regressor('volume_scaled')
34
+
35
+ model.fit(df)
36
+
37
+ # 향후 180일 동안의 주가 예측
38
+ future = model.make_future_dataframe(periods=180)
39
+
40
+ # 미래 데이터에 거래량 추가 (평균 거래량을 사용해 정규화)
41
+ future_volume = pd.DataFrame({'volume': [stock_data['Volume'].mean()] * len(future)})
42
+ future['volume_scaled'] = scaler.transform(future_volume[['volume']])
43
+
44
+
45
+ forecast = model.predict(future)
46
+
47
+
48
+
49
+ # 예측 결과 출력
50
+ print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())
51
+
52
+ # 예측 결과 시각화 (Matplotlib 사용)
53
+ fig = model.plot(forecast)
54
+
55
+ # 추세 및 계절성 시각화
56
+ fig2 = model.plot_components(forecast)
57
+
58
+ plt.show() # 시각화 창 띄우기
@@ -0,0 +1,50 @@
1
+ import yfinance as yf
2
+ import numpy as np
3
+ import pandas as pd
4
+ from sklearn.model_selection import train_test_split
5
+ from sklearn.linear_model import LinearRegression
6
+ import matplotlib.pyplot as plt
7
+
8
+ # 1. 데이터 다운로드 (애플 주식 데이터를 사용)
9
+ # 데이터 기간: 2020년 1월 1일부터 2023년 1월 1일까지
10
+ #stock_data = yf.download('AAPL', start='2020-01-01', end='2023-01-01')
11
+ # 삼성전자 주식 데이터 가져오기 (KOSPI 상장)
12
+ stock_data = yf.download('005930.KS', start='2020-01-01', end='2024-08-01')
13
+ # 크래프톤 주식 데이터 가져오기 (KOSPI 상장)
14
+ #stock_data = yf.download('259960.KS', start='2020-01-01', end='2024-10-08')
15
+
16
+ # 2. 필요한 열만 선택 (종가만 사용)
17
+ df = stock_data[['Close']]
18
+
19
+ # 3. 주가 데이터를 시계열 데이터로 변환하여 예측
20
+ # 일자를 숫자로 변환 (날짜 자체는 예측 모델에 사용하기 어렵기 때문에 숫자로 변환)
21
+ df['Date'] = np.arange(len(df))
22
+
23
+ # 4. 독립 변수(X)와 종속 변수(y) 분리
24
+ X = df[['Date']] # 독립 변수 (날짜)
25
+ y = df['Close'] # 종속 변수 (주가)
26
+
27
+ # 5. 데이터를 학습용과 테스트용으로 분리 (80% 학습, 20% 테스트)
28
+ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
29
+
30
+ # 6. 선형 회귀 모델 생성 및 학습
31
+ model = LinearRegression()
32
+ model.fit(X_train, y_train)
33
+
34
+ # 7. 테스트 데이터를 사용하여 예측 수행
35
+ y_pred = model.predict(X_test)
36
+
37
+ # 8. 결과 시각화
38
+ plt.figure(figsize=(10, 6))
39
+ plt.scatter(X_train, y_train, color='blue', label='Training data') # 학습 데이터
40
+ plt.scatter(X_test, y_test, color='green', label='Test data') # 실제 테스트 데이터
41
+ plt.plot(X_test, y_pred, color='red', label='Predicted price') # 예측된 주가
42
+ plt.xlabel('Date (numeric)')
43
+ plt.ylabel('Stock Price (Close)')
44
+ plt.legend()
45
+ plt.title('Apple Stock Price Prediction')
46
+ plt.show()
47
+
48
+ # 9. 모델 평가 (R^2 스코어)
49
+ r2_score = model.score(X_test, y_test)
50
+ print(f"모델의 R^2 스코어: {r2_score:.2f}")
@@ -0,0 +1,39 @@
1
+ # 필요한 라이브러리 불러오기
2
+ import numpy as np
3
+ from sklearn.linear_model import LinearRegression
4
+ from sklearn.model_selection import train_test_split
5
+ import matplotlib.pyplot as plt
6
+
7
+ # 1. 데이터 준비 (주택 면적, 가격)
8
+ # 예를 들어 면적에 따른 주택 가격 데이터 (면적: X, 가격: y)
9
+ X = np.array([[1500], [2000], [2500], [3000], [3500], [4000]]) # 면적 (단위: square feet)
10
+ y = np.array([300000, 400000, 500000, 600000, 700000, 800000]) # 가격 (단위: dollars)
11
+
12
+ # 2. 학습 데이터와 테스트 데이터를 나누기 (80% 학습, 20% 테스트)
13
+ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
14
+
15
+ # 3. 선형 회귀 모델 생성
16
+ model = LinearRegression()
17
+
18
+ # 4. 모델을 학습시키기 (train 데이터를 사용)
19
+ model.fit(X_train, y_train)
20
+
21
+ # 5. 테스트 데이터로 예측 수행
22
+ y_pred = model.predict(X_test)
23
+
24
+ # 6. 예측 결과 출력
25
+ print("실제 값:", y_test)
26
+ print("예측 값:", y_pred)
27
+
28
+ # 7. 시각화를 통해 학습 결과 확인
29
+ plt.scatter(X_train, y_train, color='blue', label='Training data') # 학습 데이터
30
+ plt.scatter(X_test, y_test, color='green', label='Test data') # 실제 값
31
+ plt.plot(X_test, y_pred, color='red', label='Prediction') # 예측된 값
32
+ plt.xlabel('House Size (square feet)')
33
+ plt.ylabel('Price (dollars)')
34
+ plt.legend()
35
+ plt.show()
36
+
37
+ # 9. 모델 평가 (R^2 스코어)
38
+ r2_score = model.score(X_test, y_test)
39
+ print(f"모델의 R^2 스코어: {r2_score:.2f}")
@@ -5,7 +5,6 @@ import copy
5
5
  from typing import Tuple
6
6
 
7
7
  from db_hj3415 import myredis, mymongo
8
- from analyser_hj3415.analysers import eval
9
8
  from utils_hj3415 import utils
10
9
 
11
10
  import logging
@@ -18,43 +17,6 @@ logger.addHandler(ch)
18
17
  logger.setLevel(logging.WARNING)
19
18
 
20
19
 
21
- def cal_deviation(v1: float, v2: float) -> float:
22
- """
23
- 괴리율 구하는 공식
24
- :param v1:
25
- :param v2:
26
- :return:
27
- """
28
- try:
29
- deviation = abs((v1 - v2) / v1) * 100
30
- except ZeroDivisionError:
31
- deviation = math.nan
32
- return deviation
33
-
34
-
35
- def red(code: str, expect_earn: float) -> int:
36
- """red price와 최근 주가의 괴리율 파악
37
-
38
- Returns:
39
- int : 주가와 red price 비교한 괴리율
40
- """
41
- try:
42
- recent_price = utils.to_int(myredis.C101(code).get_recent()['주가'])
43
- except KeyError:
44
- recent_price = float('nan')
45
- return 0
46
-
47
- red_price = eval.red(code, expect_earn)['red_price']
48
- deviation = cal_deviation(recent_price, red_price)
49
- if red_price < 0 or (recent_price >= red_price):
50
- score = 0
51
- else:
52
- score = math.log10(deviation + 1) * 33 # desmos그래프상 33이 제일 적당한듯(최대100점에 가깝게)
53
-
54
- #print(f"최근주가 : {recent_price}", f"red가격 : {red_price}", f"괴리율 : {utils.to_int(deviation)}", f"score : {utils.to_int(score)}")
55
-
56
- return utils.to_int(score)
57
-
58
20
 
59
21
  def mil(code: str, expect_earn: float) -> Tuple[int, int, int, int]:
60
22
  """
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: analyser_hj3415
3
- Version: 2.6.8
3
+ Version: 2.7.1
4
4
  Summary: Stock analyser and database processing programs
5
5
  Author-email: Hyungjin Kim <hj3415@gmail.com>
6
6
  Description-Content-Type: text/markdown
7
7
  Classifier: License :: OSI Approved :: MIT License
8
- Requires-Dist: utils-hj3415>=2.8.0
9
- Requires-Dist: db-hj3415>=3.8.1
8
+ Requires-Dist: utils-hj3415>=2.9.2
9
+ Requires-Dist: db-hj3415>=4.0.3
10
10
  Project-URL: Home, https://www.hyungjin.kr
11
11
 
12
12
  ### analyser-hj3415
@@ -0,0 +1,16 @@
1
+ analyser_hj3415/.DS_Store,sha256=qr9-0FPn5CFKe6kEu8_dWCNhzQ0sN7bwQgffKsaJEEo,6148
2
+ analyser_hj3415/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ analyser_hj3415/cli.py,sha256=hJMUKBMeVr42QFdlCRpmMDPAUC1xX-OiZdDdxILmA9Y,10945
4
+ analyser_hj3415/eval.py,sha256=LNOa6ryDuC1lylEh5dNjOUvtS6yD9qdlGadKugZ9S-k,38258
5
+ analyser_hj3415/workroom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ analyser_hj3415/workroom/lstm.py,sha256=O_VYURGNsLw6q_7Yi0nH4Y6nKbVBwzMojDN446cyJKM,4078
7
+ analyser_hj3415/workroom/myprophet.py,sha256=xGbs4_cCeSNAX62H6rG-bUz6_rUOyO6787WAjLexMkw,1855
8
+ analyser_hj3415/workroom/mysklearn.py,sha256=wJXKz5MqqTzADdG2mqRMMzc_G9RzwYjj5_j4gyOopxQ,2030
9
+ analyser_hj3415/workroom/mysklearn2.py,sha256=1lIy6EWEQHkOzDS-av8U0zQH6DuCLKWMI73dnJx5KRs,1495
10
+ analyser_hj3415/workroom/score.py,sha256=P6nHBJYmyhigGtT4qna4BmNtvt4B93b7SKyzdstJK24,17376
11
+ analyser_hj3415/workroom/trash.py,sha256=zF-W0piqkGr66UP6-iybo9EXh2gO0RP6R1FnIpsGkl8,12262
12
+ analyser_hj3415-2.7.1.dist-info/entry_points.txt,sha256=ZfjPnJuH8SzvhE9vftIPMBIofsc65IAWYOhqOC_L5ck,65
13
+ analyser_hj3415-2.7.1.dist-info/LICENSE,sha256=QVKTp0dTnB5xG8RLgG17LwSWCKNEzYoVVM6KjoCPKc0,1079
14
+ analyser_hj3415-2.7.1.dist-info/WHEEL,sha256=Sgu64hAMa6g5FdzHxXv9Xdse9yxpGGMeagVtPMWpJQY,99
15
+ analyser_hj3415-2.7.1.dist-info/METADATA,sha256=vuoa55U72kpqBBesew0x7x-llcXXEruM9Nzqr--yjmo,6417
16
+ analyser_hj3415-2.7.1.dist-info/RECORD,,
@@ -1,276 +0,0 @@
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
- def red(code: str, expect_earn: float) -> dict:
20
- """
21
- 리턴값
22
- {
23
- 'red_price': red_price,
24
- '사업가치': 사업가치,
25
- '재산가치': 재산가치,
26
- '부채평가': 부채평가,
27
- '발행주식수': 발행주식수,
28
- 'date': [각 유효한 값의 년월값 리스트(ex- 2020/09)],
29
- }
30
- """
31
- c103q = myredis.C103(code, 'c103재무상태표q')
32
-
33
- d1, 지배주주당기순이익 = tools.calc당기순이익(code)
34
- # print("지배주주당기순이익: ", 지배주주당기순이익)
35
- d2, 유동자산 = tools.calc유동자산(code)
36
- d3, 유동부채 = tools.calc유동부채(code)
37
- d4, 부채평가 = tools.calc비유동부채(code)
38
-
39
- c103q.page = 'c103재무상태표q'
40
- d5, 투자자산 = c103q.latest_value_pop2('투자자산')
41
- d6, 투자부동산 = c103q.latest_value_pop2('투자부동산')
42
-
43
- # 사업가치 계산 - 지배주주지분 당기순이익 / 기대수익률
44
- 사업가치 = round(utils.nan_to_zero(지배주주당기순이익) / expect_earn, 2)
45
-
46
- # 재산가치 계산 - 유동자산 - (유동부채*1.2) + 고정자산중 투자자산
47
- 재산가치 = round(유동자산 - (유동부채 * 1.2) + utils.nan_to_zero(투자자산) + utils.nan_to_zero(투자부동산), 2)
48
-
49
- _, 발행주식수 = c103q.latest_value_pop2('발행주식수')
50
- if math.isnan(발행주식수):
51
- 발행주식수 = utils.to_int(myredis.C101(code).get_recent().get('발행주식'))
52
- else:
53
- 발행주식수 = 발행주식수 * 1000
54
-
55
- try:
56
- red_price = round(((사업가치 + 재산가치 - 부채평가) * 100000000) / 발행주식수)
57
- except (ZeroDivisionError, ValueError) as e:
58
- red_price = math.nan
59
-
60
- logger.debug(f'Red Price : {red_price}원')
61
- return {
62
- 'red_price': red_price,
63
- '지배주주당기순이익': 지배주주당기순이익,
64
- '사업가치': 사업가치,
65
- '유동자산': 유동자산,
66
- '유동부채': 유동부채,
67
- '투자자산': 투자자산,
68
- '투자부동산': 투자부동산,
69
- '재산가치': 재산가치,
70
- '부채평가': 부채평가,
71
- '발행주식수': 발행주식수,
72
- 'EXPECT_EARN': expect_earn,
73
- 'date': tools.set_data(d1, d2, d3, d4, d5, d6), # ''값을 제거하고 리스트로 바꾼다.
74
- }
75
-
76
-
77
- def mil(code: str) -> dict:
78
- """
79
- 리턴값
80
- {
81
- '주주수익률': 주주수익률,
82
- '이익지표': 이익지표,
83
- '투자수익률': {'ROIC': roic, 'ROE': roe , 'ROE106': {}},
84
- '가치지표': {'FCF': fcf_dict, 'PFCF': pfcf_dict, 'PCR': pcr_dict},
85
- 'date': [각 유효한 값의 년월값 리스트(ex- 2020/09)],
86
- }
87
- """
88
- c103q = myredis.C103(code, 'c103현금흐름표q')
89
- c104q = myredis.C104(code, 'c104q')
90
- c106q = myredis.C106(code, 'c106q')
91
-
92
- marketcap억 = tools.get_marketcap(code) / 100000000
93
- logger.debug(f'{code} market cap: {marketcap억}')
94
- fcf_dict = tools.findFCF(code)
95
- pfcf_dict = tools.findPFCF(code)
96
- d1, 지배주주당기순이익 = tools.calc당기순이익(code)
97
-
98
- d2, 재무활동현금흐름 = c103q.sum_recent_4q('재무활동으로인한현금흐름')
99
- d3, 영업활동현금흐름 = c103q.sum_recent_4q('영업활동으로인한현금흐름')
100
-
101
- d4, roic = c104q.sum_recent_4q('ROIC')
102
- _, roic_dict = c104q.find_without_yoy('ROIC')
103
- d5, roe = c104q.latest_value_pop2('ROE')
104
- roe106 = c106q.find('ROE')
105
- d6, roa = c104q.latest_value_pop2('ROA')
106
-
107
- _, pcr_dict = c104q.find_without_yoy('PCR')
108
-
109
- try:
110
- 주주수익률 = round((재무활동현금흐름 / marketcap억 * -100), 2)
111
- 이익지표 = round(((지배주주당기순이익 - 영업활동현금흐름) / marketcap억) * 100, 2)
112
- except ZeroDivisionError:
113
- 주주수익률 = math.nan
114
- 이익지표 = math.nan
115
-
116
- if math.isnan(주주수익률) or math.isnan(이익지표):
117
- logger.warning(f'주주수익률: {주주수익률} 이익지표: {이익지표}')
118
- logger.warning(f'재무활동현금흐름: {재무활동현금흐름} / 지배주주당기순이익: {지배주주당기순이익} / 영업활동현금흐름: {영업활동현금흐름}')
119
-
120
- logger.debug(f'{code} fcf_dict : {fcf_dict}')
121
- logger.debug(f"{code} market_cap : {marketcap억}")
122
- logger.debug(f'{code} pfcf_dict : {pfcf_dict}')
123
- logger.debug(f'{code} pcr_dict : {pcr_dict}')
124
-
125
- return {
126
- '주주수익률': 주주수익률,
127
- '이익지표': 이익지표,
128
- '재무활동현금흐름': 재무활동현금흐름,
129
- '지배주주당기순이익': 지배주주당기순이익,
130
- '영업활동현금흐름': 영업활동현금흐름,
131
- '시가총액억': marketcap억,
132
- '투자수익률': {'ROIC': roic, 'ROIC_dict': roic_dict, 'ROE': roe, 'ROE106': roe106, 'ROA': roa},
133
- '가치지표': {'FCF': fcf_dict, 'PFCF': pfcf_dict, 'PCR': pcr_dict},
134
- 'date': tools.set_data(d1, d2, d3, d4, d5, d6),
135
- }
136
-
137
-
138
- def blue(code: str) -> dict:
139
- """
140
- 리턴값
141
- {
142
- 'date': [각 유효한 값의 최근분기 값 리스트(ex- 2020/09)],
143
- '순부채비율': (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}),
144
- '순운전자본회전율': (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}),
145
- '유동비율': 64.29,
146
- '이자보상배율': (-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}),
147
- '재고자산회전율': (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})
148
- }
149
-
150
- <유동비율>
151
- 100미만이면 주의하나 현금흐름창출력이 좋으면 괜찮을수 있다.
152
- 만약 100%이하면 유동자산에 추정영업현금흐름을 더해서 다시계산해보아 기회를 준다.
153
- <이자보상배율>
154
- 이자보상배율 영업이익/이자비용으로 1이면 자금사정빡빡 5이상이면 양호
155
- <순운전자금회전율>
156
- 순운전자금 => 기업활동을 하기 위해 필요한 자금 (매출채권 + 재고자산 - 매입채무)
157
- 순운전자본회전율은 매출액/순운전자본으로 일정비율이 유지되는것이 좋으며 너무 작아지면 순운전자본이 많아졌다는 의미로 재고나 외상이 쌓인다는 뜻
158
- <재고자산회전율>
159
- 재고자산회전율은 매출액/재고자산으로 회전율이 낮을수록 재고가 많다는 이야기이므로 불리 전년도등과 비교해서 큰차이 발생하면 알람.
160
- 재고자산회전율이 작아지면 재고가 쌓인다는뜻
161
- <순부채비율>
162
- 부채비율은 업종마다 달라 일괄비교 어려우나 순부채 비율이 20%이하인것이 좋고 꾸준히 늘어나지 않는것이 좋다.
163
- 순부채 비율이 30%이상이면 좋치 않다.
164
- <매출액>
165
- 매출액은 어떤경우에도 성장하는 기업이 좋다.매출이 20%씩 늘어나는 종목은 유망한 종목
166
- <영업이익률>
167
- 영업이익률은 기업의 경쟁력척도로 경쟁사에 비해 높으면 경제적해자를 갖춘셈
168
- """
169
-
170
- d1, 유동비율 = tools.calc유동비율(code, pop_count=3)
171
- logger.debug(f'유동비율 {유동비율} / [{d1}]')
172
-
173
- c104y = myredis.C104(code, 'c104y')
174
- c106q_재고자산회전율 = myredis.C106.make_like_c106(code, 'c104q', '재고자산회전율')
175
- _, dict이자보상배율y = c104y.find_without_yoy('이자보상배율')
176
- _, dict순운전자본회전율y = c104y.find_without_yoy('순운전자본회전율')
177
- _, dict재고자산회전율y = c104y.find_without_yoy('재고자산회전율')
178
- _, dict순부채비율y = c104y.find_without_yoy('순부채비율')
179
-
180
- c104q = myredis.C104(code, 'c104q')
181
- d6, 이자보상배율q = c104q.latest_value_pop2('이자보상배율')
182
- d7, 순운전자본회전율q = c104q.latest_value_pop2('순운전자본회전율')
183
- d8, 재고자산회전율q = c104q.latest_value_pop2('재고자산회전율')
184
- d9, 순부채비율q = c104q.latest_value_pop2('순부채비율')
185
-
186
- if len(dict이자보상배율y) == 0:
187
- logger.warning(f'empty dict - 이자보상배율 : {이자보상배율q} {dict이자보상배율y}')
188
-
189
- if len(dict순운전자본회전율y) == 0:
190
- logger.warning(f'empty dict - 순운전자본회전율 : {순운전자본회전율q} {dict순운전자본회전율y}')
191
-
192
- if len(dict재고자산회전율y) == 0:
193
- logger.warning(f'empty dict - 재고자산회전율 : {재고자산회전율q} {dict재고자산회전율y}')
194
-
195
- if len(dict순부채비율y) == 0:
196
- logger.warning(f'empty dict - 순부채비율 : {순부채비율q} {dict순부채비율y}')
197
-
198
- ################################################################
199
-
200
- return {
201
- '유동비율': 유동비율,
202
- '이자보상배율': (이자보상배율q, dict이자보상배율y),
203
- '순운전자본회전율': (순운전자본회전율q, dict순운전자본회전율y),
204
- '재고자산회전율': (재고자산회전율q, dict재고자산회전율y),
205
- 'c106q_재고자산회전율': c106q_재고자산회전율,
206
- '순부채비율': (순부채비율q, dict순부채비율y),
207
- 'date': tools.set_data(d1, d6, d7, d8, d9), # ''값을 제거하고 리스트로 바꾼다.
208
- }
209
-
210
-
211
- def growth(code: str) -> dict:
212
- """
213
- 리턴값
214
- {'date': [각 유효한 값의 최근분기 값 리스트(ex- 2020/09)],
215
- '매출액증가율': (-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}),
216
- '영업이익률': {'뉴프렉스': '17.36', '동일기연': '13.58', '비에이치': '16.23', '에이엔피': '-9.30', '이브이첨단소재': '-4.93'}}
217
-
218
- <매출액>
219
- 매출액은 어떤경우에도 성장하는 기업이 좋다.매출이 20%씩 늘어나는 종목은 유망한 종목
220
- <영업이익률>
221
- 영업이익률은 기업의 경쟁력척도로 경쟁사에 비해 높으면 경제적해자를 갖춘셈
222
- """
223
- c104y = myredis.C104(code, 'c104y')
224
- c106y = myredis.C106(code, 'c106y')
225
-
226
- _, dict매출액증가율y = c104y.find_without_yoy('매출액증가율')
227
-
228
- c104q = myredis.C104(code, 'c104q')
229
- d2, 매출액증가율q = c104q.latest_value_pop2('매출액증가율')
230
-
231
- logger.debug(f'매출액증가율 : {매출액증가율q} {dict매출액증가율y}')
232
-
233
- ################################################################
234
-
235
- # c106 에서 타 기업과 영업이익률 비교
236
- dict영업이익률 = c106y.find('영업이익률')
237
-
238
- return {
239
- '매출액증가율': (매출액증가율q, dict매출액증가율y),
240
- '영업이익률': dict영업이익률,
241
- 'date': [d2, ]}
242
-
243
-
244
- """
245
- - 각분기의 합이 연이 아닌 타이틀(즉 sum_4q를 사용하면 안됨)
246
- '*(지배)당기순이익'
247
- '*(비지배)당기순이익'
248
- '장기차입금'
249
- '현금및예치금'
250
- '매도가능금융자산'
251
- '매도파생결합증권'
252
- '만기보유금융자산'
253
- '당기손익-공정가치측정금융부채'
254
- '당기손익인식(지정)금융부채'
255
- '단기매매금융자산'
256
- '단기매매금융부채'
257
- '예수부채'
258
- '차입부채'
259
- '기타부채'
260
- '보험계약부채(책임준비금)'
261
- '*CAPEX'
262
- 'ROE'
263
- """
264
-
265
- """
266
- - sum_4q를 사용해도 되는 타이틀
267
- '자산총계'
268
- '당기순이익'
269
- '유동자산'
270
- '유동부채'
271
- '비유동부채'
272
-
273
- '영업활동으로인한현금흐름'
274
- '재무활동으로인한현금흐름'
275
- 'ROIC'
276
- """