2025-03-10 17:54:11 +09:00
|
|
|
import matplotlib.pyplot as plt
|
|
|
|
|
import numpy as np
|
|
|
|
|
import seaborn as sns
|
2025-03-14 15:21:31 +09:00
|
|
|
import quantcommon
|
2025-03-10 17:54:11 +09:00
|
|
|
|
|
|
|
|
#가치주 포트폴리오. PER, PBR, PCR, PSR, DY
|
|
|
|
|
def get_all_value_top(count):
|
2025-03-14 15:21:31 +09:00
|
|
|
qc = quantcommon.QuantCommon()
|
|
|
|
|
ticker_list = qc.get_ticker_list()
|
|
|
|
|
value_list = qc.get_value_list()
|
2025-03-10 17:54:11 +09:00
|
|
|
|
|
|
|
|
# 가치 지표가 0이하인 경우 nan으로 변경
|
|
|
|
|
value_list.loc[value_list['값'] <= 0, '값'] = np.nan
|
|
|
|
|
# 가치지표 테이블을 가로로 긴 형태로 변경
|
|
|
|
|
value_pivot = value_list.pivot(index='종목코드', columns='지표', values='값')
|
|
|
|
|
# 티커 테이블과 가치 지표 테이블을 합침
|
|
|
|
|
data_bind = ticker_list[['종목코드', '종목명']].merge(value_pivot,
|
|
|
|
|
how='left',
|
|
|
|
|
on='종목코드')
|
|
|
|
|
value_list_copy = data_bind.copy()
|
|
|
|
|
# DY(배당수익률)만 높을수록 좋은 지표라서 역수
|
|
|
|
|
value_list_copy['DY'] = 1 / value_list_copy['DY']
|
|
|
|
|
value_list_copy = value_list_copy[['PER', 'PBR', 'PCR', 'PSR', 'DY']]
|
|
|
|
|
value_rank_all = value_list_copy.rank(axis=0)
|
|
|
|
|
mask = np.triu(value_rank_all.corr())
|
|
|
|
|
|
|
|
|
|
fig, ax = plt.subplots(figsize=(10, 6))
|
|
|
|
|
sns.heatmap(value_rank_all.corr(),annot=True,mask=mask, annot_kws={"size": 16}, vmin=0, vmax=1, center=0.5,cmap='coolwarm',square=True)
|
|
|
|
|
ax.invert_yaxis()
|
|
|
|
|
# plt.show()
|
|
|
|
|
value_sum_all = value_rank_all.sum(axis=1, skipna=False).rank()
|
|
|
|
|
|
|
|
|
|
return data_bind.loc[value_sum_all <= count]
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
print(get_all_value_top(20))
|