파이썬 자동매매 개발, Zipline 기초

안녕하세요! 이번 강좌에서는 파이썬을 이용한 자동매매 개발에 대해 소개하고, 그 중에서도 Zipline이라는 라이브러리를 사용하여 기초적인 자동매매 시스템을 구축하는 방법에 대해 자세히 알아보겠습니다. 자동매매는 주식이나 암호화폐 거래에서 널리 사용되며, 기술적 분석을 기반으로 한 알고리즘을 통해 매수 또는 매도 결정을 자동으로 내리는 시스템입니다.

1. 자동매매란?

자동매매는 사전에 설정된 알고리즘에 따라 투자 결정을 자동으로 수행하는 소프트웨어입니다. 이는 사람들이 발생할 수 있는 감정적 요소를 배제하고 데이터 기반의 결정을 내리도록 돕습니다. 자동매매 시스템은 주식시장, 선물, 옵션, 외환, 암호화폐 등 다양한 금융시장에서 활용되고 있습니다.

2. Zipline이란?

Zipline은 주로 주식 시장에 대한 백테스트를 위해 개발된 Python 기반의 알고리즘 트레이딩 라이브러리입니다. Bitfinex와 같은 거래소와의 통합을 지원하여 실시간으로 거래를 실행할 수 있습니다. Zipline은 간단한 API를 제공하여 알고리즘을 쉽게 작성하고 테스트할 수 있도록 해 줍니다.

2.1 Zipline의 특징

  • 백테스팅: 과거 데이터를 이용해 알고리즘의 성과를 검증할 수 있습니다.
  • 간단한 API: 사용하기 쉬운 함수들을 제공하여 분석가나 개발자가 손쉽게 알고리즘을 작성하고 실행할 수 있게 합니다.
  • 유연한 구조: 다양한 데이터 소스와 통합할 수 있는 유연성을 제공합니다.

3. Zipline 설치하기

Zipline을 사용하기 위해서는 아래와 같이 pip를 이용하여 설치할 수 있습니다:

pip install zipline

설치가 완료되면, 우리가 사용할 데이터셋을 준비해야 합니다. Zipline은 여러 가지 데이터 소스를 지원하지만, 해당 강좌에서는 ‘Yahoo Finance’에서 주가 데이터를 가져오는 예제를 사용할 것입니다.

4. 기본적인 Zipline 사용법

Zipline의 기본 사용법을 이해하기 위해 간단한 예제를 통해 자동매매 전략을 구현해 보겠습니다. 아래 예제는 모멘텀 기반의 간단한 매매 전략을 보여줍니다.

4.1 예제 코드

아래 코드는 그냥 예시로써, 종목의 50일 이동평균을 계산하고, 현재가가 이동평균을 초과할 경우 매수, 그렇지 않으면 매도를 수행하는 전략입니다.


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

def initialize(context):
    context.asset = symbol('AAPL')
    context.MA_length = 50

def handle_data(context, data):
    # Get historical data
    historical_data = data.history(context.asset, 'price', context.MA_length, '1d')

    # Calculate moving average
    moving_average = historical_data.mean()

    if data.current(context.asset, 'price') > moving_average:
        order(context.asset, 10)  # Buy 10 shares
    else:
        order(context.asset, -10)  # Sell 10 shares

    # Record values for later inspection
    record(price=data.current(context.asset, 'price'),
           moving_average=moving_average)

start = datetime(2020, 1, 1)
end = datetime(2021, 1, 1)

results = run_algorithm(start=start,
                         end=end,
                         initialize=initialize,
                         capital_base=10000,
                         handle_data=handle_data,
                         data_frequency='daily',
                         bundle='quantale')

4.2 코드 설명

위 코드는 다음과 같은 구성 요소로 이루어져 있습니다:

  • initialize: 전략 구성 및 초기 매개변수 설정을 담당합니다.
  • handle_data: 매 거래일마다 호출되는 함수로, 매수 및 매도를 결정합니다.
  • data.history: 주어진 기간에 대한 과거 데이터를 가져옵니다.
  • order: 특정 종목에 대한 매매주문을 실행합니다.
  • record: 매 거래일마다 기록할 값을 설정합니다.

5. 백테스트 결과 분석하기

Zipline은 주기적으로 매매 결과를 기록하고, 마지막에 반환된 results 데이터프레임을 통해 성과를 분석할 수 있습니다.


import matplotlib.pyplot as plt

# Plot the results
results.portfolio_value.plot()
plt.title('Portfolio Value Over Time')
plt.xlabel('Date')
plt.ylabel('Portfolio Value')
plt.show()

5.1 결과 해석

위 코드를 사용하면 시간에 따른 포트폴리오 가치를 시각적으로 확인할 수 있습니다. 이 그래프를 통해 전략의 성과를 한눈에 평가할 수 있습니다.

6. 포트폴리오 기초 및 추가 전략

이제 단일 자산에 대한 예제를 다뤄보았으니, 다양한 자산에 대한 포트폴리오 관리 방법을 간단하게 설명하겠습니다. Zipline에서는 여러 자산을 동시에 운용할 수 있으며, 동일한 원칙을 적용하여 각 자산에 대한 루틴을 설정할 수 있습니다.

6.1 포트폴리오 초기화


def initialize(context):
    context.assets = [symbol('AAPL'), symbol('GOOGL'), symbol('MSFT')]
    context.MA_length = 50

6.2 멀티 자산 처리


def handle_data(context, data):
    for asset in context.assets:
        historical_data = data.history(asset, 'price', context.MA_length, '1d')
        moving_average = historical_data.mean()
        
        if data.current(asset, 'price') > moving_average:
            order(asset, 10)
        else:
            order(asset, -10)
        record(price=data.current(asset, 'price'),
               moving_average=moving_average)

7. 결론

Zipline을 사용한 자동매매 시스템 구축에 대해 기본적인 부분을 살펴보았습니다. 자동매매는 데이터 기반의 결정을 통해 감정적인 요소를 배제하고, 투자 성과를 높이는 데 도움을 줄 수 있는 유용한 도구입니다. 여러분도 Zipline을 활용하여 다양한 전략을 시도하고, 성과를 분석해 보시길 바랍니다.

앞으로도 Zipline과 결합하여 더 발전된 자동매매 전략을 연구해 보기를 추천드립니다. 이 강좌를 통해 얻은 지식이 여러분의 투자 여정에 도움이 되길 바랍니다!