sharebook-kr / pyupbit

python wrapper for upbit API
Apache License 2.0
468 stars 212 forks source link

get_ohlcv, now 파라미터 관련 #91

Open YiruJeon opened 2 years ago

YiruJeon commented 2 years ago

84 와 관련해서...

get_ohlcv메소드는 이제 timezone 없는 datetime-index 로 dataframe을 반환합니다.

그런데 to파라미터 기본값이 걱정스럽게 구현되어있는데요

toNone이면 to = datetime.datetime.now()가 되고 이는 처음에 api 호출할때 "%Y-%m-%d %H:%M:%S"로 변환되어서 들어갑니다. 그런데 Upbit에서는 해당 형태로 주어진 시간을 UTC로 받아들입니다.

따라서 대한민국에서 실행하면 늘 현재보다 9시간 후를 to로 넘기게 되죠. Upbit는 to가 미래일 경우 현재 시점 기준으로 조정해서 반환해주는 것으로 보입니다.

그래서 우리나라에서 실행하면 문제가 없는데, UTC보다 느린 시간대 지역에서 실행할경우는 과거 시점을 가져올것으로 보입니다.

to 초기값 코드를 다음처럼 바꾸면 어떨까요?

if to is None:
            to = datetime.datetime.now(datetime.timezone.utc)
            to = to.replace(tzinfo=None)
YiruJeon commented 2 years ago

그리고 astimezone 메소드를 모두 주석처리하면서 get_ohlcv_from가 오동작하고 있어요.

208: df = df[df.index >= fromDatetime]

은 timezone 있는 datetime 간의 비교를 생각하고 구현한건데, df.index는 KST 표기를 따르고 fromDatetime은 UTC 표기를 따르는 상황이라 메소드 호출 시 주어진 fromDatetime 전의 데이터도 반환됩니다.

YiruJeon commented 2 years ago

commit history를 좀더 보니 #84 가 발생한 원인이 된 커밋은 b4db566 로 보입니다.

get_ohlcv에서 dt_list 부분 수정되면서 기존에 없던 astimezone() 이 추가되어버렸네요. 그래서 get_ohlcv 반환 DataFrame에 기존에 없던 timezone이 생겼습니다.

제가 추가 했던 get_ohlcv_fromdt_list 작업할 때 KST와 UTC 비교를 용이하게 하기 위해서 astimezone()을 넣었지만 나중에 df.index = df.index.tz_localize(None)으로 timezone을 제거해서 반환했구요.

제 생각으론 astimezone() 코드 원복하고 get_ohlcv 함수의 dt_list.append(dt.astimezone())dt_list.append(dt)로 수정하는게 제일 좋은 fix가 아닐까 싶습니다.

처음 get_ohlcv가 구현되었을 당시에도

to = datetime.datetime.now()
...
to = to.astimezone(datetime.timezone.utc)

구조였어서 to 객체를 계속 timezone을 달고 관리했거든요...

mr-yoo commented 1 year ago

https://github.com/sharebook-kr/pyupbit/commit/b4db566fdd62c59960fdeedcf9c1c343e31fdd22 에서는 내용의 수정은 없이 lint warning에 따른 코드 formatting만 변경한 수정이에요. 기존에 astimezone() 메서드가 추가된 것 같습니다.

이번 기회에 interface를 정리해 보죠.

get_ohlcv 함수

파라미터 to는 세 종류의 입력을 받아 내부적으로 datetime 객체로 변경해서 로직을 처리합니다.

세 번째(Timestamp)는 다음과 같이 DataFrameindex로 추가 데이터를 조회하는 기능의 지원을 위해 정의돼 있습니다.

df = get_ohlcv('KRW-XRP')
df = get_ohlcv(to=df.index[0])
get_ohlcv_from 함수

같은 이유로 동일한 세 개 데이터 타입의 입력이 정의돼 있습니다. 중간 데이터의 처리도 datetime 객체로 변경합니다. 이 때 df = df[df.index >= fromDatetime]에서 이상 동작을 한다는 것으로 이해 됩니다. (아직 실행해보지는 않았습니다.)

fromDatetime은 비어있거나 항상 KTC로 입력이 될 것으로 보여서 비교 자체가 문제 없어 보이기도 하구요. 문제가되는 환경 및 테스트 코드에 대한 정보를 공유해 주실 수 있을까요?


interface에 timezone이 부여된 것으로 변경한다면 두 함수를 모두 수정해야하고, #84에서의 문제도 다시 생길 것 같은데요. 제가 제대로 이해하고 있나요? 맞다면 개인적인 생각으로는 이상 동작을 하는 코드 부분만 집중해서 해결해야 할 것 같아서요. 어떻게 생각하시나요?