[컴퓨터] 경제적 독립하기/[투자] Project tatabox

백테스팅 데이터 처리 (From investing.com)

Bright_Ocean 2021. 8. 24. 08:33
반응형

Investing.com 에서 ETF 가격데이터를 끌어와 백테스팅에 이용하자


지난번 포스팅에서 backtesting.py를 이용하기 위하여

OHLC data (시가,고가,저가,종가 가 포함된 데이터) 가 필요하다라는 것을 살펴보았고

backtesting.py 튜토리얼을 통해 quandl 과 같은 사이트들을 이용하여 데이터를 얻을 수 있음을 알게 되었다.

 

 

 

그래서 뒤적뒤적 해본결과,

Quandl은 데이터들을 많이 있었지만, 내가 원하는 호주 주가지수인 ASX200 에 관한

가격정보는 찾기힘들뿐더러, 꼭 free도 아니였다.

 

 

 

결국 그냥 Investing.com에서 데이터를 끌어와 조금 전처리를 하고 쓰기로 했다.

그 과정을 공유하고자 한다.

 

 

investing.com에 들어가자

https://www.investing.com/

 

Investing.com - Stock Market Quotes & Financial News

Investing.com offers free real time quotes, portfolio, streaming charts, financial news, live stock market data and more.

www.investing.com

 

나는 ASX200데이터가 필요하니 ASX200을 검색하고

 

가격정보를 가져오기 위하여 Historical Data tap을 선택하자.

 

 

원하는 기간을 설정하고 Download Data를 선택한다

이때 주의할 점은 기간이 너무 길면, 한번에 다 데이터가 나오지 않는다.

한 20년 정도의 데이터까지는 한번에 나오는 것 같으니

여러번 나누어 다운하고 엑셀에서 합치는 방법을 이용하도록 하자

나는 (92년도 부터 어제자 날짜까지의 근 30년정도의 데이터를 다운 받았다)

 

 

다운로드 받은 데이터는 위와 같다. 30년 정도의 데이터이기 때문에

그냥 엑셀에서 두파일을 하나로 합쳐주었다.

데이터가 길다면 그냥 파이썬에서 pandas를 이용하여 합쳐주자

마지막에 change column이 있는데 이건 가격정보만으로도 계산할 수 있는 것이기 때문에

그냥 지워 버렸다.

 

 

이제 backtesting.py에 input할 수 있도록 전처리를 해보자

우선 준비해둔 data를 올리고,

 

import pandas as pd
df = pd.read_csv('S&P_ASX 200 Historical Data.csv', thousands=r',')

 주의할 점은 가격정보에 1000단위로 , 가 들어가 있기 때문에 그냥 넣어버리면

가격을 문자열로 읽어서 후에 백테스팅에 에러가 난다. thouands = r','를 꼭 넣자

 

위의 엑셀에서 나온 가격정보들과 비교해보면 1000자리대에 들어있는 쉼표들이 모두 지워져서

numeric data로 로딩된 것을 알 수 있다.

 

df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace = True)
df.columns = ['Close','Open','High', 'Low', 'Volume']

 

두번째로 해야할 일은 Index를 time index 형태로 바꿔주어야 하는데

pd.to_datetime을 이용하면 Date 의 형식을 자동으로 인식하여 time series 형태로 변환해준다.

 

전처리가 끝난 데이터는 위의 그림과 같아 진다.

이제 이 데이터를 이용해서 한번 backtesting을 해보자

 

code는 지난번에 이용한 backtesting.py에 있는 code를 그대로 사용하겠다.

 

https://kernc.github.io/backtesting.py/doc/examples/Quick%20Start%20User%20Guide.html

 

Quick Start User Guide

In init(), the whole series of points was available, whereas in next(), the length of self.data and all declared indicators is adjusted on each next() call so that array[-1] (e.g. self.data.Close[-1] or self.sma1[-1]) always contains the most recent value,

kernc.github.io

code가 궁금하다면 위를 참고하자.

내가 만든 코드가 아니기 때문에 올리지 않도록 하겠다

다만, 앞으로 전략을 이것저것 짜서 백테스팅 포스팅을 계속 만들예정이니

아직 파이썬에 미숙하여 어떻게 해야하는 것인지 모르는 분이 계시다면

조금 기다려주시면 감사하겠다.

 

 

Tutorial은 10 이동 평균선과 20일 이동평균선의 크로스오버로 만든

흔하디 흔한 전략이다. 호주 ASX200에 적용하면 어떠하였을까?

 

Max Drawdawn이 -44퍼다.... 기간내에 한번은 반토막이 났다는 이야기이다.

return도 13%에 불과하다. 

사놓고 기다렸어도 340%의 수익을 얻을 수 있었다는 것을 살펴볼때

아주 좋지 못한 전략임을 알 수 있다. 물론 이런 단순한 크로스오버 전략이 성공하지 못한다는것은

이미 널리 알려진 이야기라 크게 신기하지는 않지만 

이번 포스팅의 목적은 '되는지' 보는것이기 때문에 데이터 전처리는 성공적이였음을 알수 있다.

 

 

plot도 한번 볼까나.

역시나 2008년 리먼사태로 인해 경기가 안좋을때 대판 깨졌음을 알 수 있다.

잘 살펴보면 2008년이라던지 2020년 코로나로인한 급락이라던지. 

급락이 있는경우에 이 전략은 매우 취약하다는 것을 살펴볼 수 있다.

 

오늘은 여기까지 하고.

다음부터는 다양한 지표들을 넣고

이런저런 전략들을 짜서

다양한 백테스팅을 시작해보자.

 

 

반응형