2016년 7월 16일 토요일

zipline 국내 종목 처리시 문제점 해결

    self.simulation_dt,
  File "c:\zipline-0.9.0\zipline\utils\events.py", line 209, in handle_data
    context.trading_environment,
  File "c:\zipline-0.9.0\zipline\utils\events.py", line 228, in handle_data
    self.callback(context, data)
  File "c:\zipline-0.9.0\zipline\algorithm.py", line 368, in handle_data
    self._handle_data(self, data)
  File "C:\Users\Administrator\OneDrive\Developement\SystemT\systemt\backtesting
.py", line 62, in handle_data
    ma5 = history(5, '1d', 'price').mean()
  File "c:\zipline-0.9.0\zipline\utils\api_support.py", line 51, in wrapped
    return getattr(get_algo_instance(), f.__name__)(*args, **kwargs)
  File "c:\zipline-0.9.0\zipline\utils\api_support.py", line 98, in wrapped_meth
od
    return method(self, *args, **kwargs)
  File "c:\zipline-0.9.0\zipline\algorithm.py", line 1270, in history
    return self.history_container.get_history(history_spec, self.datetime)
  File "c:\zipline-0.9.0\zipline\history\history_container.py", line 904, in get
_history
    raw=True
  File "c:\zipline-0.9.0\zipline\history\history_container.py", line 56, in ffil
l_buffer_from_prior_values
    nan_sids = pd.isnull(buffer_values[0])
IndexError: index 0 is out of bounds for axis 0 with size 0
Press any key to continue . . .


zipline 0.8.4
zipline 0.9.0

pandas_datareader를 이용해서 yahoo에서 AAPL 애플 주가를 얻은 다음
zipline 백테스팅 예제를 처리 하면 잘 동작 한다.

dataFrame에서 날짜 인덱스 부분을 UTC 시간으로 변경 하는 작업을 해주면 문제 없이 동작 한다.

하지만 국내 증시
나의 경우 직접 대신 증권 API를 통해서 일자별 시가, 고가, 저가, 종가를 얻어다가 DB를 구성 하고
이를 다시 로드 하여 dataframe을 구성해서

zipline에서 이용할 때 위와 같은 에러를 만났다.

대충 원인을 분석 하니 날짜 인덱스가 문제가 되는것으로 보인다.

그래서 pandas를 통해서 해당 종목을 yahoo에서 얻어서 처리를 해도 마찬가지 에러가 발생 한다.

우리나라 주식 거래일과 미쿡의 주식 거래일이 달라서 생기는 문제로 잠정 원인을 파악 했다.

그럼 해결방법은?

분석 시작 날짜로 부터 오늘의 데이터 까지를 대략 AAPL 즉 애플의 데이터 (미쿡 증시) 를 가져 온다음
종가 Adj Close 컬럼의 값을 실제로 내가 분석 하고 싶은 우리나라 종목에 종가로 교체 해 버리고

zipline을 처리 하니 동작 하더라

여기서 중요 포인트는 데이터 프레임의 개수를 맞추는 작업

    import pandas_datareader.data as web
    import datetime
    start = datetime.datetime(2010, 1, 1)
    end = datetime.datetime(2016,7,15)
    data  = web.DataReader("AAPL", "yahoo", start, end)
    data = data[['Adj Close']]
    data.columns = [code]
    data.head()
    data = data.tz_localize("UTC")

    df = makeDataFrame(code)
   
   
    df = df[['CLOSE']]
    data = data[len(data) - len(df):]  #데이터 프레임의 row 수를 맞추는 작업
    data[code] = np.where(1, df['CLOSE'], df['CLOSE'])    #DB에서 가져온 df의 CLOSE 컬럼을 AAPL의 종가 컬럼으로 교체
   
   
   
   
zipline이 아직 개발 단계에 문제점이 많지만 간편하게 백테스팅을 처리 할 수 있는 좋은 라이브러리 같다.

댓글 2개:

Unknown :

어흐흑..... 정말정말 감사합니다 이 문제때문에 얼마나 시간을 버렸는지... 눈물이 앞을 가립니다 ㅠㅠㅠ
예전에 스쳐 지나가다가 이 포스팅 본 것이 생각나서 다시 찾아왔습니다. 백만번 감사합니다..!!

Unknown :

어흐흑..... 정말정말 감사합니다 이 문제때문에 얼마나 시간을 버렸는지... 눈물이 앞을 가립니다 ㅠㅠㅠ
예전에 스쳐 지나가다가 이 포스팅 본 것이 생각나서 다시 찾아왔습니다. 백만번 감사합니다..!!