투자하고 있는 종목에 대한 관리가 부족하다고 생각했습니다.
그래서 인터넷을 뒤져서 최근에 투자로 경제적 자유를 이루었고, 책까지 쓰신분의 주식관리 시트 양식을 찾았습니다.
대략 비슷하게 만들었고, 제 경험과 기호에 맞게 일부 추가, 삭제, 수정하였습니다.
대략 이렇게 생겼습니다.(첨부파일로 올렸으니 필요하신 분은 다운받아 가세요)
여기서 노란색 부분을 작성하기가 상당히 까다로웠습니다.
제가 투자하고 있는 종목이 대략 11개 되는데, 11번이나 같은 짓을 반복하기에는 제 게으름이 용서하질 않네요.
그래서 노란색 부분은 자동으로 채워지도록 파이썬으로 코드를 작성했습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
|
import requests
import pandas as pd
from openpyxl import load_workbook
from pykrx import stock
#데이터를 넣는 함수
def input_stock_data(code, pre_y, this_q, wb):
code = code
name = stock.get_market_ticker_name(code)
print(name)
pre_y = pre_y
this_q = this_q
#재무제표 Page
url = 'https://comp.fnguide.com/SVO2/ASP/SVD_Finance.asp?pGB=1&gicode=A'+ code + \
'&cID=&MenuYn=Y&ReportGB=&NewMenuID=103&stkGb=701'
page = requests.get(url)
tables = pd.read_html(page.text)
# 년도별 매출액, 영업이익, 당기순이익 구하기
table0 = tables[0]
df0 = table0.set_index(keys=['IFRS(연결)']) #인덱스를 매출액, 영업이익,... 이렇게 변경
items = ['매출액', '영업이익', '당기순이익']
df0 = df0.loc[items]
df0 = df0[pre_y]
# 분기별 매출액, 영업이익, 당기순이익 구하기
table1 = tables[1]
df1 = table1.set_index(keys=['IFRS(연결)'])
items1 = ['매출액', '영업이익', '당기순이익']
df1 = df1.loc[items1]
df1 = df1[this_q]
# 연도별, 분기별 매출액, 영업이익, 당기순이익
df_t = pd.merge(df0, df1, how='outer', on='IFRS(연결)')
#영업이익률, 순이익률
df_t.loc['영업이익률', :] = df_t.loc['영업이익', :] / df_t.loc['매출액', :]
df_t.loc['순이익률', :] = df_t.loc['당기순이익', :] / df_t.loc['매출액', :]
# 엽업활동으로 인한 현금흐름
table2 = tables[4]
df2 = table2.set_index(keys=['IFRS(연결)'])
df2 = df2.loc[['영업활동으로인한현금흐름'], pre_y]
print(df2)
table3 = tables[5]
df3 = table3.set_index(keys=['IFRS(연결)'])
df3 = df3.loc[['영업활동으로인한현금흐름'], this_q]
print(df3)
df_f = pd.merge(df2, df3, how='outer', on='IFRS(연결)')
print(df_f)
t_year = pre_y + this_q
#DPS, 배당률, PER, PBR, EPS
li_item = ['종가', 'EPS', 'DPS', 'DIV', 'PER', 'PBR', 'PSR']
li_t_fund = []
for y in range(len(t_year)):
li_fund = []
for i in range(len(li_item)):
if t_year[y][-2:] == '12':
df_fund = stock.get_market_fundamental(t_year[y][:4]+'0101', t_year[y][:4]+t_year[y][-2:]+'30', code)
df_price = stock.get_market_ohlcv(t_year[y][:4]+'0101', t_year[y][:4]+t_year[y][-2:]+'30', code)
else:
df_fund = stock.get_market_fundamental(t_year[y][:4] + '0' + str(int(t_year[y][-2:])-2) + '01',
t_year[y][:4] + t_year[y][-2:] + '30', code)
df_price = stock.get_market_ohlcv(t_year[y][:4] + '0' + str(int(t_year[y][-2:])-2) + '01',
t_year[y][:4] + t_year[y][-2:] + '30', code)
if i == 0:
p_max = format(round(df_price['종가'].max(), 2), ',')
p_min = format(round(df_price['종가'].min(), 2), ',')
p_max_min = str(p_max) + ' / ' + str(p_min)
li_fund.append(p_max_min)
elif i > 0 and i < 3:
item_value = df_fund[li_item[i]][-1]
li_fund.append(item_value)
elif i > 2 and i < 6 :
max = df_fund[li_item[i]].max()
min = df_fund[li_item[i]].min()
max_min = str(round(max,2)) + ' / ' + str(round(min,2))
li_fund.append(max_min)
else:
s_max = df_price['종가'].max() / df_t.loc['매출액', t_year[y]]
s_min = df_price['종가'].min() / df_t.loc['매출액', t_year[y]]
s_max_min = str(round(s_max, 2)) + ' / ' + str(round(s_min, 2))
li_fund.append(s_max_min)
li_t_fund.append(li_fund)
df_dpbe = pd.DataFrame(data=li_t_fund, columns=li_item, index=t_year)
df_dpbe = df_dpbe.T
df_total = pd.concat([df_t, df_f, df_dpbe])
#재무비율 url 주소
url_r = 'https://comp.fnguide.com/SVO2/ASP/SVD_FinanceRatio.asp?pGB=1&gicode=A'+ code + \
'&cID=&MenuYn=Y&ReportGB=&NewMenuID=104&stkGb=701'
# 부채비율, 당좌비율, 유보율, 이자보상배율
page_r = requests.get(url_r)
tables_r = pd.read_html(page_r.text)
table_r = tables_r[0]
df_r = table_r.set_index(keys=['IFRS(연결)']) #인덱스를 부채비율,... 이렇게 변경
items_r = ['부채비율계산에 참여한 계정 펼치기', '당좌비율계산에 참여한 계정 펼치기', '유보율계산에 참여한 계정 펼치기', '이자보상배율계산에 참여한 계정 펼치기']
pre_yq = pre_y.append(this_q[-1])
df_r = df_r.loc[items_r, pre_y]
df_r = df_r.apply(pd.to_numeric)
df_total = pd.concat([df_total, df_r])
df_total.fillna(0)
print(df_total)
#엑셀에 입력
ws = wb[name]
ws.cell(4, 1).value = code
ws.cell(3, 5).value = name
for row in range(0, len(df_total.index)):
for col in range(0, len(df_total.columns)):
ws.cell(row+11, col+3).value = df_total.iloc[row, col]
wb.save(file)
def input_stock_data_for_financial(code, pre_y, this_q, wb):
code = code
name = stock.get_market_ticker_name(code)
print(name)
pre_y = pre_y
this_q = this_q
#재무제표 Page
url = 'https://comp.fnguide.com/SVO2/ASP/SVD_Finance.asp?pGB=1&gicode=A'+ code + \
'&cID=&MenuYn=Y&ReportGB=&NewMenuID=103&stkGb=701'
page = requests.get(url)
tables = pd.read_html(page.text)
# 년도별 매출액, 영업이익, 당기순이익 구하기
table0 = tables[0]
df0 = table0.set_index(keys=['IFRS(연결)']) #인덱스를 매출액, 영업이익,... 이렇게 변경
items = ['순영업수익', '영업이익', '당기순이익']
df0 = df0.loc[items]
df0 = df0[pre_y]
# 분기별 매출액, 영업이익, 당기순이익 구하기
table1 = tables[1]
df1 = table1.set_index(keys=['IFRS(연결)'])
items1 = ['순영업수익', '영업이익', '당기순이익']
df1 = df1.loc[items1]
df1 = df1[this_q]
# 연도별, 분기별 매출액, 영업이익, 당기순이익
df_t = pd.merge(df0, df1, how='outer', on='IFRS(연결)')
#영업이익률, 순이익률
df_t.loc['영업이익률', :] = df_t.loc['영업이익', :] / df_t.loc['순영업수익', :]
df_t.loc['순이익률', :] = df_t.loc['당기순이익', :] / df_t.loc['순영업수익', :]
# 엽업활동으로 인한 현금흐름
table2 = tables[4]
df2 = table2.set_index(keys=['IFRS(연결)'])
df2 = df2.loc[['영업활동으로인한현금흐름'], pre_y]
print(df2)
table3 = tables[5]
df3 = table3.set_index(keys=['IFRS(연결)'])
df3 = df3.loc[['영업활동으로인한현금흐름'], this_q]
print(df3)
df_f = pd.merge(df2, df3, how='outer', on='IFRS(연결)')
print(df_f)
t_year = pre_y + this_q
#DPS, 배당률, PER, PBR, EPS
li_item = ['종가', 'EPS', 'DPS', 'DIV', 'PER', 'PBR', 'PSR']
li_t_fund = []
for y in range(len(t_year)):
li_fund = []
for i in range(len(li_item)):
if t_year[y][-2:] == '12':
df_fund = stock.get_market_fundamental(t_year[y][:4]+'0101', t_year[y][:4]+t_year[y][-2:]+'30', code)
df_price = stock.get_market_ohlcv(t_year[y][:4]+'0101', t_year[y][:4]+t_year[y][-2:]+'30', code)
else:
df_fund = stock.get_market_fundamental(t_year[y][:4] + '0' + str(int(t_year[y][-2:])-2) + '01',
t_year[y][:4] + t_year[y][-2:] + '30', code)
df_price = stock.get_market_ohlcv(t_year[y][:4] + '0' + str(int(t_year[y][-2:])-2) + '01',
t_year[y][:4] + t_year[y][-2:] + '30', code)
if i == 0:
p_max = format(round(df_price['종가'].max(), 2), ',')
p_min = format(round(df_price['종가'].min(), 2), ',')
p_max_min = str(p_max) + ' / ' + str(p_min)
li_fund.append(p_max_min)
elif i > 0 and i < 3:
item_value = df_fund[li_item[i]][-1]
li_fund.append(item_value)
elif i > 2 and i < 6 :
max = df_fund[li_item[i]].max()
min = df_fund[li_item[i]].min()
max_min = str(round(max,2)) + ' / ' + str(round(min,2))
li_fund.append(max_min)
else:
s_max = df_price['종가'].max() / df_t.loc['순영업수익', t_year[y]]
s_min = df_price['종가'].min() / df_t.loc['순영업수익', t_year[y]]
s_max_min = str(round(s_max, 2)) + ' / ' + str(round(s_min, 2))
li_fund.append(s_max_min)
li_t_fund.append(li_fund)
df_dpbe = pd.DataFrame(data=li_t_fund, columns=li_item, index=t_year)
df_dpbe = df_dpbe.T
df_total = pd.concat([df_t, df_f, df_dpbe])
df_total.fillna(0)
print(df_total)
#엑셀에 입력
ws = wb[name]
ws.cell(4, 1).value = code
ws.cell(3, 5).value = name
for row in range(0, len(df_total.index)):
for col in range(0, len(df_total.columns)):
ws.cell(row+11, col+3).value = df_total.iloc[row, col]
wb.save(file)
#엑셀파일 열기
file = 'C:\\Users\\fibt5\OneDrive\\0. 주식투자\\보유주식관리\\보유주식 관리230903.xlsx'
wb = load_workbook(file)
ws = wb['총괄표']
#fnguide 사이트에서 크롤링 할때 지난연도와 올해 분기가 따로 분리되기에 리스트를 만들어서 추출함
pre_y = ['2020/12', '2021/12', '2022/12']
this_q = ['2023/03', '2023/06']
code = '214320'
input_stock_data(code, pre_y, this_q, wb)
# input_stock_data_for_financial(code, pre_y, this_q, wb)
|
cs |
좀 복잡해 보이지만, 만족도가 상당히 높은 코드였습니다.
앞으로도 계속 보유 종목을 관리해야하고, 내가 왜 샀는지 기록이 있어야 힘든 시기에 Hold가 더 쉬워 질 것입니다. 또한, 기록이 있어야 내가 무엇을 실수했고, 앞으로 어떻게 해야 하는지 판단이 설 것 같습니다.
728x90
'돈을 벌기 위한 자료 > 투자정보' 카테고리의 다른 글
퀀트투자 최적값 찾기 파이썬 코드 (2) | 2023.10.18 |
---|---|
파이썬으로 만든 퀀트투자 백테스트 툴 업데이트 (0) | 2023.10.15 |
효성ITX 094280 - 2 (3) | 2023.06.13 |
효성ITX 094280 (0) | 2023.06.09 |
23년 5월 4일 기준 배당 투자 종목 필터링 (0) | 2023.05.10 |
댓글