토이프로젝트/기본주식분석

ADR 수치 및 그래프 직접 그리기

. . . 2022. 8. 31. 10:15
반응형

1 ADR 이란?

ADR 은 시장의 온도를 어느정도 반영하는 수치이다.

이래저래 알아보니, ADR 수치를 제공하는 증권사는 몇군데밖에 안됐다. 인터넷에서 제공하는 그래프도 한군데정도...

ADR 수치를 자동으로 계산하고 어느정도 나만의 자동화 기준을 세우고싶어 직접 계산하였다.

2 계산식

구글링해보니, ADR 수치의 계산식은 간단하였다.

일정기간의 상승종목수 / 일정기간의 하락종목수 * 100

2.1 python 으로 직접 계산

다음의 순서대로 직접 계산하였다.

  1. 일자별 전종목의 가격, 가격변동폭을 크롤링한다.
  2. 특정일부터 특정일까지의 전종목의 가격정보를 얻는다.
  3. 해당 종목이 코스피/코스닥인지 분류하고 상승종목수, 하락종목수를 구한다.
  4. ADR공식에 따라 계산한다.
  5. 매일매이일의 ADR값을 계산한다.

관련한 코드는 다음과 같다.

def _calc_adr(target_date, calc_date) :
    trade_market = {}

    ticker_infos = ticker_api.get_kr_ticker_info()

    for ticker_info in ticker_infos :
        market_name =  ticker_info['additional']['거래소']
        trade_market[ticker_info['stock_id']] = market_name

    # 메모리아끼기위해서 삭제
    ticker_infos = {}

    stockDailyPriceInfos_model_ctx = financeInfo_model.stockDailyPriceInfos()

    target_date_days = 0
    price_chk = { '코스피' : {'up_price':0, 'down_price':0}, '코스닥': {'up_price':0, 'down_price':0}, 'KONEX': {'up_price':0, 'down_price':0}}

    while calc_date > 0 :
        calc_target_date = time_tools.date_calc_days(target_date, target_date_days)
        query_datas = stockDailyPriceInfos_model_ctx.get_one_day_price(calc_target_date)
        target_date_days -= 1

        # 타겟 날짜의 첫째일에... 가격정보가 없는경우는 calc 하지 않는다.
        if target_date_days == -1 and len(query_datas) <= 0 :
            return None

        if len(query_datas) <= 0 :
            continue

        ## too long...
        for one_data in query_datas :
            target_market = trade_market[one_data['stock_id']]
            if one_data['전일대비퍼센트'] > 0 :
                price_chk[target_market]['up_price'] += 1
            elif one_data['전일대비퍼센트'] < 0 :
                price_chk[target_market]['down_price'] += 1

        calc_date -= 1

    # 상승종목수 / 하락종목수 * 100
    adr_info = {}
    adr_info['기준일'] = target_date
    adr_info['kosdaq'] = price_chk['코스닥']['up_price'] / price_chk['코스닥']['down_price'] * 100
    adr_info['kosdaq'] = round(adr_info['kosdaq'],2)
    adr_info['kospi'] = price_chk['코스피']['up_price'] / price_chk['코스피']['down_price'] * 100
    adr_info['kospi'] = round(adr_info['kospi'], 2)

    return adr_info
  • 코드는 부분부분만 일부부만 올려놨고, 코드가 되는데로 공개할예정
  • 매일매일에대한 전종목을 쿼리를 하는것보다는 범위로 쿼리하고, 매 종목에대한 가격확인보다는 numpy 같은걸로 한번에 카운팅하는것이 더 효율적일듯하다.
    • 1회성 계산이다보니... 일단 생각나는데로 급하게 구현

3 ADR 값의 계산결과

  • 특이사항

    • 일반적으로 20일 기준으로 사용하는것 같아 20일 기준으로 계산.
    • 직접 계산한 ADR값은 유진투자증권과 http://www.adrinfo.kr/ 에서 제공하고있는 값하고는 달랐다.
    • 위의 사이트들과의 오차는 대략 1 ~ 4 사이였다. (그정도의 오차는 크게 의미없는 수치라고 생각한다.)
    • 기존사이트 adr제공 사이트들는 어떻게 계산을 하는지에 대한코드가 공개되지 않은상태 이다보니 기존사이트와 데이터가 완벽하게 동일하지는 않다.
    • 계산식은 일정기간의 상승종목수 / 일정기간의 하락종목수 * 100 으로 계산 하였으므로, 기존사이트의 데이터와 수치가 약간 차이나는건 크게 의미를 두지 않아도 될듯.
  • ADR 계산결과는 다음의 포스팅에서 매일매일 업데이트된다.

ADR 실시간 그래프

4 잡담

어제부로, 대략 10년치의 전종목의 가격정보를 크롤링 완료하였다

MONGODB 가격정보 컬렉션정보

  • 전종목의 약 10년치 가격정보는 대략 600만개정도 되었다.
  • mongodb 기준 전종목 가격정보만 약 360M 의 사이즈 정도
  • index 를 걸어서 쿼리해보니 라즈베리파이에서도 해당 사이즈의 db 도 문제없이 동작하였다.

이제 10년치의 ADR를 계산할 수 있을것같다.

10년치의 adr을 계산하여 한번 유의미한 데이터가 나오는지 확인예정.

...

반응형