거래 전략 백 테스팅 소개

zipline 을 사용하여 거래 전략을 구축하고 백 테스트하는 방법 알아보기

투자는 투자 금액 및 관련 비용 측면에서 항상 많은 양의 돈과 관련이있었습니다. 여기 BUX에서는 모든 사람이 투자에 접근 할 수 있도록하고 싶습니다. 이것이 우리가 최근 네덜란드에서 BUX Zero를 출시 한 이유이며 다른 유럽 국가들도 곧 이어질 것입니다! BUX Zero는 제로 커미션 주식 거래 앱으로, 액세스 할 수있을뿐만 아니라 휴대 전화에서 직접 쉽게 투자 할 수 있습니다 .

저는 새로운 앱의 출시가 양적 금융에 대한 시리즈를 계속할 수있는 좋은 기회라고 생각했습니다. 첫 번째 부분에서는 자산 수익의 양식화 된 사실을 설명했습니다. 이제 거래 전략을 백 테스팅하는 개념과 Python의 기존 프레임 워크를 사용하여 수행하는 방법을 소개하겠습니다 .

백 테스트 란 무엇입니까?

거래 전략부터 시작하겠습니다. 시장에서 자산을 사고 파는 방법 (사전 정의 된 규칙에 따라)으로 정의 할 수 있습니다. 이러한 규칙은 예를 들어 기술 분석 또는 기계 학습 모델을 기반으로 할 수 있습니다.

백 테스팅은 기본적으로 과거 데이터에 대한 거래 전략의 성과를 평가하는 것입니다. 과거에 자산에 대해 주어진 전략을 사용했다면 얼마나 잘 / 나쁜 성과를 냈을까요? 물론 과거 실적이 미래 실적을 나타낸다는 보장은 없지만 여전히 조사 할 수 있습니다.

Python에서 백 테스팅 할 수있는 몇 가지 프레임 워크가 있습니다.이 기사에서는 zipline 을 사용하기로 결정했습니다.

zipline 인가요?

zipline 환경에서 제공하는 몇 가지 멋진 기능은 다음과 같습니다.

나는 이러한 주장이 스스로를 대변한다고 믿습니다. 코딩을 시작합시다!

conda 를 사용하여 가상 환경 설정

zipline 을 설치하는 가장 편리한 방법은 가상 환경을 사용하는 것입니다. 이 기사에서는 conda 를 사용합니다. Python 3.5로 새 환경을 만든 다음 (3.6 또는 3.7을 사용하는 데 문제가 있음) zipline 을 설치합니다. pip install 도 가능합니다.

모든 것이 제대로 작동하려면 jupyter 및이 문서에 사용 된 기타 패키지도 설치해야합니다 (아래 워터 마크 인쇄물 참조).

라이브러리 가져 오기

먼저, % load_ext 마법을 사용하여 IPython 확장을로드해야합니다.

그런 다음 나머지 라이브러리를 가져옵니다.

아래에서이 기사에 사용 된 라이브러리 목록과 해당 버전을 볼 수 있습니다.

맞춤 데이터 가져 오기

zipline 은 Quandl (WIKI 데이터베이스)에서 다운로드 한 데이터와 함께 제공됩니다. 다음을 실행하여 언제든지 이미 수집 된 데이터를 검사 할 수 있습니다.

이 접근 방식의 문제는 2018 년 중반에 데이터가 중단되었고 작년에 대한 데이터가 없다는 것입니다. 또한 Quandl 데이터 세트는 미국 주식 만 포함합니다. 이 기사에서는 EU 주식을 기반으로 간단한 전략을 구축하고자합니다. 이것이 우리가 다른 소스에서 데이터를 수동으로 수집해야하는 이유입니다. 이를 위해 yahoofinancials 라이브러리를 사용합니다. zipline 에로드하려면 데이터가 CSV 파일 및 사전 정의 된 형식이어야합니다. 이 기사에서는 ABN AMRO (네덜란드 은행)의 주가와 AEX (Euronext Amsterdam에서 거래되는 네덜란드 회사로 구성된 주식 시장 지수)의 두 가지 증권을 다운로드합니다. 후자를 벤치 마크로 사용합니다.

먼저, yahoofinancials 를 사용하여 데이터를 다운로드하고 zipline 에서 수집 할 수있는 방식으로 DataFrame을 준비하는 짧은 함수를 정의합니다. 데이터를 준비한 후 데이터를 daily 폴더 (또는 원하는 다른 폴더)에 CSV 파일로 저장합니다.

여러 티커를 yahoofinancials 에 전달하고 한 번에 모두 다운로드 할 수 있지만 필요한 조작을 단순화하기 위해이 방법을 선택했습니다.

ABN AMRO 주가를 다운로드하는 것으로 시작합니다.

그리고 AEX 인덱스를 따르십시오.

현재로드 된 번들을 살펴 보겠습니다.

이제 eu_stocks 라는 사용자 지정 번들을 추가합니다. 그렇게하려면 zipline 디렉토리에있는 extension.py 파일을 수정해야합니다. 다음을 추가해야합니다.

데이터 다운로드 기능과 달리 다운로드 한 데이터의 정확한 날짜 범위를 전달해야합니다. 이 예에서는 가격 데이터가있는 첫 번째 날인 2017–01–02 로 시작합니다.

마지막으로 다음 명령을 실행하여 번들을 수집합니다.

구매 및 보류 전략

가장 기본적인 전략 인 Buy and Hold부터 시작합니다. 아이디어는 우리가 특정 자산을 구입하고 투자 기간 동안 아무것도하지 않는다는 것입니다. 이 간단한 전략은 또한 고급 전략의 벤치 마크로 간주 될 수 있습니다. 구매 및 아무것도하지 않는 것보다 더 적은 돈 (예 : 거래 비용으로 인해)을 생성하는 매우 복잡한 전략을 사용할 필요가 없기 때문입니다.

이 예에서는 ABN AMRO의 주식을 고려하고 백 테스트 기간으로 2017 년을 선택합니다. 250 유로의 자본으로 시작합니다. 저는이 숫자를 선택했습니다. 초기 구매를 위해 얼마나 필요한지 알기 때문에 10 주만 구매하기 때문에이 숫자를 가능한 한 작게 유지하고 싶습니다. 수천 명. 또한 zipline 은 기본적으로 미국 달러로 작동하지만 모든 자산이 동일한 통화로되어있는 경우 유로로 표시된 주식 및 지수를 사용하는 데 문제가 없습니다. BUX Zero에서와 마찬가지로 거래 비용이 없다고 가정합니다 (거래 당 최소 비용없이 주당 0 €).

zipline 을 사용하는 방법에는 명령 줄 또는 Jupyter 노트북을 사용하는 두 가지 방법이 있습니다. 후자를 사용하려면 Notebook 셀 내에 알고리즘을 작성하고 zipline 이이를 실행해야 함을 표시해야합니다. 이는 %% zipline IPython 매직 명령을 통해 수행됩니다. 이 마법은 위에서 언급 한 CLI와 동일한 인수를 사용합니다.

또한 중요한 것은 알고리즘을 실행하는 데 필요한 모든 가져 오기 (예 : numpy , sklearn 등)를 알고리즘 셀에 지정해야한다는 것입니다. 이전에 다른 곳으로 가져 왔습니다.

축하합니다. 첫 번째 백 테스트를 작성했습니다. 그래서 실제로 무슨 일이 일어 났습니까?

zipline 알고리즘에는 (적어도) 정의해야하는 두 가지 함수가 포함되어 있습니다.

알고리즘이 시작되기 전에 initialize () 함수가 호출되고 context 변수가 전달됩니다. context 는 알고리즘의 한 반복에서 다음 반복으로 액세스하는 데 필요한 추가 변수를 저장할 수있는 전역 변수입니다. 기본 벤치 마크는 NYSE에서 거래되는 SP500이므로 여기에서 벤치 마크를 AEX로 변경해야합니다.

알고리즘 초기화 후 handle_data () 함수는 각 이벤트에 대해 한 번씩 호출됩니다. 모든 호출에서 동일한 context 변수와 data 라는 이벤트 프레임을 전달합니다. 여기에는 거래량과 함께 시가, 고가, 저가 및 종가 (OHLC)가있는 현재 거래 막대가 포함됩니다.

우리는 order (asset, number_of_units) 를 사용하여 주문을 생성합니다. 여기서 구매할 항목과 주식 / 단위 수를 지정합니다. 양수는 많은 주식을 매수 함을 나타내고 0은 우리가 가진 모든 것을 매도 함을 의미하며 음수는 공매도에 사용됩니다. 또 다른 유용한 주문 유형은 order_target 으로, 포트폴리오에서 원하는 수를 달성하는 데 필요한만큼의 주식을 주문합니다.

구매 및 보류 전략에서는 이미 주문을했는지 확인합니다. 그렇지 않은 경우 주어진 양의 주식을 주문한 다음 나머지 백 테스트를 위해 아무것도하지 않습니다.

전략의 성과를 분석해 보겠습니다. 먼저 pickle 파일에서 성능 DataFrame을로드해야합니다.

이제 저장된 측정 항목 중 일부를 표시 할 수 있습니다.

처음 살펴보면 포트폴리오가 투자 기간 동안 수익을 창출했으며 ABN AMRO의 가격 (포트폴리오의 유일한 자산이기 때문에 의미가있는 것)을 매우 따르고 있음을 알 수 있습니다.

트랜잭션을 보려면 performance DataFrame에서 transactions 열을 변환해야합니다.

'DataFrame'성능 열을 검사하면 사용 가능한 모든 측정 항목을 볼 수 있습니다.

주목할만한 몇 가지 :

단순 이동 평균 전략

두 번째로 고려하는 전략은 단순 이동 평균 (SMA)을 기반으로합니다. 전략의 '역학'은 다음과 같이 요약 할 수 있습니다.

고려 된 자산, 투자 기간 또는 시작 자본과 같은 백 테스트의 나머지 구성 요소는 매수 및 보류 예에서와 동일합니다.

이 알고리즘의 코드는 조금 더 복잡하지만 코드의 모든 새로운 측면을 다룹니다. 단순화를 위해 위의 코드 스 니펫 ( sma_strategy.py )에 참조 지점을 표시하고 아래 번호로 참조합니다.

매수 및 보류 전략과 비교할 때 포트폴리오 가치가 일정한 기간을 보셨을 것입니다. 자산을 매도 할 때 (그리고 다시 구매하기 전에) 현금 만 보유하기 때문입니다.

이 경우 Buy and Hold 전략이 단순 이동 평균을 능가했습니다. 포트폴리오의 최종 가치 (현금 포함)는 B & amp; H 전략의 경우 299.37 €이고 더 복잡한 전략의 경우 267.68 €입니다.

결론

이 기사에서는 zipline 프레임 워크를 사용하여 거래 전략의 백 테스팅을 수행하는 방법을 보여주었습니다. 라이브러리에 익숙해지면 다양한 전략을 쉽게 테스트 할 수 있습니다. 그리고 거기에서 BUX Zero로 투자를 시작하는 것만큼이나 쉽습니다!

향후 기사에서는 기술적 분석을 기반으로 한 고급 거래 전략 사용에 대해 다루고 싶습니다.

내 GitHub에서이 기사에 사용 된 코드를 찾을 수 있습니다.