diff --git a/streamlit-quant/strategy/all-value.py b/streamlit-quant/strategy/all-value.py new file mode 100644 index 0000000..16be363 --- /dev/null +++ b/streamlit-quant/strategy/all-value.py @@ -0,0 +1,36 @@ +import matplotlib.pyplot as plt +import numpy as np +import seaborn as sns + +import quantcommon as qc + +#가치주 포트폴리오. PER, PBR, PCR, PSR, DY +def get_all_value_top(count): + ticker_list = qc.QuantCommon().get_ticker_list() + value_list = qc.QuantCommon().get_value_list() + + # 가치 지표가 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)) \ No newline at end of file diff --git a/streamlit-quant/strategy/value.py b/streamlit-quant/strategy/value.py new file mode 100644 index 0000000..efb7a1d --- /dev/null +++ b/streamlit-quant/strategy/value.py @@ -0,0 +1,25 @@ +import pandas as pd +import numpy as np +import quantcommon as qc + +#가치주 포트폴리오. PER, PBR이 낮은 회사 20개 +def get_value_top(count): + ticker_list = qc.QuantCommon().get_ticker_list() + value_list = qc.QuantCommon().get_value_list() + + # 가치 지표가 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='종목코드') + # rank() 함수로 PER, PBR 열의 순위를 구함. axis=0을 입력하여 순위는 열 방향으로 구함.(PER, PBR 각각 순위) + value_rank = data_bind[['PER', 'PBR']].rank(axis = 0) + # axis=1을 통해서 위에서 구한 순위 랭크를 합침. 합친 것을 다시 rank() + value_sum = value_rank.sum(axis = 1, skipna = False).rank() + return data_bind.loc[value_sum <= count, ['종목코드', '종목명', 'PER', 'PBR']] + +if __name__ == '__main__': + print(get_value_top(20)) \ No newline at end of file