파이썬 자동매매 개발, matplotlib 수정 종가와 거래량 한번에 그리기

최근 몇 년간 금융 시장에서 자동매매 시스템은 투자자와 트레이더에게 꽤 큰 인기를 끌고 있습니다. 특히, 파이썬은 다양한 데이터 분석 도구와 라이브러리 덕분에 자동매매를 구성하는 데 매우 적합한 언어입니다. 이 글에서는 파이썬을 활용하여 자동매매 시스템을 개발하고, matplotlib를 사용하여 종가와 거래량을 한 번에 시각화하는 방법에 대해 자세히 설명하겠습니다.

1. 자동매매 시스템 개요

자동매매 시스템은 미리 정의된 규칙에 따라 매매를 자동으로 실행하는 프로그램입니다. 이러한 시스템은 주식, 외환, 암호화폐 등 다양한 금융 상품에 대해 작동할 수 있으며, 기계 학습, 알고리즘 분석, 통계적 방법 등 여러 기술을 사용하여 거래 결정을 내립니다.

2. 필요한 라이브러리 설치

파이썬으로 자동매매를 개발하기 위해 다음과 같은 라이브러리를 사용합니다. 먼저 아래 명령어로 필요한 라이브러리를 설치하세요.

pip install numpy pandas matplotlib yfinance
    

3. 데이터 수집

자동매매를 위한 데이터는 매우 중요합니다. 우리는 yfinance 라이브러리를 사용하여 Yahoo Finance에서 종가 및 거래량 데이터를 가져올 것입니다. 아래의 코드를 통해 데이터를 수집할 수 있습니다.

import yfinance as yf

# 데이터 수집
def get_stock_data(ticker, start_date, end_date):
    data = yf.download(ticker, start=start_date, end=end_date)
    return data

ticker = 'AAPL'  # 애플 주식 티커
start_date = '2023-01-01'
end_date = '2023-12-31'
data = get_stock_data(ticker, start_date, end_date)
print(data.head())
    

3.1. 데이터 이해하기

위의 코드에서 get_stock_data 함수는 지정한 주식 티커에 대한 시작 날짜와 종료 날짜를 인수로 받아 데이터를 불러옵니다. 반환되는 데이터는 다음과 같은 여러 정보를 포함합니다:

  • Open: 시가
  • High: 고가
  • Low: 저가
  • Close: 종가
  • Volume: 거래량

4. 데이터 시각화: 종가와 거래량

이제 수집한 데이터를 시각화하여 종가와 거래량을 한 번에 그려보겠습니다. matplotlib 라이브러리를 사용하여 그래프를 생성할 것입니다.

4.1. 종가와 거래량 그래프 그리기

import matplotlib.pyplot as plt

def plot_price_volume(data):
    fig, ax1 = plt.subplots(figsize=(12, 6))

    # 종가 그리기
    ax1.plot(data.index, data['Close'], color='blue', label='종가')
    ax1.set_xlabel('날짜')
    ax1.set_ylabel('종가', color='blue')
    ax1.tick_params(axis='y', labelcolor='blue')
    ax1.legend(loc='upper left')

    # 거래량 추가를 위한 두 번째 축
    ax2 = ax1.twinx()  
    ax2.bar(data.index, data['Volume'], color='gray', alpha=0.3, label='거래량')
    ax2.set_ylabel('거래량', color='gray')
    ax2.tick_params(axis='y', labelcolor='gray')
    ax2.legend(loc='upper right')

    plt.title('종가와 거래량 시각화')
    plt.show()

# 데이터 시각화
plot_price_volume(data)
    

4.2. 코드 설명

위의 plot_price_volume 함수는 다음과 같은 과정을 통해 종가와 거래량을 시각화합니다:

  1. 주식 종가 그리기: ax1.plot를 사용해 주식의 종가를 파란색 선으로 그립니다.
  2. 축 레이블 및 범례 설정: x축과 y축 레이블을 설정하고, 범례를 추가하여 각 그래프의 내용을 명확히 합니다.
  3. 거래량 그리기: ax2.twinx()를 사용하여 동일한 그래프에 거래량을 회색 막대 그래프로 추가합니다.
  4. 그래프 제목 추가: 전체 그래프의 제목을 설정하여 시각화 내용을 알기 쉽게 만듭니다.

5. 자동매매 시뮬레이션

데이터를 시각화 한 후, 이제는 간단한 자동매매 시뮬레이션을 해보겠습니다. 기본적인 전략으로는 이동 평균(MA) 기반의 전략을 사용할 것이며, 매매 신호를 생성하여 매수와 매도 시점을 결정합니다.

5.1. 단순 이동 평균(SMA) 추가하기

def calculate_sma(data, window):
    return data['Close'].rolling(window=window).mean()

# 종가에 대한 단순 이동 평균 추가
data['SMA_20'] = calculate_sma(data, 20)
data['SMA_50'] = calculate_sma(data, 50)
print(data[['Close', 'SMA_20', 'SMA_50']].tail())
    

위의 calculate_sma 함수는 주어진 데이터와 이동 평균 기간(window)을 입력받아 단순 이동 평균을 계산합니다. 20일 및 50일 이동 평균을 계산하여 데이터 프레임에 추가합니다.

5.2. 매매 신호 생성하기

def generate_signals(data):
    signals = []
    position = 0  # 현재 보유 포지션 (1: 매수, -1: 매도, 0: 없음)

    for i in range(len(data)):
        if data['SMA_20'][i] > data['SMA_50'][i] and position != 1:
            signals.append(1)  # 매수 신호
            position = 1
        elif data['SMA_20'][i] < data['SMA_50'][i] and position != -1:
            signals.append(-1)  # 매도 신호
            position = -1
        else:
            signals.append(0)  # 아무 신호 없음

    return signals

data['Signals'] = generate_signals(data)
print(data[['Close', 'SMA_20', 'SMA_50', 'Signals']].tail())
    

generate_signals 함수는 단순 이동 평균 기반으로 매매 신호를 생성합니다. SMA 20이 SMA 50을 상향 돌파하면 매수 신호를 발생시키고, 반대로 하향 돌파할 경우 매도 신호를 발생시킵니다.

6. 성과 분석

이제 매매 신호가 생성되었으니 성과를 분석해보겠습니다. 매수 및 매도 신호에 따라 포트폴리오의 성과를 평가할 수 있습니다.

6.1. 수익률 계산하기

def calculate_returns(data):
    data['Market_Returns'] = data['Close'].pct_change()
    data['Strategy_Returns'] = data['Market_Returns'] * data['Signals'].shift(1)  # 매매 신호에 기반한 수익률
    data['Cumulative_Market_Returns'] = (1 + data['Market_Returns']).cumprod() - 1
    data['Cumulative_Strategy_Returns'] = (1 + data['Strategy_Returns']).cumprod() - 1

calculate_returns(data)
print(data[['Cumulative_Market_Returns', 'Cumulative_Strategy_Returns']].tail())
    

여기서 calculate_returns 함수는 수익률을 계산하며, 시장 수익률과 전략 수익률을 비교합니다. 누적 수익률을 계산하여 성과를 쉽게 분석할 수 있습니다.

7. 그래프를 통한 성과 비교

최종적으로, 누적 수익률을 시각화하여 전략의 성과를 비교할 수 있습니다. matplotlib를 사용하여 시각화해 보겠습니다.

def plot_performance(data):
    plt.figure(figsize=(14, 7))
    plt.plot(data.index, data['Cumulative_Market_Returns'], label='시장 수익률', color='orange')
    plt.plot(data.index, data['Cumulative_Strategy_Returns'], label='전략 수익률', color='green')
    plt.title('시장 수익률 vs 전략 수익률')
    plt.xlabel('날짜')
    plt.ylabel('누적 수익률')
    plt.legend()
    plt.show()

plot_performance(data)
    

8. 마무리

이 글에서는 파이썬을 이용하여 간단한 자동매매 시스템과 함께 종가 및 거래량을 시각화하는 방법을 살펴보았습니다. 또한, 이동 평균을 기반으로 한 매매 신호 생성 및 성과 분석을 통해 자동매매의 기본 개념을 이해할 수 있었습니다. 앞으로 더 복잡한 전략을 개발하고 다양한 기법을 적용해 보면서 보다 효과적인 자동매매 시스템을 구축해 보세요.

제안된 방식을 바탕으로 더 나아가 기계 학습, 딥러닝 등을 활용한 고도화된 모델링 작업까지 진행할 수 있습니다. 또한, 다양한 지표와 전략을 적용하여 보다 발전된 매매 전략을 개발해보시길 바랍니다.

끝으로, 코드와 개념을 실습해 보시면서, 자신만의 자동매매 시스템을 구축하는 즐거움을 느껴보세요!