파이썬 자동매매 개발, Zipline 시작하기

최근 몇 년 동안 자동매매는 금융 시장에서 큰 주목을 받고 있습니다. 이는 알고리즘을 통해 매매 결정을 자동으로 내림으로써 투자자들이 보다 효율적이고, 감정에 휘둘리지 않는 거래를 할 수 있도록 돕기 때문입니다. 파이썬은 이러한 자동매매 시스템 개발에 매우 적합한 언어로, 다양한 라이브러리와 도구들이 존재합니다. 그 중에서도 Zipline은 가장 유명한 파이썬 기반의 자동매매 프레임워크 중 하나입니다. 이 글에서는 Zipline을 사용하여 자동매매 시스템을 구축하는 방법을 소개하겠습니다.

1. Zipline 소개

Zipline은 알프레드 S. 반 더 빈(Alfred S. Van der Veen)에 의해 개발된 파이썬 기반의 백테스트 프레임워크이며, 연구와 투자 전략 테스트를 위해 설계되었습니다. Zipline은 파이썬의 강력한 기능을 활용하여, 사용자가 거래 전략을 쉽고 빠르게 구현할 수 있는 환경을 제공합니다.

1.1 Zipline의 특징

  • 사용자 친화적인 API: Zipline은 직관적인 API를 제공하여 쉽게 사용할 수 있습니다.
  • 강력한 백테스트 기능: Zipline을 사용하면 전략을 과거에 적용하여 성과를 평가할 수 있습니다.
  • 수많은 데이터 소스 연동: Quandl, Yahoo Finance 등 다양한 데이터 소스를 통해 실시간 및 과거 데이터를 쉽게 가져올 수 있습니다.
  • 분산 거래 전략 지원: Zipline은 여러 자산에 대한 거래 전략을 동시에 테스트하고 실행할 수 있습니다.
  • 오픈소스: Zipline은 자유롭게 사용할 수 있는 오픈소스 프로젝트이며, 커뮤니티에 의해 지속적으로 개선되고 있습니다.

2. 개발 환경 설정

이제 Zipline을 사용하려면 먼저 개발 환경을 준비해야 합니다. 다음 단계에 따라 알아보겠습니다.

2.1 Anaconda 설치

Zipline은 Anaconda와 함께 사용하는 것이 가장 효율적입니다. Anaconda는 여러 파이썬 라이브러리를 쉽게 관리하고 설치할 수 있는 플랫폼입니다. Anaconda를 설치하려면 아래의 링크를 방문하여 운영 체제에 맞는 설치 파일을 다운로드하고 설치합니다.

Anaconda 다운로드

2.2 Zipline 설치

Anaconda가 설치되면, 아래의 명령어를 사용하여 Zipline을 설치할 수 있습니다. Anaconda Prompt를 실행한 후 다음 명령어를 입력합니다.

conda install -c conda-forge zipline

이 명령어는 conda-forge 저장소에서 Zipline을 설치합니다. 설치가 완료되면 Zipline을 사용할 준비가 끝났습니다.

3. 기본적인 Zipline 사용법

Zipline을 설치한 후, 기본적인 사용법을 배우기 위해 간단한 매매 전략을 구현해 보겠습니다.

3.1 매매 전략 정의하기

이번 예제에서는 간단한 이동 평균 교차 전략을 사용할 것입니다. 이 전략은 단기 이동 평균선이 장기 이동 평균선을 상향 돌파할 때 매수하고, 반대로 하향 돌파할 때 매도하는 방식입니다.

3.2 전략 코드 작성

다음은 Zipline을 사용하여 이동 평균 교차 전략을 구현하는 코드입니다:

import zipline
    from zipline.api import order, record, symbol
    from zipline import run_algorithm
    import pandas as pd
    from datetime import datetime
    import pytz

    def initialize(context):
        context.asset = symbol('AAPL')  # 애플 주식 사용
        context.short_mavg = 50  # 단기 이동 평균 기간
        context.long_mavg = 200   # 장기 이동 평균 기간

    def handle_data(context, data):
        short_mavg = data.history(context.asset, 'price', context.short_mavg, '1d').mean()
        long_mavg = data.history(context.asset, 'price', context.long_mavg, '1d').mean()

        if short_mavg > long_mavg and context.asset not in context.portfolio.positions:
            order(context.asset, 10)  # 매수
        elif short_mavg < long_mavg and context.asset in context.portfolio.positions:
            order(context.asset, -10)  # 매도

        record(AAPL=data.current(context.asset, 'price'))

    start = datetime(2015, 1, 1, 0, 0, 0, tzinfo=pytz.UTC)
    end = datetime(2020, 1, 1, 0, 0, 0, tzinfo=pytz.UTC)

    run_algorithm(start=start,
                  end=end,
                  initialize=initialize,
                  capital_base=10000,
                  handle_data=handle_data,
                  bundle='quantopian-quandl')
    

3.3 코드 설명하기

위 코드는 zipline에서 작동하는 간단한 알고리즘 트레이딩 시스템을 구현한 예입니다. 각각의 함수는 다음과 같은 역할을 합니다:

  • initialize(context): 알고리즘이 시작될 때 한 번 호출되며, 필요한 변수를 초기화합니다. 여기서 매매할 자산(AAPL)과 이동 평균 기간을 설정합니다.
  • handle_data(context, data): 매 거래마다 호출되며, 여기서는 현재 자산의 단기 및 장기 이동 평균을 계산하고, 조건에 따라 매매 주문을 실행합니다.
  • record(): 매 거래일마다 변수의 값을 저장하여 나중에 분석할 수 있도록 합니다.
  • run_algorithm(): 전체 알고리즘의 실행을 담당하며, 시작일과 종료일, 초기 자본, 각종 설정들을 인자로 받습니다.

4. Zipline 설치 후 데이터 사용하기

Zipline을 사용하고자 할 때는 데이터를 가져와야 합니다. Zipline은 데이터 번들과 결합하여 작동하므로 퀀트피아나(Quantopian)의 Quandl 데이터를 사용하는 것이 일반적입니다. 이를 위해서는 먼저 데이터 번들을 다운로드하고 설정해야 합니다.

4.1 데이터 번들 설정

다음 명령어를 사용하여 Quandl 데이터 번들을 다운로드합니다. Anaconda Prompt에서 다음을 입력합니다:

zipline ingest -b quantopian-quandl

이 명령어는 Quandl의 주가 및 기타 경제 데이터를 다운로드하여 Zipline에서 사용할 수 있도록 설정합니다.

4.2 데이터 확인하기

다운로드가 완료된 후, 데이터를 확인하고 사용할 수 있습니다. 다음 코드를 사용하여 AAPL 주식의 데이터를 출력해 보세요:

from zipline.data import bundles
    import pandas as pd

    # 데이터 번들 불러오기
    bundle_data = bundles.load('quantopian-quandl')
    asset_data = bundle_data.asset_finder.retrieve_all([
        symbol('AAPL')
    ])

    # 데이터를 데이터프레임으로 변환하고 출력
    aapl_data = pd.DataFrame(asset_data)
    print(aapl_data)
    

5. Zipline으로 전략 최적화하기

자동매매에서 전략 최적화는 매우 중요한 과정입니다. 여러 매개변수들을 조정하여 성과를 개선할 수 있습니다. 다음은 Zipline을 통해 매개변수를 변경하면서 전략을 최적화하는 방법을 설명합니다.

5.1 파라미터 조정하기

위의 기본 알고리즘에서 단기 및 장기 이동 평균 기간을 변경하여 여러 번의 백테스트를 진행합니다. 다음은 단기 및 장기 이동 평균 기간을 조정하여 결과를 반환하는 코드입니다:

def run_multiple_backtests(short_mavg_list, long_mavg_list):
        results = {}
        for short_mavg in short_mavg_list:
            for long_mavg in long_mavg_list:
                result = run_algorithm(start=start,
                                       end=end,
                                       initialize=lambda context: initialize(context, short_mavg, long_mavg),
                                       capital_base=10000,
                                       handle_data=handle_data,
                                       bundle='quantopian-quandl')
                results[(short_mavg, long_mavg)] = result
        return results

    results = run_multiple_backtests(short_mavg_list=[10, 20, 50],
                                      long_mavg_list=[100, 150, 200])
    

결과를 시각화하여 어떤 조합이 가장 효과적인지 확인할 수 있습니다. 이 과정은 데이터에 기반하여 올바른 결정을 내리는 데 도움을 줍니다.

6. 결과 시각화 및 평가

전략을 백테스트한 후, 결과를 시각화하여 성과를 평가하는 것이 중요합니다. Zipline에서는 Pyfolio라는 라이브러리를 사용할 수 있습니다. Pyfolio는 투자 전략의 성과를 분석하고 결과를 시각적으로 제공하는 도구입니다.

6.1 Pyfolio 설치

Pyfolio를 설치하려면 아래의 명령어를 입력하여 설치합니다.

pip install pyfolio

6.2 결과 시각화

이제 Pyfolio를 사용하여 결과를 시각화할 수 있습니다. 다음 코드를 참고하세요:

import pyfolio as pf

    # Zipline 결과를 Pyfolio에 전달
    pf.create_full_tear_sheet(results[(50, 200)])
    

결론

이 글에서는 파이썬을 이용한 자동매매 시스템 개발의 첫걸음으로 Zipline을 소개하고, 기본적인 매매 전략을 구현하는 방법을 살펴보았습니다. Zipline과 같은 강력한 도구를 사용하면 금융 데이터 분석, 전략 개발 및 최적화가 가능하며, 어떻게 성과를 시각화하고 평가할 수 있는지에 대해서도 배웠습니다. 자동매매를 통해 더 효율적이고 성공적인 투자 전략을 실행할 수 있기를 바랍니다. 앞으로의 투자 여정에 행운이 가득하길 바랍니다!

참고: 이상적으로는 알고리즘 트레이딩을 위해 눈에 띄는 전략이나 더 높은 성과를 위해 여러 데이터의 조합을 고려해야 하며, 실전 매매를 위한 리스크 관리도 매우 중요하다는 점을 잊지 마십시오.