반응형
1 ADR 이란?
ADR 은 시장의 온도를 어느정도 반영하는 수치이다.
이래저래 알아보니, ADR 수치를 제공하는 증권사는 몇군데밖에 안됐다. 인터넷에서 제공하는 그래프도 한군데정도...
ADR 수치를 자동으로 계산하고 어느정도 나만의 자동화 기준을 세우고싶어 직접 계산하였다.
2 계산식
구글링해보니, ADR 수치의 계산식은 간단하였다.
일정기간의 상승종목수 / 일정기간의 하락종목수 * 100
2.1 python 으로 직접 계산
다음의 순서대로 직접 계산하였다.
- 일자별 전종목의 가격, 가격변동폭을 크롤링한다.
- 특정일부터 특정일까지의 전종목의 가격정보를 얻는다.
- 해당 종목이 코스피/코스닥인지 분류하고 상승종목수, 하락종목수를 구한다.
- ADR공식에 따라 계산한다.
- 매일매이일의 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 계산결과는 다음의 포스팅에서 매일매일 업데이트된다.
4 잡담
어제부로, 대략 10년치의 전종목의 가격정보를 크롤링 완료하였다
- 전종목의 약 10년치 가격정보는 대략 600만개정도 되었다.
- mongodb 기준 전종목 가격정보만 약 360M 의 사이즈 정도
- index 를 걸어서 쿼리해보니 라즈베리파이에서도 해당 사이즈의 db 도 문제없이 동작하였다.
이제 10년치의 ADR를 계산할 수 있을것같다.
10년치의 adr을 계산하여 한번 유의미한 데이터가 나오는지 확인예정.
...
- 해당 포스팅은 tistory-posting-cli 를 이용해 발행되었습니다.
반응형