ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

     

    [ECOS API] 한국은행 경제통계 API 이용 (2) json

    원래는 API 기본 값인 xml로 데이터를 처리하다가, 뒤늦게 json타입도 지원되는 걸 발견하고 환승하면서 코드를 class로 정리해서 모아두기로 했다. 주요 목적은 인증키와 STAT_CODE와 ITEM_CODE1, count 정

    hayjo.tistory.com

    데이터는 아래처럼 딕셔너리 형태로 받아온다.

    {'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
    '''

    댓글

Designed by Tistory.