파이썬 자동매매 개발, Zipline 거래 수수료 설정

자동매매(Algorithmic Trading) 시스템을 개발하면서 거래 수수료를 고려하는 것은 매우 중요합니다. 많은 트레이더들이 수수료를 간과하곤 하지만, 수수료는 실제 이익률에 큰 영향을 미칠 수 있습니다. Zipline은 파이썬으로 작성된 오픈 소스 알고리즘 거래 라이브러리로, 이러한 거래 수수료를 쉽게 설정하고 테스트할 수 있는 기능을 제공합니다.

Zipline 개요

Zipline은 Quantopian에서 개발한 백테스트 프레임워크로, 주로 주식과 선물 시장을 대상으로 사용됩니다. Zipline을 이용하면 다양한 전략을 구현할 수 있으며, 거래 비용을 포함한 시뮬레이션을 실행할 수 있습니다.

Zipline 설치하기

Zipline을 사용하기 위해서는 먼저 다음과 같이 설치해야 합니다:

pip install zipline

거래 비용의 중요성

거래 비용은 여러 요소로 구성되며, 대표적으로 다음과 같습니다:

  • 스프레드(Spread): 매수와 매도 가격 간의 차이로, 이 차이가 클수록 거래 비용이 증가합니다.
  • 수수료(Commission): 거래당 발생하는 일정 비용으로, 각 거래마다 부과됩니다.
  • 세금(Tax): 거래 시 발생하는 세금으로, 각 국가의 세법에 따라 달라집니다.

이러한 비용들은 거래 전략의 성과에 부정적인 영향을 미칠 수 있으므로, 전략 설계 시 반드시 고려해야 합니다.

Zipline에서 거래 수수료 설정하기

Zipline에서는 set_commission() 함수를 이용해 거래 수수료를 설정할 수 있습니다. 다음은 Zipline 초기화 코드에서 수수료를 설정하는 방법입니다.

from zipline.api import set_commission, commission

def initialize(context):
    # 수수료를 설정합니다.
    set_commission(commission.PerShare(cost=0.01, min_trade_cost=0.0))

이 코드에서 PerShare 클래스는 특정 주식에 대해 주당 수수료를 설정하는 것입니다. 여기서 cost=0.01은 매 거래마다 주식 1주당 0.01 달러의 수수료가 발생함을 의미합니다.

거래 수수료 종류

Zipline에서는 다양한 수수료 구조를 지원합니다. 가장 일반적인 방법은 다음과 같습니다:

  • PerShare: 주식 1주당 소정의 수수료를 설정. cost는 주당 수수료, min_trade_cost는 거래당 최소 수수료를 설정할 수 있습니다.
  • Fixed: 거래당 일정 금액의 수수료를 설정. cost로 거래당 수수료를 정의합니다.

예제: Zipline 전략에서 수수료 포함하기

다음 예제에서는 Zipline을 사용하여 간단한 매수 및 매도 전략을 구현하고, 거래 수수료를 포함한 시뮬레이션을 진행합니다.

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

def initialize(context):
    set_commission(commission.PerShare(cost=0.01, min_trade_cost=0.0))

def handle_data(context, data):
    # 특정 조건에서 매수/매도
    if data.current(symbol('AAPL'), 'price') < 150:
        order(symbol('AAPL'), 10)  # AAPL 10주 매수
    elif data.current(symbol('AAPL'), 'price') > 160:
        order(symbol('AAPL'), -10)  # AAPL 10주 매도
    record(AAPL=data.current(symbol('AAPL'), 'price'))

start = datetime(2020, 1, 1)
end = datetime(2020, 12, 31)

# 데이터 다운로드 및 알고리즘 실행
run_algorithm(start=start, end=end, initialize=initialize, handle_data=handle_data, capital_base=10000)

예제 설명

위 코드는 2020년 1월 1일부터 12월 31일까지 AAPL 주식의 가격을 모니터링하여, 가격이 150 달러 이하일 경우 10주를 매수하고, 160 달러를 초과할 경우 10주를 매도하는 간단한 전략을 구현합니다. 수수료는 주당 0.01 달러로 설정되어 있어, 매수 및 매도 시마다 해당 수수료가 적용됩니다.

결과 분석

거래 전략을 실행한 후, record() 함수를 통해 가격 데이터를 기록할 수 있습니다. 이후 이 데이터를 기반으로 성과를 검토하는 것이 중요합니다. Zipline의 시뮬레이터는 거래 수수료를 포함하여 성과 분석을 진행합니다.

시뮬레이션 결과 확인

import matplotlib.pyplot as plt

results = run_algorithm(...)

# 성과 그래프 출력
plt.plot(results.index, results.portfolio_value)
plt.title('Portfolio Value Over Time')
plt.xlabel('Date')
plt.ylabel('Portfolio Value')
plt.show()

커스터마이징 거래 수수료

시장을 분석하다 보면, 다양한 전략이 필요할 수 있습니다. 이때마다 수수료도 적절하게 커스터마이즈해야 합니다. Zipline은 고객 맞춤형 수수료 구조를 지원하여, 각 전략에 최적화된 수수료를 설정할 수 있습니다.

예제: 외부 파라미터로 거래 수수료 설정하기

def initialize(context):
    # 수수료를 외부 파라미터로 설정
    cost_per_share = context.cost_per_share
    set_commission(commission.PerShare(cost=cost_per_share, min_trade_cost=0.0))

def run_my_algorithm(cost_per_share=0.01):
    run_algorithm(start=start, end=end, initialize=initialize, handle_data=handle_data, capital_base=10000,
                  cost_per_share=cost_per_share)

결론

Zipline을 사용하면 파이썬으로 효율적으로 자동매매 시스템을 구축할 수 있으며, 거래 수수료를 쉽고 유연하게 설정할 수 있습니다. 거래 수수료는 전략의 성과에 큰 영향을 미치기 때문에, 신중하게 설계하고 관리해야 합니다. 본 자료에서 제시한 예제를 통해 보다 효과적인 자동매매 전략 개발에 도움이 되기를 바랍니다.

추가적으로 Zipline의 다양한 기능을 사용하여 다양한 실험을 해보고, 나만의 거래 전략을 개발해보세요. 자동매매는 단순한 코드 작성 이상의 것이며, 시장에 대한 깊은 이해와 적절한 전략적 접근이 요구됩니다.

참고 자료