수익률 구하기 2

랜디 Randy·2024년 1월 4일
0

문제인식

현재 pykrx를 활용해 수익률을 구하면 이렇게 등락률을 구할 수 있습니다.
그러나 현재 이 등락률에는 문제가 있는데,

실제로 연산을 통해 구한 등락률과 차이가 있다는 점.

지금 당장은 큰 차이로 다가오지 않는다. 0.01% 차이인데..?? 싶지만
현재 제가 작성하고자 하는 코드는
일주일마다의 등락률을 구해서, 그 등락률을 점으로 만들어 그래프를 그리고자 합니다. 등락률 추이를 살펴볼수도 있겠고, 일주일마다의 등락률을 누적하여 기간 전체의 누적등락률도 구할 생각입니다.

등락률을 한 번 구할때마다 0.01의 오차가 발생한다고 하면,
한 달의 데이터를 구한다고 할 때, 일주일 간격으로 등락률을 구하므로 총 4번의 등락률을 구하게 됩니다.
따라서 실제 등락률과 코드 등락률의 차이는 0.04로 벌어지게 되고,
이 차이가 분기, 연도로 쌓이게 되면 무시할 수 없는 수준으로 벌어집니다.


원인 파악

이렇게 오차가 생기게 된 원인은 무엇일까?
답은 pykrx가 기간 등락률을 구하는 방식에 있었습니다.

네이버증권에서 코스피의 일봉의 일부분을 캡쳐했습니다.
봉과 봉 사이에 빈 공간이 있는게 보이시나요?

조잡한 피그마 실력으로 두드러진 부분만 표시를 한번 해봤습니다.
어떠신가요. 봉과 봉 사이의 빈 공간이 무엇인지 이제 잘 아시겠나요?
이 부분을 ‘갭’이라고 합니다. ‘갭이 떠서 시작했다’ 라고 하면 보통 봉과 봉 사이에 빈 공간이 생겼다는 것을 뜻합니다.

이렇게 갭이 떠서 시작하면, 전날의 종가와 당일의 시가에 차이가 생기게 됩니다.
전날에 10,000원으로 마감했다면, 다음날에 시작할 때 10,000원이 아닌 11,000원으로 시작하게 되는 것이죠. 이렇게 되면 천원만큼의 ‘갭’이 발생하게 됩니다.

이를 계산에 포함해야 정확한 기간 등락률을 구할 수 있는데, 현재 pykrx의 수익률 산정방식의 경우
그날그날의 시가와 종가를 사용해서 등락률을 구합니다.
다시말해, ‘갭’을 등락률 산정에 반영하지 않는다는 것입니다. 갭이 발생하게 되면 그만큼의 오차가 발생하게 되는것이죠.

이걸 어떻게 알았냐?
제가 그냥 더해봤습니다. 갭을 생각하지 않고 그날그날의 등락률만 단순히 더하니 pykrx의 수익률과 동일하게 나오더군요.


문제 해결

나스닥에서 해결했던 것과 똑같이 (((종가 - 시가) - 1) * 100) 의 공식을 사용해야 합니다.

# KOSPI and KOSDAQ's weekly price change rate
# KOSPI
weekly_kospi_full = stock.get_index_price_change(monday, friday, KOSPI)
kospi_result = ((weekly_kospi_full.iloc[0,1] / weekly_kospi_full.iloc[0,0]) - 1) * 100
total_weekly.at[idx, 'KOSPI'] = kospi_result

# KOSDAQ
weekly_kosdaq_full = stock.get_index_price_change(monday, friday, KOSDAQ)
kosdaq_result = ((weekly_kosdaq_full.iloc[0,1] / weekly_kosdaq_full.iloc[0,0]) - 1) * 100
total_weekly.at[idx, 'KOSDAQ'] = kosdaq_result

그래서 코드를 이런 식으로 수정해주어 문제를 해결했습니다.
한 가지 특징적인 부분은,
예를 들어 pykrx에서 수요일의 시가를 구하게 된다면, 수요일의 시가가 아니라 화요일의 종가를 수요일의 시가로 반영한다는 점입니다. 화요일 → 수요일로 넘어오는 지점에서 생기는 갭을 포함하기 위함으로 생각되는데, 이는 오차라기 보다는 단순 계산방식의 차이이므로 굳이 수정하지 않고 넘어가도록 하겠습니다.


다음 문제

위의 코드박스를 보시면 아시겠지만, kospi와 kosdaq을 구하는 방식이 완전히 똑같은데 코드를 반복하고 있습니다.

이를 하나의 함수로 만들어 코드의 중복을 없애보도록 하겠습니다.

profile
데이터는 계단, 직관은 다리

0개의 댓글