파이썬 자동매매 개발, Zipline을 이용한 이동평균선 전략 테스트

자동매매 시스템은 주식이나 기타 금융 자산을 자동으로 거래하는 프로그램을 말합니다. 이러한 시스템은 사람들이 거래 결정을 내리는 데 도움을 줄 수 있으며, 특정 알고리즘이나 전략을 사용하여 수익을 극대화할 수 있도록 설계됩니다. 본 강좌에서는 Zipline 라이브러리를 이용하여 간단한 이동평균선 전략을 테스트해보겠습니다.

Zipline 소개

Zipline은 Quantopian에서 개발한 파이썬 기반의 회귀 테스트 라이브러리로, 주식 및 옵션 전략을 작성하고 테스트할 수 있는 기능을 제공합니다. Zipline을 사용하면 다음과 같은 작업을 수행할 수 있습니다:

  • 데이터를 쉽고 빠르게 가져오는 기능
  • 알고리즘을 통해 실제 거래와 유사한 방식으로 전략을 테스트
  • 다양한 성능 메트릭을 수집하고 분석

이동평균선 전략 개요

이동평균선은 주식의 가격이 특정 기간 동안 어떤 경향을 보이는지를 나타내는 지표입니다. 여기서는 두 개의 이동평균선(짧은 기간, 긴 기간)을 사용하여 매수 및 매도 신호를 생성합니다.

– 매수 신호는 짧은 이동평균선이 긴 이동평균선을 상향 돌파할 때 발생합니다.

– 매도 신호는 짧은 이동평균선이 긴 이동평균선을 하향 돌파할 때 발생합니다.

환경 설정

Zipline을 사용하기 위해서는 먼저 관련 패키지를 설치해야 합니다. 아래 코드를 사용하여 필요한 라이브러리를 설치할 수 있습니다.

pip install zipline

데이터 준비

Zipline은 주로 OHLC(Opening, High, Low, Closing) 형식의 데이터를 사용합니다. 여기서는 Yahoo Finance에서 제공하는 데이터를 사용할 것입니다. 이를 위해 pandas_datareader 라이브러리를 이용하여 데이터를 가져올 수 있습니다.

pip install pandas_datareader

이동평균 전략 구현하기

우선, 이동평균선 전략을 구현하기 위한 기본 코드 구조를 설정합니다.

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

def initialize(context):
    context.asset = symbol('AAPL')
    context.short_window = 40
    context.long_window = 100
    context.order_amount = 10

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

    if short_mavg > long_mavg:
        order(context.asset, context.order_amount)
    elif short_mavg < long_mavg:
        order(context.asset, -context.order_amount)

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

start = datetime.datetime(2016, 1, 1)
end = datetime.datetime(2021, 1, 1)

run_algorithm(start=start, end=end, initialize=initialize, capital_base=10000, handle_data=handle_data) 

코드 설명

initialize: 알고리즘이 시작할 때 한 번 실행됩니다. 거래할 자산과 이동평균선의 길이를 설정합니다.

handle_data: 매 시간마다 실행되며, 현재 가격과 이동평균선을 계산한 후 매수 또는 매도 주문을 실행합니다.

run_algorithm: 알고리즘의 시작과 종료 시점을 설정하고 초기 자본을 부여합니다.

결과 분석

전략의 결과는 Zipline에서 제공하는 다양한 메트릭을 통해 확인할 수 있습니다. 이러한 메트릭은 주식의 수익률, 최대 낙폭, 샤프 비율 등을 포함합니다. 아래 코드를 통해 결과를 시각화할 수 있습니다.

import matplotlib.pyplot as plt

# 결과 시각화
results = run_algorithm(start=start, end=end, initialize=initialize, capital_base=10000, handle_data=handle_data)

plt.figure(figsize=(12, 8))
plt.plot(results.index, results.portfolio_value, label='Total Portfolio Value', color='blue')
plt.plot(results.index, results.AAPL, label='AAPL Closing Price', color='orange')
plt.title('Backtest Results')
plt.legend()
plt.show() 

고급 전략으로 나아가기

위의 기본 이동평균선 전략을 다룬 후, 더 많은 고급 전략과 기술적 지표를 포함할 수 있습니다. 아래는 몇 가지 아이디어입니다.

  • RSI (Relative Strength Index): 현재 주식이 과매도인지 과매수인지를 판단하기 위한 지표입니다.
  • 볼린저 밴드: 주식의 변동성을 측정하고 가격이 어느 범위 내에 있는지 판단할 수 있습니다.
  • 투자 비율 조정: 포트폴리오에서 각 자산의 비율을 다르게 설정하여 리스크 관리를 더욱 세밀하게 조정 가능합니다.

결론

이번 강좌에서는 Zipline을 이용하여 간단한 이동평균선 기반의 자동매매 전략을 구현하고 백테스트를 진행하는 방법에 대해 알아보았습니다. Zipline을 활용하면 더욱 복잡하고 다양한 전략을 손쉽게 테스트할 수 있으며, 이를 통해 실전 투자에 활용 가능한 유용한 인사이트를 얻을 수 있습니다.
앞으로도 다양한 아이디어를 바탕으로 여러 자동매매 전략들을 시도해보시기 바랍니다.

부록: 자주 묻는 질문

Zipline을 설치할 때 문제를 겪고 있다면?

Zipline은 특정 환경에서만 제대로 작동할 수 있습니다. Anaconda와 같은 가상환경을 사용하여 설치해보는 것을 권장합니다. 또한, 종종 numpy 및 pandas의 특정 버전을 요구할 수 있으니 문서에서 확인하십시오.

어떤 데이터를 사용할 수 있나요?

Zipline은 여러 데이터 공급업체와 호환됩니다. Yahoo Finance, Quandl 등에서 데이터를 가져올 수 있으며, 사용자 정의 데이터를 추가하기 위해 zipline.data 모듈을 사용할 수 있습니다.

Zipline 외에 다른 라이브러리도 있나요?

Zipline 외에도 Backtrader, Alpaca, PyAlgoTrade 등 다양한 파이썬 라이브러리를 활용하여 자동매매 시스템을 구축할 수 있습니다. 각 라이브러리마다 장단점이 있으니 충분히 비교하고 자신의 요구사항에 맞는 라이브러리를 선택하는 것이 중요합니다.