FinanceData / FinanceDataReader

Financial data reader
1.1k stars 357 forks source link

KRX 소스로 지정한 경우 주가 불러오기 오류 #213

Open QuantKang opened 3 weeks ago

QuantKang commented 3 weeks ago

제 경우에는 NAVER 대신 KRX로 데이터 소스를 지정해서 사용합니다.

오늘 스크립트를 사용하려고 보니, 데이터 오류가 발생합니다.

KRX 대신 NAVER로 데이터 소스를 지정해서 사용하고 있는 중입니다.

fdr.DataReader('KRX:000100')
Traceback (most recent call last):
  File "/home/me/myenv/lib/python3.11/site-packages/requests/models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/me/myenv/lib/python3.11/site-packages/FinanceDataReader/data.py", line 92, in DataReader
    return KrxDailyReader(codes, start, end).read()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/me/myenv/lib/python3.11/site-packages/FinanceDataReader/krx/data.py", line 139, in read
    df = _krx_stock_price(full_code, from_date=self.start, to_date=self.end)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/me/myenv/lib/python3.11/site-packages/FinanceDataReader/krx/data.py", line 108, in _krx_stock_price
    df = pd.DataFrame(r.json()['output'])
                      ^^^^^^^^
  File "/home/me/myenv/lib/python3.11/site-packages/requests/models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
chowg1762 commented 2 weeks ago

저도 같은 에러를 맞아서 response 를 찍어보니

response = requests.post(url, data, headers=self._headers)
print("RESPONSE : ", response.status_code, response.text)

아래와 같은 결과를 얻었는데요.

RESPONSE : 400 INVALIDPERIOD2

해당 홈페이지에서 똑같이 테스트해보니, 2년 이상의 데이터 조회시 위의 에러가 뜹니다. 혹시라도 start date 를 2년으로 내로 조정하시면 잘 되실거같습니다.

QuantKang commented 2 weeks ago

감사합니다. 조언해 주신 방법으로 사용해 보겠습니다.

FinanceDataReader의 다음 번 release에 수정되기를 기대합니다.

FinanceData commented 1 day ago

수정 반영하였습니다. 업데이트하여 사용하시면 되겠습니다.

pip install -U finance-datareader

2가지 문제가 있었는데요.

  1. KRX 요청 header에 Referer가 "필수"로 변경
  2. chowg1762 말씀과 같이, KRX에서 최대 2년 데이터만 조회가 가능하게 변경되었습니다.

1번은 반영하여 업데이트 하였습니다. 2년 기간의 문제는 우선, start, end를 지정하지 않은 경우 현재로 부터 과거 2년을 조회하도록 수정하고, 응답이 200 OK 가 아닌경우, 확인 가능하도록 에러메시지(Period is up to 2 years 추가)를 출력하도록 했습니다.

>>> fdr.DataReader('KRX:000100', 1900)
400 Bad Request Period is up to 2 years

2년씩 연속으로 조회해서 자동으로 병합하는 방법도 검토해 볼만 할 것 같습니다.

감사합니다.