-
[Pandas] 데이터 정리 (2) 필터링(query) 및 정렬Python/텔레그램봇:채권모니터링 2020. 12. 15. 12:03
현재 데이터를 pandas dataframe에 넣고, NULL값 정리까지 끝난 상태.
이제 목적에 맞게 데이터를 필터링할 차례다.
목적: 투자등급 A-이상이면서 잔존기간이 3년 미만인, 매력적인 가격대의 채권 찾아내기.
매력적인 가격대는
1) 평균 금리에 비해 저렴하게 매도 매물이 있는 종목
2) 혹은 거래량이 있는 종목 중에 적당한 매수가격대가 없는 종목 으로 정했다.
일단 투자등급을 걸러야 하니 'BBB', 'BB', 'B'와 'BBB+', 'BB+', 'B+', 'BBB-', 'BB-', 'B-'를 버리고,
잔존기간이 1095일 이상인 종목을 버리고,
수익률이 평균 금리 미만인 종목을 버리고,
나의 채권 기대수익률은 2% 이상이기 때문에 매수수익률이 2% 미만으로 걸려있는 종목도 버린다.
다만 0.0인 종목은 매수물량이 없는 경우기 때문에 포함시킨다.
매도/매수호가가 둘다 0.0이라서 소외된 종목은 데이터에 없기 때문에 상관이 없다.
비교할 기준 금리는 한국은행 경제통계시스템에서 API를 이용해 전일 금리를 가져오기로 했다.
hayjo.tistory.com/59?category=913163
데이터는 아래처럼 딕셔너리 형태로 받아온다.
{'date': '20201211', 'value': 2.215}
필요한 조건을 정리하면 아래와 같다.
conditions = { 'creditRate': "신용등급 not in ['BBB', 'BB', 'B', 'BBB+', 'BB+', " \ + "'B+', 'BBB-', 'BB-', 'B-']", 'yield': "매도수익률 >= (" + str(latest['value']) + " * 0.9)", 'Y2D': "Y2D <= " + str(expectedDate), 'minYiled': "(매수수익률 >= " + str(minYield) + " or 매수수익률 == 0.0)" } string = " and ".join(conditions.values()) print(string) # 신용등급 not in ['BBB', 'BB', 'B', 'BBB+', 'BB+', 'B+', 'BBB-', 'BB-', 'B-'] and # 매도수익률 >= (2.216 * 0.9) and Y2D <= 1095 and (매수수익률 >= 2 or 매수수익률 == 0.0)
Query
이제 쿼리로 보내면 된다.
# (1) 부분 import pandas as pd import ecosClass as ecos def year2date(n): y, m, d = 0, 0, 0 try: y, m, d = list(map(int, n.split("."))) except: pass return y*365 + m*30 + d csv = pd.read_csv('./text.csv', na_values='-', thousands=r',') csv['Y2D'] = csv['잔존기간'].apply(year2date) # 평균 금리 구하기 Key = '인증키' corpBondAAm = ecos.Ecos(Key, STAT_CODE='060Y001', ITEM_CODE1='010300000', count=19) latest = corpBondAAm.getLatest() expectedDate = 365*3 # 잔존기간 minYield = 2 # 최소수익률 conditions = { 'creditRate': "신용등급 not in ['BBB', 'BB', 'B', 'BBB+', 'BB+', " \ + "'B+', 'BBB-', 'BB-', 'B-']", 'yield': "매도수익률 >= (" + str(latest['value']) + " * 0.9)", 'Y2D': "Y2D <= " + str(expectedDate), 'minYiled': "(매수수익률 >= " + str(minYield) + " or 매수수익률 == 0.0)" } string = " and ".join(conditions.values()) csv_filtered = csv.query(string) print(csv_filtered.head()) ''' 종목명 가격 수익률 거래량 ... 신용등급 잔존기간 표준코드 Y2D 41 파라다이스6 10043.0 3.302 100024.0 ... A 02.10.12 KR6034231AA1 10 42 93 쌍용양회공업315 NaN NaN NaN ... A- 02.09.15 KR6003411A91 1 015 118 칼제이십사차유동화전문1-6 NaN NaN NaN ... A- 01.03.13 KR63351569 90 468 128 동아쏘시오홀딩스103 NaN NaN NaN ... A 01.03.06 KR6000641730 461 164 현대일렉트릭앤에너지시스템2-3 10000.0 2.760 23867.0 ... A- 00.09.07 KR626726 3897 277 '''
원하는 데이터 선별이 끝났다. 이제 정렬을 한다.
Sort
데이터 정렬은 .sort_values() 메소드를 이용하면 된다.
먼저 거래량 순으로 정렬한다. 많은 순으로 정렬해야 하니까 내림차순으로 해야한다.
csv_sorted = csv_filtered.sort_values(by=['거래량'], ascending=False) print(csv_sorted) ''' 종목명 가격 수익률 거래량 ... 신용등급 잔존기간 표준코드 Y2D 41 파라다이스6 10043.0 3.302 100024.0 ... A 02.10.12 KR6034231AA1 1 042 382 칼제이십오차유동화전문1-2 10000.0 3.419 49764.0 ... A 00.09.20 KR6352431 A64 290 164 현대일렉트릭앤에너지시스템2-3 10000.0 2.760 23867.0 ... A- 00.09.07 KR62672 63897 277 '''
예쁘게 잘 나온다. NaN 값은 아래로 몰렸다. 이제 잔존기간은 필요없으니 .drop() 메소드로 제거한다.
.drop(inplace=True)를 쓰면 csv_sorted 데이터프레임 값이 변경된다.
print(csv_sorted.drop(['거래대금', '잔존기간'], axis=1)) ''' 종목명 가격 수익률 거래량 ... 매수수익률 신용등급 표준코드 Y2D 41 파라다이스6 10043.0 3.302 100024.0 ... 3.831 A KR6034231AA1 104 2 382 칼제이십오차유동화전문1-2 10000.0 3.419 49764.0 ... 4.052 A KR6352431A6 4 290 '''
'Python > 텔레그램봇:채권모니터링' 카테고리의 다른 글
[TelegramBot] 봇 생성과 메시지전송 (0) 2020.12.18 [python f'{formating}'] 봇 메시지 포맷팅 (0) 2020.12.16 [Pandas] 데이터 정리 (1) read_csv(na_values) & apply (0) 2020.12.15 [ECOS API] 한국은행 경제통계 API 이용 (2) json (0) 2020.12.14 [ECOS API] 한국은행 경제통계 API 이용 (1) xml (0) 2020.12.10